From 22648977f635259c8d972c9cfe364fdb2b2dc372 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Fri, 13 Apr 2018 08:04:20 -0400 Subject: [PATCH 01/19] Post South Florida VMUG UserCon v2.0.1 - Includes features requests provided during feedback from session. --- vDiagram.vssx | Bin 0 -> 811190 bytes vDiagram2.0.1.ps1 | 8807 +++++++++++++++++++++++++++++ vDiagram_Scheduled_Task 2.0.1.ps1 | 593 ++ 3 files changed, 9400 insertions(+) create mode 100644 vDiagram.vssx create mode 100644 vDiagram2.0.1.ps1 create mode 100644 vDiagram_Scheduled_Task 2.0.1.ps1 diff --git a/vDiagram.vssx b/vDiagram.vssx new file mode 100644 index 0000000000000000000000000000000000000000..5acb6e696e4a8a05619143b83a6350e21f0b8af7 GIT binary patch literal 811190 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 z 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%0AW#|s-_LSUe?VI^wixa*f&e-XqC*?O|B%(C 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 w>+;fF& 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⪻j=$~evfD3|ZEan5f63xkm!R5c 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

t~OCPOm2OMOWi6Qp8+mD<*;>pCW>t zt8U%x)zUXmYSrf#Y&42T}#2`|r>eyM-tQac=Oco0n=c#7ewd!# zq~|K&zsMFkbHW5mtv#z7zoV`|;jAMcljrDerl{?|bBP)00vk>2ZU{ znIYPm52EvzRW( zdKX}P!2qq*66yEz*p?8@J+PcMjaaa5RMM?GqP{QjW>gBgHqAHkP^x`e)-Rmyd{ENT zx`i>AcC#dPN0TTT8KXabNMBoDTf5%S&=C4{P$KyR-_>)uF4^X1e%;UrUd+-C`)yJq zFaRK%*qeJ--yuApIJosX7nV_b-mw!wXIbUidN1?RchMeLgV#U3&#(}S4qp=T6G+_N zt^a$UwN#R7aJlTC-V?X0d_wQwUdHFE+GpNBeCw>X zn+=@75Oi=o+5$-_E?Ou>kATY@O{+c?xfHkE2s}Q0Q@I!lBWLvJ&Q$M9A zQdjiup&r{s&jOW@U`;)7Dht{wGqV_Ox$$JnlV`;s?PvP$^c7p#+b+`wt(kj?Qwu-9 z=yLAs{E+Rd(Yxp(a##1{r8!)i6_!5eJDh%mzx9mb)gAjHVqJN0>F&{^zrd(06UsNXxQ1KoDfr$2ALl-roJ;4+^%DyMkyg<9&5j-Z0InV5T6i+B9}Ck1tO zUwK~iqTPNdI%~HY6cqSnX)VlwLWR&QJg`r0nV7j$1S~=QjaEF`p?3f+9dF73P}B6-THv;!B~yIQU&nW4 zd-G+%wI}>7n_s{i^^(~C4ooHlwf{IXM9-_~Y;lHv{7p(|D12BJ{NQfFbp@=sb2GVv zJ5Ttlvy|m`qk=6yXRBKr?Gem5u^Qh(jB+|F)-L?s=j~#d`u-TnT%xwzzqIdn$78Lf zg+@aH)N7QPcpTW=9c&m*FHdak0@K%l?^gv&q}Ionb_|(Cy2G6cX^>KpdO6_ zQ!F4b{yqnJyqJjr0I<^gQlgp~O2z`sPa!Pd5vx2Re1o%$nqerKn-{GG!tVktTXrs=iDcfoCcpU8x+Z_M4fI22s69+@Z5U+-QgC;atw1mA2m zr`)$)!nT|vZ>IGopS~X(c*}arjCj6KPvKSgkGT_hx$EW2tE+Q~F1P%)*OhfU%q6l{ zd_Pf8Ok4wZH0tfsHpz$g3c5AHctREvDzo+CA?s+&=7_tg9iT<84ZcW!ofKeh!Q&;A zs3aM?`O<78LZsmD*WT1~k!Nn4_m2eB3Mu^WF!Vm2{;aKA#4^_4v?ct5Jj$@b*i?6J zjdH|f)m&2`f|r}kBwE+g71(?wrpt)2EFivBLX0DIJxOFP zVA=a*VO1?5Ebg$8EiAu^U#@p*E>!Mn`^cdX?g*M~VmsKjg7p`4Y4(%HQX`?#S3Q`}Vr%_8I_o%X`y= zr^nx=;9T5o5ixhmjC8o*NS0cV#h(#We6xU{b%Yvf9H5FY zEP)BGdkcq0<}t+H1_DM~Pn&Ga6ZGFbHOQ|W7wQ;El0`05EneKaiYvyJ#^&{fKz~7z zD80ETy;0hc$k&{mm7*^=LOOL+i(hPN3|R{=RlQ$l_lyDqVH<3YZr4w7LFl86sHO*} z9OSkddH+B1+&ljBq%P-`D{D_aHpCcueOTn10i%)%Us8X|1!=_Ak~&TcFAXc{ z$VsO!UQ}r{$btNF9IX#Wz-TEWv-bOcm(?#=5H7iVHVUpdr*O!oIa4s=W~=f}9za|L zMEZ}nT`*$CXp)>A$3b&0Gx0qu4sXe63D(%~F~SlmBYP3x*9R~;Aow=y_m>W#{7fKJ zp34T!KM9=`zI$5fVdUWbQmJ)DLB4T>M&uR86T>A51JmYv-<}5Ncyby9gzFCpV~E6| z*Dy%Dr5d@}$U9%jfmYgeA1Kh440K=)cx`XhS@L`N?~_lyC%Xdz4rh$KpDOq4%&|K_ zzA(at-}hA~<5*v2JQ1ym|7%)(_1)=rd!{8cUSCZbQ8^`hzwAV1!iUYVPp_)+sz50`rnob`)cE{N#4~ zd%SKpTg29l#0^;{>9h$9ir48ok?I<IQ(JBi#|7BGH`$!TZWD} zcW7Om+C0DSed;gyC;!IFs3=1Mq3)+pJ$ia=Pc)feM{Z!@OL8NIR<-A);nUPd5Es$D*F(6KpuwPkfZ`Cn?|AeFcu~NBMExwGw8m0OV6>mQ^KE4~ccurPC=brf| zchj*=7O8Cs1nfR8U>$um-vHqyOfp?X$`=d}Jsqq@dxf(F!-x^^<0=&Z4}Ox6FP6U# z;K1Wo35gr;Hul`^-U47^=%$^-lYz z`-@9dzuKBRUMSo5I7B^lrQ%rO(vRv?>Lm$mwgLNlT<|45W+;$JR}LycDP$xrf2B%! z%~TT;1XDD0)-V8;kPMh=H(>{~UF27M!VP;9!PM?oMa{OGb+}CiBW3L> zFuv`s!0YlXLvG5rCWBR+^t+zeCSJgysT$pM{>PKoH~g=_qrg8(EL-~9#Vl`x7i_>Rt8+Hfyf5XB5cKN`-mp*JM+{AC zRWkNCz@RG=8^Sy%ZioaiQH{fu707E730evQEbQRpA0A5BJO!*>J`po!vO1r*aidNu zB{0G!dqP*LVQdqR+@2Pg`1$J+Zp zcbA3iwnu3Twa-Ul7>lWma<2+rnC(G5@ule zRMY3sje=8S_)n$w-qS;>X^HcBCyG{NDW5lX+o~6aKmr4@l}{g~*?Hem*z@dyys1mP z_a~|$yH|ZxW_qxUG|OY|rp4(^WqCnBLjW&1h8vsDsvotNXN$Cj^(i!fUVUf@KC%-S zs#v~Jf+K^Er67_QSPm9Ur!AR2P+F9_IB%Ppvi|xXH~ZSNDkUaxG?kH?J35g>O|qIe zpJ0mwgcafeu4!%Y`os>#J82Yd*!moNw|;JLYS(1crbm?tI{#7FA(t&~kUII1YL0~|iHFfFhhM1S{^`rwbC&tb9yL@Wn*fbz&g z(HZZo_8gV|lOUaLp=Q%g%RG7ZOy?C90Smn<&&a!7k`0Md=|}F_neTfxsR@jUAOQ3KXm-9yltAPa$1NJY9jgEo5zpy{U4cd=jk!U+OJQq z<;3$$p1#wyw0`}HHWqAC>xJEAVW@W;J=X zN47{I?gzQ+Cv+f)S6QT17tknZl7Y8#zc6?>Hs!1*s(_7sVWL3OYH0r8`g)W5R9f(X zhmrS0W%ro29EZr2CoU{%^xIU32t!^YfV<&->Keud`u2G-qHjFnir%l(kr~T>i%G2Q zus~FXDs^;^DUwDc0r*W&&m3tRpX*mOg#-)Ydsx*06wlBhzh{ zvceb%p&kOXUy^uRIl3yhIO?Te2xFXaX#zG}Fu`s_KhDEA0!E9zq4}bKMXNct^;~}S zd27?&Lm&5&(7&JO){m#K=54v_O<*+aQC0%o^>F0t$EH!btB!q$cAsiW9p9?)VC`SB zKG!uxttdB-tuHAS`5Jo5k*5U1F2%m`-@eJG^r+_q*NufAuFH>w^;DIAy?P>R1iA;D z?W)UL@ql3u!!O;PS%~E@o;r=$pbS9nD8n0}swKqI)3N_0K~1(GENS9Xkq6WCCz-Oq zt7>JL`f_(nWUs#TOpyp!HeV!MEtvQwVIAhRU-m_L%~_|6!`zRL%H6Q<0?`>L1M@Zt zkp#UGCF9|9><_eP=@_A9{C(fe7%X|s)HE)ag>2-gGEg2LgE#bJ%THO<8q@Z;506f| zFr7(x+(o|H*5)Jmnk587In z1gLm9O65K+%`g?TJu1(eP>`aX`^n_>-P(fDoO%-c-w(cYZdO)Ps7yOG6w_E!j-m1b zItdUtU}GIXzV2zp97rtj!f2f^T%{~yL~OPuuQ_m9mSPAq4!Di|#sgj~uuSNBgO5km zK>g!l3<1%b=b=F;X}o=64@eEMU~7s>IJtPMGh8!Me z%f|G*+$fq7^GX)Gc22B$-L*bt_4Bp%0HX~|?yL3YikMU6t$TL2<=vR%CyOt&A2Z6? zITEnhH5gge*_r;}C#%_t-O2qc*#s_ug9c6243$bIygd$nss?|M`ud*f znX}kngthw(Hc2*nCj=>tHsa0?f&z%N1LQj%B`9I>DB1E4dinZx3ClS$R`G~4c#uk* zQ9g+0+>K3$0pyFtFkk0ihB7MvoAn34kJ@9^9XCd#XVb~D;Q9p!eU_&<(R+J8|E7M! z2osl>#a!KM@q}o{=8-zV=S6w`SH#fK<~b`a&7dO=IT`{b7ITaE{FoyeA|q>?tG(u9 zYeC;-DTqFPv)TdhmI9K+99vo=i$EdFYnD8lONz4OE@%qQpkY~(O zU2DH-Io#U(^UQ?PbM<-e#Ou8|BW^)D?C|-S_QIwz2{!N*^25%yytKMty$Xe5?HLy0 z>A1$fvleaZJLgUv&U;$UMC`UDhki0UzgqRJvo(rOzNLwjC8jo*9s48TV#9Pxym>{> zK*o3HG#7tHbtS~si?B1QE8a<*?EQqh9H^Fgr}Bzsh3J=6&*RC zW+oxfQjn%Fe!%QGOaHRo{+kmyY-9inE1SLKFh3k+Elk(I3>R$}uBGpqn| zlp`Mr!cZRUcZ2XQJoHeWj0gLr?qT_U1QXDUfV$S8C%@k*-wAnovIx9u*^@qW1Um`z zMPC2xTkVF|{-J^*d0eh(JE7r0F76@w!s1wgFD|+Lz>uAPr%zIi&zIBwZ6R4VCj}xO z#f+kiTTYq_@e$$QWplRlA1*DGm`aJjJ!6|a-;HC<{J*xCAKGEZK;7MwI|nshL(wVM zB7g1Mmy-JY@SfF~oYeEjINalqj%T28@IqU4Wvn3TE`{%f;9e}5OH-qOc52c~RE z1TG3=oWa2+gct-lPQb>8dnxg;3J^A!aqbaT$osOOkzwq#zI|N~2ATPtd#!n6u*F6e z=u=Bj66+ILfS>!t=IL2bS(ex_UquREv+uRCn6G_a5reio(p=j7_+1${x;}StCfN1s zRN36>&q0IjZ;CG)jsA|Jh%%Xs|1bOITqB@9Xr_e>o4xB{Br!K$3D}$#?rM6n1rbhBm0Qs!o&Ca_?j}6rQt{gBwgCll< zm}XU!0T2V3=(xsi+_&sc(KIZgV5H$>YnTZ?x+y23T*kam4(9krz4U`xXx;?x&*(>E z2+joj3?7Q0H=v*Tcrj9dVCmyLT@V-+484bxF9b*tz>eZ$u4%6Iv0tasH~fM-)#CI; zzW*k{q1n5O-sI1X_6@4D`QP8G&&ZB!;?DgLP51p9e7U>y{&4xJqdq+fN+C1pD*DKw zoqOMl5~57{ytjlzT%pm17fN>~Tv&;t`(LP0=p1DF zH9<=zV%G&Cj4+suEd3rSfzM?)24_UD97CwE1pn#Q8_LIDs;R@$ zSNFKwTE;!cKJX#6ybmHP5ow}S1eIfuO3|;_$mx4=vM1D0&R`>!*aCB-qrmbp!$BGt zVZ$4gS4>@;9V1%zHos~OGO(8KrvB$YCP8XmEpe$ehF1y!cVL2~(52wNnjBz#u-gVK zTw5+X0w^UIuPb(!lB6CdxY;_Ft7eySQzx`;K4WS9d*M)rvOY>%W98lPYzl8ndUW-> zh9a=Zy?xDRBy#eSkJqg(6=^u1l;JqR#}ti<6hu8f zmQl!fS)V#0NJhUu=}^3!0pZmxaek2mNa%xqIWxW&2midy&8QxnA=3%?3lQXlFf8Ix z5s6nKwhZAMasE`286~6ORJyTsMN1B2BRzF^H<_*$3#c>-EtX*k-Qz|?P&q35OBl;k zqOCY7_{?cJiUX0h8%SXcI6H(4M$NQDfLJFEffBo{(UD_^5e+>a#=Io}NTVwW@Z%ld z8c}+Z&-^qdfbqYbV$NI@=d0kbU~8?d55B8o ziVgKMf16x>EwCDn&9DDj^xHJ>FFop0Yb~Dd+_IeAlh9^Yz~jlhs&c4dy?m$P(4bJV zuXA_p^0mhc4*LQk0?2FweJ&)&$@uSSu&NNsV4`3qg7CeQnc6=gC}*xL#NAmM(=PypV=e_zOnfVG3X52l{iFOCb}kzi}(NzBsS+&;?Mx7-h(YW&TaIKl^hs1qVR(FXg07} z@e)V_?VZA$e7y@Bd8OG0HiX6*C-?5X;}j{`%|vlMZ@(tKK0PI`N?bTJGI^LxW|Q}R zm%ALU3scxS!gtzuFLmD4ulKuKdM2o~%WUA6eUKADo;pcqdH4MD-?^ ziA(L%Z`CG-7svJAUfIb=_T4?pUVKn=pDqhe_RRqIt-{M^!o6Oz;M+Sa?5;MvQC}}i z@gekKPIF0MuR?<&g|2&R;+YhY#zcgj3JA|F@xdr6GJ~TF2V=3iOou|{RHJed`*AQw z39AOcx}IUo2!l%&$}6tI;eSDp78~mT1g|tAK$(K)c9MY#VXBxo`kbaKV5PbQ$zZ^6y$@zlVWVV8)2Xfu6nxQ$XZikOCvnW_>s?ln_d0YB{^z zsfvP%btt1i4IyGSqaRHM(URS$WIDQQ2DZ?| z{|fqN&=u_BLpta|G{jSY;v2lYUN7#OK8p;I{|_o>n(qT)XIKS)+4m8UQYJRJs zJOkWnd71&jwjM!*KnpX7?6XE)<#!I!0PpDOMBMSOCtZB7acnwhKL1!6JHyXcqv1tZ zwpBw>jbdf#gB?*o(eCK%{LXUF{>Q7ZkiQepM-08j+h?WiVrNP8pita@uQ0y(yLZl| zN68wjQllp{w4Q(L$PAe5C}n?MKdVjz2A8gEXUAw!mp@z!$F3ze#Omhd%c@$UKGfc= z-pzc4jhv{ZjU){1PCY|^&_*)jazcT9e+9}@jU)a7a5%~kCDWPl=P)nR`2>fTK+Ga| z4$L~WV|GS5luVS z&qDo2P>OuKIRcQm=z+gnV3>R2*MMWioKV4B@X$@-{LAudHHu}W60gGw#+#?@gQa!u=23 z)q0lGmT!^#m~B4D0864aFw%Aax$j5H*zvJAA7PLa`ho zMh+EfaNhRaWZVraZhymr@?HC?t!>+J2DI{h%v<^zahd&6Rg7Y(QiXjF*ZO&xmJu8o zGpLg1>b{#~Fg4tsS@~9ENvMaAU;k~Wgqbeyx2wa42Y*P???t%0MwG;%EX|6w!sFB! z#(jl%%~2bBF8KxS-nUOID9R-?x0f3<&JIm_E9JFw&U;r-cNE70ui!wquTPqLadGR? zXB&4yP9DV}BDm=3moG+UgS;83D~Ai?BDlT)`0pEQ+mqt5-vF6G(n8oZV0?dv6WN|& z#r(fj+6@$L?ZO6Q)J6*osW{9B&kh0N1ym5Tp@t#51`Za2AkQa(469f~?g$S7isp$! zA3_-5Oif3jXrrH4@0KGPZwavw0Rh6x2qwgs5wZ-?$NHFj@zw4(hG!yY^$H`|hnJJJU2m=6V>|>w zFpl`5^W|Y8$oV@`)qYIm-ItM94}U$AA?CH-ZBrFOCiU(eDrF%H;KT=E&QfGa#3 z)I5NO34P3$WAr={OxF+kv$7n2M*@$s)>Mb<&CR-H&%NjR)nuN%=Q_5ZkETJ+gZN3~EwSd)%juq7^zA&pRNl*xXd#7FT`7>d||mP*rPqxY0E zXZ7IIxks;nbSwesl~}5bzAGC|wSh#yOpP+2`3QJ$bph;n4LJ~`2b5UsoT38>3tG(4 zOh!9@2BR{cK5=oW{r15y_7XTp8H}3RlH3Sq43940A(2RIjOSp(oP#alj=sI!?%SIf zA+1R-4qz0=ovzWy#z(+{h3Qfx+Q{sE+PA8nB#dWNxou;zDSFn>zd`*T=S)67e264x zwBKx-+U09y?-YkZ$0GiI6DxLqz2k6lRL^2}9=|WF@9F%^rK5_cJT5&*jzwPFJzbxR zVRi^&qNfU-Ls6gq)DbRhMRi!>R8d;WfrL2vzv~Vx^_VwCsFH(M>CQmEBMCH0V;z8% zW7z9IrP<-TAUd(bLk$XM2GQLXmT*3T>>~-1yKctZ=#n_AgA~Hz23TQef5jH^HgZs8 z|L7}V4;Tt4jN0RrnZb!zOfx`z6m>nfd2r9&fW~LD%|EYi^R2Atx8M4&Va9L8yKOo| zsY0%9^q1;E1K_(0AOC_aSs7?_RwnOYD0nxkDZxQg?>u2{I+c37(f<2pU!_aSGrP(3 z!?xQ;CVt9n84mUwq13#5dGCEwlVP%$mePqzXS;;G^}sIQb3=joY&>ROVL%;=yGBbh5i|fZ_ zod3+c-WuGF=EwFAV7ZM0=Hh>3SMPY;@(C@NjTZF#Z+v~ro{I_G+PYW9Ec#i8$UEv~ z#Y)Gc=f6!!PZk?4W>SrJoL)#|?g$;6zT)#CxCHHT-xlNCu~cJkXo~#*X|D14?LMuO zD1E-D?!Bg_wTGCHR6uf)J%xf7yjUrfp`LDK|51Q~a^b({La|AO1;31AfHxw5phB0; z8;KAh=AW~m)LjT2i$-`UAYWgL@)TTzfjTC)l@-JAD8SR5oj|lA%GlkFk3rDG`i3lL zRrM)JrYy7rXc(iIyp~0>B#IQ6`9AQ;y_7@-{OhF{ za7B0Bnfs!}@_Sf5(9gX1;McFQi(`^cJWE=m#x@Byhx3##N0+@Z4Cv z!XzwazcEIU7yj8G`j`o)It*t6NPAyWi}n9J17!=ASc-~J3e)U)jz))}wcI9Wc4YC~Cx4bQG)sUT zC*v)x$1f6LOc57a=@@CtL%1*bJP8!xD4Aag%HF^X8jVCcAR{3jx3PULo8z2O!Qr11 z53ZbsT6Kp(;#O4RcHJF`&iG}a%MIt=@bh9KG+#93CW~K17C!qcsuw9y=R7Ql9q1Mo0OHcynQO00vSD3%qvFkj=;-Y1 z)=A2*kp@?Frt&+b@$s#yPd$qNvfEH-zbmV1t8KqH=s&ukP&`oNZ!KW&WplEWSVm`| zSlTYzTJ$=QPYzse^oJ+^GJdq6`@ZhhG5LiS;hU@|^q(Oy6{}enQHIEM%C) zE0f&i6ob(bgT^lff##18S%`$-z|np1TYiWa{n;404=54W)#9Vxmofv@`pbSP&Py}# zX;IH8%ViQv4_l8A83Q3ri(X1M<>iN}=+(d8xEYbqz%V@xy%*cV@!ZP#pu^-)`;IQoo(Z}g5_x5q=hss(6WAb}V6>G`N7(5; z({l(OdM}Q?q1I4ne1s1as;z8Bi!U-7f^mO8i>InvQ@{L(_g#O_}HD1&# zh$=8Wy|(>BC@Q7t$@P$(ZNu+m(ZkDf#05I}IQ!D<=NiqMAk^es*1Jm$k}Z<2FhMs!_)LfAfd>JRcnG*F&U5`Om?PlzgA-+ZhFKcYk=~3lTxA zx09Sq8L6zAKtb)klE@bhd()^`&Qu8Dovg(Au@?yVb3-8Jq9vZ5>IB7HL_ztKI!YDl zW(1>Dt(SOu%n%fP(FEK0>VJ?C9hBT!As=0SjhpI;oPduKFyh0*0}R{I&tCfG#65U? zI*HzE0~J8t@fdo@xysT!e)yp#_@)mv6Tq3{M@Y)N*o-@6#Rx%3RJNm)&=iSg1Q59JTL(nSXDHX$c^<%hqEPKMJFm zACc%fr>ej9T9rSxzy42Ru9T|8yN+d-yWZ0{8?KFBH`x};3|O82dafr@Q%Ynz;PRET z(AbjLqia6V!#c6UjlaxhaI07D&3Ct=%Fk%Df z$FUyJ6u5pEAW-wfAF81neQj0jz~AXD?Pjrs1kZ!D-@csS&{F5U_5H%K)y9cyzv8>& zpB$K(cd#_oDX#stb>VTp=d)5j_fL%fc+SkKGavD7N&y%r zEXVJE;aPC-!S6o!O?i`>`_toM0^>s`qER{8LnqeKC(rJ6f3>%JA!mJFh@H~)_^rAO z&f(82XndYv9i)ZOMgHxJ8P5&5ej!zUS}&RCOInta{S~oPW`vIOrfN~>7|I--4(u;r zFYF@svtal{RyszXl*3Tt*67`*O~{s#O`7;mG-;X#UU^S}CeGMO8Bde}{1^3;nQ(yR zJwylOEMEX}feX}}cL4x7hA?P4b2P?qvuLQ26`t53`2L!|x!J(U0eY;eqxR-p8LB7E z+`gS}aU5L8cm0S*Jvo(_tib6TE2o2Of2+|7}mM3f$J7zxlrW#cG-#;sg?c8`0TV(Ile{SaB3;N>)1p$mEobO6ZdR`~$|UL_f^syl za~v=B?C>>;43Y0;(%lUtKQDd|`Mv&RQf{QUs?Ybzdlh#oI|WO}o_coX?FC7_V&^#( z+9FJ?Zn^%ILPFP9t|tBwpfqXMwfj|ylJIV~Vbvi!*BRf+`vb{>)||%V?k}hLv2VVO zx|a$j_p*8a!sCOvVP$RmAr|s4Jdv6aBB6*Gf+6<{#s}-OlkxQGIy2L|E-0#k5pVEjD~VTP@ydrprTOWag@h0>mi_@u zvHs~6W!`1C&B_TpUUhsZeXDMOfC_5VyN~Ww)F#9zi#BZeDoK^REPlLYY9 zKE0i6G#!3zJpBkmRcVt8exy^fk4qfX9LuW1@q*AQ8BKskU_jA@l=;+!NK|Q3v^1vG zh-Wxt<-yHUya$AG^zQjIs1qwf137Ab4LBuVyl{Uh>c`)qA1AsbbR}NZ*}2QW>?9Hq zG+pZR8gqQU_(k|DuvT8zkyHy`x_@joB8c+qZL9Ky_PJv!j8|!F!=Fzw%}zf+l;0N@ ztA4d}5}YrWObYJJG!C^mU&D%^YW;`FjI}A4{LA1TDEkSM89YR100~kpn+Oy?2=AOC zSOZ|C682w8oJ5)lk!)+pbeLY3m_C&B6xjC?%%~xkWFaC?$Z1V<4#PLFfxIq({)%Tz zcHvzn%rP<$8_QK}g2c)XM`1`dzn#{1y9I(-AK9JJmZag(RgyPA?_xzg0^Y|=W8Od@ zd!{m>{ciVx@k649M5dy!9+Se$|5+p~IOAq`_&f2x*RodJI!9zS?Ybp&h4ZaOObA3& ze!D{uL{3~6d;1_yeErZfzRdk!O>l4G8z%Pk5B15&onZ^R))G2B*=w~?7h+4{AL}t6 z9LV+25DOD^LS$Mkz}Kmj)e0p5 z`!BpMv0tzifHHU~{p@O>Y?O3(ltiwPQ1m-&Mt6$GN^wj6ZgI=3X$Q1aR{eRQ+oTTuQffE-^u8M`a0bzWe0m9}-{U1dU)UuY2y zkKW#`{c?I|Tr)~TM6V!crwsf%u=jOsZn&RgSl!b!-MS%j*FKI~wO#q=gJ$YLP#eA_ORNPY=X6LW@lpr*0fpg6FFpr?&D58)u0fT2-EP^9kZ7M@%0bi88>#FDzv6Fh-k$iKFApNQ$Oe8_aBu*p zMP^>zpvk^F&q?@LEBuA3x@eCI_8zx@d*>q@bpG`7+}Cbxqr@tTw`}<&<87&GKG*)3nEP&lriy>VY^`(6F|-88VzX$Ebxz9=%Pc(XfO|f zU5c8>CJ!cTnd6^6pxJX;9=YCg1$>YpExkuGNd@1`_WSTZKkSJDhjT#+wvl{Nl8xhEu2CUM9DCa1w>5sF{DAlh@a=Mpp9Fa(7Z5K!cUjtL8P?a-qm!~I6C4ja$Wr{&z` zmbvkUR)p8R$ho^qoMB7ZXAP;zoDB}M)H1lBz+I)GaW;^Ne#}IX@4F689g~!Cj6DxQ z&IcMfQla`^bU-wgH2r&rG8&C34AZJ@hj8RjisBj`qdL(F zC#{Q$;TGHN9R08CF9 z5EPj4-yi`BvRDZy2eNrr69eBd4Nep2?SB!X5A745F0|EnkST0fCV_14txsUV zRIgvUjYMI`;xI=(z22z=L5K`*#-sTjisj*WbGyIvNxc4ymva&;3C=5wsK?P#4b=-Gf)5w)=%$;QoIkT?stX|NsAdw%O*M`?k5S zipX6yM~I40D!`@L(j<@OUgJo(Xe`jhXiF|NA-pl6Y| zieP3hY{H9aud|wS3p=Umzx7NKe$*h^JAL{FgQNI^=?`n8M+Z?_q%(8hKOOnJ7>qu% z>(@RYiGU`+{YAa0+Iq}&sy+i4KBr3p&a_GqM)`4!+oFhz!9d%IQl6T$8uUdlsl{Fp zOKq{|{d3=_Mk)k2c1m}MgvB}Uw?ra>L~htVz z)Cmf^gCq+8s(1M%^!S4T07rpAK#lnkI~twt#zzdLG+h$L6*@`C_R}fX;O&|XzM~%n zjR8Xu-DqHR>p{NUOZt&zV^2!L*VEhreuxfDiD7Rldgt8eTQB|8xiuJn3ONVU1{znt z7>o;doU3anh+cW4Qu*LzT>W*S6A*$#I#Fm%#WO3!-}ggl-vvM0+Sj zV19DGJyBaO6@sc!KjDlVv*&M~w@2zi4E}N|O!-~YbRq>XL#bnH6rDx(TSmd3IB^)? z1h~P4$N_Y!g%xRB{Y|9bE~$>Ri5+m&ODs&m<$~}EVsPCV9EOqLpZDa&3%W71%b)`2 zpJCO4fwxY8>Ty6q5B|52*mnq&0C2F=hWR5_hZ&p^(C?kmJ2??DBPYk7?*m6dF?YKm6;5Y zcEaGZ0#O(_I&dABL4LK65A@-fgO$}CR_N_YrRETW`N2q zg%U&rZ!p?R0r*Kn3|sM3rtx|3O4NLX3BDL7Nn|BJ53fz$6^IP{2^0#!Tt9ldIahuJ zobpfmsPSQEGeNIfEajnx^o`?5cxy0%XY_lE&vdhw`?6=M7lpazHFLwb=aMx~AyE`H zayYcz=RTgxUZilZnBWp~gTi@Jx7`y;GfwRcp7-#&ZTcy<&1CKMkMZ|%opvU~;tNNI zZI4Ug3yn!kBob@JVqj7DGPt}5R<;Pkz%arRh)sybZ2~BZ6p~8t?_^o3E_~;HrmOGm zO=m&)G7207!z&tMP0N>I()a!!wNVDs8d|tVYGriUd84 z3{`a?upNL_E#2~B)COGMxHZO#TBNlZ#L^*muP%OAQqw(U! zF${E7GyLH8?hWG$iLEU$=Z{B9XREZo#dP!PYQ$|V9m7d4UDE?6?9Q|8v;N%Z<8r=T zoNInrzvo<;(lvz;2dO$vJS!R=2m9sst28}3@LSB!G`oP-1QZTPdfK|DjK|}&hX#X| zuj@t)Q&<`ulj?;COFY;F5aA1Vigd<12M47H&X1BAQX!0nqCIG=?A8x$k|pU0W@u#y z&heoN%t9M2=e7veOiQ{{k?|Ks6@FG08Ae_;KvrUc-tK=HxVOu8%mf9PAOIm}5QZB3 z1c5VUP<0zCr2yEMK+9tk}pP?&auIf{~F7HW}uV)zA7 zw(;a4tQC?P!2dxMHDiF9!ENpaA`;!7WO#DM-2{PU0hlM~Iy-I6Js7%W>aF>Ugk z|8lGVeg4zKa@Vsm(_gIPx6Y@;vyR}I9Dk%npfgnvM%9rYx7xq4{|Cv0Db#IO$?xF}W+r)J?%CxR zF_HYWO=({xwHat_2EYgb$ZBqkb8uCr6m+B^BtZm!p5wE>&R|pt0)SKj(&QY#xNg&M zN<2FknN{qP4yj=Uq*0Ht%KWG{L6POg5&Q(OHe8{zW& zMlc4MIyHUr;k z8hi+ZgG7TS&y*s52%)IZ3Gp>1EvJYNK)8W-g*B@Q3~OsNYCzUTdr1V*X;zE)eAp5o zEC&7>RvOz^7Djl1K`p=r4G9c4hJ?Z}KiN|7$v>&pp%^ZuAV7jS981Af8e%30us0La zCdZ3rd@&7kHSrAj=5k2|hcZ49`k(q9U}@VNxcT)nkvN;i;mUqp@A{748Y%|C2frE= zke2d%lT%qd5-?Rp@Nr^mVWs>DlB8hw&Zvw2`C7j|zAb#D6`)5NsE${jb3gQ)6Kf$y zim1P*bQ8JpWR0=X&uzuvT94Ejr-S?y{)9lsoj)^OzC05BOu6R2L{%KTK#}s8b*dB| z8<_iZVZTo)P$o4nyB+HOF;zQ6}-y7Si(2p3U^rQ|H6IH5DVxFOfUDt z(S|P!2{axr1Q^$>jE z;9UG^FK;mGE%B2O>Fh{x?#2@iy_MH~U;B%b`$vz7^BF&oWSZ2MR?7I;SE6V0Q@5ku zvRh3j7XI`1oPDQX8{;YS&E%m#RlW`S)4?4`32{+}Vr|}lHrnTB7q_E%Qka}Fq1PiW z*zvYyL9F-1h@%zNJ9Q0*kLKJSmhkUxEgIyKM#xp;)LnzZ_@5VX5qbtZDao?pTQFH1 z8P;6CeL@Iy?`Ow`WT4Hm6r0ipbHNhC+bkhqco|2Ez~M~nu_QtHP&Awrlm7vOHkBnv zM{;mwk4KR6uul=-y)}XasDxE;ewuvX?Eg!+hS0rxq6%P09^_r=-92XB2m%o(K%RzJ zcy{2=x-9UlGMUdK|A_w6UV;n&t-S^Rcl!USt{Xo{V7|S5&inBL51FEm^KbssO{!d`6MOf zSww`w@>r;X{FF;CqHk85>2;_#{9gLXQBEed=9K_V;m1?rVp_wi ziI;y&n9jy?;rh^|v-{j*fd~^+2MNc_9cJOKw<*DigV-Zd1a=Or{Gwz9WHMpNVuRb1 zAix$o@EJs%6|&;d#1bSRQSv^x#$PK0!h~>{Nrt@OJ_+Ypo@Wifs6I3X~R9e;XY=Y0bC!+?uOf)J|Ht>lB2o*VQ*bWdk0 zOo`TS;uS|^UPd0&vbK^L*1K1!IPTEg zkb*$HBe2)qHB;$$#xge{TZBB?=E!2u-E88;z5YW%Bi7mWwnIORog(sArN_7RO zq#goD3Jl(Vio6i{HU~Dh@n7});T!}uzXU;#Dv+Q8crB9y$zT1vj@ob@MpxqTPH{N7Mp4j7Z6&Ss` z2QbDx(doWNL&(F48jRln7-ps584&t(OYQAH6Ae=`GWcSk4uGKykU;<@QY1M5gdRxs z_41kbg7iH?oB?cdHE)v5CTCBUw464Kz&q6i!Ru~WTn|bOl63fNxEf|;9C%!b}QZhQApf%wnJ{r(*_Y{*ja z_>k_+q&E4o z0Ep06wr9F2K!sl4HyLglX;*f8R3z=?uQ13 zX+kx8F#teVUAdaq!v}a|?tv>04Y*(cZfO98$%iZ-;;Ia=iYN(?C6~dy zsG!cSon4pT)4L?u`xZ1u58E{9J)?ODS~lrvX73oflJW6Xh+g5)u9mAIHyqOLr|H!k zbD68YAXR8~Ff`w3;q(Td1UA$(t%thqdU0aQoBy$~KM}vkjr6Uk+@bNXD${;F=6k@< z1m_>W%J0WAetLJqUvF|m?3TS{AV4nB=Hifmv&m=2|8S$^0I2N<1F)4AFyVuRir*g( zCt)Uhh7sZ+q=q8999enGE&#?LnIRDhAXNzZ*F!$y{1CCgSLQ}je1y8Dq-4z#;pRcy zVfT6h^PM{lkdXir3z(3=(O{ta6q2V#2=GYW zL&A`TzXOoOAOs8iWt*F`4n*;gVBDMB z2X0qX;*>86yEnaO_v0;X!6ombK8KJl!>hYU)*LY)E!pc4s*^SM#*NQg_T*9QN zenfWw8o-liX41ezT3Q~ELOQI~%9rS{+na>#n0x<#+wn!J^v5LIB{UKYPF10w$`;J~ z(1m7vz?5~tpSNYkES|~{)BFG0OEdqLO(m3qXb#*BO~=owkO38eH2KFMwhM+d0d0|R z;e}I^*u{&mBDtb0m6n3F2hx0~$Uq-Z3^gk2uMJ=$i~w^~NTdMQf}AIN&K}f14k{H0loub| zdho0JKcqG)$uBTlpAUNzVI}R*P7`%9eMXbEQA&Bee68JAcQ(u=*6)NC&tD>^n=ErN zAtwon-*bzTNNE-}LNAVl(ylH)24!RAe+d&9wtua)7`E-Unn+Z%+>Ed^BTW>=apvJb z5K){;90JHBoF-O&WQbJ#po|vkQoh0>h0~engn0J#cxJCnBLy@jP~@ zO*!|rVi5niVuDm=g*jSJ+6G|uS&mtFhw#sUSm@f!zi)z*=sw#Vs5hhlfsO zY2{Ep#1Ki3KiB;t3jw+(U!029OM;GkzC55k`E#dLjA3D`Qa78CBl2zM2Jh`fi9Iud zg^JSmFe(rAT2CnKog5Ik%G4tkzL{Ov1#|K$o#_%k_8b#xyh}ERe^yjL+W*M6)Qn&H z-Hk?b0ijp+=*z={hB2e(ha?bg?e~@HJC5QV_`)1MnEZK{bU!Yd`!!0Evlp>pPyPGy zAv0<3;MkRI{;xcgCf(ul!?jWY>VLb z<=i|(FrltNI1@_)5=mOxfp%rh)@;Bv9m?e^`$GUo*t+itFt}`{oOG#xZ_hEL6&i5H zFb-RWNgjLB5&6Mh?Syfsqg^B`;?_=p5eSgQ0Or+WG%;}qDGu!e$o#-)0*dte6Tr}h zV-z#+tuwZ6P@FWgA0B}Z<-L7tM)59PKJg|$T(|c~VmR~IhLB4!zMd-ZVjK;42bm=J zAE=kjA-1l{5k}1#R%{TEWaG=)yAfe!E{G(?g|j=qig;Knhy~{6^g>5`EUAvxYb{ju zo~IXtuFhGiEE=oBTrSejc`W69$M^WZ6V;oS+rX{-yxNpfd;6V-XGp1(ywjM8>z#cb zrg!I(hC}uYrv4YdP1c9>WY&`pNP8*T5ol?8DI^9t&q0QKC7pTF4Vd`z-L)-iXF3nI z`b2Zyv7dJiw8ok4Uhz8q=&rPqn3F&OFGtTpTkcWlWKYTGuBD(Y>EfS8irG_62wY91 z28bLT%?GIZ3>c(K`(kee7_t3*WzLI+00im#3o2MNfVfnG+M?|maI_>cxi01ts0%d$Sjv(F<0-N%gH{Okk(@4dZu(%+ut0gR9UJUMW> z4q+^Q<0QPq-p5ia^o}pz(|(=5RUj1O44gTaiTIb-n*!uiE2bzwu0=!9&j*_`eN2z( zusM=x5=j#5G&q?DBmh^S53QOc^P%`9@d=0fl&GNnSP;NYf9;b@njr8b=gS%5%VxXrSZqrp|`2_wwd#DOkjS-$6W1$bJvf25>iK^ z#XbZ`Uy*IUoTlYZu)S%T%&4PUAJ8$qF8=wtvMbt0sb=YP3#DqhDBp)qw^t)SOYmlo zM%r6d6PBt)QC$tte8_-894jglfCkQ50sovXbnSr%Of5+bdw@jumH`X`P{C9s0oX!P zglHzS6b(K?ZEx4R(He^QY7EHpe4D}L0KD!Iu~&!YMpB7}%fQ9)gSam#vgB(X`@$q< zLL!ajr8*B;e>y*rg9{_fNK8w-n1BW(y>(vj0;5*i zY?ue3=;OQbu32j5>||~~62y(Fj=muo5Kss-6#_%O3D?1cZ3LWQGARkb{i`dcVMrn< z5-)&A2EYm^F%V`4p#BbVzO2m%H6ndN3`kA~TkaBWlPs|v)$qXIN&V?p--v*8K!&4T z48ZuS6WVe1HHu*?4&DO+4S*p6)L?+n5&#DAory+ZA;Xudi`trygsJMtIe_7SVVsNx zX9An?I#KVmm!3{GNnG*&SL{EP#VAx`>WN@7u<+msg5eE2i|32|&D`+a%=h6_`mPf>o?$0&Y-*?Uux%uhY zcYUGkpJU_e&5Ntc?PTMo&u3$Q-eo0}v{tvTwv5F1UWonO^#qwqH4+bYFZm-8>$0RF zP);X!9$tIUi3%-VU|nDd+bB;QPvO%@`1=9xGC!1ZyP$n!KegBy>G#?tTKIKaz_gGv z=Ba^*mB&xdf?!)KrN(nphkD+S6n02^-g~BUFB8}9hV@fcN)}IY$lCAd+u-~0`kE7k zooueLdo{Z0)7y%(_kvkIo_ojj`}$u*|2InwFu5bcwhf^-AQ}PnQnq! zZrlBn-GF03hCrrL(#gw!81K7Ol)Oknmhz^&@}{>c$sQ6doU~^ex{-2(BT7hh+B9dz zcSK$A6FV zk;*}RXA)wU9-l+`x|?1$691HigDQYA)|0<>0mOi9%BT$2yi{FHS2g%ew4hw+SK{-y z0vEfYvfQ6Ll~C963Vw!YVmq_+%2r()g8;sr(U}b9?`H%%N9TU9aF2p?kturA8o&0Xv|-i9CHpcr+=q!zVxI=^ zeQml{ShO)y+~34F(>z!I+hVapUdwxF8j$fW47j38LXX}*xxz2yjFBQF@#ET3!go>KzEm>AZX|87S1QterF? z+n{Kx=$NetCk69FafFEgC~pPI6EHP+#3(AQz8}C*jg(B|@W1g(5b??y@pFO73R8uzN1#;`N`bZ0_(u*C*#{ z!u@zBl4NrSc_r#z?Y`!Jf5>vaX8y3!JNABwGsN0wpB$>gboIYq=t+&EN~AYP&8(W# zJSkPaR+){6G}0 z3|cPXqv=C@5haicm7ugK`x5#PsyNu!mW!{ogFxlm%6n3FpOn?yQhv}8^8yl*jyqv@ zHFB7CSn>D6Q(f6sfE@v{eupt336Y7Y8Y#pm5?n|E&ezo$!8l4IamFz$*#K1|!c#+a z08j%Ff~Xo<9snHDg#dukB7tL^GXrl9vq$m_9oGa7FpnuORWQ$&v{l6=5g%g{I!M|i z6b(o6y3(@YKI1#)8_CVqox6aUCaBRGZELe6N#Ab>jeabAR4G9D!MQjyd|+4Yli=?z z#dX!U*67!X9wrsMf0KWMN_S-g-IY-5(h1LuD}-!NE#9*eriO~SM3cA2Q5Cy1y_fD> z6TN1a+k*b!lm0;w9KR%eNH+fdz*ht~z8JW+xC(6)V8@x$N7KhBns)Pm6?r_VJ$2pS zjwM!AOapZZBa=hT%Lw}eX1w{JQsKGYanyS<{J&J58r<|W;m0Bmy^y@PSpAO9&`n^Q z2sS^}Pe#_>tl2G*_uFU7{#?(4ofS8l1eDm}#YB^117D=g z0}m?RZ`U)iSO2YaOEZ-uWXZd~*gPT*dCw7-X9>9MH7+vq3|Jy(C4F*Ca6%ZT6{Zv< zdHqq3Ww1h$o_M5a5MHVVcnq#Rbo|y@pZ8$!$HA{J8|$k+y-U`+RpxT4^T~Q;$GhHR zF-O$yY`@L85fxmr6Zy4oSC3@VET__E#_(qH$m!Kq1|jt=sI}uIs>C}@pwVZthq)rC z9N{04F~E??1RPuTycZ$S5Mwqx2kT@s!JGUzaDY&HY{Ga{mv%4t^X|=x8MNMh`%`cB zIJ>!~VhlXJ9}CVk)^g;{Wbc{@fOjDv>my&nb!v$+WF3u&M=)3yzQQLY6FwWV)E6Y+ zP7lc3=HaNH;RS~W_?l%A*cR@CI2I00_ibn#&^LGmq0=@g?gRr}@*I+cdsxnIEV1qcvD|iv zt6xH8Hg2Avq6o>AZ_5z&a4A*(v`h|ZD?kLyWa^i+J)C>NJV`@b7tY~}@B>;v*C91c z1o`!V$$7!nr}vTsaB-=;R=3qmCNE*350hqIBn`n9EcoN{?t5nJb}ifV;uIju8n82U zTEe0tF1G-f|3sUMk1<=W0~-YH1xvtO3n^IwyeI*dIN9Nk5H-ArQMfUZ3=G3)XC=sL zn(H7=O57I(AC~GnNYEdHa@Kj0_VB8GAKwAy9Z}0Yd!0QZUJZ~GQk8-4!1P-4hWn(` zpl>8SFOkU7RkILB9uUpYDu^tQcP+QI(`&gb*mXieX=sPnN!KZd4eql;>x0~!ZhYza zXW8%unV-=;8MwZWm#6bGL}Cb5n|dE8gc#f!9@TY|r^n{8c>C_aFkk9hov(X`R6PUN zB$CLBRuKZ8b%#uECok>evq;CC4P06La_hgg`S;cSG0#GdpI=7U0WXEtnhrhxsuTPI z@iu?iW5eD1z-(mGtM!f5r}M2`i$w{o%ebc}-8bW&J;_PNTAn{@1L@;Lyp<@Bsd8hI za-&sH1dnLrUVa3L2gmnLMT%AdIV2lcC@gxWYH)8jFeo;h=VxPgJV%~jNi5UVF}t0k zudDM}17_|dyK8gJmI`JSQ(dg0`@BC?)fiK5Kvv`prU;f9A@ws7Qt8;p2flXY4D7=J z%th?xm&Ks7XB(^mFD2+bj-ievpUQ{eXLD$HZ{Rg|O8}x6{_ z`z%uj_LrZth~9gzRYf^S@dW)`hzrmQ+H*!arx&hoy1w^SBYy8r6qVsF-fp`t@By*^ z6V-yCcD6{E*H60P!EgG;(*rSij*>4^PQEYYO1{V6olQW9w10B7R!ZUQ^2RB#4@vLZ zWLx62QM1xT-f^d{-&*DH$+UBj)qDv-OiW=}{_^l6RXfDQl5087rSV0V=$&u}3CrF~`$Q})9(mdEx&MtT`JO32 z0PRrjNYO@1l#-11J$O?_2#JrZWJ=|6!_1TuA@vfOJ=jCsHNj@CN5d&+uQWrF&4V|c zdXCPoZ43{2%<})JD=C@1%pLc$#yuAL`D2+AF2aRR!C{zzjsQK7SB)=3F-stz=(8Q0 zeiOx1oTOlBuZ5T;IvUWLVsaTZMoLot*?&TKYkdD z2ThCReYoL&X%WZtZ7I8Uw8*uuDKsRU#~m~z+&nEzk_SBd&0pOJ)~OEIKEQuMtoa2~ zcJV@IfBVYQQzHcAjt$v)z$@_=S|rvmCsnlDhF23`b9o-t_jy6*o6O37#3J#ULh@&$ z%3tlbmDkWJZ%%Zv&fKr*la^k$SSeQNiXLM+_sI@rydHzsn|B<9#8iRo-C|7574AR# zgJN2011u$|<)4-R7=|TltkBEq>!Zes)oJf{R<6Tx7lc7ESn^I@#wSh43QL1_F%rZ{ zihKkqL^l<!Um!hqWKrpDZtMok%*_s8}ePshpZPdZj?I`GVx%WaSl1vCS%G z)@XyD*RRyaM1LT+E&S6{`LL5NWy~#MJ$n6d-u*X;OV5R3@G;C;aU0{^bFJeaepn;E zW$tCa2q-o;DH^|(X=nG-py9?*$0w7ebYzu10d>(5`=|YkJCLAi7If;S~N%0LtQPWn>Xbsq5@eVP^MajRx(5fS3`fWK@GGS z%)#LS+##VsdCNl*fu);4eG&r)tbdp7Zl;?DttrfNPX~b(*VvRRo5VFv|HL*+-jah? z2V-+Kxxg}UWn6>-i(879p#Xy2EJw~2!1HWq;LZ_i;7mDCsl@T!&!*?`kw9L?UM!gh zRU`jb7#w=9&cU#$8yXl=Mt$e~kYktpj_Q0XyZ$+8KVtj__PXX(QD~CVL+Rkmvp=p^ z;M{xvoX%b5-q_@HhP#SB+%a=e@J;I$VXs#7Y+`ke_*Nd#W1!Kc{8H7Eo2}yS@$C41 z8id2jWC{z~yGbSeelzyRA|=A;pnAn2(;%A_bGaUc#yFl#Zu0p6E!24Y!fEl%Qy&W4 zt}5P$7xDH3W$fRBc_=xx9V}9$v)CVIc~-8d@7RQv zfY7Zs-j;$A3e_3yw+ZhilpmM||Bz^=3(0>ffBiao+GLC}5IoJ*nn6x(v&?lwRD&~)22B=q|2pxIk^dskS~S8#5RQN3kR02; zFu9B<^i~Oy#}d{!y;XY!HotG5+4(fga6eFfbjSCCY2~LPK04o8c|Fs=SzrJIhe9VeQBbMpKWP zK@VQuJ^dtXUFytd<(j9l6Q8|a|5{CMqlwWwj;GMr)bqyZSF*{sFs;4JJD2ZEpq%(V zXxUl(9?$*ICfjcxSWOWFn%=~1@0FTLKQ~?uP>o?1gi^L)+7s#^0JRCMr8YY)ifkr3 z69D>NN>M*gj{G|%t+Eu_6KvxkVGzG`dO-EMZ9469N`0_B3prDBHg;G;mXNe@`f6by zZwT#2Z0D717WQv-@_v(Z2WJK686QMuO&k^!rnz6_@#sxVONU2I{#73Hwj+~WO3;ID z?rR)FX_`xYIvfS(V8Vat=_uwdQOH~gQl6wR#=~^R@JkIKyUGa1t%jqTJU|>4`aL#= zEeKMQz2hjN(0@3F%QRPXl6w$KP(aux18_X#^2D>A=V;~pT?g)Y--j0;%Ep{ca8=HE zo{PwlJ)0G`SltB2odGYaosBqK{7<29E0@Xr_%sLo%=c?bb4b_s?hoyHT8nxfF3KFG zTlFMK9(AO5DW-8{r-c<8rly4xyEb?J*Kx}F+rsM~eVsusKg4L*8tMOCx$h)z>qw0c zqnx+9bMJGvgVWA{TgC5r#V%xSBOP-{sxx#Eg#GVyeVt1Jh z`My43>7xPd8EsM6Ip10RUeesWz>ZGVb0XQo>#`w{WPl9RI~*!&z+>p__MlUPxgAr) z81>Z`PdU|T8wKaI3d6Nix-H3U%AEzS%rkCy?)J?MVw(&Iad}R1XS3jG8WFBJtmfla z*yC^%Z_8O!1wBw;s4y>_O4aZ#!hf2F?vg9$Va=vzZqjiG!k>*XI>@Z1U)?0$*`)BU z_%izm94BkeTb6ERprIrQSe<)W=+)D^q5H~v#4_lD6^hUN6Ok|rNB5JI#qCS~0?Ff) zj_u_U-$x3mdZslKhtYM zY%iKOyrion>zeS+O@3(mGuN7!(ZVl#WmgPt!I!Ke#@k_lvvLj*=q&hqWR_3v&yHU~ z^^dRDw!L$0KGL`Puto0+MeRNcSaCRwFjhR#5HCMAGW8~kcOd;}lKo3~>(RJt&Vw1{ zb!20fWxYW9J?es#{l_ujykJNo!yA1W%Qlcvcx0M%d&j?`ju+`)REz(Vy!yvF*g%&Ys%Np4`r6Zi8F{OfdJG(;o`{KQ4~#15##{dnsRX zxnFX)Ub);m_y!Gt@-t;agX5dJp$i8l%G}i+&a4tQ>Ih&O%MDoJ;7F1vU=xpK*GpZ5 zA6Kz&N5%Ump+{%jp7nlo;pF!FOx%w@;;)=st%5KW(sFPDTy8aGMejQh=dh*ov%1mO z^hx8_4R;jxS7N;dE{3e7_26@*21*Ncz_c7Lz%>!JP9k+IA{GE)hLqmu zJ_5|0#i~GTKJ%qsCioR$8(TzUFKl0hR;(v*5Be#RwD{GUQ9|1i}M z^e=nFA&ST<^6L`r5jHrbFc2G(^TVz4s`*kBqZ`GjR_Tl${c%Q-J-c^vnR9xH6Ap_P ze&w;v53ejrzbD!SaZJC8A%2AQ%ab^Z)|{#BSBssj#dg*r;ctV&B3)vUp1Lv~*h`Vi z<;pE_e&%q`fZUL2B5EL7ZJA;LOIFToNrek?ACzoV-;@!Bki`GELkyOCu?Flg-=zV8 z$LcWV`}D5#H(dxS5(u+H`B)(aVw4T%TIhE(pQ@cr%3m2;mq_Mf(3~&ZrrK{e+0;=l zd}%l7-L4z%=j^4@CT$Aj?T+q@^4-NZQ5SAM$VqMaZ(k4oYD7xJ+?xp20t2#na&F+B z^i_NFmZn!{0|bu0)H?9=+lb-cfo~1o3W+xn2>TqsCWj(pNLbwme3k50CX8%+jmlDO zA6ZefQ=RDNZ^GoVLv)3x#lQYwbJqBc`2xgMwr}mEwJG0L6^Dx7;H_=$tzp<^{x*;K z53w)5!87q)-~+Ss32U!ZIeoc*iHyo~C_*!P+n- ztq3o2qkn9_`lbALwuNidOxJ)8#loQ-zzk1a3(r`S+PnjD9`X2dS97>JFcl{b7^HJt znz?xl*2w$+83`oElRuZsKfRsHjmqUh^xhpqk5s@crh$bGQyru;*JXljr_zHHu!5~bkV zX5w;3o46{XncT{h`)~2$7C*a5=a)D2?63~%Mc)SAq8|^}&R!`xPrAUQUv_VmRsuz+ zD#;`n6zLBngy;WJBrjUMT)m!YRVq5V;s|k1)-(`C$tkm^M`%bQqkrJogcqaQ@BVG& zN(1yGB&Qtm{g(>1@tS$Nb!8zrBV*QE^ebyb#|5rYEpd=CIyb;7e#0sz{JFpsZsxA0 zU)~m0=7RK9&c*5N;<~UtmJ0X#b_35CeLHZPYx|7*GlP48UGMpE$g`IvHMzZ-vAt@~ zsrr{HW>0L(`TtW<6$C|{>14;zwdL@$S2z%T%lluJGrvQeaW(T;aD3*`yPjAehUtbvlu8nSH6mCr^8XSdw+9C*M;@^>;Fl}|A@N#;ql^*Sb0rq zS%#_&7Lt9tI*qdsDiSV0HW;_Kmx}&X5Moa}wZbI6kTzd3*kj|GDtRVh^t3%iP&nXz zO=reWZ%{#7|B&6)xx1E_#8M&?zhMzTWDvLHyOMiY^yCeq%A(UZZWS!SoDGdX81^M$ zF&4g^g)dzVCyr5c;TJ4o`j@_}KjO^AX9|CH7wJ3*fc?uznY+xX8c~7Yvyq8XthcNy zfc$0#H;MpsK2~dne`Xi+<_0BJq=!BbK+|ITZ%WoR9G00*T7W>wL!&{a;2U zq|K}4#wq8>I@=QvImo3k-@}#}MBVM9E3Si1A^M!HjHi(QJty_~G4CzUSknOSrBS8<{%^VF#Jlbe$7l-}q*Q$im9US}PA!y%J_@U*hg7 zimK-K#g}DZU;dc&y$lr3Ss@Znc3)OU@3uO~^i^FlIAj8Hmg-7^@nRe1{n=}?Wy{7E zHd}P3kNp?#@~O^IZak%5&}4y}n}?@hPm_~B^grJ-@ju^Vza_>(ax4&Bi<8`avD|O5 zT%R|v&gd`~n|EH_HWp)rctZMtlt_=e7$ z)M+;5K7-ptahxX|Qmpu^9nNepW!=K4#D(pBg!(x7N_MRN)z8mDLQDT4)b3IG8g+Bf zlA`TAq#aZBZ(pv{{s1FUCk&^T6vKaSiwyjnJyTlv4&+81lDglA&ytRcLf57W$hGjY zSJ-zA%A$B4vojlsDDI{(D)AX-F?XGq4x2k&WTM8l!e%b#u|1oY{bn1P1$*Rfmddv9 zyN4h_J1@@Wpb$S9LCXqigko&DMp{lntrP5fN5(2dlb`RoxEXe+S74bYPn< zIxXlf7AwSZ?Q%Km`UGgtG`*C5k`hNbKoO;kvD|N!EYO=N1nxfY`lV&1Ljv(is$e;w z1*jp_U^(yKJh7!?GjzJTv{;|BJklS_bN%3T%#yiW0l{U^o+VL=edJc;yu6V&5!Q%- zyhRaF<;Zf4WS$q5CRS)f)MTVRu1M30_LIe{A4#->W=|*fEpFZwAW8!Gmy{wKJaZ)H z2uRuOnqqi30h|^1s>eqvK`ttTK4nkABsOt`c$kzh zVg~(E3H+QdxNM9c_!2Hs3!8WDv1V>yDO?O+q!*1+?lH1Ae6MZjs{YYs{1eAh!XIBD zFlCV5=5ms|Bad=Rl{?78A#IJEA1v;~mr?{vDfRyumvRrG0A730O}d!vYlXmVwrq^d zYA#m4DZa_k{u}%tJ1;S^lY3f#UCkP)e}3d8@<4~w@A>l^Y3|v=F|?7`>K&L~M$)YR znAbQVRc9J(IWlLLa_;!kF1*~Z{>m)nm;7<=b9-(>25XtEa#(D`u8ktFND-eC-eiev&kaHg5X4KomxkrfME%^PUS}nz*mdFfGS_{9PydnIM zvaJRY`QgKXk`R7jU!t-MNUZqrbQs(q*zgZbw^_yyddxXt)LbnqQ1>#ey)HzPj@`JD8N zs?f675^t}Jc!i7y{@ela&{!PXDPU;R)SWz`@s2$OiC_}%8Frf{n*~LyYY4twb&}Ym z^z0_%&uRYn#o+egF3R*1SM~@JAkIRSuXe^2!oy zDflBPk9VqarnimJgY>FWuI#^Cnsb`C4$Z_Sg3Y7r6Sh`rhFLiQ7Z zrHz07gb%g{te!0-XY6A4R{9{_Jd*4B#oW{V0EL0KhmW(I)tuAU@p!|3$)@-wKVs=; zVO?j*TDbk!aqHOQ}Cz*jW_^kDD?Gn4E58iXW+W+TU^h`kqv$ zW6yjg@NtP$-}OYb?d!|BSGHBt<2e86m?gH|t7iE0fA#tM$sm~<@RnFv^PX!uV#M*u zs^WeL^WiuFLjIol5oS zkoAMm73vYAU@rDfVm+Fkr%>sAG|Q5I(25*C%=Bayx#xC@n_L< zzcX8-IY(R0I{WF$c?^6^%pG~XRsAFI(#;DnAxli{>@)M@_!kBneIem3`k(*%D08;T z&QtDZ(eURYhl^jEc7+AslQM2N9Q^)QPhH@!QcFg?kFtz#PC=V+er)zj6Gf-K83l!u z`?9TlHf4_d;RDMFm!Nc-|Hn)wM?&ULC=2 zR%6%rTzkD%{6q69y~*KeMzxg%HxK3P^Z(vO^#ATZrMNYMX;LrGd~kx&!Tu14habdj z#@kC5gp!NbbtE*jqbj8b8>F8+aenRm>EIrOT&mU)6SUlwxyd_M4|O~`Wl(E6x_5_! z<7@rehaP=C7rqrx#xHH0J(x(F#(e4>;|5f%sBx=&w$BYWxE_)l-S(3kV~NPEMDLRu z`sF7#P=8~c^6d8dFON?}XWToAI=1SnLR*R%p6<_1ROxv3ACsu+n$jA65Re&jD*9rB zq}CttM_#vzHiq*@de&OUMxX!E_M&S%`OJ7~80ueaw{XkoXjSBQm*F}Gtux0S*6m(f z*Wt{>lvI5`FZjZ&?&w#^lRCAC9e6M5_mgjH7M3W(d+Apr6eOcw;qKs{W)B}YdQ)cN zb5Fig=h&ONr{UzOnvvaA4F}IuTL|6KHkNgHqDsRrO>AuNvp?DS93gf`uO|1}uW^Pg(Y^n~ zZ=Wx=7CvuJ%pZB3cA?tOy0{`N`PH!oOP?qIF?M}g=s0}zS4ZE`vp|FXKE)L`L%H^i z^q41MuWLp2o%#H>CFDP8qr=x0y+$4hR)k;adQr>yRUs=^QE6R;IjFI}_VFZKnWLT; zQD z+W*O_1B-z4&x0;CzYV*?^@&D^9s>RXyIukc%mw#c1c; zWW`o<%$Z*@$_?;uv#CxN?yXhKDgDJIW96F4I#SC)pZ$*cUY&=0mNevUy$k2o`Ok zD~Y(!o?VIN6j+DdCLg=9zq%qZ!&i!HdThd|pK=?g?wN)!`|{@NsS@|LDkYD)OaXFs=Ex>zvvHzbRJ+2JY~&BJo2fCK=xrL8tBi zX=?YDyw-#tbsTlV=M_hEkVKptqe&U5)_wSxyjPd&+&YS4>`oV{KLOH**3e>9f?qc$ zle*2Elg>TP1K)_z15@@Nql6DAH7wMh)n$cceQ2(!FYaIc_F@5S7;Lji5%}9FX>;y+ zWkd(!yANwmN%6pKz3MdN$oIf!N!RLIZJ4Tu2gYX9VOWnX^rZEP$souRZWlKaNb&#M z!S(~wH5d@lmlT!Spx*+3Y_ifyQq_`1!7B1Fus8sC0A$@K;4|Q8dq1Tea&!mTKS6eP zD;FyVHV-R%GY1bBR!=)yv-mpues)x;N9cD1yDVz~!r;Ehqg^<)#83$ zJH&BrCEJD}SQ{Bqq)TT*Lp@;-u8?2nIRDwPiG&L75Al7&13y_DuMeZq!}+|ytbW}; z(0*#?SdZQFH(wXe{SW1cA9QPu_p3271&l&=NvAM^rD$+#;YMtbz^4E(7zVOL@_%n> zPrP*AC=~#(?gItD`@dUiXKrR?%w}b0Y-!HJYHnw7o{f}%qnR<>5H|q?8ZJC;D3Wt~ zxFAi={GE)=LJpoQ9Vw>g4;Dn6ji#jFqTenZp@BYanJTXYR>lcU3|OCs)(K68bA2VS zpQx)VtP3ZeI?YHSZnwVzyJ=ZkT56JMrU3agZ@NAVEIP-=#LMcDI=$>OeBR!thb-CC>|}?Amv`)YGn*LWK~-V* zqQ}VO{S!m(AHmiL4N=dc4M8gt^BhZ@?dk2;teNQ-*Qn}%m>%fb?;UZ!I6iBOR$fW0 z?LV^gAnc7p8>hKz^LM>bK0Nbke@;EIIc^H?AKP`~xA4^Cb5p>steI3SRSw=Mp7>7S z_s{G1<`*%gtNy)wJsfhsnv$Ay_`Y!nn3(RO-N#9bjTQWrlA|QG1oBeX^sebG`1Eo zp=h>2jxfZST6I5alipdILf?6tBHsmhBi@-8r#?h^v){RS)8FZNgWf54KL1do3J1JmT8xDmSbvj`!*#r$7>(2GXjGBLhXE` z?fl?hJ#1g~I)*(w*>c&_(NN~<0xoRJ*dwZN@#?6;XqLe#=bFn)yyq?m4}Kh?{aC)K z3r`B5C)=|d!shJ;`+m#Kpy@7@;XLBuT_}>DF#Npn+XN!vrf#Ui=fiz;=d#N$2J%C# z@whJkn)z4Xvrb;{w8>p)8cdxmuD-k~2EK&wbB+DXz-zF)Zhc83HPNH75OPHQlQwDD zot&m<9ze%I9J04DT=|LQC2gU0*e6}H?zQ*8fWX|H_}oGp-xkjH^Qvp#YL7LREslX9 zg4RM^qAkuES};C>0k~h;ynCmlAz;U{A@}ZXC13}?F86wTCEyTP*S)(`dv$lV(!Iym z;BejC5YT^R1diUCG}tFM%00lSQ@$Hs9)2co`1WkMOn%E&i*Xk)DLT?UdU>#A>~R+` zy*UWZ*q8#Rc4mWNe3-y+?df0)cNp;2xnf7I-f%?A*|Ui~n&EKOZl>{GYs#Cuy}CjS z(}mbSRZwfu(&N2YTUR`jdF8%0pSFMO*FS7I;_t&w)yjD+jfP2zb%se-{q95lN^Qok z#@|fDsFZt@1~+N(O&k(|CN)3h>*V)0mdE#<&uMNY&b@9`&!L||=OoX5=cv!k%SgB8 z=lsvS4+K$z=vZHumHG2C_mLkHD2?eD@SBo!cPwTp*JZvUSIAb>1}os;C7kpz&wl=s z*ec1S!~BC%KGb-hC_lLp7uiU{Ib@sa3@&Jm-gndvS2V(J%nsYXf8(=n&jlu{iwBBB zzrl_>5`L>lpU(1LEmbW-tNjk^vimapvf#2@WiCP{8gcv*cmL`2i-|20#^JC#nE3sg z*uCN!?qxrBCHAJv9qXP;+XH<%`&;JG-v>I+NqNr;`Q@SU+=AO{_Hsx+}iAGF&ljS}O zi@p+)g#6^kQ{G7<>8}$AH~mLNQUSwnfw8mfwnuQ;Th~E6>`EMWp+&M6%fEQ$G_kb1 zYzPA{-(v!m_6G$)HuIVw4(!DFm0uzwl&eUN|C?MGiqX9=5(?X=+-pt(1L*Ok(e99U z%fCG(fBU}G1_bkNhIFF%pkzEVoJ%k35G>66))wKG9&YGbh8^XY+dE_2xij7q2-g{X z{MW-F|Au;p_D^;Xoz#UqP!z-D{oFIt>w5gJyZL%e%qyBxx5(vH^ee*Nhs?Sd*`wvo ziBA{7V@*#@-|dZwk;O>I=$o2ce`|*xf9m%X#CbmI{xYD;u`MS zqYu~*26Q3$v%S$jz3$NUiJ@-62OxIAe5gJZU&r^?1O{OFv%Fb7W$v)`IRphj`4hiY zTtD`7Lv^EkkUsfccL#1^KpsYQ-5oB54(52nzRvB*4Fv?;kB<(8|qVsrB68lB)oyoXcsZYgaI9@7%i|e$FM>-1EgtG_WN1iVAWN zfS@b}zS=ptc|!ewefxF&&(jY@IeyFII?|k6>(SHPKOKA(SmLb>*h20mfKW%km*>s;N$sieTEh@@E&6nSy(JMq zyi-Qj+@tPi9|p#LF$jf<%7rCa}&3PbiQ+QS9 zd+T&kekBHV(Og;u6pjB0n0){ai(GWOdI<|}d>psbgp^zvqAEYqv0c7jy9R*caUa3N zkVbX=*ShKJe|P@S%3@+080F+`eycT>(Acp;T)Y10zJ}Fvk%Bx@DJxG6%70cGz%BRL ztpOcx3qIUmt3uydu$I8dg9QkmVrnze*QmU81IQj&ZQ*{zwLkV*%!T5|3m%deADy`P z*@<)#wk%h(|5!#m^KorPtC>dQJ33@3tDM5aju+Qcm6f1ap8tEj6G0xFD^K=gucHM2 z*L*0|ePV55aO!slO56&*u(;5Md69OHfcpiYy|_Js1E%%FXcbZfj+A@|^~8%4e}+px z5Qs;}u!rmnElO?>w#3*JegO>a^DLANlSUb1s)D!jeZ8PDr`d7jClG!cp^Bs8OXmyL zPKGTA9XHp((csU;56y7-BI~p%Q1CKZ5&oE(N>{_F>mFZisHvCH()+suasDSc#piCe z2-7=(YI<>9l!BoZ?IktTE9{}T_kQw^Z3;IR&-gK>Qbafu#E5f`?wZy7@lw^T^tmFBQdo6khnjYhbR}zv+Is7{~x2~SbKkzie z`i}*R^8v^N_?W4j_VfXzZp%N_!ykWnZcT3(bflndPT|-Zh zp|4#TGaL<%cok}%Eoq<3_kgv^jE*^Q^v1tY?}=ew72quABAKZAi;2Q&gH?wlec4rB zon{#*Ey;b0jprq9#m-L2Ha+EkMd3`kDdSt-Z~P-{hN2frlFpxAU_)vXeu*G8Y$XHW zqgqn{J@(}vj8?>#Kx64Un`mwq5#U%c_vTs+L48eQv04u9q^x;KNAR3pGf+=_C zChA1?0bDa`ji;;g7vwbcSy-ZB^PNNfpc@*m(w;JeS^T03-24RGJApL1S||aox?UGg z(vbK%Q?rz?qFAQ>jSTVV2>M9umpVL!z2(5H=L=Qc!?@l+#hi@QG!?a|)1iEe<=L5? zy^*4!xZB{sT%|J;EPNM!T6nKd&j;hbSjM(@JA#BKUJ~+Xu9Y;zcQcqYu-k{{tIJt> zH8|j<%)~5I5pDs)b}KD2(elji9UfIic`M)OFnr3ZR4b^XprVjv+J+|UN9c=}ISPp8 zzf_VR0e_=j@N4$dq$U+m&T+N)ZyxVzK7UNz`m!vqswL!fQu5TbHNje5%m6rSe&fmd z=r~2S2KfQ5V%7+$Pak8eL}wP$v=#maQ6p-E7tlU5FB;n;TiPG=1~Tl3&|&g>|0|6e zLAd^kpS!wkGlr7=-G*JIK0`)S()a<|gs0-v!q19|v-fH_a64Z0UMl-uM2Qa5mQW z!oQP1%kC8x7xx*<1K!M&c(L>?_~kTX0>%exQ``XShOI0vCv7oL9W~4kvqJ&?m(C;NyNif$8PE`OUuQ$O1#TQh>v5xu>8cP%6rdXNIXz#MCCC^XL=r z#dX|I?yO&y1Ped!zT%VX9gqVF$Po2<4eU7F6vb&CMj>yK&*>{eO6s8vFd#A&nEFer zoR%Pq4?Kt+h*c_&ua-e+&A{0|Q~x!X@OR(?$<2<&RV9}|@%gJ9DgxmqO7R#mh~(#~ zrm+d3gMd$CTP9CXTC#uXGFKDPjtJU*nq8RIY}dPD3}3<#!dpcIu3)sjBJ%7@Z#fdh zx1{-`7d{_OiRym6EDbTi;)j!ydlLbUPJ?0@fWEdY2)n5WCv6PYS>HyM$3dC672U!0 zrrg(1&nj+UO-34$DKr|Tm}0AV-aOGs4r;%%;Znc6;ga%JW6sTQGfiW7etUCKj;biO zdDL1`kjBeX($2*I6FBF@AW~dJdLq~rpQhGUJxvVi@K6)^o>i>FvcRJ%_D?N(!A&~y zqJ@u>X1`^Lqj*gZ?FNr-!NHo*+uM7i2a9}u5;|+sect?Y{DOT29ih-AB$CWsa>Cw& zR?*o|VcX~bczwh<1MqRRo}A;t8F9mJ$dHk+evGY|nibJkwCyrhTt=P4p70xcwxzg-t?9>I}$zNmXzx*9+r=>c<`=uL|_ zW5>XPYH37$JC;?nZEQ)GfH$`JlVaW^E+Jze3E#j0mI=Eb6D1TCa9VATMXCIXME&L8 z58X}^=5u1H>NQ(>Yf04ev{;T{5)jEF-)T-}@zDS9Fbqlyqp6x`0A5G&_=n14qt@=` zPyH!}efOw!BN;wb<@En}=)1%tr94$xZ2tAuB#D9oh0mrhE*bjgiVNfMW7;(p(JHB* zHZ_7ro0Z3ntLHG?!dm&>i1am4fF?IoRT?#l56_O2TwT#`04YewbhtrgzVRF6zQPz& zH9uXe{r!oIpyK9Xo4_T1IcYpvtG%S+-jfQ@3}N*Mebi_K5Sihi1# zzcclCNGQCZmK9m;5KF5 zz%y2wbZa)d(gFoch%4P`L9_{WEo>U+q=xx1B!!;znC!WH36K_8*=>$KSa;6SA<|P- zM9nKHnCymz?9>o)PcE_W8$Yzr2L;j@9}oTSi5Bc*$YV_UjBc(QQ* z0s`&+@c!Kqw;#0>LuoY^`6f9%pi)R`d<+|Sbw^$Sgy7_4qdv|R|* zMzM$rGro^uq{1daNV16UTQLt&J8`o2#cq(S^qTkhH2z^k1A~>coU%qX7)sRxib&R5 zvhr_T=>qS>9X@mmox{I@|L#&7fEC2Eu*o|XI{d=!Mkd6MO|;p%!?-xoixxx<6b`Hp z%1kIFLwbq`(f8qII~I!Co)1oroFY`fOx0pW`l-PiWNOuUP(<-`eyoL>(yDkRNk0N4<#4^oo&wMIg`3 zP6%iUJSoYT;13^gnw^-)G>1YY>0@MmcCLX*=^kIlgD+UjDzlPyURg0-siHF4v4#7$ zc$_*IpikZ+xhQaGMz=uSZaQWWt@dv`g z=OV~M=I=tf%F))N z^z_rK=X(&FpwaCmwRsX(A2jHiKx@w~fjzE8E;!x(ue36TXfX(-})L4CEx4 z)3}2}0#rQzPxq1MXjKlajl5LSsu8K%+cWe?tKBq153mug3=?sv#MQpBE9fMG*+fuSOeM)Vzfas2EKIrWL7)iUxeUK8q``Afg z-jKrA_EgUBgmCMx_#XxlvuR}x52U@!)ejw~+tts6=?LoJ9&WbP-k->trIs$)8aF1c zwB(VfNr?W^!qqV-d*447lXR`b7(9?dJKpE4Xhh<~u3;qF&KhCB>JrY^=4o2z;VpeV zk(CrgqZ6+jYUik^h3$u((Hze(a@MJTNZ>$i-=dyPYcIEt3`fn{28mg3!i<4?GKiGm zULOEagjWAF4r4^Q`-l~$V3ad8Iz&oQ41qD~I-lPH|h{zugrC?22dQ!KGE1_weg(%(@9 ztI`%fTPT0R9NT<2Ni0h}qe|BHd(b z%)uRI=M4{!MB4R1AHzkY#2&-Y4#$UTF}XiyV7O)RuzFCx>I(O9Ev# z^w)_F$xgN81*!59t_VvhC$`LXPZ$B(1-`iG>0~L zd~4iy0wWDaQ z{z6-Fhs3rALlFtHJt+s>Q?*UI*v;q0AQu$mA2|K>?0He2Sz`Ru?_4Aw{0&uDgw!jC z8)q)|sJo=Ff&L(=N2xq; zAmu$6!deR*f=KMcVjR|k4gFKl41r9pM*(zFH6cX|lO#6l0V&$EI|#Qf%R}uGy%su= zB7q!({upt)o4s+4w=8cp6aPvpzbE(3*UgqEP|6uFqADNeS>1jSwjLQFJl=24nJF4Y z|5we9d>>bNizWVn?7@10@InDD{QlF=MbK}g0cxf%gO9qBHmNMmq*ocxSHJ5%BQ^C# zms8}W{NN7y)vkbdVjY}w`|snIghzJ3x5&r*lSD{8=*;gM8+p)JnV_AFNZ3kn0A5*+ z?_Lw$#2-}ZDnL!=_hM#vm#k&c&-yxQkw%x*o=R*nxb=kBi&`O1l_?n`u1~er=V_|4 z_G|SsZXLs#K0t0rwMUFGoE^kF8M4HDHk8@PCa&fmkZ&u{a69vo&+x!@LyXId9Q2bE zgN#jm1_ApnDk83_4f4haF*daFWX!+b)KVMZdL_~T0i;cU9$iby#Jm(R8}9fzH_>Rp|HX*!a5B~J&<^=gWS8HXo#&~pV< z1V(EdA8U+TEcFro5jEa7>AZxI?YU6bLl#O8c`z&LtGhBmG+{W2Q$Y+Q8k zl#>RltqM`O7P^cse)y^3uF(cpe5{CnG-hBI*Jx12!!Z<0na{JzjF=5w(;hqOa?%$* zP~=1E3x*98NpuwTNm)mCMBlEz2pCCk7;i4XZC1}zqBfCqxQnpppjs)O=MplrO{fF3 zm<1<@`6$GMV~Pg#^w4%2tgN7K`q6dL#M~z;EgaVBC7`tHj;SGZN;9vGMTE9nuZ+S` zLsn2J&vqG46dKLk4AkFmuVsd0?8Hwcq&5p^kjRTlq-i_WY`dc*(wcj%J(A*$B?4kwsf9+r=o@hGjC#9)1T`_wQR1~?=PjFH+cL#W*Lu;pmXjZL>+(Wh}RgvA?rYtF@$i z8?Wucn=#`8_XUJUjVHe!&nadG=3=0&LY)};gyy<$+J#YweNSt7Tqy#^+!e)TmByiE zFL%92vAQ*wrmm}_yqguS4fT5mAxXJ@!6+4q7I6oiFvR)*f7E(}^Bp~s92@28^)kqH zLsK)z;G*zA5w5VtK+L5q(WoEMV|7b1Unf-hy>K&h2d;FKVLrUmP4vP5Pyf66P%JyN zW??MMJMpiyF)sGc@565iIw-*V{}eqC2M?Lok*dGp-KF-}Xh69BkzByPd$sA}pyp{+=^6+TOeK~Z zv1T>Ka~CFaX@OE3K*J701W%p)55t?VcW#1lLlZuSi9bfPn(%rB)u2Qq=v~KOw6$V~ zpzDnrK{cRf^5NcgCTK$hoJQr7NQNm;R4oz1;P*hw@|d9DI%c zDZWXqD9(2{E@^q*VqA&ul^#+g{lgI|k=ch62SocrfeP;ooi%&e}Ypaq-@ zOLO7%Q28h7QCJ_Z;;y51jNXB&-m#ljiS52=iL%=3e0qF--W2=lwDf3kbONOUrx*x@ z8B{=k4r8A>IK@lUgYP!wXkDrly-vH?!t4&oE!osN2+Je0%dU)f7#?jJ)4_i?frP-> z;la;Piwa!rh3GA+-!!iFAsuME>WN{U8T_3SA;u{2ZZ=vgz9x1m2=3PqcCid<-SJYQ z*znXfOojluJpCgopj#v%*K#(cEOnVLx4wE3Tm6iqjbpoQ;SCh(ff(2ZmyASH5$)A~ zHoH$IL_IE&X44`bZCsFx#Ct0@gCSwXGw%a*MEXV2*QvuU`gk$n@bc_S5q=f|A=u-x zDIsObx)L<9AQ+hvewGePnzTd&j6ry?Qat%lV%wzVa@T2>3dxNI3|cc!Gxn zb|0#UhyKiO|J3gF_e?(;(yH1!_GgeOTB-sa9Igu`+V2v5)rIRFTOohS5!mQtKflP~ zdGeJ1F@ttZ09~~AuD8olv&}bmM@fALF`R+tA7sp1U!wl(E!FQ!O_V=AUJbD9ie_GJ zcub|OLkE=%cRkjpRUkO*8zPF)^PB3=@0YPrKGl9n`ZEHIY1W5weqgG;?U=KpU)_T@ zBa!mDa*_oV>EYjp*vo@f_Ep`~b@d$4?T)I@U%YaLFcxl1L z{;S&}A01|O#cjVq@v6v$I|~JZ+iY!q8BMIO+f_8k#yp zDczsC6nu)|PNiUFm)Oxz`{#QJEVe2QN=h;MongNkijZ`n9)@@s`Nh*}d?#+}qA@6$ z-h$19Exey$e>uKW=qza#0U;R8-;2I9NiY4g8;^P6Ch&{LtVH3(XX^f1_&;+lU{7DW z&Q9`cyr}K}b6eXk3)>TRV>O{SK{b)OM1i2U=~Gqf|Ep`w2eUt;GQy|b8DqVPm>;ul{8uVh0xvLj#u z-E-qUcK}!Gh{I>L>$Q=JH<5ibe|)cqt#AIlS9Di*@d<`^!=uA**!$QY)X%^VlIP%V z@sB<+W!Mjz-Kb85mSvhGe4lJ7Q-{RU<+UP0Ud9J5PKE~;PLxF?J)&2dR`f-x#r^SxzWI|2$%@8gQy31# z{d6#mPq;EcK%zRQg8ILF=)`4M|ECYVlEyT2p-59(ZZ#BrmUV)Xv`?yD{5wrd7;U|N zDQ!iVTD?|e0&DNLMU*Wk;;@=lmcFBPtsUic-W}6R^c}w1$5zt5we^iY;&s*?h`-oA z-Vxdz_JLxFWgTS=y&VohajdhN@X7GlZ?7}8f*oB1Yoj60b(3JzW~8lJy)d?AmOh9R z9WuYd+tyV5$7!%`ZqvSC;mc$gZtpP_`PVZr#{V<<2N^QW=fCYUplYL4p8*R1_;3Gz zo&3YkYH4K=rK0o=4Vmb_Vra55Qji2109VLv0SWgB01$;XHbZ`(T-3fv0;;D-P9P_+ zmJ*5*06<+l%9}A9VB*8l7YoZ(I13102JN7SQuY3Y=1LtPACdD?mIwvieiEM}iAO&&$05F6ra zRSPjy>brPrKOc|xk0HdP?R0(%EAe27*y^^j3iPLk7A+O8x_`f(oHh)DVW#l6Sz2v; z++A1#SQ#7m-3sQ3n~Qub7DKV(p{{@Fb;d{6z!VsTkqR`j630>qgjP{`&OGWccZNDg zU_8T7K*1?pwC3Yl4ugWD_D5%UJ8EyP(Zv_>r$9&mCl6i?K<`eL)si?y+8L{HN!!%6{%TU$Aa#XX5WKW2wj ziWbSNu+NK&8Jnz!GA}vU?EudNLR2YOQT>?fS14ktawcy0JGm=wi4dLa_Dc^=<2ATK zqYW#@UVSl2K2qmMwniVBZGDJA*VfH;>~Rv^m0u^?-YzsV+TP~v2zvkF{O(s@@e*?w zpFus2f&2PUkRa1vw-aP>o4FLZ)_c5iqf)bcd?#mA;v%WckqF%<59bWqZ0c9pi{RR7U@!D*-xIcis)w|$WMvp-5r zJUMvO=Z|N+(m75GVE;~^I?1aG#xu7yV7yk;X^T;z=a%@{;5EBJhd#=i7ocQ-#B+^d`GG+s2Jw>B*?zTvRiU1T>9QJ?8R)>eziqz6^u}iXxX&$fE#4P1x2hM0 z2%U=38$lj4%NZ;!)1lZwvmcEOUY_O&a#zDb0G?55G!hM1M-C|G%ruItAU?pXp+(dH z5mSz{G;QB>!o;df~HXq~O!^>ZKgxqi@sm zv<6FSMVLkAO4Yp{${ZkDFgrmWsIe23@~XD**-&Mqn5m3p{#9Alo)sipoCylr6^q$O zsr#6-b^A^VpD6^Yo3TUttKWuom)n#V7+mybxkT@w#--QLOw}Yfuke@x;hRVuY3ic0 zAp=-JGg5ahMgOciGi)lUy5&+XW}R%pRT>U1vwUC9zfs(D1DCB66ohxsWXjdftw0Jx zbeC&7o5FF>m2sNzOK*!+y_F4EeF2Trx^a9GU4^d5FjO+;r+(0sTv@x`5UUoUgoU~^C&}6)2$<|toC)kv}F$=PSJDtNVI3{Ynz&p??VXDhEU%kY% zvG&MPisWg)UjPv@HM5+^@r_oURu8P2xpUQQ^_w)KL2IgGyt=67mM^c`SqqA4U1l zEpAAPr2<9j&z^Q%R_i8z8{dmHCIaJme1IbdCgMJgfQgDKXhHKAXQs*u^WFvtn5n1SQamCPCxHsNJQGCiMVXQE`F5dp`mB^(H$#{)bSMKG~WTu1a9` zYpmnuS{D(htN6H94GtT_Z3Du_*c&k%g;FhB!PO+Ob6HadXt+e85ZtJ_BQX9wiO}Sx>X_pyya9^X}t%H z!@C2~l;feP&D4w)mXoo4di-wQr(Qqj$OFfEfs??VHaT&qld3tnYB+1-TM)pnpC&$x z6#v6q`wgA7G6Mu~DQ5C-|56P~y~};Fto*|RN{7XX*{1ILcsJI@_cvPzt}P-^VQYry zoiJw(&sG*Fk-PP8(DI_ZaJ)?mo6{HzBUMUmjVe41HV0b7iE7Vu-Gxn%9HpIw)c9uu zoUn5+EIO7kSN|ZkPz6flX5J8Ck%MhB8#U{EQ-14l!VZ^Y4m4^93Ar>rKaq-|cmZN4 z`%9mfRqMhUa0*a?X!`E2_NLl;zg961cYar?m(ZsT1p|pnLWUi%snhozvW7Pjn+x9DozR~8$ zT?(gack5mPjb{X5$*vwZEd)F$0CnGva>kp&+wJv{g;VWq^L;)Wu^?w%+XQE>Ju)yH zsAjskf#H}+^!bCeUql+^=9pW@L?E`yP$6>kg5-mXwmGZCA;4e0#p6nLCyrPNeJQ}! z#`8$p4Se;ftq~RQhQ_KP`KK(d8z!B0gQW*gyz0uX9>Pb6N^$_F*DD2jx55o5cijd% zKH8O#0bYug?MN%#6sXJArk~m~j+N+yr^_!A0I^%W4!e?>CUuJ9C1ZB-ZED0Di$zR< z?N<*MFe;VmG1&ZYwiWjSr(*yq5wh2l)a!`$I3oY)w3y0PwPZP<^FdcgV)fH8Ud0Zz zPHUt1Rg1e9e?D_g?%k9T@k`OcDNQooU#_MZz zc#QeMR?v9JwVAXtRh^8@pJLL{(=|iO!A|taX=`HynzsUWwDl>F9bJL!BEyB-PQ8x8 zaUoeBS09bnus@ILls2iz1*OL-0-YC1-Ym=8Ii>B@4@BL7)^oVj=!8{pj7+#HMnPAnQzSo_QQZ!2?&54Wf4u;>btU&bu&rTr)eFz zSa#kb0GEx1>Q_{LYfFNTezTIbSI0XIYSJ!&rtAudVQF6I(h83ecR7(O2k{ODEFR|4 zv+iBG2kq!_T!*dsX%2)dH}&+>(+fW=IcdT_BXkKjL*uDiFo#K z3wkAJzO@rY>z5Ez(Th1PZ|`-USgipwnesZs+i=k$I}z}3Ts;z?Myi_(wym4mJdxv3 z5fhp(Y)^vLWorH(kh3r3^~YI$lkhIvWz4R|wV0^XBEmYn7k$W8va+4ivMotoN0<4J zN1Ga)>!mBruK;U}xj37}7v%zJUlS$!6rbDWr0RL-sv8I#OP@6^%X!J90@d{!t=<}y z?7g#V+qgvv$H9Uw>XX4ZDtao{CvvQ97l{FCmuD%}8aniN##HMJ4b3sO7Qfno*e~ViE0<&Q&W0%%G$1R6$LCWOYr%Zr6&J4$ z1fxx&L#pW_$dv=qQO? zc|6W*4ebz8l&?eRV2@i_hTe#?r`~TQ2doTxxXzW%!|j~b_9zCnCEe#kngcH-bLMfW zC(A14Pg#4L+qjTFtA$X^WNooj#3V{k&M@?NTs@IkZ5AYFuSr_(BQ{E9hrQN^Biyv! z;Nmmgs9dQdJbde;6IdSj-PSde2tIRmBJO#bOdJ9glEfh;pb~j0SIS_a+I_d;?8*hL zg~yW;q`LnRJy-D}-+8qkNDSA<+8VaUj@sF@&8m^ASr*TO7~rIylrpRTrLG+h1aB~w zg3OUkV3p~#d!A5ZVkA76Ki5XHbbia-At1pR{{u=T`Mdm~oLLRQgv_9uXG?jv@78T< zYk%y$w%X`_xk{^EIN~SyQBerC;^jpw-4=V-1iCO&829?(Lol;XtIJ+Q|YBuX9^fC#8#+R_L1_ra&Uw2XVbu zJ-V$u^MWv??+T0{Ro64ih|-BaE(Ro6Or%DaOR5OZz@EiR zP*gD!1GqJ@ok=sLp!IXCKvyt3cxBafaM1w*6YSd5)Gr|@nZaFeDC=LyO}f5^bi)@O z2(UkBTG~vR74Tn_x4$IMJH6dBhOC_%jz?+-(z> zve~c`bc-=R^__b1H^XYW-2w07#N~;Yh)mpM7*4xtMA+ySjW$n>19IL=#Oag~^qIur zzWX_Q8eHkF5ELfkHXq7sRj@W~clNh;5Dd#>jv^f7)6vivch%m(!@?soZmYW)+Ym`A zZd{tm(B8vudPXNIXd_u%9j}7r(b^2AcM9#`R>|&sVN?07AZ#RzN@rp5U0PzDTh+cw zSe0x(wvc+55sFbYnge5!0NY_^1^3|=eU76tgw0RYGD{_a6! zd_YTAfA>K!0f3$s2CzKux&Q?r=@Fp&9C$Dlb$1mAt}xaB1foy@*!?ZDE5sTACI2SB@v$zz@di?I3&QN`xhi>%GI?pa|I>Yc6Dq( zR3znPxAQgFT$4d|jFIJOFuA&|MGm${27pUKYYh6#_nw$IhooMQKYkIPLA=LGPK{c*G07GgSK zgaVMO%hnjfdhpggVxx!w0^g6sdU~gAMi2newHf7dw2o^V=y?K-(sL_I`|lOCT%D?7 zN1ex=Rl$64-q@x-igxW+!Wmt14jM-)Oz8wtgWaKw*aW{*MCUbr=uToEQ2k2@WCi*x zEOXmmX%N8-`(NPJ+9E{wQCaM+wZ6A+5wz$DeEF%1aC}KARMpjS2yuh!FE3sZj_!Sk zUk82GzkV=L$tz07Eab?F{$z8=86mGa!;Uc|`nNQqlLH2Y-VEwl{d+r8nF)GENzgg* zLxHR_uf*2?I+Rds4zp%*d#50Qd`eGlg~B>(mP8Ehw>*d7&zDW&bZ`**cEZ>PqmO zxkJv#_o=;w$wxEV4`sN~6&s(+yb^QNzd6xPlZiqVtXz@wy1-{W)ty!arS$lL3!oevqf6_JDuss zEcSWL34Uy&_R*02NI*Ekss-heT62*450XbWDaJj~MAer})4L;Ln#~<~=ERm%9#Siw z0HlQjhtrGia&~m-vA-7&Yr<|2WJ^pUf?oo@-Y(sE?84qg8Y9d6tP7GJIQy)Gx@(?y z#YQa2WasH27M}br@iXIQ;ScqEPuQ=y07%s0u`tG`-y%+f*}^%Y_M~`vRg3H1LSY$$ z@7i8o4(PjIa?+mz3lE$UtP2zGv4p-+b=rE@oB0WsNgP)K*sFN{p-$%npxd;^0}pf4&wIpmMWlXicqWp7~du$S`vmDrbl*DvUA zA-g-ebJL9Ocnw7&bMW${2F?~^0zo5P-9C`@^G`tP9^O1Ag`DrgqXCk?- z+lY1zmemqSRe$O}!D3S=4~cfgD6H5I2jl6-2_;z*B4QcOicl-^)^2U&KWl=P>?dp< zdbQ&{Xu*qtpST0j_;f9ts#!XOD^1Fm)XQ1vzpX@mjZ=i3V6MgqHy~FkD%&8Jwqw9s zFS&^RT=I8+`|(;*7`t9tdwwD{JpyMegYP>K8}Q~J0}Z&i&q%IYC+YqW(zfC&zZeF! z_yAaONAxJx+hJ8v&xU39q6TEN$6r>cgWlE&YA6JUuPctyjw)ae_qywGvUcqYn$#S3SC5U`8>l3gVGWFri zsN%>VnvHX#gpHgB#%1St{+NfJZ|AAd|5i0O|0qL|bz}-DaCATo)w}bSedeN@7-G(- zs#9$N%NFzhWVA_8b42p5B!~>7f+>^u8%YPqtQOqn$r$S&@eWI@S7q2AA%04fQabJG zi=&f0WR2$=2+VZ&jh{Z`=}u`;){4s9dHVnpF#b~f6Tg0x#pugv`fnCxV)Y4sjHd`) zh0C~do|=4v@>87}SkQB0W~eDM{vN94_?j(0T(81^(38<@R6$P`ds~OSRXxZwphQHx zg6gF4zNRsIHd20kG@U;^}cDZ)FHP^%;iN}r}0u#kzA}d-v1~huX>%pR$A{%)}L7ZBY?%Wh% zUSCdV1+A~`mq?so*&@BgVrfQ-1u@2*Z=xX3SNOTw(Q91hI?=(DI@lv&0f*T=s^L13 zEW+{rN8~m4>%2Sh>^VkWV|B9d8L40$TsfO^zA4X0XV})t1|0*mXw)^mJ>nYhb~ba% znCf+ea2{>_EY^)8uEjn)?{m8;1Ett>)Q9z?0L)i>Xe5}3jK>vc;E8E5$ErDjSl{ED zIPM<&-BLR^?)BlsU_WSFnbEp|Y64G(s-&I|3+C?0AUaMqrdi-~Ub5#vbj({*B3QXC zcafVvaN!QCk0(H*b!X`kE!+3u(WRK1E1R80uyOcYRvwYICc2Kw1h)=fmY7@MtRQma z)v$>Dn$Wp_R!yB!uyMcI929Oz-$L-A`(j5ci^!{gN3i3Bp_Ilh=34tt&OwukdylCU zr73=3SOxZ84$k5Eg}n!(d24>mo4|!i(BD-<=IQ!1nTf)g_5N%%@f(%E5$8U`#Bz^*UN-^OvruIiA z2gy#cbOEgNxIUJYRL{;4+U-I*uaXZPKl)*jwRJros{&sQ-s=8ycrezIn$fi3pTLn5 zk~_tqH~Sj0Lq_BWi&cRaac710(|@LOf)9G$B^(TXvDiJ92qw!2KN1(3QfJX=|526d zF*UEoGKSuL_V^WvXi#jg_Qd=WIaOc}E6-je?fc+vQseohRI0#UuYpe(ZP7VcM-Zjz znjJEuj!=rpinwqluVW)8a7{&^B0PQa?;oMWA<*K!GZop267SiA#b1KMhNfMOr!ZsU!jh-kBtHsXpL5NK$B$#?zMwy367H1x6fg^h=9;409hdSGB$- zgm<@mYg7w@(8LY$*WPrTgAq4PRI@&tbG>2KSVbkZ9Ji-FV-gTK&CEEyQZ95|?=+F3 zG%I7x3(;>>7ay{yP2J_%%bPNEfDCE~N?}rD47T1*TM$?5_oYDs8zvBn%D)p0X|V|1Inb%S_8)ii=i~ zy2C-{zD^M2^HQ$@lh45U=wT!+;T{uX1nfqSSeV`mw=G%hUN6ugW3O~BbF~)uiqV2x zzUK1ueqyhyZZ%aXWt+zdo+U+qr>lcyX|nd+4K2#H;+TK=YkE-soE}Bz^fh%`3e)fH zp&OguVu>zSom#hM5tltWBGqa%7MYE@Cj{Gp_Fa;78J8%d@GP036LN%FgOQ+n$x-Mj zbX0$!6`}cNoIxKe z_>*m1swa1zsl1x|KntvExPi-+qv^~Yh!_$kkm|=$^ZDPuE0?@5A=0jH>IJTB+{BBE z{b>AF(Gm-s7z`Qz5$V{mmDRQrP538gt9$zVX~#!WeS);aTNQ$C!e7zHgdwFiPgMvW zymF7_qW(RmD)(z&8p!6Gp+9`@bNL6~%{eNr7cJJSu zdi^#@7S2l1INfAs%daS6*OpOSJPtm=>o`tmK)F zhjTK8obE>CxJ5<*${e@gU=S)3Rl_-q@oqb2VMKN%H_Www2(o{(Kdhje`}QnK+kim| z_&%z`>#-EU`$!EJ@ZXxGWOFmgrrtm6x#kd0j5wFnC(69FdM&YbE$1wk_)IyE``Ut)C&Knry*XUvZ*`I2#6l zE-$zk)@N8Emi#2UbJUuke%PHD2IP|S(eJMO;p>p|{R=v~=B&wYj99}rM@y~HUJb^m zNECW^<7w8%&g!tSxpM7Vec@m&Gf~+J$B?@__>DE`(Uq4xo|PfJ%vReL{4t{SNJ>_6 z8Wg4wMk}i@n4Ev|f<@uhvz`Cib)1E+ z;nsuUuFD^n4Y2e?g^?*1KzP9t&W(riRKg;`&T6ecZjO-QI;|d^{@-y^hF~;Cqtyth zcRlVpz;30olxj{iu*}c4VI+Doi}-~WJpJvpsw;ovxV{y*Xt+Jb=|+y(CT)j~Mv84k ztcp%APrGkLB=JOT)lmgf=8QT`;0!v~_lZvLxCbiocGC1{*Ml)*$7T17&4DGUHq!k2 znAdj?3hVqiuL8OD=4(1ctDa0rjT{>)#gP55y6Nylwrj2ruJ~Z5TB7Tu53bxoR*f89 zngA)a%&+WZ+^~In=^mWjdAXc3dv_mk_C%(RDcDWrrR$9if9DNp&4|rkJAGPM+g~ub(ohv_= zhTnC0JQOI#>p`XorI@8kepfocd&HuXK7F^bT^Bv^&YgX)2d_;!;H?WnJCuk9p?k$g zs9tE?ar3Ipi-xlOw+=1`q9Q}QZ?K&m znIgBDtni)QTmJ7s*$XZ*v>e{?nGL)__PBA(4chL8I|9ilV#4q0g;KLbz#}t#*^by= z`m(|AjkiP}V)$zwlPl1{L>?Hme%6#OV+{b2)<)0QpcPuHoq^}4tGXidaxoQZKsJ_W zsd9T+B3FYLp@Zch8E^359d?YD}s#J`C4d8hX2Ku3zsCq4p1{G}In zJiuXGk(BzVbe>j3;K4R4_SI{(4ObCmhDXaKYS9(Ah>c_*TQZ$yiP|_$Jg52&+o}>B zDprd^*+7j+(1|o_CDs3U8E%q`>`g+WNz}z_=F`C`gSD_ zD#i0X>9uiJO;CUR>@%Jruf0)Y5>g!TuK(Hn1lIV#`n8+dE^BDI`aJ>pF8Ua{VasdWTiO^wy z0q1Nf+9To;_hWer4;s#7g^of#%yg*ru*}E1t^8SkWtSc)JT}UNgz%(Ah{Tm$g!DM+nAn#~&W%Q*3 zV)?uP4shQfo-_38b!}Ygsu$h98bU4jl1D&`VYRA135;lT%1 z$JeDTct@l0B_Fj0mq!mMELOf$hp1+mQqWs2_NqHhryP%&gBN{NgH*G=h%(<_Ll&9f z1(lo$x~Tb62q$}wzhk|Lk1ee5cUf5mCmiHc1-+W*dAQGH!(C&|C&;m19_Z}K)5p9H z`5I*2UYqtVQY*^N@@rALl`W~@W}(YL8X=MEiD>aTVcWB}VRQms(Yz5 z3x+A?mCIEvCGO5!kM|IBLX6KPz>-0dKLo&%elDwKm4;vaLBWirU+@tAePYS)3xvDa zL4w&&CXt1L#f$=FMK*p1>~>q0e&F4lbI7$oHfm6BMep!zJY_lX<2zUQ+q76TgpG-! zR-Z@NC*Op#lz|f|KFA^4m1T3Oi$sXM(lUci5b-j*PZBGe6`Ff3N&_L8Z}xs^Tt)P7aPM4>*JAHv>QCbmE&+} zW&u;!irV?5!?a}v#De}j9K&40B=4jL)Bt`ZeMQX;B-Ij7OfeU)pmFz`C#RX%O${1L zIi@g@!0@s@WMuuo&v^jd8X{`#FEA;4J_4qpzU89@=Cmm)wo65%fo%ntUQG4j;PYK~ zEOvlt{PJ-GiBFodpAeL)wa%+4&#Q?%=Pz-G8JVCN_`ZhQA^Do3L2ff~!OQ&7yiN_RF^81n2W@(7~13Du_f z+4HK^37hTbBE0n_ctl&K91xmnL)di%6@#?cwVwwzskt}|h=g@$Js)#4UuGzsI~XhO zK&Y^wdDKj4_tNT?dybwb4V|tM{)tl}_{nS%AI>ZS+>t{pnR$U6fM??xNDuSE6jmmi zEybXp6McYd8EOW!8OkJ0c)SQnU29ODzJHcpDPmKt^7EXfs{eu8@&xjV@`bV79O4XX7i$vxzMV z!bySC$DUqNy%)e_s7*PV*Lh{)(HIJKv!C}#8U;)$H^MsSVN)#ww78=Wdil%q;NA*| zL%fw9>8t1vSMn60MIudsD69Ol?kj7Fxy|;fISOvMe8pB#9a;0RI64JrC1yFvMVmG;+3ug(1lVufaL40$i0yX!!&R2x@c?^=Y!bq2y^{PDn2^k7fTJS)j)*rE3= z&eP^BaQtuw(O2gDN>aBeHE}1Dz;l%hWM<}CfhkHrc?xG3SYvIW`fmLCck%ZI-<qbwM0AF?M z->&1l>k$^~dn|KBXdUk(ZK&+#V{|Ari3PO=?GdBEu*APP|Em z8Fu+wN+#)S(l))a!AWFUPvGr+Z@EkyjS^BUV$V_bz^P@yU*!{xz?nVXj&$PC#fRSa z4u|Md#b>GDy)t3$lbvZN9-QTM>Tqxt| z+DUjwY}v_!|7%ITD+O7i%{E{m6NwChmba7YhaYO97}~!N($YvV4Isr9xNo_@qwFG7 z>mJg8yFYk@*%76%Bkry@eG5GH3n#i)ZSSjR2_~xNVF|;UfoXEmQmv=H^fu|87##J{ zS)!FJ&+VCI7PNuwpJp#t5jtD+yr26-M&{^G73Z3+iSVPx=ZHDwbN?Ui=iZz5H-Co9 zwo5)+&c~t3wzb&6HZ_)x9TZ>J-dYc@lk|q-&HFOTdne1ydrihHM_O_0>C94ln1?*1 z_;pc=S&wk{CL4^Cqv-QKKoGzmnDiW$YGbo~>2b$Vir$x|M1!q_&S}PPCfV2;8E(TU zWF3Zk1ncmb^f!7d9V$fTq}TVHQJQ5P`J-`UQ~7HRbyEjpW}ODtZJh$1V(ov*-1@B- zb(poUVd@rdm}Tb;gVr8}w-z3TSLS%K0-Urf9_AiMhxv!3CrZ$T#S2gvLJ~>3z?ee< z(esd1m$MS=N>J&-W91@Bf*xngA89PZFLUKjqL8lPHD2~g*C$d%8MNgr{B_2D=xuon z)*nrRtg2>6Dys)4bp8Ox#F`ODFI!m`!hgz#{Exfj8w|e~c_=;jiw!4W$co)C4EcEZ zVR&Q7G5B~*0E~BuW8yI6Yl}I`HO7KK5;^Rd(uzp3K$1w3K=deReo-~M;+0?`30J)m zDxoBijMpbi@N1Mg?0MCMeCZ-xcR6Q&8Xk{7yfpg|%-k6Xv4yn|UsMOnkEFsNkF?Me z2E%XVBKdYNvja=k^|cDT|M9G?@bTzR)X4%V4$7AVLiZT2trjjzmPKM$^9m@}Tbl@FypUWJNxTkQ6pOQw2o^4wrOPxC zdj8@ty9js#n|Qi5J2>?cBox=dX zguo1s6ebK8N4l_Gx+a{S6G_*FFGWE}6h#;mgq|Nsue!p>&Jm%@ttA&p*N>|OlEh)C z#3@tgRv>mAt>*GT z~eBh7<3K0B3mPjRvbNn%!_0c$XdAIS-NhRKa@xoiC=b$NLO*IFG=T@rE}== z^mPFx(0Ai$_;f=stUQteDdi0?Zbu9(h`cgZF50KJ%=gXpd3(k-c)s6k7=;-cJ%eYO zd$Qydl_0WPPylv4KM6sipb&&23Kv915~M`J-+0r40ybyb%jOA16hROs3Ks^&FkZ-Q zDvTl!Va7qyvx`gx(h6lCP7@GFlMom$zn9=w?rz8TbFrci+#Cu6Z9~BqGuiE@@?nZ^ z)|n^XtWNhTI`g+-OW>W!n_%*uM3}TYku`zJO%^Bu6GDOR8WDsbcbwD+AtQ+)yTyzk zDp61j@u5)<6Gpt!UJ(Yx;ICYm?!=*6Z`8t6OQLW@VFdJUF%U1WCg>Q3J4C_o?NMNJ zG8^_qmBM(B^ccD5AAi}D*)hM*f}QaCC`*`){h?WyS<$@~`U1#cf%E$?wD5Z}_vw$NCVj>D52xAmT63LlhcOMwx z_k|Gj5H9P}6)pRxYc0!%n4mN5}z zCvXuqV1W}x5zq<2mC`E~K8No7Q3Mf$u#s8!Tu-6hJI^W8uq>krU7gpccX? zf^yr6h(-t|hFL+d!1=8$RQUW=0~doihPgx#g$sjXh_}3OwBjhDu$wXX{X7!vLTwHF z<_y{{C4a=K<2hgxkPm?d!zZ#t`pc%2>x zIlR!h09dGE!K<4hEKm`l;Po)Nz_e)+VFgcaPzj(GLM;FmK1VKm3FG_S^6h(CjJGaH z!gMDFzsW|qCkyHBMjN_+g}>50D|EBXYX2fwftfk6?Q{{WPi|TyOC~KW#yJKXHic9& zfwrP(Qj>#)*lj^e_jXD5cj;lKpu5AQIWpq_ENF8m_lnVb#8d#a8#v~KQ0^&{5k(-E zh++_201>+7gNtGU-2s)_q@diwMc=12v0OuH2}@y9P$9|%|1C>rVc{6xP&eHnP!dBH zL{->AtyVr`!LowpV1Y`A?|EVK``YA!7iv8#Y+m!Jz;)n0nu_0_I>ril_=#`&ob$Fl$~k zh0P0@f0n)8DHc43?%X?(CEf9-#gCx7_UJWN2mGFg zqwV3BApFW*e+!SqI>Ww%T6WO1L20MyUP$R+l^Z>EIGAEYy!DoW>*McLg)4uS3bVxo zUa%ti1uPY^ZsE$uAwo5q-@{4A*^}CCgl?~tpu$&fog}Eh8Fc$3NB&Mv1jOXtPei$6 zk&|bH-?_L`ZUrfHQTVZ-dzJ~>X}S}T-NYvU6RngsL_0}4&JS3xa5!Efssa`6*rm_x zI|;sC5p97IriCiiWU*jPkPBI<;oa440e;V_QqWW$8pHzT@PgLD?rGJ07H=HXgWd1S zZXcE4Et`8%BWvv};)-e?@SUNX{pfB*_B7z)8|;?MGYH+fNw;^>{iuqth~7b~phD^i z-PBSoN`cDzpg`Yoj{HxOA5$-HFLJMmH7f z9gylaR1vvwv<0a}`#b)b&~8gaDmXQDmx&dacljv$2I1H}BjZ5LVdA1fg4ZGx=?O)$;v~ zmv6G~xv+H8Ccm|p-?bWzqDGNp=~i4OF71&10TBGaO%Mu!V_I-+MwI{U5Z+7BcJyxd z<=^$>Z^nDDu|SnujP;2iDI(7M7oogAW@}Tmzl5#zblvD#!TY!TaX`i z%dv8+F`_z9L@5wLE)>o~3sFXS06al0h_F3n`||hH!cavtfxef2uLh3||Hf{VM^Wge zdAeVmDucE{DJT`uh*(J_^jZRmg=@FMZ{Gd%Ws7oy;rpIvk_~rNj87L_nv#p_#n;sj{e1Te>UA|Sku%7cHU8tg#unf z!T6o@?B;U11z8r9?zSaS*^Cf`aBHzBtSBxyR(z}ghtC#4ah4tn!XFjDVl9eF;&Oqz zNBt}Xs)Sn7IS+ZR!lOVFyQsj5CSp<%v7(4{S1FUKZomg47r=g>Q}C0&eZpq9_`!2; z*2&UYSgdl743@-`D7;t$F;ilPFA=jc_6$0Z`O3SJp99}b)hheHA3>~R4!(~2nG4^cc@&$yRm>7-@i2KNW1 z;z`d+SnYm>xv;VICaiP|fdipw%3}aT`123wfe+$*I!sg@x0*PXKykIrF>|iqUg?1@ z`tepR@S~w}x*q6$-U2*HHtzL@cgL-S6K4~^FDwDx9=VjwAfqSV_kaI))0vaUTRJ z(vlM>t$PV_uhGFMZi^(a2p792P^|6_-qiP$u#{5hJ#_;NTWk*@vFQ*HnFw#9Xf*W? zJ;%bFc)x$`{ll_k>SgGnt&01!;?eUi_%knvqD!@KtMd+AZ)k(vfr;P~l>-gvPU)F5 z^uUfT2A}LnPgo8$!R&EL928W1E)8#rIV7xE=Mv=F4ir>GBQVdF9~Fw#Jw<8y5t^RN zDiEc9d&&XvChMtH= z^E}bxFWiEXpzUTS+`W$l+kT7HsOYRpxYpQ)@$nuL6ZKF%g@rwd1)&EDJxo~9xl(g% zL~$+`Sr%3+t_TwsovUy|dLEAme=5@>fnsS%EW8Rcw;o~7KA5s`9|Xl@KwMS{geT_0 z_%*xO<2h(9Dti9N!^Hdk^KZk4!{_`-mP&uA2KdqF<<318kLIzWM|{v+R)KN(&~fVy zJm~6z`wtA*<){O{^LY@PQw8PM8lk572HZpyMM2F8d;6aBXsn(JOGpmxLib8jxV123 zaW(E09c%-^Z^o2smud0Q-@@tS)S`7zICBS&A1I&3e zF&aHqg(gSqsd)eU;RN`>pWZRF8w}k$PP<_D;a^8AbGR|f?$~3AN0Y75<65XT(o;=# zWAl0@xd@utZ!#gf41f*=_QasW5m*pMqTwL^?tFF?WR_ottnym+AS`-5R8?&YG_>Br z=J_sjEvh^rWJoOy$8MjzL+l zD6l@x`MV^XRcOG;1C`nuaEpBkX+Q*ptdAgS~t2K8u}q zh`SH)yE~AJHQ6&f8@BshfbG7C;Bht+0uzfMGP4q5urqr;?-Io3UWS;QOAw7j>*-A zbwdYK)U-iL$#vLyDnoG|JpzYj=%dHr@MiOI#rx~Px$w(Z`oLR5rrF67eD!7icJHLI zt9B{^J_+&Y@jLtxJp3^{{82os51fNdN6)kWPcOL&S1_w>LxJfjiVPH%;%nPYiB=6Q zH#!+j?VZqwG_>7PQIDB%J@#8`WonSCjU7;Or3sRXuEEI*rLY4Xw=E!DaUMZ44${+b zXx70^$DW*ce;=_Fe)rZuc=@w0^W-9b^2>tl#|y@<-OWUNn&R=t4e>_~@y8DFM-TDG z5Amn;@F(?%PwOH0EQ#ivM~^4sk0|1gDdLYR;*TqOn&S1Eum+z0;7fSvlQ9)?5kLLK z-apN2l9jt*y+_D1@g76G_r@)UzxEkz_;Bnp^)pVt&IOZ?-!5=I-Y^^cGy6^_Jrl1R z@%qo*0&fnU4(|+_*_voDJSP|7w`0K!^^eP4{F~-Eo&e9#Gzds2{HGRgvdtkFy2u_r z9=8-enPk~g2=JO*RNw9eh5V1bG3CL_cZWP!zUK^V^N9sV-}vvecr@}d&H4Zgowo@F z&f3s5!}dTJwoLy=E|P!T1;zZAz@p~Ec#xe-T?1jUi$5&Kn!3s(>>pCR%{~`krQ0c( zX0->VuHOw)*6qH#VEX!llB%SptKv0$4Q%(mT+zuAeuw}l}yS3|!Ei=fZQS@6k-negeDxzKO?A{a1fsbSEJ zl@Gq0v;M~T=fKX;Lhy(x zgTrx^a4hj6_$FNj|I{lGlztUXWl9f94avL)foWIZWb#GuzEB1Gqe@{{SP^^H$&7s$ zy83TVZ0x%`F6A?)lq17@+UDH^_@%rX&zA0%QHAiIBf~m=Hn*VJuFsa}_Rp+O8OA$@ z!$$7}u*aCQ?Ihwa#iuo%@i1a@5WKy>6JDIM7ydY55Bz?@ZukSfJ~zn?UYP0*FHG~0 zUg_`n-5)0Gg8v=oioe^%zI$)!QJCQz1|AW`a5n1-oX@X?3#AQ^R@n&A1vRklL^kx@ z6k_=5Nf+);AL@~q*x&Z-gGr8Oz|uVoyAP4D zbZ;0;v=4$$S9!zVX6=WU=N^LIEB#=g?HL&F5(~5UrNY9)naY!G^`36apKL2Vk5hVZ z>T=?k^mN-r_&?L!F2K;O;qcL_lkm6Mhv1dj2Vm5eQ<&hSz^T+rkaM{i;!Enl`Ah*! z-W~s7z^)7FW5RCDJ`C_f`7r)DmQ3vLEiI`T+1EMoYX42AV5XBlEZIrpgh4Re>NvbQ z=K%b9=6-n3@&t@_ie^ugH9p~%gyLcuAD+q|psIbstt413L;HkV_Hl!o@rGCC9E6eR$iU<($h+JEr!%Ty;;y)RgWVEi!wrU) zS%2Ixwr}nYLrb5Zj>y$BlEO9YNPr5CI+51!B?+d-)h3OtJ z-XRncOKPF?dK;|qNrz9jgmrB#ZTu9E{a@u`_{Ul%2Q)40zdfpP;OYbLrKJn>U$GB* zE%kyo(OE+S$6K(BD z^UsmyqVdN?S|RkmW1VB*A}nHse{JB_7ZVW5xR`{9uA>oQY5>XQ4nG5=kYL>?#GtRRt=f2eA^8P@-7$ z09JaIwCF79X}APEOIq)F(vnaj%EMOKQw+<&8ljfr?~AC?a^c?sBXnB$z|wg z7jf75V#`Nz@qGK1o$ZD{4ROsV>$B9|@bL_5_;`^Ue7O1~^jQ~(g2kh|P%J?th9DF@ z{F@%Gsx*P(gTE2(CgX#@C09vesUQ5!#6mZSsGln>I!j+HtzgQ7Shb?b4`AgF|6YLc z`Gb`wSTih&r%riIpfe7@cfdW~BNz2`VWpY=hE3A^Hz zhkq*~VSJ)j%JAGo}#~MR{Q(-rKo#q8m%2!Fmb&G+ywX2x$X^?{usxlnMm4W{jhg)!b2kA36kIwP*MJwL?x ze8bz5Y~Zc&YvHqX{_KhEBORmBU6=(bVo6S-#|jecY3(EsW_`*-!AT@^k=ZA<%T5we z2_`?WUF|CQY3&+UaiMzZDp4?#r?m@WX`eN18&U}qcE-W`*hl=r`V@p_UWK64YUu9} z-Qrx?tiA!{>snTyy1wKKt3decz&Y^I;{7ndHWd1AI*Zw1CKF10q&|CP0vTPz1j6?w z0trsi6-nhN$xV`@i~=c+65O<25J)SMD3BP|4@ z)7zzoz)snd2%l~^1^ui;;8eyH*b`n1Ble_aJ@uy3vDWZk1Gh)rrAO?)KG6n7(9^{c zdMqvz3B_4P&7B~QC=!34gG7Ny99bCSBlihO94(To${0Nt$kbH~6QP7>R?A{> zq3F@c-3cX$WqfeB_(b=$n7PvAAAPOQfYa%GIG1-F`frJRkXhC81G$)=>|%Y*@WRmT zk)6NpH4;9xJj~`rAjoC9BFRE=Cy_vGUIeXB0;0()JT-kB_Rw*SP%5#s zBC$AS6iO?WiBO0+SBZj=v&_wlz@A}!PJ-4m#4eo8i!gg{0>l^B!RQ^acUP1eUXhFY z$t=0GH-0{RTR8mm<ZFSokX)&N%JL0b0+Y)5`<=si6UfsD2^nM zrnw_=I3$vcA`qeLChZ&vT8u)8A{m8xm`H@FtGHlhAGa(&>30;CtW1} zXeg?={X4nXzuK}tzV;7ecE;WR*~_287{>^hgzYrVK%x?g2_t}_m`rHF#gQ>KbJ8mp zNO6&#NGOVS{si@e7Sdz;)nXZ&JT8(pM)9VPp%Ka`7CDL2y+~XrJ+U~_b1$#K6t_ec zZpQA2fv}uwFv98lgCl9RU#-7a-emaxxSg@^gXi96Vomo*h3WXJb&e>^I{z}|RczX{ z6I>XDK`}%`QRMeV2O)we=EPwF$>Jyip(q?vC!sKkK%%20H>rdYnmmpoj)<;M63#Ia zJ7mVW#ImqMQ}aaTUuUmr?S`MoGCbNsna*U7w3eT}@+nN;dx6bDGUq_LzI(b6ND)dF ziBEpP-DBb+(LE@Nb{3NE1X2k_@F@U9M8QxX>9PMBk?862vPfE?Oq|5g2<3=wVj?l2 zjI)mrY)%FFncFl22{9F&M>CL62s)j41;)Cibf5;0K6&(vBUuH%eP1ulflNi>%^gh}!gbXeGNuL~@KEgp9TyBq9o;7R5Nb2@^$jj3^8_#yFjf ztp z0DqL_F~2PGE4}=)zxBaRbUvHwX9cG8%4ACd<|-lLY2g@!NMn4QzoMohoR>nMHERGCKS1c zyM|9oqX>krSo1haGsgwOg4a4o*F`$w5L_58l;|QwDA`F&C|!~C-9$~ER;2EPQqK+1 z$mV}=L-8oDnCqFv08b#W-(I(!E(FW?2Pz0gQ#u1u#EB z6CpZ8^Q`L?S`>t5z6A6j>k>VGz9;SJ?X$X-XT{ z^VgMGwKfMA!Ls8;cU2<^POAye!UH}RLo1A099bY8F*qa& zpNUKQEQ-SgGIfsP78#lxiVGwPBf{ejo1cgYC5we3n4h0W?H+EsnFDlD$O3B5=~zWW3wf`*P;?cc8b)D z)v4Zdw8GHTX=+jUtX@W^aMYq`=|&tZc#}z{Pzdf8J;!jg&f(~bV|?$)J{#vcQs%7F zKod!^nYs|lH|XSsRWOZ$l%ZtspB6p_!`tIGdC4x41XBsX3tbcf-M|W-BNx8WEm}d0 zbJ#HvNEBHZa)s24>5D=zQLvzU;ua2xVB#9yqzU5mR21bs7QD83Gnw5>hTiLnl3_$U z$rMMLY)YDNiV{Jozg!8Mg9;#|&Cu6kZ+zXZ0gIei*2U2ly!ta2!C3gpXITVA2#z3t zA_Ss!ggGI&0Nf#pOHhElf*6V@1Qs%hz}_R>iNoQ7FyzmQI1J;=VB9gvj9~m#gdBr~ zZxpCShJRL1R>dZ)A~MwzRPBwg#lA51jgc*Zxv(exs*iW9dPLMY$sxI-(38y2!6 zgbXWu*$G-lbSDHyD+q@>!W>3{&>d!+q7p_Bg*kY z5x$5tIidKzO_kAai>kR}vB^Kzz-NV|f)rn-1tA_fTVyU`W(qhOaODZ& zwy;V-;c}FMq=TkHqkDm(L@Nr? ziiNLr2MHp*@}Mui=fY?OG3O9MD~eGVBg`>^IDB@=hs`8OD3ct@xL>GOl0zn({pliB zFkT4l5Y;w1NUD+ay;zW1RMUHE3Y|~!sd5DWjIhG*!StR4cY+#IS1|Ax^aNn<@$cdk zpP~>VYC(*%P!i(wo=glbf_8dOGs385o)j=Q#V4Pqk2>R0&QT8z5f{P2C9;AQf?swE z_|wL+rP^{F4}cERiwab((MlY62<-P*xJF16HB#lES8|A^@HH?uh~U04LGV3~9a{7R zA=ILvEBNsuqAOHjxo{Lg@bx5t@6DkVhan3h!o@KMO{#b_4f6^)-`Ej-1uVR=km-O< z6-e{4((H|Vg|ujFJgg^y*ShgkT8UZHdNtd`mYj(7_;~MTk7{ z9Zg_IQ+?73XhXD9bO2P#=(kcq84FKa$mUS~hu({y1&r|lw?**6m$xl}e^-$9ONG3z zs?SKbP7q+nDq(Vf-D9{J3A!7rWmF7@+^|{`D9Luk}FXDU=ftp%62rWtV2Dw zD$QKTXDVb9ze+2m$z3H8jRl}BAXTB7f!BUsaZJGPwSn3kq8M64G5BXyp=*#t5hvi4 z3Y-Ly3Lh)7fG9$DVkpRBa6!65oEP>awk}FymX3}KDQLo4&;}9sM?Ohz93jtIC{2SY z2#L_dvb18_5!z8YAZ-CC&4wOwAwCT8cf9Z)R`A4=nf;jPMi4rFgqH*H@Y#cEiS3e5KsMVk3dm+UM$T8z1iKP!&QTIlp2e4T zhNfCRL(?te0aHbIT(r%Q()m*T$;u3ssznW$YwIWB2PmpIFd~&Pfe;ksjLzo`Ha8vPD%%+u4zgw>>*;I z66S@F3ffrn^3j0Yd34^Agrj|u0c5OD@-&p`SB$e3lZbpeYCf^6 z-aO+jyD36C$6#gCCPMLtoKA6I%h^F`F5LTHqm4&;M z!(*A$)XL4SfVzcHBeo=3xajMh55wO-8*$lU{eja#d6n0&fIC=0(=3F1+RKu9NklFr z%|^_G)R`b&H90&YO#>}Y(=5kFHaR?RT6+K&+Z?=L_0TJPebgd9F1*4h$ju~&PYln| zwhZdZpbwoSvD&^He)QZs2^KSLJ?*2?OCd0+l)0s}u2Y_tQkqIq5fKsHXcQ6MC=19% z%wTa*BJHvyrZn|3Hm!1eOhCGuw4G13{1d792^eTio#EPNisa6COn(z!ugOxT8 z@Y~lv4Yjb`6SCOqKq#EgEQ4e$Oqv^;Ph&|_O43BM;$*bS{NS>PDj^XzqrWgcG{r}0 zx@F^B+~mj3ap3^gWRtmQ~*^a(1K$21gbP5dX<9Es{~p$?D2!$ zhfcr`o__~^`*Lp^i;x!hfaX-)e>w@yBo#t(RU71>J7|hYHpwg^%^+-?RF)=#Rb~U$ z%=Alfkg$%+fC807>|m!0$m_b@WWL^O zIJzRD8}l_u4v9#J&FbSqan&4@1$T#@&=2EjRRUt*to7jG9SA>s@dGB@n?oiKv8cOY z_yq|^c!s7zUd1&ym0ZqZRei^OHm`RrpU)e`6P>7@u-)iJDK?5ts}LVaNWE;8+(=EU z93z>Kf+M9k`7oq2KSpk;NatM9pdEje-N7A5AJ4jm{tyLB`^=qpw*zLJq5+q z<9tyad^mO~?DY zg&?p}aB?12K?oG;Nx{YcaKb8Z_Xz=;T}R;;ZwyiiH~rwL?=j(KZ$F_3$GKA13aLex z!1hQaCLo>0Ik*Wv9kVQ=YW{6mNajXCOr=>x`0V$Jn6jYMG!sTg8sUPnKBSJAkAv7W zKQ4Neqo?Rrpqg9o<)W>y#>o@*quYMfYotoJA3Xmy-Si>No;A((uu3?ZK6%BS)6m#< zlg))~do&7a+U`Nyod?j0Xayv=fLb>)AyGgc7sUjJiHM>ZlN{4#RTNNkBhOkXPExbV z(G%$FKu^@iVbrqiFk{_LICeT3UK%hH=%II_aNqmG8^A=PW#U@5TUz0W-2n;E(oUI8 zDs1tJg8KHm(1C*Snemy3qL7HTNo8?SBcjoXh#(|2tE#4zx*g4g)a@WAN^ZQv(8fq6 zDhesWW9H++-K~HkJ&lS|P;(o`u5g0k3%9_Dv+*!&zBT-&_c#;bzW=*d9>}s;SS;TY zoTw)paUwbkS~_mQ(TH?dvo91HZ`@POdf$%15j0^s!2}d%y_W^#A}R?E7g9zq$zh;? z#*7tdxrZ6642sAFt;G1q&#yj7v=!k|pp03sGKfeOpc6iyu@NS$aDVRv7quKfCH72thT5oouh}mqK>5A(uOgs_w4ETbGgwUjl zagk7BBO!|^W~+M6{8=n48H(5na@fpPHexK*%uuP+2g zr-1F=;`roR*Mu{rDj5Hp9z`2xs2)~fc=68JyW8A}p`^n!vfw%jQwwL8nFC&*b^+-5k!@+Q9 z#cZ<^o65T84mcd10jCm+paGpof?@f~0!rLQZrWV&1^s(op+ zrE`yk+vpj|X4pS=E*tLNyASstJb;_G??8IVH3&~HgHjZ*7Trj$6a`d^h;F>srNl-( z0XbYiYFee{wM*T9Bv8EWx*wvLO7ki@lfy(cLg!*tpkN|g^efGGU^~YC>6?$jB%4F9 ze8&lF77HOUrwkIZOJV9pcldnv7U(m>rpLnl;7`3^#1hAMWSR7raVuOas59PE;kF-- z!x)#u#*NCZHZtcu=mNNns)VMM!in>_n1$BC#hPYlyLFd|q!m#uB>wL`Omgl?P3ogK zQaYPMVoIo7DTv7-5f$;Ypm;sydfQ#ds%&5<<>z64coyagOLq7{Y-TB>6;?q~UIiRF z9S4J#I6?mf+oA8Atvwd*S8tDipa1#&tFk=imp!M`UK+O0?$Lz{O$VQt90)_Pn%izc z7mD}bfdS*-Z3wzh2p%D6kdS{7N>SX4wJp$o`z~Nh`Vaxhjj|(=M-`Hb$pjT$Nno55 zW2A`Kymm*)^)@&hnG0(VM8NVrA+Q+B$ofDScAH8etF#(2iZ8?I_-vSJeE^0ncX=$~ zzW4k)FnO8t+p;{}FY`9<%cc|0k1E{pm|O@+Du#0z6%dnM$>Lm>!2qZsHkbD>11*6q zUNPW{zss(;4*3^rp$eVY($NWbP@ucmY-)wnBD#``$_4FCR6-KdD4f!N6wz^}#C>SE zaSsZww!+E8a@c%45v-5K!McOzVD-K*a0^O;%#tgRS5<>?|0;@Cg0Az0@f-HR=rwLE zIeAp!e);w=`1#-Zl*_U_e2I;{^nZuV-+F((^U22(F0%s8q?CYfTs{P%+nUjJs2^LX zDZNzJ3U(M9ZBfLtsU>)@wUCD*7GA7_%4^M%8_hJSB1U(1Vb+S^|8Vp~B+>NxjpiV+ zE;ZhS;M7WR56cJVQ`z7UlnLAX)4&#m+vb~yt;i)Pyi^Cpm+GMak0B|q3Rdk2f@xc% z827ls{qEz5G=%fuWNhJo%d+%r*?ux*{>Y_{Ur9K>_yX|4#Ki;SpDX^R^h!MwjvPo$ zX;+s45^^tsv)={Sd@L5uB$YsNQ8l`;1~SWPAieA=idhfWn>tYZJJ5kPqb8I3ilTse zD9)52A<1!KX39W;nr>o>-*OvDYuX{Xv=)xW6oEa8vppaK9D_5#DL5M(gR(#P<6zsVb9IUa4XbUYk7 ze(mljBHYe^B-nO59yT3~h6DK9y5<|0#27FW?PA=-xn`EvKz1d$wH}HuH$nOJ7O0{Et!;-ZjW-zdU2@5F zh{?MGXVWjj$qQw0?0gX%jLe5UXHby9bg(~}26iV?QK)o=LtqADJK}`GoldQS%!+!b zs%wYph7Pz~-_Ev^T~Uj%I~~^Sj{r-zGc3kE3E_V8<{)_f{gFws43EB`G5&4rYS)e# zTaG+2;cSjX!x{|ctM-Mn13rnrsi#wBckf}0qcblOBxDUbEi|skCI@^i6q$S zo5Ha3OI2ZyqB#Vl!H!dz*d*q{>9i^+xzdcncfi%An@T0Pgn|`SH-Ud*8Llr8He!rh ze<%uLT=)|c?zvAUz%O3@_!gG^f66jE-V&CO{j*V)j`wD6J^Dn2TaBWLtUDM5drqZ7 zGCHie;}+b(l(Un-KHzQSX6HS2nytR|CRAV(m5we9$0X=@Yylh$%Yr>28L%@53qLRw zoMr5Nlfe#g3`m6?__sYFS#U5S4^G4tqxhA~y@i(>SZ;#PK59Ykhbf&pi1YY&aYPHeRu?-7gWHl>+$0cnFI(S{I9hKBZ_C*9t209=x4(9P`FQ~Z-7_(O@Q}CEVvZa z0#9cq;+`z7XR_R8*m{EX{t)nq&Uq%B8R3R5cYzPaEQL1)PKBY1HXoIX@0(qYC0D*Y z*WTyeLdWCa6`Ao&IE`?F7urFu5%b{fA#)zgv_0^KTx{Q-Ws7%0=sZW?u9drk!9PC# zpI*3e8$6)TL`(Q^%%ZNL3#`w}#q{l5!qXdHv^F!kU-uJ`HP8AZNb>u*a^$cU3qVNL}FM$8Opf zGS?cuTxi=;*Vg%&Tpa&c3jqA@pQM`FsC?h1k>I|E?p&OjhBX@uY(O*r}=tHaT- z!2SqKUAGISuHOx_H}9{CsW3}+jF)ahFRE| zpRs8_EZ%XFIgzgC_$Gv-0n}~yJ&on9+8qQFEVsj?m5wlNtqaVtaqFCIv-dLY`(Nb4 z_~%|urj&lL#XDxt5~mYQ(>Hp+)D3PJH+I70b-S6M3mtsGa?dFy=93m~3;uS^zO%5% z;TTL?zY9h!w1wew*2CxpHZXR{7MO13+O}#>fcxR7oR8(*eYWT=l+=_p7>OzHw{L&|_uGf59_o+6Xr@R-~A1)fdd|Shp z3v6x-oVN18z^Rt-#l)r1cibZQeB6BaR2JsLq0^xEkV)|VzzOi~7h~b=e&ZhW9yaY} z-!bzW$1JceonzzfGhvbSbcdj{UfBHo3b*qg@@Ahc{|rkZz<*jB4BsDs6>P&D!;4cg z4e$0lSUGT*Q{424N0M#7^vOTc-=j35|E}D;zK+S&102pbe6cO2bSO7!$~z5~A5CGO zS0MEF1qTvg-u^_G<#7R~?TLfQxSny&k%r+;(GP|@$KLsJNBqsf&IxS;oh~#Ca89}M z#qRuq{s&5;h8)ZDo_I8E>z7WkGe7qzA3Q0|&u+93xo2Y$NsTwx#E(E3kpBRl$T4Zk~dTf~D2E|FdH-D3=^ z4#yj8jwiE(m9Fx0Ih_T&&g8=G(0p(s!V6$eSOM%ln-4oe^04QT4R!%pVC$O>R>#m( zM-pNA!30>cFAf&D$HJW5Q7{*owR*B|I4F7<2dYt&ulAwmIAIk#$5VHXx^G6+W=?G8hJLs5JcPiox*z zvIpl-)8QI zzs))TugyCQZ!YqJ_m&@rk5>D`=j(%EfK3Ptwml19+DE`B$0!)<90Lkt-SI9!N#f81s<%2NC)G?0qSWnE+uRp5N}tFnw<#``?K>V_~dQ42;?y3B$IA z!64km7aLE(Cu;-XgB8B;)?zQVKQG~a(Z0R4@G$gQc?`bX6a+JOgn{M$STt`ccwhq& zh=z?Ts)dZICdj$e0;v^^5T0`#yy7dt`Aj~nJ)RCT+~N#_?9biqw=1{!%ai#5gAZld zjM$$u+OqiW-!M}CU%9BCE&q&5Ii`V*Hy=#t=aiE8iCsj^CtD)g`)vxjH`YGbFyHkw zEZH3b%lDjtm2^_o<1DP+7YcJ-f??2x6Y%={gIG!T!(V6agFnykfETBG!0QW+u!=m& zDGH{#U4R)LDKHBSFoz6sC>`c`X25)8!Qo6;XhOD;BiXP>!{Va|zAnL6ElUZn9L6%j zJJ*EeoMRG}$MV3^M`8sdpS{xe%a7&bZ}ZstXq$_VWTCM$V9Krp=!a%~ZT=B>VTv0( zKV>ic1&{mX+56$$MTY?+J9x#FLwZ#sIroL2_9GoX6+u3z4|!FyBlKi_nwYv86} z_|i52CfWJI-0jC`uVgO~+y2T5ouJktdo8TmLzSq^M+h0zO+G1S1_V zwR2Bm2Ac1gX#$zbNY+CQCBn=lz|EwEnTsPDi#{78Yaagu57WQH~9gtKB2^c90s#~DoN-Kn9 zT!T&iSuoop0fu9AAGkZYbms9K+mU`XU#zb;JQw@y?A5n_!Sv-{4_-6$8sk^%@rC30 z;?K55-Wp)-XBcVY1>-jzhRK@_!E{?s7;k+T2CO~;A1plrZ(=(2DyCO2&+&wJG2I(r zdj`h2oQG*>EQ(U|4(XeVSm2q(jKxtIOn{jRO{5r1V=fl4WJ75&8@)88O~-@L+SN)X2hh@dN`4M308Tf8v1R;G}SJme28b&;mub&KS6z;nedxjP=J5i za?9{POZu0iXL!id%GFnY}%7`0|E3|s91pRYIsy-?&gFk=0E zkvF`v>;!zWE(nHir&KTz&6TcWDA`mZXdr@_3C*L2Vlcr}i;rTehAct!jAg{Up+vN% z5{<=B8Os>GOrn^Mu{fs25)7qK!d}<;i_gc2c|yPS{;>LRBAiUDfYkDO_I##TjE=j)i?DASXBg}p-!{U#Bx;Fo?qti0hTlDl zhEI9P1o;1EMjJ+cxhE|FTfvUcH=KCTf4Q4s&=O}DvcwSvEpvg-m%GFJmPava`M}%D zd|34Ag9aPz6b;kqM8rYtUn$WG`zsisM7XgOgXx)yBb$pE%uCbXLK6{+p|Fw>+K9!` zGZ*V$vFIfkOKUFn8I7e*6Lrj`LC<7F_a-BQl`z8?5ez1yHdvWitb){#8EOCN1Q0cd zuVae(3T7a0EcAl@RzYBUA_LCn*Ra$ytEvfnld25!4kdPdVSnz%AeV#;hrG_IG&h4> zRh})6yU@7M!qD6AkM^n9F~BLl?z0Ui44*FB3!lxggU@GghR^0Z!6!@Hp||BRcyFa2 ztANgUd~@CQel-Y`}HT z-k%CXwuWI}(HCArBfh@C3;M1PgbiLP5RiNk@-DYvL~MXP;lQz3vmuP0FRli|$RVx?1q1EFZ}wTf-|)fIP3)%552tQ`j~2PXN7y<4XpKJ-z!+eA zmYr6ga|qK!xo>3>rMS76nM~oP(y~N0lgPtNC4o`OjIkbSD%nU{C>_+Y+RqrNv_=z6 zw#LL!jLPqM_CYl&R1&7pJG@;%H6Au{m9(ut}j3tZ*At=7Y9`!kbHu!JA8c z;2q3l`fdn>)kl&cqpF#i@Ipx)*qqEU^tBDY-G4`X$%fVk)2Y8NSFdLaExX$dKbaa_ zK6uoDqLO~r!SLY{4|r?LN_czhO6WDk7Cv5f5I)-w44-d2jhuo3o6f*U$0&?s=_)fx zhQi1sqcRYhMM-vIfYgXaZaRY#8Gl4a4?iURv%~G-hqS;TLk%`{!CHb==x)7(I4(YI^@IXYal@ z#~EH7z6@R+wg}#xxg9=TeFFMz41s<&XBb25B4Em%M3ySD=!8ZR5e>#uy(I!mv4tdf zgwmoI%7;UdssNT_G*Z$*df!ciTA^bmhK`vS7^POBX;z<9n@VLa!Av4bl+rPkf|+Q= z&@q*Wp1BCE!OWYiQo)8mGwB*lF_(y`!SvX2)(AyHIuSM0E*w5weG+;jA7VB%!Y&jX zf^#9ctPv7R>S1?SA&hd4x<7PBV&2MP!_4IGdJ0Ns94!;>{B=f1`H2BrBX0Lzx-}D` zYbF7uPoKTeKV<=#fEJ= zhlLag!yTevx_goovCuSHmiZ9*Xe8;(o@gc!ZX{!L(l--BFpm~>R8qqtl!$C3W+sh^ zjFc$wXho*tXpLpAZ$**HtijMkgr2zwJwp+qp*99fNT1C|Efa&GkqDKsL>^)+EqW&7 zXw7C9Rt@&yoGa{g%h^k;E>R;+X=q>T)6fqY;}{8t&X+?{X#)hMS7R0x*EQHNreZAG&I{Z=rzZMMX^zIO&}v0Chkgr1sKsNozp{% zNZp!9$2gSUamYa8d$R`8V9r3IVa&m!(mFH=p=%%+T@w*#7Ckd@!x%s7nMyQ}7E=?c zjD(R%jj4g?y=WvYWS-43l9?_s^o*oMG?mdzrfiGohR7?h{oGYN)^eDQ*GQuhP-rvVt z!7tt%2+#MO1%s>uFrPjTV|K(U%s!BY{Vz)YxS@>Z(HhFcOdQcfikUE_L$fHDF_*rX zIOa_yn#hRh_dFu$nM}`EqM;ep|d&)5%{uigT_7^4{D@_?{f41wj5ti_izx9E?4O;@EwuQk2jAWci zyDzX4BCHRErct7kXdc-lB6ND3^^Y`X^Ax%@5>M-l-|3l&5KUtaZX9!nW->Jr2MwiT zBt7)aM3^@ep^Z{1Gim9@ROXCj7LA!qO=TLbI9fv)xysNp6@Tw&j;L!U(EqLRFM+Wx zu`ranH!^h5`p&Q-h%TrF_j9E%en+%nlv{e?{>0YTsGiGJ{+nHJM}9chzt(@GQ~3Rt zhAxI5|D`v)IetA%bd7~6Zb=H$-BZ{ZCKiQc^YD`l%2_-PekNnA7GP$c&spn=gjZg%SPUcV>N=o-spm8|5rjjul zO6*TPMjH5#Xhnz-OV?QEOpQf25z(CM3eH4~1fBhyyeAPxIz}r{w`X%e9)#y!2al*y z7`H37Yl>&#`E-Nfw{q40`WLU<+W%U7rg76Gx1^izP2UPXefd)~+d7!MD;{Qeq%x)> zGxtj=q!eLFj0Tb;4>t*qMxt>zCT8KF83>9l^jVw2=|vvNKw9(-M3IPNG>?3u0gb{@ zn}*(3379vJh@N>w^vokd<`K=LjZC7U^bE8$^fE(?OlnhUOoV13ObkQ_5sD0>7oiBz zNaoF?Mc-Tu!BnOOt3hfRJ9MdmO<0a}#(cEU1sbp8!RZVTcS$|b&Yj(?R) za8BzFWh;CQ3x?RWCHF^8Igr*cXzdZhFJAc!UK%_frtCTovk#`TL2H8E)7Y18B*MNA zVPYa3!#oUq6A3At#yqAb5{$&mRLL-!NCO&#&@+w}J@XKh&MEIT<`FTM>Tw<=GKmH< z0izSajU+7%{MM3^f&rC9EGu1GhMbJFm8tc3omsnGFoUdVZ zf==#@ca2w|i{o8FOCUJ?3as?bFpP0eX{@~_H#F= zO{7LL5*i5Uk%2gIYIb%@9m7?JooGNh*FcevQcupzeaYY%TM7GO%3+4v1;aeQ{IL8R zPw6Tb$IAP|XCBIK8M5{W{OoTZ!RL#1vI~jnijai@lrnAzRGWnvMu|EVX3?f?%rFdN zs>WV12j`~Y2I|&CGGq|tGZ_X=L1<0$s3;~9Od_Rw#?M-`<}xCficF*!NrIb5579^r zAv)=qiRf8G(m}^W96b{mQAZ?mXiX);%tet2jiZNXC=oq#5xe5+&9W`>8fI-7FwH%M zotL23Y3|9e-ZvL~Q>tNuUk*&#n|yQi1;dlO#*@z2ScP7)nR77h?z@w$;JFXSz>M87 zu*|1G#Y(?oG>*B5Ln&L81Xg%LG)uRpA*09{GVTp|lRGr&En9Cn76(jz(^EI(cD`jyj7gTe6QWq}p(Gxo$9 z{`AQNcz=pDEcMBS6@G;(=wt>riFJq(8x?BvDDTk-HVBV8TJ(%#0-A-xjbjcy18qff zYz>v6_X^xd#`j{>Q6iB5Hxm1-HIHzDftyI=i5N-O9Qx>)MT^=j^qC`@NA-8LffOTg zhLt!o&Z_BAd*dJX1i;rX& zX8Yt9BpVF>BU|Xv7SDp_->wKQk6G-QYM|&g%Gz6X%AP~1o;d>;O<)dvLu{5Ynu1q; ziY&(OP5-VnjfB=1T2v7SE5ALaW$e`i$vFJ8$}l2W`MGJ#8A#VKgpN5Lg-0`y#w^_- z8c8sUzG?K0L#WInpf--Fd3ML6F$j%O^iZ3oNf$SPy$``X(a3H*wiUjGu;6I6inYFZ z;C`+gmeZw*#|kn|(eJ~3x*%R@Gi{Q8DVl#g!*h`GOcm6hS4G# zNNo=Bd*X@_!5|7~5RNLEJPf@kgO#1onu8lg&oo-pXW|5OjL{R+=FvA0p=ThoXw4&_ zXCfo|2IBCDqkI;=Q=>ML2|5PSL(fE7dTJ;_G!@4qNzJ}wVNgXWW{UqMTdMno2LI-J=hV$~4TqQd&t#|Z_4;U9lPG7*^bDed z(FAf7;otGkWCqQ9(IBExv`8k9UbWvzV8#9l#xONRPk6XN#K@xe9YbZ1Ium%sH}}03 z9%)qH=@>>8fw0n%K{$HG5K%`SZW_JsOilAJ<8*5nGKv|esaU9@~&5g%!LK};;>&;rS4~8T4)zh zjYc4Y$Y{)BG>Q5CixzEKCZaWqgN*c9{JVgTS$cxLVF(^wr1zp(9)^i=Wba#F$WpxAdw=V z`Tmf=zQhLfL?x^|S)^jEe-SvHDTEa#3%gdIt%}}L55JTxX1eSvZ`ru!c)^2Ty!sh? zd^e?iTQGttgkEN6*7S@a!YjVBYv4?;GSo>BDBGYla{Ar3bWH;Q5= z;X4(n`go=`>vABuk!62tF(VYQ3M>ZKkUZEBSp48%QOge5V(O*RV0hmqq^fi9GFMo% zKMtc8Ml7BJ$|%uA&kPD=7JbMR(yJIXMELh=^o-F{RL1Fnne>c9=$WKD)CMs|77;Ru z_OmwXbZa6s4TlWGzc;3ABKn5m=$eLu#@H)F89kJg&J6nqG(mUh8Hr%#c^G;IGND-l z&GIlq9X3arks~sPQW}A7=9Mn?kjJQzjlm_bB{&~e2bACUF&M_mR+E-MgW=~};~ER+ zxkW(#MUJp7{4$!u)JzmXIC>SlTd<{)Dac4UBu_Y)EHU$@fRoJzv0E6LovgIr+JgXi| zcS&fzHPmu9Yz!zcF$FV*PE_FV0ZsN^hz@#Y(W~?i!!_Q#Ayg?AR&c^K9$$In&?5gv z*Bk^^V20-VJtF)!h@Lsb??kvk9u=)Y#OT7mSJE`B++u{$8pj->K^_KA-INF<7)V4N zWlRmCMK9tIdQnCpUCj|KXbKUnSwy@9^u8m!iA<4J#!=jsbM!USVY4$8uq7}THiuol zyFIDdk{K=*;HL-k+hZ&bC&E}OPu)sS=vDZKVKfB)PBH{XG=PY{V$-N8*DpjY8V^eTBzP>g_;TZ|+o6(3Pdp^X~CZ;WY}7Wucr zcibG}cVt;&CqLiN=tK}=^Mcz^0KZ89u=vdp*DqN42lvWrl#l#qCvPZdJGyt zj21oRt3(cS-)j*gh}J+N+%$@LcwePEG^WtviALfWQ?qW;Ga-`bMj8CRJG1DaH4it` zS1}J6h9iE~GmjqJP+CrC-k->7gX8#nmzWxpGx_!r)nMzF4h~TbH@q+2?`x4$e{aFo zGZpuixSwN{QmoLA4XsD4=p6i;h;DS~25r>PL#*IEMb7|Q9%clBn}EMpM-B~2#CRBT zB*BW_6GT&JQJF&iPValsFh{V$6Ji=>4x?#$Xc7^uu;$G2C`J*DA%SLK=>1JXGL1gI z*{$HGqRmK-K(53wJa*IbA=kkEOgY$xRv3zEZ`oQzHr+kD$v+pIBQL5dBCkM{vr}cG ziYNa4aZworBZmt4H+tI=4bT(#zKdtKx&?o8C>dLQj0y(@)DZ)Jqkx}vOd>`MT`+nO zEQ+KPSni6acz6eh+nj~F?+ha0DRwB|5pknYekix!F+9QGLvU>?a- zdZsyn<{*6aK(i1k^N7es(&J<|?20!%+30w#8n%U1g3E=5s}>%K4R^N&<$+t=HLNsL zk)#%rTBM^gBr;V5-kP%C36=4{6TqZ`%lo4GPF3lR680rddirC*!zQfAe z6SNhZm#c*McRi@G>qm@-(Oo3rJhmyYLW>o?C+M0&14Wh-8pt532&2bCOv2GKiT^_g zFh`!wcLioqSxA+$Jp8C7%Q|M4{Q0&!OP}hP({{$R@0_Js?ges-yMPhu9AG_7=xhFF1n zg5EkFhFGa}|E@v#Uid$r9*N&+|HdQ3af1Jim6I_lXi=Giq5`4!9hQA}h?W0wP>j+Y zSSL8DNYV{@=I9A3v*@5Th$&Q`)tq9WadbFMprLd@zcA#_$Fo{=&ogi=;>tU2X$6WX zX@|(t8xUF20pUnku|z0x7CA!{N#^7mq#dJ!5f7Y9$psDhoGl*YKi|#oE;#hjaJ&U;f%UuDOPKqL&EA4=o@|zGX z6IFJDaSn}mu0$f7D87MayaAy_Xhw##Q9_K6)PnFr;{uS7dX=L)^eX4$pl1-h-|4~k zL%VN129I42vHbO5Wu^l!Pc7QN=~Z?Sv0^_Cx|N?Jnm~)taO)95jXP`Lr8=d8)ibH_ zm$EZGuPr>b-Ebe_mGphE$qC5>ihyh=Mkc^?^-n7x|b82*Q^vC<+bNZ+aaOq zCdA9cRZ7HGNRS~p%#`J5M1o9-L?FzRNEi}I#*}x6cAgG`A2>IrC?M@apgFLDd=<2n zwmbCxUyq*tR$iuZKzHR##xAB}ESndQpT| zXzlkR{5K3J)VAGn3@vED1LcL;hLNisk}us*!PYLRZ+`vjsNL>?iNEN+1)b)i!^@wBc`!MV-sXpWSL=&ly0|hr0Hy0gO z5H@U-p`D~GiMk+Sx5W%%*XBrk737s&@v~^{xHCMxqV;wticUL3J4`J>%H^Aoe&rS; zts1#}3sNpgBqK>^MvlsiGR%-dgk;79#JcZii(Z2(D=?%?MEcr=hO>iRfPcZMMt;$cu-;;{Oq z)G=)Qai2uaqAqlzP)z%^-HXS8x-Y)jE#Mju_aH03c)3MO$GzUU6?LuQh0QE2eFCvYJLpmbxOm&?r)J!Z=uH zywUh7=vBV2!ow=M-ahaO+Ec`eX{_LCsC-!E63R|hege|p+RZ{I+9I$E5`lexqPvQ& zRCtc8p@>-TIJ~R!$WQ}LSrxvgeWWNSWl`AB$=L*D8q|g95okQIi|{y5_v1wBHL!C# zeA{Y=+hB`BVX1$OOew87l~jT|+o4o+GD6O^+mK&-2l8qksLkQuol$%qU&Iugv37#+n3nRZ!TL zVZEITd@_7$&0qSAc*(-Aut{#B^V^|Nqqxjje|mh0P&G;cqYMv|EHX8s4!bu-1MLY(Uch zyC6j0J^%K={PzdV{$F~=<$o@6@ZP=LHNa4Ou@=rG7r}*!Hl-p{Dp-N0t7yE-C~v%@ zq6{g;zZc6!NJ_61~QNAxB}BX_!H;k{(CO3J2`4Jn#Z9U&#ss|nedvMI#~DH)TeutKy%BlZMt-iLyQ z7NKmRr|<^hX`|P8JPvw|#gjmiW&oQ(1;WnS#(6>X(OXKGv;I8GLN7>q)v2Xp!t*tiRo%4??(!xiDz5M zkj#|EF-d-cM+-Np3XG&r5+0p<44V9r8U{4nqrx);!sKrcLC^3HL(kk_2YTk$1r7Bu zg3>O-q-9%R_n{LofAtpl#Y?^6`_H}6_4B{HYj15W&+HRWc7MP^m%z4pPA6gct{^C> zu7|QK4X{5X8IsDIv7+8&X&ss8YU@3?+IAnV5Uuy28oA7Axd)eU;c0jGaN0e{L@~V?RfG!nQpG5AI!(s^x|r$yw(Wz-siwSu?#EbEmk?p(FoVk za3a@am>FdwR--wI%LJK`8Iq!-(Tp6)gxGK7XidnG%~&F%*N+qpDH>BTq!20fQr9fR zG<~Hgc}s%#E4xFEq>qD`7VANcz~iE4{zpZ>fzU(WsNWR24TBzN`p4r2>#`qy`Rb?e!x!FTru+VLZ{7Hx*ZU2Z9EXd+VEDrVN8d|iI?l?yry;HQGSoD+ z!J)G$aNukPWMieH3R;E6sOxwDwMfkkq}|B%b~GX(8&WhSK@qYVQKBP98zm8K+R7s& zKdB>~*fB=TQW>!yDWf&yI|a5o55kKd4u>E8r8oTOh4-21e)OleTl&uc@IVj0 zwElz{j+RV-AIx(J$QDgUtlE1Da?7v6^~QDxO)iAh9%mpb|0?9x+=f!D&~+X6q2cBO zs7K>*$cUU8G#}BO33+tnNG7Dnh~^^%6N(X%n~|ANMvRVHc(kPb=B8xEG-F7fwub0dd+|S>V-d(-`D~G|KB3#6UkcB&3E=^uMw%m zP}kA{l~)^JZ zG^JurG#_D%karkj`dUut7*b4O39T79Vw6-2$x>GW(^f%Dj*-tSB(*=`PKtQ z6M<$Uv_@oR)R>T{CCH2_Ln3H2tqHjiIVLA_I6^;CjFj4Rm6;OFrtL?Ha5M6=u7uL3 z)QOg&DLKm7*RKj)aL^58_->*8Y&R&;+Z<@9Zvs7&efAwd-G^2*9fuo`nUEuxP(&{}DyBrki4l@TNu~d&HlT=}8Mz^)Gp$C9XIs&X2s5J@ zQ}Spj_AB-JmOOP;PV@-oG-t|hJ9_5*CeZf1pA<^NfL(?QB{eX9r8E3xz${q2#T^a> zM1a?+Xt3P251#*IGW_b@k?^axhM6_p_y71N{LkOs-z!_qxEKtE*C$!I8^ma*HQa(7 z0SZ)MJ@qg?HK{-<@M0eaTnUrTpf417;Oq@L>X076zEB0 z)HNiUPc)_&6-C6<)toU29wns{JZM4@G@%}P(UO@F&BoE1QiKhO2$AyZKuMF$pl7=8 zIt4Yi;e7rT7`Dg`{@i~yOj+#&-lt>0CnN^kPn?0bM=XNh^d1Mles2u?x|ey={SZy} zz2ChCy#_BBBwNk60Kk7tweh?>*TJ_(rX!ZP2Emc=bhzHw1}*Kk*zkgPWCng8%*=N# zs|xDc??49{>4t1Rk#;m5K}O^#kx>gpO2LfXnUWh*Oj8wPL$ZD(AxBE7PpLMdo*7w` zL=zIG{YhhlR7@yv5vd|%Gb&M1PG5VH#y$A1MsNuOyO}cG28W< za4a$thA-I$uMAxP<18I8vPFVlSUh+IN5izWPVmC#Q{i_XP3*Dh{=eV7+=%}Ak!&^f zV&|KAaO##LT{J-66Vokp31lqU8OVkd8qs*IH#(snBcEqzDl9_tkuiOub1@3tRm`VF zYer*K>_KECGYaXd){y2>R?&o7Sn7%o!>A?p;2m-v{38;X;Z`{wf|mx&hChBf8Gheq zVvkMt{pa2`{OqqE_{kPCT_()6S~}Kp=UpD{dTKiUd4*dD>*Fu*6=S{cmU zd;s1XzZ%{hyAl>{-3Q0c#6eJ03iw4Nz$P~zcyq)Oc%k1+_|xapAK7&O{o9xCTW#K9 zCtJ*Pi7BstZtgbE_*wQohDR}-7BX34{zYiHaT_{rVtR>WmR*632g8~9R=J;npo9Ww z>9_+o(L}fIcEL>@^bE-{XG}3d@+her9npv)JThw2RF2AwB7!Nkm>Lp|Xy#;(h}NLo zoGMciXhc<{G!rc!6>XpN+l-#!yMs)bd#Ra?v3)XqBfLLxEqp%H1{^$t;Y@5goQ_F_ z;OG=^IvfnW##+KlgXY1X2h4#Nzj$=h{qQgE8-DV_+c^&Ihu@biroY&qOqn`#!R9-2 zwx4(`(=FN=#Gv=9-OoZ$d>*Epx1i(J9k_v9s%-}U*gV*P2DCa90q&<$Afxme+`#D9 zdA|#8-y;lgi}MikiRc-TFzGi6m>5!oM@k+o1;j|HXH3PQI%d@CQ?fBia(=Y0d9FYuK^-x;}uzj+!FQZ!|c%!z1Csij9zlOr2bZ+ub}Ek$HgYRxH{lt;`b z4Icx2l9)vGM*`DtG=AyzcG!v$?Th)_pzoZm@cHa5@a2;2a2SminVbU=i8&CKkOcve zNicc6E4(?%65bfO3|!nFn9xCHKuIWVcZ9W{yQcsG0x9{ACPK2UhR@qhXjmZU%)2VPYA`@bBs^C&x3$$Zu zdi(AJxFZ{of$y~j<>v{k*yOW+nu}j(M)Krd-vgDO%nuT zpYM1~4g}z9azQoJ(6B_uEsT(qhLY*fgrX5;j8RbyX0ME!cMXamAH|fWhLn&_@EH4$ z+?2Y86hQ;(^(#5%j47gPN)a@nlG36X+1XgeeIsJDluh|{pl9kHgONzdrbK!kjs>m3qDaz`rhb@>@4()&|2gThAwMy0!a5VWVdx zY(5$VJ5DA*SZXO;Z)%55G~Ycm-~9&GL&9vfNS{M zrnXzqehX7ojD$QDHHXT83I+*^j*k%;2|XinxFOZ)t3+$3gsveuJW^^5DPk^KY7q^n z2R}1QcaGGGrqqJQd>mB9ejLzX6?HctKL0Z82~2<`&b~0o<`7J<+K-0wfQeT7VD&CP zI2M)&v6;niA-fb3kT`rF7?lR=cl*NNMcd(%nYOGy_u;gS@Zl3S-A}MD_us#M30`>T z3p@1BzsXj5^u;@~amT>9HV>w5@_b6Bi-zsTHCbsYF8^18NZssfD5=`Wg+% zdA!tB3pb|PjK*mBDE&zV9aHL|HK#Tze$$ZgiK@Dr5SCUBRtG|1_V(j2dz%l;wDX2( zn~%WcO^0EYofo*Bj6rjiK}tatBJ!lBS~@QTO+-`HG8 z$iKu4b?^RtG#zK+qojx!F|}w-s~C_+NgenZS-t3JlA?YM)OOs1 z?2C;MoKymPQGaW!7t3~^g2hyiuujpF4CZb>0c+h)!@<*u5Sml~sYMqdqxdpp;A>hT z8V*h89hwMhcKgBT)w^NH(j72(i4zQ5>8d5L%^#rk>`KWM%H{QGtxtE&2Jv19O9z72m z4#&W{gHf<%e*~=B7mjt~ELggoVReO`UJ!6T2Xf1=KyKMp$S%9W$U-tptC{IseWPLG z#se^B?OqtUY7dN9xeJC_?u4Psz8=&4lv2t+{2hMx&XC=+_htTvY?&vw<4e4M3o z!>DCWFbBi^0vA)`Jq^=^Bo#v__W91C>B7^>;7m#h1YRhD2uw4JE=ji<-NQbh0b2)g zp|tdBeH%pM{~Zp`0$Z;bus$3G`_H7qDKv6i?nTI{xDNSMwUCDtpcyN!H^a4tc3kHz zG-W5;#8mYzM%8<0G7i?=$3ksV5$SBK*tdKbdge3-oq>JmiJd1v)2;h(wWSk^ueCy2 zc>_e{U4;`DDqz={T-fHH2KFaYVXJR4Y(Aa{n~ue!>0+7bY>vjjF4W%pTsEA~s)Pd6 zq8N20JtS>vAP0>Wl~w{r&L+d!y}>Yb^I@1seL6JU_znAD>^gTCy~gcpGu?0A9|J#r zsSo_{gEs4 zgAtig4t1DL>Ma-`;XX#hwwrgL2qWLIs2tdcCS2hW4%SDaVejcQ+)f!}m0xEj%&kPR z8MXLb4THWfyV?X-8rz}eW+&XfdtVhTA17jR#AvA<3gO%)dSFg68z1V>jd)tnG#ss& z=sSK!w!Zxil-0CBe8Dw1nOF`U;rZYkoCVthGr%z@3mgKo*sD`;HpBT;Hv7CiAPwyN zQo-IY84gG0LM%3Tg%|6vEE}QhN+XowYbm}Kqb|jmk&x-=iQ~Hi5@4xoAU5(RV3xhq zr<=azC`_?EES*UC22A%q?|unCda)P$@|DjjMsM-{yKIf8yBG|H|Fh}fnLS@F+J1M; zN*ADOHNQ#Id0`8AC@d2^Fs*b8P63yIByjRefE_0E(F)_fzfa~rl|JE<6&nYR+NZr2)>o9^gwcSR;(ydQ)4JvLMArr9+0vMwC^iKwviBWZ{B0KTh+DQfosjT;Znm5D7)Sc`Inm^t*j2t=U;`;jLYDkSOH$= zi@_r-7j}i9X@WAqAs`(i6+*AbcEkZq=74{549;Y)()%nlU^eW=$aXlo2u`I{LP8-n zV3!&(gJ^+Eb!}Jst<7xcc$9Rl90NEVhS9R_aJm%{m+OORN21yV|`GLnm~LJ~sXT_})9 zD5%D0f#g?1T%N@FoXcqHOAwuN5zb{_gviW`m_lEK@Qf-5LqgN5;A~n2;|vm#TF&r| zF9N5)RIojE0c?FPz$TwWu*DQ^^NA$bav~W?VNu2u`ksSP=p?0pX)F~a$Xp!JaE@p= zx3f8LBCZ5taKDSH>4a4~TxsZlYEI(~BlH>neiSHUYP4>tS6!+K0F*P|Y5 z4n(T@bjx<1{uY^THvF#Fm+1aRM0^iJnS=+zc9Er3ay~6R%C`%`p zzWIm}@xCplv%%DH0~1#2tgpsSyU0rXZUdT@&1&KJUo*g`lNR|NhE#f-p2?8hdSLIA!7Tqps5#O+Kb8Y&5mmdIY!BxC<6 z1-1}qI^{jGS^gXKv77?aF`{L`!3f-LY!L({m!rWi!g<{Pq~hz4Q&kUT*IJlqt~cFO zxF&EFxq{{*$YAvQ)UsNL%)X5KTLA~p6|jg&#uoc@)<@&O3L7pm-C8u=>TjLt=EI-* zOn_g%_8I*0rQY}78a#u}PX1rH>VNY~OH0e|rfk?-F&d3GX5|i6NdG9NqgGZ8MMWd) z(2(mrqhPalEO>@zu|8k(joXs(&~S7)o5)SZU6#(OxJ`Flbh7A5v>`N<(cFGpqT?2> zR|Y>fpouBvy-HwZzJw_%=Q45;Q#4L>LmSeHzimZRbUstWQ=TixW8qXI$py5-c`t}s>8IZiH$ebq9GcvV$*O1 znT}5Ch_sraQ2~wGcB@j_|>lL>VfZy>DGHjn?R?&IaWu`cgsesY=jjfmc6&} zj>A4q0&G2g0qlJf!O=ejc3?W{8jQyjk^vr}S&ReWc&w4R4A00sObc___xr+f*z2y- z8L%@r9sf5C90O9p0oSwbq?BGtNU0^E?$=?TPVUQbxVaRQ(a95$?~v(U9XtokHW+^Y zPJj5*`@?INdBpXhdMsDzf1HK-dw!|4pDb|+${x3Rch|)AZZLDp5iHPC|8%CKF)1T) zVC{vKPQb=n&8A}sDs0h=TB!1J%=PKi22(?QIuX%u#CP3v?@w3*uMV6EFZLb|&-EJI z)ob|p;?axj2V=c`@`K#p#8Ow+_D8GzAyJby?1f1i++p?>Pxj2rXQq2*y06=GA52;c zf9pE|{_@dCc=5w8;k{7{lB`2YjgLJ4t}RsnKiC_dw_(=SL-kXw_rdI~hhg=eAaL-B zd1kt2rh96p`*fxa^cuAYUh6jzUixetyf$D;^N3~JxBHZq{#34--~9zc_`hadX?xx^ zDE{0u+e2N`Hywic+q}WSJL;L~o|*26neM~MtKf~n)8Vx*Cc&%yCKx`Ou|9dn@$i?Z z{>fGGpL4+i_|K5aYtvTmJ(V@n?&$qlTaUsDSATHzkAve;IdJ-!>7JRc2d1N&Scfik zgwJPM!Fwa-!#hJ}!dru8KKOXT^8Cqb_boAKA8Y<>krsO1dwf~bl=X+BE9TgF8Rl*G zfh9Xmg7b+OjCe)QO!v%mCZ-#)Vkh*Qu^v7gw;0|ZwE%jJm}~fa+S=-c&VlnCBXht0 zOSS%y7mR>ENG`cDVbjr=*aa^Bcjr6$!D5#Hu<;CoJwb`={yBP(?K9K;6Pa$S7fdFj zEq80~7}0(rSD|OiS6R@2|DIpn_D9dys-r91 zLT)bF83>DAgP1t$_J^`ZKDdXZJ~Q2S%ye`~;XE`Po$(&FU<(YIZ3P2nu7`fp*HCo3 zz0AogFfOa$FIYdm8>jid%?q|>KMpIqJ;ljC`Gobcn40CgLkyN~XHm3JSi3(QtPh`q zO-G|(vscVB)BOXPZaJE5fuk?X+;j-WuX16JHy^%m3k;oSV;F1c)G&9`-avbw^RsIW zhM&t-;o0&{EOaI+tlaSZv`fvsP9$GEzIy+;yUX{4u-1}Tx+@5lQdC5!CDj`5nd!bc z)6s1_3$|fD&3Z3PS-%@5uGz_^r5b1H1Y=h^-E%k=9(*J+@59(jIX@(wWyzl{-^K+6 z`cI68FS~{o*f{#dCu}@&u5PhwK-Xdye^|8RBrJ6DWl$fH=GQZt@tNs3Pr`IgL78mb zo4jIKH(-gg56rgN2h%s~hG}TBY3p~v)OEYN=5IUNu-45#dDTvThZ=x4P`_`_)%?$v z$6HXue?b%epNOn0&!4|iKi@N@Cd$$+q;-LVk73@nV=&L&8|K(~!JMs!VXoZ~m}~Ea zru2iQyH7DQu02S18$2_eIn&W+JKrR*Iur@ZT~5MW+kG$tjWvD!PJG=3GuFG}dwj+3 z=GpG=a1Kn1^-Zl_8j_U%XEGS+BTMyc`K~Xr8Gli6^M1cw;RUNU>^tMT&ONwd-nJum zXKp^!HPdFlVdka-nErUc^o{N?-O3$i+8%^CTMom5?Z;q|vmf?Df?<_MD6B(ck^#wN zS_A$gnT{@eCYag$)A9e4!RF|BSi3J2mhZ$YVcSudW#bN0*SNs=Wp*%j$rc#9bPG(d z+zyjgY%@$=Ea%@mGuN}l?1Gi!-$F94|9^gk zZ9jH75&Qd?!ppOqf|DcBY%Mcv_jgXhlxWggSJnrauzCk}`km#zh$D<&;Rs_b9bnwj z?N})t*yqXXcB4@}VUeRRtiW`ZP8_U1Lm=t6|_&s_>T3fATWuH*pE{9lsbpAGZ)b8?ykJ51)>i3!jXd z1ARu#f4_dUCNKKHlJzPsm~d-3&O zT=?Bfw_JYjKm6vU!O~kN|D^QM&p*HLsn0+E(~tb~_V2xV%lH2J3;($8tzUfQ!e4y7 z=fXGs;D7z~@W8j8|9c~U{`@yS`|3A-F#hucbC-TH`+IL*{OwPjedd3D`UhYA=*X9Q zUi<2wZQA^UvGXrI@qcHIf9zilz4^ts?!a=dT*Sba;0D{~SCrdgLqH zzxg-+``ka+{;8LbjQ_VE|5@V~o`2xjgTH_A-@P*Q=;NRJ#UGtm`_upT@Bj3|j)k|b z{B&=2$4?I2Qum?nemFb&iSK^t_x|K?SMmGL&7Jwn|M3^6zyGISe&n&g{Plrf{Fg&- z|IKgy)uyL@cHlGLKl`nV$LIf1=PUR8s~zW#ex>y0k3aO*_rCCNn-{+E?l<23>cryw zBbZxaQ$@WPAjX<-cMIkHH{5{_&cc+{bmB?@HM>Ynou!ApSGNT10NQ-Y(x7TFxWA z4w36W*7eCx{yJ9vr&ylj2Kajuv513SwFhQe|9HG_B7PF_A0qBU{HWdT$(oBX5f z-V2odhPzp)mX8I?e&}p?%T%z;Jz(%~rILHV(BT3Hd?>ifl6!@r!<9<@0mFxL59n5= z*}Gq*w}%f`D(%xNblB-y$F=Ms&GGFeEt~T5bVZh}^}yEmAp zspH(|Lz)WO3oM%o=4t8@%QO+Pa)F^dO|mTh(n}>?d|Fw2wHWdV)gl#hyB<7j_a#=R zG~b89>udT#P0hW!9Ja?3t5Y;M6<%M{mlCU5^qIDu?jmB}POMH=c2ZTdLX*p`)+Axz zcGZ?8;se0jBiH3+?7Ifr?Mpk}z22cC3lCSh-SL!trj|VvIR!7{LfSq**v_jbci}>n z^^&?>%04fplwFuACH|#um$J{)?W#Q9+f{CNDQ&w_@?Yxl()O8FmVCHU>hW%-?b6Pr z%CbvUZufTDc2miPsoN!QR=TOSOS!((`n(p~rR_7Vtd#us_Cv{Ksr}2n$=e-I*=MRB zOWS8!+3lsoziTm`NF5VZJI+emE@@a^;`Deb>DtrApJldtC~2Q%#>uxQZMQFFTwYU? zJRrn&i33n7aWu7w?Uw8@ota&KD>;lW~jW0XSvfJa!_Oa|Y;>%c+ zaDnEQLHq@p`DT2Jk;_ZCh)Z(3_zS#X%3@E{6xFPaxd^@K6TTb5RqbiU&N%I9*3=9| zcY53&FRn(tvX~Rq&0=cQxdAg3KHw#9yP9L+vI~A$*wS;4E3@-(&LcEiqsIygH3+2K`Q%z5ZNR zcCFp;kelZ%KaLIG{f?ImEZlau^xl8k=VbA|?WIrhZg1uHZ9jr_KhJ2l`|mYhO1N)( z2iA)JD^0!M!*roEwR^NQwPAZ{syB10^m{s&%$ywq<|wesJ2~vO|f17pXnk zw5{n;8}4g-wCTP^2Ii3HQ!TTtmp9gR_F$iNoo4?FBkz|QdB3n5NA0#lGwrBh(mF|E zt%rpgG$rJyu^ke(H9Y}lPY5$ZY^yL^TYq2UZI+%8v=p~BJ=I*AqAo9Yl%^iE6mNEh zH#xhV^ZAZUU0Yq-W$1$%6P=0HgdW&22c@lbZC5s~>#XZ+N9fJ;X8I7-c4U}~y;z-+ zw)Cc=KTrnor<$QzsyEnZz0v*+0i+koyb0y zn?{r%b`HyoN7UxIJeNB{n^${8(%fnSJ#SsxNhp{!+3Pay2f_UyXj%p}e=~-gh~4he z)Jyr&)O>*|5po-;6oxvhr#`4@LWl`1pHP65QX(mhq{U?kxp`yrv}T#S$FqIeb{v~W zoNZ-~3~i&WoNPU{@vgS%TyJ(9=U1|R_r}w_S=cRMtjN&^dcC%FomW6jdcd|0>MJvz znHFNIGtnA#rkX>|8@-W%Mru!DL~|tRMRF9XplGR1Lyx_g_RL*qJ0M4T2xR&geC`|x z-UQ*svl}dSKuu(1d=fQBk41eMVk8yp8C_Cd?-(Jano}E~W%XusN9~=p8a!Jt%d|$T zec8HB^wb;Ql0M)r_5qo?&ZX`f&F@CCJAio>wdPYJGutatXR0+Yq-Qb&g<^yzwH8Y> z;_syAbakhiqyD^J)FX*JE+5HLiR`;CqyIFKvx?3AH;&+qVaF>zlIsPj4nz{`=%gL}|lB&H`_jjJ|l;k{e ze2O3|Jt_Sm`%N>Fy0Wpoa~J&J^$ypU-QFUvnhImz*q0g4j{AO%lswI0IZBIaQ|$#t zB%(R$O||EZFI9JfMi4xD0nK?NNt8NsX_6rGB#0$F23kh1H(eEfM|z}cNeX$i200=Xch z_4=vr`mlSai*-+p8J#i3Kw1G}Bt&Xa&5@8$q9q*$j}VrbckTThb!SK#|H-r9mGoxT zb?UvJ%dIcM{~f#L^T2D(ZfXegp&a}f)F!lY)AnjbZ=U8@Mr!dS%hJR?ea(@gkc18P zqNMB16m*&WAD08Z&hJHC&8had_MEg7)5>`E>`kb?Q!S@jW}8o62mM`Jc6V<#SH;h{ z{9FMcKbJT3NXd<&H{@w;#AuI%RD03hF+z&9>qd_nX|004o0D_kdGb1pAMe231@mNs zchq?2{MvJs-V@jCX^%DFYR~kZ%$o)=rOM@-$=~_pj4$V1 zhAU7X?up{*#w?ysT&r+x*e!J*$#WJko}JFk7v{T`y63yX^w?5KD?sdh>hFxtqgUWa z40G1bb?7~3TS#wz^Qo3y*W@nRwP5#Lj%}~Eb2>LySn6h&?^^5vL(v^nBi{XQpT9HY zFmJ`(J@lPz>)Pn~b~HWJw4-UZW%bp!+U%ao^<~MeFSFF$(7&nJ(BIH+=*@Q>DI5v( zn!fH-d#0BR_mE6WPkEF3JKi%_-6=ixo;$$qi6-=)Ev2#5B)FRF_Tv7edGh&Eep8X5 zp?`xVxA;rs?|Pv+>aHEiTi14_^)h_lj;3vm+Zyq{OlI}ytsc8fKigVI=R|I?d()5v zq37!^I9mDJ?eBv0>K=HZWxvqd)>zlJTJ%0k($5wRTWhLyEy2x!^ z8)o2n&cI#WecDqyjL4y-SSUOD1-mWg7iD%jfvy z)jpN=EuWL?6Im|vZ6md3v6TG23feE8Wbqk-e-jhdxqYJEB@xna@gT%eha^W!>6iz))CO%weWXn&EC@?JPYI< z8TcEj9a}GT#>g4tfD|;MS3FNO z?KHipZ(rSce&VR~n&>&jp0~ZI_NMGnLvd_!WJAC4b);x@Cz`}tOnesXylLc9zmHeGUtgxXtFoHS+ok(CFh=J6^ zQFypLBYQ@0=akRpdoU`&XymLJk-&GEkqK*EdOsPZu>5R+Ytm2R{?8D4;9+_{vL>mmN8OR${X(y@JJpr2o6f<*3OVs}s=Zb7chuW_ zVW|%_If{NU$_!dNKXCwF2_9((r1~+E#CTE0l<>1l-HRMgc5~#hLGFgrGm=h2|Jg31 z53Om`d3cNo5{Bjgo?A_hOpd|>hV>^(K8n^dFtnln9lS}U`!jE2@CtOKvb_17@9#)% z+xl(wYwtW!`+V)A70ma_vpZYhyV^m`u~%pBj`6XK`>LJa@tWuI4gK_Ham-4)k4_vI z-86)^m7pXU-J_lxdW>dJ*BD>yL39H1z+khDVA#X$s1X@~$S8z$Kac2I+anrX;s}!% zy&e@UIwXZ5T9NdmtLyKy*Cf5yY7f=&4Tk*x2#WH_CHC1%-E;U}9(#Q1Zsq=N+j{yuGiG_MHl18) zsvNua496%Onb^20{*HG)2ZoPEw6?IDJ>#b0d>47){Run~go5Cc*q7}YnS_TUJ!3gr zm}G>S4_|kr zDB7#e-xU_S!D0+!4yQ+;Kf|~K%%C**G0eL0#tX+HmX@)gCnF0`k};yp;bc#`H?_KN zP1D+O=>jcAA`GZ~nGvv$#rUO1=62GXvPU(M^gt0Qj&e3b{WE5M3343Evdt8S*+-Bb z>n7<5Q2P8%{T+38|DCnyH=keQ)=_jhogMp2aPw&K+{Q(D)%d&l!lt1xHP-3CF#8^k zw@uF|dV-RS)`S+@y3D>oK)Ed6a$6I@FBmXJnpoILy;7qC@UTnN9jVE<(x2bSI2HbI zh6=azqy@k)&v&tgs+-@bzcamNE$AIulTI&^?Bs(9hlmZ@zb7bRfMS$w6+fH`_Rfn? z-iZ{im(1?5>@3D8L0W884C4|jy`S08zh`8DHRy-kM|W--dQP-PYSfklTs>-G3~LA1 z_qSZm688~}KD`Q;j_#a+52k;N%;rF{`;Bk z`zrqPyXgGR_&e&Z7Ro!c=8K75FNqy~Q3U;^-$M#DPjg0l<>q(A;TbB(Q3}*1V@NX- z$5o=8!oy%Z7+lZYrov?&r}AhSVhh`2hON-WT2Z?&F*7T&&gdeGfTj|SM(t0 z@u@wuMvOp*=ezmls=i$-Z~58xRigJZ!~Ra`J-_Bqtz4N?kETwN*v(>m$&qeQb0nzR zE939bj|6M|z!<)hfagVX1&%W@I})ue><+FKlhQS4<0DC^rqud$!b_GGsjMu{jI#d- z%5|$RUiF_!52@jqgS4`-rqsh?))}{@dwKWv^J`3m92d5jGPBKm)7jS?mq}15 zicOf`Va~nNC$KQVds@8bn34X3)HpZu*N9zG^2xMZBIUKlwc~Y$SsrEwD~byflbo9t zrt!Uc))D7-zt&Ds;S|KirT`_?)gI zmX`5z{EVC5&Evim=5LOc4vb-ZhC9L>i5aaeC>3WdcZ_E!W>&tcCJoeO{CufA5pJ5A~2pC;29+c|)_YahQG zMSg9)nZ>>g`cE>1`tVHvexJ*}<>x#%m%C#2ex{k<(ce*boTW!cEMa!Nnf=XjFD0P4 z_#V`o-xW3$eGhhYC%F}co4u1|YTG46N({8Y$l7L}YfUQVlT=C}jU|u@QHiU0A1GuvpklZe}!zr`tByl*N3qe0ed3ANJsc1afIwLs<;T zoh8X#sMwml2zhRa7Qngud{;Yuu>;?p#B6z2wxLLRn}#z(FLhnn$oHc4J+U2)@$)<5 z?=E7z@;rRr6M^@q!|Zqm)0@`?v`2axrT3KgRpz^1^+uIPcQ#;Lf{}^5v#>xaZqPJs zFtYBe(pmy3YK*jKW1>^btD-SODoL-CBm4${ncrP*J=2vLBD>7++kJJN`hI5G{Eq(a z+vqh9t@*>yJTJ)ZrNXI}J|X5(63totQE}#eCZF+d8d_kjBj8yn#=-pdUE(uv!_iO* z(~C0$s>T4*D=VtM4`xrDA zetsA7cXynC@}681e1|N^?lit3(t&3_HhT9lkq&5%G^cX|Bi75Ir{p^%d{#gYXK2c& zF4G2MMOs_nTGpSHA!Uh>iW7wh(#t1anp%gF+am@wMl#e~Wg7Ep)YkN>rH|P?#aTX! z7{?5c_f=kKInzz`)fX2(eYw?)RD#d%%>7LDcPH>H@5x(TpXal?yJvqhez_SM>##cG zvZpz_3}2UB>}FjWABSgfa(CIEBY32gSdvXAh*CL?PiRb z=N(HQj>Pe^;OK&`U& zs*YoJ+e$3gNr)VKp2iIC>85u4Qg{Q{)fXSj?r&;M^><;9=d-)K5pVL5nl~z;?!wyR z$Z`Soe_(X3!2jto-!1PYgvlkPgXG*4DI%nhizi5GN>6Q&WI$u2#^72muUf2xDvmcZ zwrQxYjq|%xEiV-eyn%#o$ss8QOH3_Esm5R#N|u|ouGWGiv72o*?_rAOV*K4W=izwnc7B3huD5fpuxG^7JU&S*HYCtdN@^{g z5Fzpkl8H;l({d@TE{QQqHo+dV`LPydk{_^}itU}eBUab>b|1rI=sDdP!kcnmh4VX- zJA`{HZT8!hzV5tPdBorKVuWJ++`{gqK5A~UduA+Ea}kmYHYcPpmmZf%QEfIB27r}1v)AV~TJw8V`!TZthch5WT9x1z*@k=+!{;r|O zH%;-y9{0`TtmNTNg2Q#hsMoEIdyA|&q$=wfS$61~FIkg;PGA{PP%Yofu zH}7F?M&B8$xro+EmN3>=YOW;`>1NMamoei^`~1%FcmCVb%8sg|uZ#M-#cnE2$qkTPl#StR>@AdB4mRh`NWS*P*{*EKf=j3Dy)27PqcI6W41Uem8oyrFH#V8_Dj)E`E>Fy`RZ(CUj??;~91fLwE-|;_v!0dq(*5 z8?yq{T!b9^PoZZmmu)1qAVIf>B+Dp8AxByav=V)4Zf{9)OgjWYLTTJ6yW*Dc`0y$8 zoR@{(t~~n9J21`+_`4@>y-mKOpt|d@zRuTPUxwe@!4sY#k~=Vhr~gTmTv{aNYs@Zz zL>wvRd6c+xOk?>g(2W|c;*ijw>`zdP=;=607T3grGb-v#HdiR4F zzM=VTnIWjZ({CskcKp_g|5hLUTu0|3?o=-9<~8a){MN5#i%diq_3CTWg%(4&_u5$c=p;>6J9q%W-*mbHkIKMlDdz$8L zP1POs=4+163;6EBfieDnK9C!;n)7=^C8Rb)3dG`R1+?brjC%8Ek;Q@`;@J=#r-l#O z_1GcZq&e-kB+L2?UJjP4~7JhFC|52fSSN`?xX9}(Ld|!pn?~K3GZ&Vs~)40nO z^moN!epef#OG6IKJU>QSZX`8_AbZDHt$7+FF$RyEN6jTD%a)=gNlFY3xfLw4&bcqw znpDE)L7N|EnYX%eV0f%)tm(zB*SjCf@pn6LSH-6%v-7a-M0>dBg*Re%E@3W?@8*u8 zo_$)5zAPd7w+b|tPK!(y3>nWxDWP_RT-i2mYm)1+Mk}@zXhQZ^$$D5vG?r=)jvkcq zsGS*E?B0g?!n1|fyHBFuOw!#%z~5nHg8p(~cs#qIKSWOT7S)=LP=XYz)S5#wUTffC z0&9{X&NA7T_q4+r0hLPp#RBCyQ8LXXbpT#U; zSN_GWw(NiOd(6Q6&L3m)e^l^S)6U>~j(agi(V0Ok!Jx*p=k&A|=q2gjf_{zUg7dQw zHA`>xv}37@9;nH8?=+dms@wh>pk1`MAIRkUaY?x&+ZvD&*%n* zSa%CnbF>Hvw2oO`v=W1qK*-hBf}|ubM2kA%QLXi;MQfpK+fUL)L=(wvKCB7qnB!Z1(A};4y(7bJoX-$C=ev&L zO``b%YZCLi@aQB;Z`HL%oru|1HaPDqm4j2!piiD30i~BRAXw5uH0Uc8e^c9D0IYs2`Sc;Qs8p+ zS7&PKT5ivM$HZZqSB>R16~)JgW?Or5y9y`npugiAwsxEe-OUwV#czBqb(0)@oi|GH z^hTPdXAD@smt3Ylvl1>n?1SlnZgsz>@^*K2h}wc`DVl8Lo+z5qhJ?L3cB*N#^s>Speylbo*$#u*aOQ* z*;wh3NW_V(1s*rfGOvQ@))3c^OUKrTU3YcLhNjGZs*3S`Hbc)J0=g@RwnVvQce>_EuH>&*6)3qH9J!9Wig=qV4{k-s4)T1%lelR&f5 zd{9y9t3xJ14=bWiQrvGPc4#_(xb<^|+v zg0;vtTCVL&EtxYn?UFT@mS)+i#RLuPwfU=Ju`k(AMfR@DWBDK5;rqMA?mhTrR?{}6 zhqU8Kr?<4D5ca3kSvjp4zv=61#^{Wsw08_rOwt9(X`4^7*IffRr;3ir7Q}Tu3p$d9 zovJDh7RU2#xx*Xzz7cgdjqla*f2Qn}TEZ{Xn-HX>el7N1h|K1fqqX1_RjLzSE!SP9 zRc%DJv&Yr)iY$&T>m}O3qA6b;yLZU!$5<{ebw8NBD{K7SJNWHY{@$J;2S26k((gOk z8MgM2^lDyD>HD&v#z;)HBlOq?uXiNUR@TP$E46yu@P0Hu&LWS* zyz|vGt=$haVV9_jWyYdizY@!J5a$YaW*^0`Q?bv)uUrj1UNmh{bm#Y${)oiWnT#D} zG~#N_p%>NKvf8=Vwr%aOhE^PHjdS1TI@7J3gR@P!?Y#Bvxq@^V?F`!TWXpZn9y4S& z_rLYAr&xIrQ~C|5^GwQrN@@F0+O5i+p?EB*k>LXecZM^(Vg*YP*!N3X8c(>zh)^( zt21riv^`m-7Os6Xni~W`b1b#NWAhAIzSo|UXEh(z1hf5KSF2J&stn7t=6FUy{m@Yr zadXe-@GUN3H=<`i4+h-{J=#jgj$V7TS7O_|)C`xge^(#P~j~kbE&vlv0dY$QZFSW{+;aa4a<|l*H5pBN&5-c0G z^q(nEcld>P?n7#sN{iK6kY0cs&%#7sGZA7uLziH=bcK|rbiIWAMQhevCw0nmOt-38 zT~E`-a$6^|4w#O!wtlpp(yY{z=|vL>W>K<)X9v{Xq<7`cNIyhNdquVs)tYTHzP7X` zVHrp(!Sd`FR>kg3K2GHLT(@l0`p|VXZLPM5!1c4N%4oG|`z)hHshfUM%J$gkF8AEs zBmQnTMk;ca=n3`yeux}toZ?pT9b5~HdV7)x3Uh8%eo2CLwZZk+kNaarJS{g`5g#pG^9L# zhEgHMtF)0<%zc|+ly0lAB(Sa2Y{2eK(I(e-%L7`(cByI9zLbLl>I&2bdq{Ch&zUaH z&3V;w<)mbL#)!tW-LQ`A`eLEqM9Z?&kWDT1w&n2{(yV(<)h+9F#aVOJ_H%EHWnR^h zb<6EttM%;_RgI9mA{Emz~!mh15y%X4z0 zoS#$fq*?dsUjtf1ejtr)swbk`xnDVl^CWFljio``p)*6A7`0Y zCg^!pVofdkEiopI>z48q%Nh@8m+K;WwU2Ud+0Bnz_O)oXiA@h>sXHYH%lRE@Q}p2O zl}ASKuTW|)i%+ggZ+XKl&PC3H=M)oh?#tCIwg?1XKZ9%CI;n11>ov}rTDPBjLw2yg zaeH>VA8Tq11(NXF3C|W=I^?pr28ouMq3v&bP0~Cjk7q5;$D_f#O44Snz$dSZp%UxV zf!0R_R;XaTIJ>M~lKWskXl;LXJ9H>cT9(;pY0C8`EGubUN7Jqi*WdEfLK}7O zT1oB2XV&O$E3~(@5wWHw+w)GrP_S)LkLa~`TSIn?LpouKm8G#Cp&erb6zuUi0&OLv`7d+{bSPxc@SE*$SvfIUJmiuGAkgL>k8!x)Fow^}mMh3MemH6qB z=5}t{Qk1+h%h?|24dEWds|D(A%l32mE$lVrYP~ZzX(xBjHEutfzk91v8I;;}wbp37BfO$`$uuiuv0lKEcG(DyvW{!H47zeI36}KZ$~8a6 zLW^u;0skuGv^9h+*R|_MEttsqw1_0DX)bGwA&t^NaLFf--9kSn;cA|tre>(;pB!G1Dx|5~EN?xof%X#lcu@l6ahEHJ_wxt4O4c@~9TgcF}w=lJzZRl4fKGTaz39 zgqK54`7R<=C(q4yzMP}S^XCrXew~I|zqD^k=X_K`Y zm)3l#bx&`WPDN=_;QE$^S~B3WYfUQf8K*sN_`oAJ4cJA z$7HXG9y50~-}s1mw|21Sxy-r;46#Z-leBqH3VD{1ev)NbD6W7uH0F-3TulbFsQSbD z$y(GhQgbL9{UJ|ix^~d!#aly{Z6H>YLN2JmY|k6eoQdc1XLH%Dh8^b(r%HLw1(JSipS&=Sod9k8AjZN8Tt zBps_&v91=ErOn3eh8%m%ml5x_>`GIOkDP9KIjbX3V@Z-;(6iujw^CJ`NH>kRmU%4z zbQwsTfwbA4m=3o9mPvjYi*;Q3maybizAReBHnc)IY`56_SW7Lk+_hX5niW~cFE(yH zm%ExX@htS0wS8u3>YlCZ9_Z`TaSUgFj0|c`Y9*gaO7}qu3@!;SuOPa#xSs?{s8LU= zw$@dPVOyCtT{=ojD3KnuXGr;W(A6SJB`um%KN;>Zp|>1*OwePGc~$;>vB*^@7HrAgmOPksTl=MAH-dYl75NnBZ9j22k z$||HR>jhhZ_($XiEa*r4Ci5Z@{3Oq@=qadDT`A>wEx z<)zV44Ti1OclDMv?-5Zl*0M~>t<`iHy9`>k#*_SJl!!~op~C$zc(k}I(bwM90;y4V zoY~=iScu);?O)5DsO`si1s+kNQ6Nb&xHhc8q%?crpgz+myBhVh2w%y31|8$xEh*%v zAJue4_8v=IEopLjITq_KgR-n^G{@~C+GF09l-Rgk^hVufU(TK_yqw*OccR@svov)z zcctZpW+g|9T4U|Iku|AA)JpBLhL;oLC^AnYX>r-LCRNQR>8QW-W*?RqsZ|hNT3kQa zONwuF^FSlXU#5}@%qWCt<5p5LCj`~H+6!wj zkS_Q=FSmIYX(_k)q@1YLNDGLg%vPfLo<_+zq(#+gI`2ySB+_24xdud`szcY31kHEM#H@Z-%qz0vnCWcLB zGG%0D&amMp8XsHEJZgf6J)|32r;na)g8 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

68(Wh@W;8WYZ=^rJH6g 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�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Αlzt0B(#h*MPW!LLJt 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

+(9U&lB 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

t~OCPOm2OMOWi6Qp8+mD<*;>pCW>t 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%0D&amMp8XsHEJZgf6J)|32r;na)g8 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

68(Wh@W;8WYZ=^rJH6g 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�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Αlzt0B(#h*MPW!LLJt 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

+(9U&lB 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

t~OCPOm2OMOWi6Qp8+mD<*;>pCW>t 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%0D&amMp8XsHEJZgf6J)|32r;na)g8 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

68(Wh@W;8WYZ=^rJH6g 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�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Αlzt0B(#h*MPW!LLJt z%NJaFB+L*hHb;<1vwvV}T1dw0L9S|yB}_2^2@Sif9(|5mymlYn(S(DI~j8CsyR?5IbU7IT{cx#y(t;UeldpXJMF)bZ9YjF&hZ z7#YIEc}a;MWR*X-EPs~m_g@kJO5F>+eUWU|mA?05!SuUN6rIOClsg}9p*JZN6b148 zrkFFKn)_#WZQ36JFNb7)n>_#*yZvp&LLNxSr|vYGDbX z8T{wgY@VTcyQIpnq(ILozxdSX-G{#yM8$h5^KK8JtZhSK~vJ?VLV`<`lB;Cm^?-quAE}H&J3g!Z*J)_I)LZ-{LctwSd^0i%|?Vp$DP3F{jQ` z>dLp+%69!x=76Fs@l!2%?HXj-S4LV%3m!A^MGZoJ*&`>x;q;PMJ?v zIBlIM8ucMJnBx`STHof<$g?ZApSx~9ukT#z{OFu5>g*xm{eZ0$D+koD5|ac6GE1u6 z+7t)-Yd)WbO9?%I^9pAn`eJfGf4X5bR(ZlAf-Gkqqb7t9OHc{UalgH9ySkG)_3=73 zS)%ip zi{2tc%5jOktr?n~J>C1iA_IRDbuO4zktDkKMFj!G713qLwREEW-qnRI-^<-hXQp)I zhmHR3R5Ig7P10o-S_hldxQR~vs#TQ7e@ZUS%9FFDHeGmP2qQ%OAJ zOr*NUeMTi5)EcB%&E#dOG|M~e3c&G!B{(RF0cFteO2)PMH18IfxW;=e1g8@!qYLrG($_-=}Xig?F#Z^{U${7O3I3 zp4uqir5I{4qSzr)P5txvh1b3+NUp^w@Zw&USj=9&MAUf|9$^ZP(41{bTc5qZgjIV< zdea#N$_s6nkLWc=bzQn18vmlBvu|rEigB4|>M^9d#>zXNl0I~&U;DRK*ChL){R2v46hant;t8UT4Lv_&tn;39B))Mrxf(|B>Z8= zr;XED)$p&<55zJb0Y`Z0o~Ae-K=RV!U+&Kp8v{yl5CP={JOL=9_P_{b9XTo8G07PZ$9I2?r6C z)y&{TaN=X&fD4{OA(X*>OJ>^47Xdx2JS5SCoSFu6^-m z=BWbx)Taq~m6j-HwW7~8^6#Dc7a#f+w);hBefavsa)ZiJgTu5aPZ#LQ10utK$hj;k z&bRdBYtda&R5YJU;>j-V$uoyfnE;%$r66KRfjS#J2k_3QP)9_|Y(6t|hyq~s;NtB| zJ+^2vo2X8zoSRwc}sEs`xdRP1&qcwCdIFrb;Q-z2%ST z-fVfw3(@#E;xP<>if?;yvp%s=7N#0%E2A4}GrpA?@`?Ic=PGa(MycB3UaN#Nj^V*5gq8)*Zqc=BS7~*26U9s7DD*pNdgPUrFsl4whQwfi<5J* zq=m`)uvBG5{XFrWKCv4H;{#63@Q$a?@SYRQ+|?>D@gU~8Q|+P-dU9O29Rh`E4|y}) zz4TCm-%j$h7UWC#_Y*UP#1#JI5fL1Bc4E1%oxwqOTop%PIz2r%2l2J72kLkI&0_M( zeh7FoS#Ezf8Leid$%fl$mC#`91ws1Q_%F=D2~%Ra+}CC-FqoRsPG4A( zyHtg$zhIH%PSB$pj4)m}BXNBX4+cq+s{Szq`bpkBCMvqLAulQ18RX&ZZkxbuqiA`6 zAEYKiDHpaCCU}Qjl8zFYB#HlN1!g$zR9uA_Y2q8hF9?ZS85gqZ=maYm8vo&#)qKi& z5g~wI#=YXly~WC>vB9X=2_ozW3Spf=Ow*dw`}Mao)Jw`W6MY=Ec|}_TITg1A6&3eQ zXBy~!+r~O&4hX7({^ZfjwyVY(nSws`)L7ECrTIu0@B&W!pdwyMxm%jZzy1G{??NE% z!%h?BDIs@UUXXsOQ+FLW@$Q%G8A$voI-f55wz3({{g@lc@%&Lgi7tZj)mPyg{mH+H zQt~A=;9pC8`~xIYB#8TI+7~v7@h0!lSu{<8omLu*oGnDc4_6)S529u|!O4nw;^O(& zFU?={pZI@C+}Z#^`nH;f*3f1t8_gredh&FaL=KfDmOl1Z?cwKen?=!xEs3XX^lQ-3 z%kSA6?c*Kdyk+{L%UK3r#(&fq0$Zhn*rs%nSi01Zo37s-)%qIqv(v zV#ArZCDMe}@&Hfj6uon6i2JKpK$IFJeB+~|YO|JV5C1aVI?(XB5*#k^2-``lDNQv1 zG6w;`7^{Qs6l#O6cWMjS5H#^H2x{qnk3i+m{L3h#rH7CAD-(u^wzp34g3kCvOxUsX z4#BjSh=E(vk>gvlP8gV2X{bq8X|-{n|2J?uel$t`9>?8QxowV_ob%_lVn3eQj(49q zP55ipva%>j5Y)hI_ZX4F3`qALVljnN>72)k~i z2?zYqW<{)$_$lIy$P#ZFgZgqF_|K1R~JRnAl9H-<(n(V#laB{5BD zSgwKT4eHCirdeuv`cakGY*YuQX0J*F7rG5@8sa^|!H7`zOz;ovLi@?hReayifr z!@S2t;uf)@UnW6&{YL^MmNoqwsu@!~1l_*2pE4<6dA?Cm|E>@J?ZUoShXv5)ey%$I zy4;Do`J_@G5Zzdz1A{p0$;59%j)F>*@&FJozL5lECMv4g9J9XkUKmbf+@)euR4G-H z3A3-@wN_Xd4b`&lrIaPjAl!|gm;kJbhEcT<{0x96m#Fc|a_m+N8X;{zY-Clv39M{vhaSwCXM9Z+v_|L{*=XN>Wi- z@-ria^+0hA@>~yQxj)(F=z?O1$u+O~)W}jfDe)1kjG^1)M~{qn1;80=ml}QtxZhN& zQ}i=L_I^a_j(sl=#^Ld2BYHNRu5HeeQp6z4boB%|u9dc=><3GLq`4J8-r(XvY-L1Z zpt9nl2c&I;z3r@`o}`%sEneKD##Pc5kz*dOUOw8^VOn!9QJYL$2#fTU zsU(Ku{)y%O`pm#|5&HF1kCI}tpVH>}%w|5j5jUJ@O(b_ z`#U-Von5H_HjpA0egm1u_wMpdW~H3xPT@^ZE}qaLcWG6vut7z!Y$6hcMkHRQ*AT4G zC|Xpd0AY=nVBN!L`9KS<=k%9E70sgz3}27_MdPg_t~v#;B?JfxUDu6M`~<&Lyd<6) zWx=wzq2Liwe)N^(6@*QhJp_9nbU(^=_YbZHJjzuQr|4w! zH_EPmp7k{44Qfi$2b0oU^XcZKZQY09yK&b>xg4rdh7KU=1(H<8P@*G|1R_bshh$^; z|2B;tVi=L={Fl4(x8^e&Y4@X_SQ<|^&$ORGBY_7C!5%vXn`m(x;;$;Y}Z>hf5L~e=-E_Y>04LPSKm+)ryXq>{fUvE zxEjFtcRrB9>mOaI`%kTtd_4B8oi?||REt@j#=bp0$%s-Pi|=HXkA^1P;i~)2;dLc> z`u5q#c=uxTGX8E-l!BP_c^3$J9EF9gyZjyYLROM@E;Vv|4cLC$wU*y7N+jT|tA)`& z$2f4P)LXq2y4gA%qi{D3TYOWySAr9t+k+r3B~B!IG&r9ldhkRarJ3_nQh1kMBIB{B zqz@R+A`h1W`_X~@^5k~Uq*h-4659}AF@Ze-SYsv!(kBWNh3%-x z4DLwea+=d;r|4uD{UZ zD|^1<3#AtuWNW_S@dN&bR6Cx|bpRDaSVZ%$?)O@m-#6eD2*2zI3lj@{r(@GK$~6T ze7qa+4(lZzYYY>;uI}M^KfNnaa;%<+|K%sh2v-sXV0S>ACf8;j+hf{2ZyAt!3`j}_ zWX4pFrVlSrhyQK{22FP1Ovscvx039zxjsjd20hWV+<&t$1-JhMA z_}4Iu!+O~8dSxYB(97F>MY%IkN<>V2!APfU9HCK)V0A5_2^++c>u(|o2oyhtJAL*f ztYCF`Pdc8T*RodGFoUZ*mpboZr#R`gzCSw6H9Y<>L)26=oB##dRAw~}N>$!V?>WrAdy=zY>T{7kYFlIy%sXdZ`_-A9!jg(6yFyYA3OArk zq<|Y%yT4T>==K@=SnPSpGnZ5ScJ~6*f z4tdh|q?w*nnI~!Yq5^3bmqZ?IFqQXTd}6if6pC9qsNcSvEWSvOv{yT~U)T(js{DCk zVbzPu2*^siC@xp8#;f%N;Kh>z4Jul1N@w<*Gmq=vB@*B@3wc&n0(l*#B3w2XA_@lR zZ1y!D>YaO+shb)$%!RW#GV$a7Yy9l&g(90cDv7plmsTjZJn|lhiuW)7sRC2jdHPA& zV9q`>IB`AyF7)Io@!ENSyshKUjuCmUh5GArzFSZyjEFtt6B!>tuJ%saAJ)T6|Q{{#0_XtGW zPdE~h=QV47=yRIwYn{ixBq-YnKGn+gLR;eF{t%mr>n8^i66)RNuh9ezv%OUKBud;Fg|Auc^;V_!CPRDXcJC z2>(yR-YBlb5}ePFxxC9~+c%`3{S5w-oXgn#LmgiDXP$naiDE%haYlgaZJ{C!BS=@B z_Y91kg1C!2*MalOsNOmacrYM|-zE?PlG`GW)sou0Z-VBukr8-*{nRsQ@=opiu80Ms z;l<#|9tg}vj_MRu8NJATyx~Raxpae{p}7AfUTsW*D~IQPry@Hnn&AX0@+tQV5nx(+ ze4RTS<*L$sO->BLAfo*)UHk5>x%ID{<=Y>z-Vv%PSJo2vxTS|s=hPX?**$4p+3-cS z>W{_K zNLMGDfQrJArcg&ge%!>iG<|)D&%W9ah6rx+$!{-TAySY zozucN1QO#5B(W5~9tZ90~WUC?#`@BE`%5t4iZD4{_fgzGC zk>WRi_mD9&B;g}aOtU~V3(ikKqk(sC?ICS2?-r+&Cuur;n7fr0f2XB|RHp3JgK{n+ zFlLoS$D)-08|?1T`Bva&-VAv!>Lp|L8j_fEvmbT5WRP0l;?66uG)4vz5i$AVV ze$D-+9Gr^G-&gKIL(qp}mfOkIPD<_kCp{1z)7B@Rh&Gk=4ol4Angl!S%q_v)Q>OIb z7tpXT2%FAcjMM)OoQ6t*1mR6Gs7j!_$|zSr-%-fI_s>>r+;=e+0K=RWss z@?$EzC&*hvR?$dP#y2tNy<*`x-E(~Z2jQ*7ui$RjW;!{b6TY{a1 zC3n=!W2N;6MEfbCC93;xFvvRuWE`2C65hPIMYlsnQPO=dUf6U&UNA4YiVVEl$%x&N zkW`p>f9D4I<*SSddFDo>^4gtC-6+=NoeZY54dZ58#D2x_=C{s<*u$(8vY?nRX+(HL zuUlbzIjdM+a8G}PhVNYTsjd|ZAU2&aS@A6I^P58-e5OKVTY5}N5x*n)PiPq5r!N|; zDVe_=&Hk3rAD;_lPzQ|uT#58F4OO(M=iT}BDI;OXp20X_Hoie#Bj^n-7XPC&=Oy5; zAX>KgSGN8{s~mMD=#w$b7VkKY>IqtlhEQ^`LVp6h19%^&7L98&qU_&puL3Wu35d(% z;rHjdB}`@Y4A+*=axFU##DtC6g+=w*jSKFmiSHm1Y>31gwm9`OKC4xekS{RDWuz@y z>Wt0e^=@)IpjBbUfq;)<)TGI<*i*F;r0T`UAT2$jwy=$7NmB)?ybDyST?p2T?;Vh$ z3`E|JSehjH2Ud@dWsxqD>I)QPb~m z7KI+}LMB+(xFP#M`DyGa@0RH>P2+F^@7=7N_N$&+G12Lt1xhJ7{k(e?qr!?MyqV>s zkHj6KE!7XNazft0Y;bWCOfj%j%*4sLi4*&~%VAkt7b6IponqjGw5; zlMN;yd?YTSv@1G+z%UJu096K%s^Sp|=gHP&fYT9$e>MdXWtH!Nub!VTHcBd3)oAaz z@dTXuHVW^w0D~ppuLCc*gU=9Q6tQPu>Xqi{qUM}Ss?Kr2$~0EI??5WCmogbWuYnI! z)hw?IwYIZ^-sqA3@>)Hos6Ku3s4`0P{pPK-kD;88-J)#X&$=#c9Vl<(JM(96cb(Yt zjL@$5e89*iaLo)@lf=8=(I-xR@NQg9nPrgEOe5!mWZ-8?LP&aYAt==zntnq@E4a?z z+CH|ktE>94RN*4Oj4gL*9L#Kuwv_ah^nPXF*E%T>CB{;J|KMwznzg&zGj~K@b;pXK zJ5&Vw&ExMiktXB&r{CL6b{Ne~TaebIqjHpA5JfcEoi8|7N98E1CKy!x%Ad1hY{xHJ zr=>S#FW;n0_IlK^H&b%ko>9TdS=mkK2f*}v|3Qgf97;1tYDX;Q!pV;$o;LwGC2^I_ zAc3vNEq)!memC-h=(rTlOYHS0`5B+7%)wmndA&x+2!`uS@K} zzdpqE;a=ko34w#0EC*<eq}J7^{LQ+QG-SUk<$Oz+ zINLQ4rd8p$;dd144mdiAYny1pF>l_@gT297yOUY|;Bp3o^&U?lwb3uPM?Rl_U2?t! z`qI2Pmo%&X34|!3n4DC)Qw3MIJjt$V<}(_-SF$mb#$c)HZqyj(E+iZ|r~it+UaRQy zT>p5$RaGP}gayui1Em4q#;B#EL@t`YA$Z3we!W9I+B7U4W9k@C4U*V7xV&QDtKcwA zOC%SVxU5d5Ke(?1rVZk+2=qIkVV*=aK%?+{ zQ?wLZfCmjk9R$XOfLVxS$^BZXQzhsjb|_T|wedZdWva z)ZGK0&ebQDA8W8bzF0P(KK{v2KDux?5NUrY_JEXmBl29#Diui&2gG~ud@HaX|Fdpf zo&}bYK4=t)T>Gyu3}D)MTe94bSSqcg%hD6?{Yrl%B5BpvltTz`1M zd_O`h&NAUNuFTK?c@KBLjGqtdkdW+s-XA<_@1YPPijSQL#~3z{s|`@zeR@|0qBBa> z0?DqFT*a5k3!gyrU>6X$km}#33nkbENFwtFFL`SOM8CM36s*lmxk3MIK5IpWF7+;* ze#NL9Rfs~%hH_@}#r6~sA}iPg8DcDEq!8LpR31kmhM6xxr7$MfJH$>11@0qtV$4u! zQZud_k4^xJp#LB05y`p+(oQm%)x#*T01eGHsR8=BCK@{>U|8?+rO_Wm@d%p%V*GRX ztGF|g@-5o=-YAZFP@p=W--8fgdA&Q7!Y@>r{Jiw!0}Rm zUBF-$qXL`KQA4*@OdoKr$*qSrgTSI|)BO`{1tZL{MbG8ri!A~K6g1u8wQJ!;=gI{o zve7_X<6ixTFWW&PlvkR%E-I2>4>DS7#m z5d?PhG|+T+m-v~XHy~BOTm`@*oHqK)O|TPP<$wPsx4Uxi9DhBr1i$zJirXjAXLuu& zeJ>jCe9yyT)oc|ik$wKF^k2^JUu%_Px%HUVQu(N$b#NN+kb1`XV`D-W2V54QoXq;Y z!7WLAv7BWK0a!#9sO2ERJq-;7)<(O%+Cm<^+23LvXYRH;(w3IF1J32At7CbuuwnL0 zHhv;D6EeOrLs9b?{YN8@N*r+UNK@_+_XurhaJRzVJ=D7nu@1uODa%v7=B`ZZJBr*O zM}gd@p!BMw52++fE7xduH#NuyWOR3&<6VnM2&hmAG!Be+N(fz5SH-v|@~-`mxy{(_ zA}ks)_0xDnbsZ!)j$Ok>mvxuF>mr*4Nhw-dIg5wu?17vfNm7Hg& z%B}F}pu7ciHBh4Tx(hgw0Ls=8sd5L|fSx=zdA*wKL^c=zc4{@e5OL&$(+OWhH;|2U ziN{T{cK;4p3fx#%W0vG~g|al1dXZ|1crerb*NP8^Fug*E;mw5bfjcK>UNdjLx*r$( z-GTC&5)WNW78UnZ^@sz+3wrVMv%$sDnd4T2gXvE{=j0hu;Ri}DJA%-MeF2!s#k8BP zh|Aq2G)m6yR$=l;w}BGD+t!mlO`?kM`Qk^t{}<5dLFDa=d0!+RlUC2W zaS~*`BNP@O%Y6XtH}MCHTo`#Sa8gk6EqtSk^AFH@+f&r~$Fauk)6a!>H@j;&I8!}@ z9`h2j1s|=bzJ7i&HmoQ!`rh)v5dY|T-e?VH2CVDsx&)b;nOt&6Sh%hoZVRcBb5kr3 zO*|XVtW@LhAN|^y>eVE6ag8}5Y<=&a4B&mm5QI@KCo-9I<5+b?y=o9E89R=YN-J+fmNQm+> z9Sy~QFTFJGl=TQft-V^J{*wlRnyz_zIWD*A-(SJfoocNshJ}#JC6KEndLQKt8X$sh zXTR=2rgvL4gQl;dHEp5h7@ZE}V+1o=eB1f1D89M228&<6w*$w}PQ7Fg)Wu>i?C%CDuLNm$BzgXC9#Nq2e8}`~_KOJbo z@6F|$R|}j8{zSRM+th7Mq}tf%9hS){GDRG^3mW5%)mUk$Y*UehfB%c%c#p62j~aL5 zpxqky>}>EA$pY0n8>;4bJ-}&R#do%>b^YP}-w#n8Zoh&8tl5e?4xfn)q`s@XVR^JZ zny%J*%kF;siS~5sVAahGKOi$Fs`|ETDD+FAfEj*3i7^8DfTVdl_$jE6Dmb|0&&H%M zh>a>c(aKqzrlCuFih=TQ4@c$$3sZp$DZz!ndk*-d02dnEd0Hqc9BBpwYnJhd1TuH* zn-!1~x`ByZtHemj)DE({Npbs-VZvWO9hGiI@J!fTnq)ux9l@9AT}{MlIH*f8@-SQqG)D544`nZ^X==?JgB*&Xw@^u zC+<1ZJX%mgVNl}#S`Fc8HJy07aOZEk6zrdkIz4K%;@iW$JuSv31oojNwfBU|vhdWv zpHHBSkjy_D{B4AV@-?;(8_8iDZNgAlI9KsBeMx4L&U^$Bo7?XkfG@XA-y9R_*!{sj z(dB!zIUO5qA?3?DXSY&s7N)16khIAVAH+H!R*iGAMu<=hj*{BxGe>W

+(9U&lB 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 I?_~i014p;Y`Tzg` literal 0 HcmV?d00001 From 27520ba507d8c2d0baa9a19981e3c20fb8681916 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Fri, 13 Apr 2018 08:39:06 -0400 Subject: [PATCH 05/19] vDiagram_2.0.1 - GUI --- vDiagram_2.0.1/vDiagram_2.0.1.ps1 | 8807 +++++++++++++++++++++++++++++ 1 file changed, 8807 insertions(+) create mode 100644 vDiagram_2.0.1/vDiagram_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 new file mode 100644 index 0000000..c13525d --- /dev/null +++ b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 @@ -0,0 +1,8807 @@ +<# +.SYNOPSIS + vDiagram Visio Drawing Tool + +.DESCRIPTION + vDiagram Visio Drawing Tool + +.NOTES + File Name : vDiagram2.0.1.ps1 + Author : Tony Gonzalez + Author : Jason Hopkins + Based on : vDiagram by Alan Renouf + Version : 2.0.0 + +.USAGE NOTES + Ensure to unblock files before unzipping + Ensure to run as administrator + Required Files: + PowerCLI or PowerShell 5.0 with PowerCLI Modules installed + Active connection to vCenter to capture data + MS Visio + +.CHANGE LOG + - 04/12/2018 - v2.0.1 + Added MAC Addresses to VMs & Templates + Added a check to see if prior CSVs are still present + Added option to copy prior CSVs to new folder + + - 04/11/2018 - v2.0.0 + Presented as a Community Theater Session at South Florida VMUG + Feature enhancement requests collected +#> + +#region ScriptForm Designer + +#region Constructor + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") +#endregion + +#region Post-Constructor Custom Code +$MyVer = "2.0.1" +$LastUpdated = "April 12, 2018" +$About = +@" + + vDiagram $MyVer + + Contributors: Tony Gonzalez of RoundTower Technologies LLC + Jason Hopkins of RoundTower Technologies LLC + + Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram + + Created: February 13, 2018 + + Last Updated: $LastUpdated + +"@ +#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" +if (!(Test-Path $TestShapes)) +{ + $CurrentLocation = Get-Location + copy $CurrentLocation\vDiagram.vssx $TestShapes + Write-Host "Copying Shapes File to My Shapes" +} +$shpFile = "\vDiagram.vssx" +#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Set_WindowStyle { +param( + [Parameter()] + [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', + 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', + 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] + $Style = 'SHOW', + [Parameter()] + $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle +) + $WindowStates = @{ + FORCEMINIMIZE = 11; HIDE = 0 + MAXIMIZE = 3; MINIMIZE = 6 + RESTORE = 9; SHOW = 5 + SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 + SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 + SHOWNA = 8; SHOWNOACTIVATE = 4 + SHOWNORMAL = 1 + } + Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) + + $Win32ShowWindowAsync = Add-Type –memberDefinition @” + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); +“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru + + $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null +} +Set_WindowStyle MINIMIZE +#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function About_Config +{ + + $About + + #Add objects for About + $AboutForm = New-Object System.Windows.Forms.Form + $AboutTextBox = New-Object System.Windows.Forms.RichTextBox + + #About Form + $AboutForm.Icon = $Icon + $AboutForm.AutoScroll = $True + $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) + $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutForm.Name = "About" + $AboutForm.StartPosition = 1 + $AboutForm.Text = "About vDiagram $MyVer" + + $AboutTextBox.Anchor = 15 + $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) + $AboutTextBox.BorderStyle = 0 + $AboutTextBox.Font = "Tahoma" + $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) + $AboutTextBox.Name = "AboutTextBox" + $AboutTextBox.ReadOnly = $True + $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) + $AboutTextBox.Text = $About + + $AboutForm.Controls.Add($AboutTextBox) + + $AboutForm.Show() | Out-Null +} +#endregion + +#region Form Creation +#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vDiagram = New-Object System.Windows.Forms.Form +$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) +$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") +$vDiagram.Icon = $Icon +$vDiagram.Text = "vDiagram 2.0" +$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan +#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainMenu = New-Object System.Windows.Forms.MenuStrip +$MainMenu.Location = New-Object System.Drawing.Point(0, 0) +$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) +$MainMenu.TabIndex = 1 +$MainMenu.Text = "MainMenu" +#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) +$FileToolStripMenuItem.Text = "File" +#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) +$ExitToolStripMenuItem.Text = "Exit" +$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) +$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) +#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) +$HelpToolStripMenuItem.Text = "Help" +#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) +$AboutToolStripMenuItem.Text = "About" +$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) +$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) +$AboutToolStripMenuItem.Add_Click({About_Config}) +#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainTab = New-Object System.Windows.Forms.TabControl +$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) +$MainTab.Location = New-Object System.Drawing.Point(10, 30) +$MainTab.Size = New-Object System.Drawing.Size(990, 98) +$MainTab.TabIndex = 0 +$MainTab.Text = "MainTabs" +#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Prerequisites = New-Object System.Windows.Forms.TabPage +$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) +$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) +$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) +$Prerequisites.TabIndex = 0 +$Prerequisites.Text = "Prerequisites" +$Prerequisites.BackColor = [System.Drawing.Color]::LightGray +#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellLabel = New-Object System.Windows.Forms.Label +$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) +$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) +$PowershellLabel.TabIndex = 1 +$PowershellLabel.Text = "Powershell:" +#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellInstalled = New-Object System.Windows.Forms.Label +$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) +$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) +$PowershellInstalled.TabIndex = 2 +$PowershellInstalled.Text = "" +$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleLabel = New-Object System.Windows.Forms.Label +$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) +$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) +$PowerCliModuleLabel.TabIndex = 3 +$PowerCliModuleLabel.Text = "PowerCLI Module:" +#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label +$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) +$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) +$PowerCliModuleInstalled.TabIndex = 4 +$PowerCliModuleInstalled.Text = "" +$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliLabel = New-Object System.Windows.Forms.Label +$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) +$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) +$PowerCliLabel.TabIndex = 5 +$PowerCliLabel.Text = "PowerCLI:" +#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliInstalled = New-Object System.Windows.Forms.Label +$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) +$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) +$PowerCliInstalled.TabIndex = 6 +$PowerCliInstalled.Text = "" +$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioLabel = New-Object System.Windows.Forms.Label +$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) +$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) +$VisioLabel.TabIndex = 7 +$VisioLabel.Text = "Visio:" +#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioInstalled = New-Object System.Windows.Forms.Label +$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) +$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) +$VisioInstalled.TabIndex = 8 +$VisioInstalled.Text = "" +$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray +$Prerequisites.Controls.Add($PowershellLabel) +$Prerequisites.Controls.Add($PowershellInstalled) +$Prerequisites.Controls.Add($PowerCliModuleLabel) +$Prerequisites.Controls.Add($PowerCliModuleInstalled) +$Prerequisites.Controls.Add($PowerCliLabel) +$Prerequisites.Controls.Add($PowerCliInstalled) +$Prerequisites.Controls.Add($VisioLabel) +$Prerequisites.Controls.Add($VisioInstalled) +#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfo = New-Object System.Windows.Forms.TabPage +$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) +$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) +$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) +$vCenterInfo.TabIndex = 0 +$vCenterInfo.Text = "vCenter Info" +$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray +#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterLabel = New-Object System.Windows.Forms.Label +$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) +$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) +$MainVcenterLabel.TabIndex = 1 +$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" +#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox +$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) +$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) +$MainVcenterTextBox.TabIndex = 2 +$MainVcenterTextBox.Text = "" +#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterLabel = New-Object System.Windows.Forms.Label +$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) +$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) +$TargetVcenterLabel.TabIndex = 3 +$TargetVcenterLabel.Text = "Name of target vCenter:" +#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox +$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) +$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) +$TargetVcenterTextBox.TabIndex = 4 +$TargetVcenterTextBox.Text = "" +#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameLabel = New-Object System.Windows.Forms.Label +$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) +$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) +$UserNameLabel.TabIndex = 5 +$UserNameLabel.Text = "vCenter User Name:" +#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameTextBox = New-Object System.Windows.Forms.TextBox +$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) +$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) +$UserNameTextBox.TabIndex = 6 +$UserNameTextBox.Text = "" +#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) +$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) +$PasswordLabel.TabIndex = 7 +$PasswordLabel.Text = "Password:" +#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordTextBox = New-Object System.Windows.Forms.TextBox +$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) +$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) +$PasswordTextBox.TabIndex = 8 +$PasswordTextBox.Text = "" +$PasswordTextBox.UseSystemPasswordChar = $true +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton = New-Object System.Windows.Forms.Button +$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) +$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) +$ConnectButton.TabIndex = 9 +$ConnectButton.Text = "Connect to vCenter" +$ConnectButton.UseVisualStyleBackColor = $true +$vCenterInfo.Controls.Add($MainVcenterLabel) +$vCenterInfo.Controls.Add($MainVcenterTextBox) +$vCenterInfo.Controls.Add($TargetVcenterLabel) +$vCenterInfo.Controls.Add($TargetVcenterTextBox) +$vCenterInfo.Controls.Add($UserNameLabel) +$vCenterInfo.Controls.Add($UserNameTextBox) +$vCenterInfo.Controls.Add($PasswordLabel) +$vCenterInfo.Controls.Add($PasswordTextBox) +$vCenterInfo.Controls.Add($ConnectButton) +$MainTab.Controls.Add($Prerequisites) +$MainTab.Controls.Add($vCenterInfo) +$MainTab.SelectedIndex = 0 +#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SubTab = New-Object System.Windows.Forms.TabControl +$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$SubTab.Location = New-Object System.Drawing.Point(10, 136) +$SubTab.Size = New-Object System.Drawing.Size(990, 512) +$SubTab.TabIndex = 0 +$SubTab.Text = "SubTabs" +#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDirections = New-Object System.Windows.Forms.TabPage +$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDirections.Location = New-Object System.Drawing.Point(4, 22) +$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDirections.Size = New-Object System.Drawing.Size(982, 486) +$TabDirections.TabIndex = 0 +$TabDirections.Text = "Directions" +$TabDirections.UseVisualStyleBackColor = $true +#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesHeading = New-Object System.Windows.Forms.Label +$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) +$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) +$PrerequisitesHeading.TabIndex = 0 +$PrerequisitesHeading.Text = "Prerequisites Tab" +#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesDirections = New-Object System.Windows.Forms.Label +$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) +$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) +$PrerequisitesDirections.TabIndex = 1 +$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." +#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoHeading = New-Object System.Windows.Forms.Label +$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) +$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) +$vCenterInfoHeading.TabIndex = 2 +$vCenterInfoHeading.Text = "vCenter Info Tab" +#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoDirections = New-Object System.Windows.Forms.Label +$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) +$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) +$vCenterInfoDirections.TabIndex = 3 +$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." +#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvHeading = New-Object System.Windows.Forms.Label +$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) +$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) +$CaptureCsvHeading.TabIndex = 4 +$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" +#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureDirections = New-Object System.Windows.Forms.Label +$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) +$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) +$CaptureDirections.TabIndex = 5 +$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." +#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawHeading = New-Object System.Windows.Forms.Label +$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) +$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) +$DrawHeading.TabIndex = 6 +$DrawHeading.Text = "Draw Visio Tab" +#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawDirections = New-Object System.Windows.Forms.Label +$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) +$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) +$DrawDirections.TabIndex = 7 +$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." +$TabDirections.Controls.Add($PrerequisitesHeading) +$TabDirections.Controls.Add($PrerequisitesDirections) +$TabDirections.Controls.Add($vCenterInfoHeading) +$TabDirections.Controls.Add($vCenterInfoDirections) +$TabDirections.Controls.Add($CaptureCsvHeading) +$TabDirections.Controls.Add($CaptureDirections) +$TabDirections.Controls.Add($DrawHeading) +$TabDirections.Controls.Add($DrawDirections) +#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabCapture = New-Object System.Windows.Forms.TabPage +$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabCapture.Location = New-Object System.Drawing.Point(4, 22) +$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) +$TabCapture.Size = New-Object System.Drawing.Size(982, 486) +$TabCapture.TabIndex = 3 +$TabCapture.Text = "Capture CSVs for Visio" +$TabCapture.UseVisualStyleBackColor = $true +#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label +$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) +$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) +$CaptureCsvOutputLabel.TabIndex = 0 +$CaptureCsvOutputLabel.Text = "CSV Output Folder:" +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button +$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) +$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) +$CaptureCsvOutputButton.TabIndex = 0 +$CaptureCsvOutputButton.Text = "Select Output Folder" +$CaptureCsvOutputButton.UseVisualStyleBackColor = $false +$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$vCenterCsvCheckBox.Checked = $true +$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$vCenterCsvCheckBox.TabIndex = 1 +$vCenterCsvCheckBox.Text = "Export vCenter Info" +$vCenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) +$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationComplete.TabIndex = 26 +$vCenterCsvValidationComplete.Text = "" +#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatacenterCsvCheckBox.Checked = $true +$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatacenterCsvCheckBox.TabIndex = 2 +$DatacenterCsvCheckBox.Text = "Export Datacenter Info" +$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) +$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationComplete.TabIndex = 27 +$DatacenterCsvValidationComplete.Text = "" +#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ClusterCsvCheckBox.Checked = $true +$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ClusterCsvCheckBox.TabIndex = 3 +$ClusterCsvCheckBox.Text = "Export Cluster Info" +$ClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) +$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationComplete.TabIndex = 28 +$ClusterCsvValidationComplete.Text = "" +#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmHostCsvCheckBox.Checked = $true +$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmHostCsvCheckBox.TabIndex = 4 +$VmHostCsvCheckBox.Text = "Export VmHost Info" +$VmHostCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) +$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationComplete.TabIndex = 29 +$VmHostCsvValidationComplete.Text = "" +#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmCsvCheckBox.Checked = $true +$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmCsvCheckBox.TabIndex = 5 +$VmCsvCheckBox.Text = "Export Vm Info" +$VmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) +$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationComplete.TabIndex = 30 +$VmCsvValidationComplete.Text = "" +#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$TemplateCsvCheckBox.Checked = $true +$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$TemplateCsvCheckBox.TabIndex = 6 +$TemplateCsvCheckBox.Text = "Export Template Info" +$TemplateCsvCheckBox.UseVisualStyleBackColor = $true +#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label +$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) +$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationComplete.TabIndex = 31 +$TemplateCsvValidationComplete.Text = "" +#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreClusterCsvCheckBox.Checked = $true +$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreClusterCsvCheckBox.TabIndex = 7 +$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" +$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) +$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationComplete.TabIndex = 32 +$DatastoreClusterCsvValidationComplete.Text = "" +#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreCsvCheckBox.Checked = $true +$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreCsvCheckBox.TabIndex = 8 +$DatastoreCsvCheckBox.Text = "Export Datastore Info" +$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) +$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationComplete.TabIndex = 33 +$DatastoreCsvValidationComplete.Text = "" +#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VsSwitchCsvCheckBox.Checked = $true +$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) +$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VsSwitchCsvCheckBox.TabIndex = 9 +$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" +$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) +$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationComplete.TabIndex = 34 +$VsSwitchCsvValidationComplete.Text = "" +#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPortGroupCsvCheckBox.Checked = $true +$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) +$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPortGroupCsvCheckBox.TabIndex = 10 +$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" +$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) +$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationComplete.TabIndex = 35 +$VssPortGroupCsvValidationComplete.Text = "" +#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssVmkernelCsvCheckBox.Checked = $true +$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) +$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssVmkernelCsvCheckBox.TabIndex = 11 +$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" +$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) +$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationComplete.TabIndex = 36 +$VssVmkernelCsvValidationComplete.Text = "" +#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPnicCsvCheckBox.Checked = $true +$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) +$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPnicCsvCheckBox.TabIndex = 12 +$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" +$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) +$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationComplete.TabIndex = 37 +$VssPnicCsvValidationComplete.Text = "" +#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdSwitchCsvCheckBox.Checked = $true +$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) +$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdSwitchCsvCheckBox.TabIndex = 13 +$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" +$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) +$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationComplete.TabIndex = 38 +$VdSwitchCsvValidationComplete.Text = "" +#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPortGroupCsvCheckBox.Checked = $true +$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) +$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPortGroupCsvCheckBox.TabIndex = 14 +$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" +$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) +$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationComplete.TabIndex = 39 +$VdsPortGroupCsvValidationComplete.Text = "" +#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsVmkernelCsvCheckBox.Checked = $true +$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) +$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsVmkernelCsvCheckBox.TabIndex = 15 +$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" +$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) +$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationComplete.TabIndex = 40 +$VdsVmkernelCsvValidationComplete.Text = "" +#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPnicCsvCheckBox.Checked = $true +$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) +$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPnicCsvCheckBox.TabIndex = 16 +$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" +$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) +$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationComplete.TabIndex = 41 +$VdsPnicCsvValidationComplete.Text = "" +#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$FolderCsvCheckBox.Checked = $true +$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) +$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$FolderCsvCheckBox.TabIndex = 17 +$FolderCsvCheckBox.Text = "Export Folder Info" +$FolderCsvCheckBox.UseVisualStyleBackColor = $true +#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label +$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) +$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationComplete.TabIndex = 42 +$FolderCsvValidationComplete.Text = "" +#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$RdmCsvCheckBox.Checked = $true +$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) +$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$RdmCsvCheckBox.TabIndex = 18 +$RdmCsvCheckBox.Text = "Export RDM Info" +$RdmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label +$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) +$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationComplete.TabIndex = 43 +$RdmCsvValidationComplete.Text = "" +#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsRuleCsvCheckBox.Checked = $true +$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) +$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsRuleCsvCheckBox.TabIndex = 19 +$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" +$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) +$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationComplete.TabIndex = 44 +$DrsRuleCsvValidationComplete.Text = "" +#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsClusterGroupCsvCheckBox.Checked = $true +$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) +$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsClusterGroupCsvCheckBox.TabIndex = 20 +$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" +$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) +$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationComplete.TabIndex = 45 +$DrsClusterGroupCsvValidationComplete.Text = "" +#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsVmHostRuleCsvCheckBox.Checked = $true +$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) +$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsVmHostRuleCsvCheckBox.TabIndex = 21 +$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" +$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) +$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 +$DrsVmHostRuleCsvValidationComplete.Text = "" +#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ResourcePoolCsvCheckBox.Checked = $true +$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) +$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ResourcePoolCsvCheckBox.TabIndex = 22 +$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" +$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) +$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationComplete.TabIndex = 47 +$ResourcePoolCsvValidationComplete.Text = "" +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton = New-Object System.Windows.Forms.Button +$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) +$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureUncheckButton.TabIndex = 23 +$CaptureUncheckButton.Text = "Uncheck All" +$CaptureUncheckButton.UseVisualStyleBackColor = $false +$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton = New-Object System.Windows.Forms.Button +$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) +$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureCheckButton.TabIndex = 24 +$CaptureCheckButton.Text = "Check All" +$CaptureCheckButton.UseVisualStyleBackColor = $false +$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton = New-Object System.Windows.Forms.Button +$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) +$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureButton.TabIndex = 25 +$CaptureButton.Text = "Collect CSV Data" +$CaptureButton.UseVisualStyleBackColor = $false +$CaptureButton.BackColor = [System.Drawing.Color]::LightGray +$TabCapture.Controls.Add($CaptureCsvOutputLabel) +$TabCapture.Controls.Add($CaptureCsvOutputButton) +$TabCapture.Controls.Add($vCenterCsvCheckBox) +$TabCapture.Controls.Add($vCenterCsvValidationComplete) +$TabCapture.Controls.Add($DatacenterCsvCheckBox) +$TabCapture.Controls.Add($DatacenterCsvValidationComplete) +$TabCapture.Controls.Add($ClusterCsvCheckBox) +$TabCapture.Controls.Add($ClusterCsvValidationComplete) +$TabCapture.Controls.Add($VmHostCsvCheckBox) +$TabCapture.Controls.Add($VmHostCsvValidationComplete) +$TabCapture.Controls.Add($VmCsvCheckBox) +$TabCapture.Controls.Add($VmCsvValidationComplete) +$TabCapture.Controls.Add($TemplateCsvCheckBox) +$TabCapture.Controls.Add($TemplateCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) +$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreCsvCheckBox) +$TabCapture.Controls.Add($DatastoreCsvValidationComplete) +$TabCapture.Controls.Add($VsSwitchCsvCheckBox) +$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VssPnicCsvCheckBox) +$TabCapture.Controls.Add($VssPnicCsvValidationComplete) +$TabCapture.Controls.Add($VdSwitchCsvCheckBox) +$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VdsPnicCsvCheckBox) +$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) +$TabCapture.Controls.Add($FolderCsvCheckBox) +$TabCapture.Controls.Add($FolderCsvValidationComplete) +$TabCapture.Controls.Add($RdmCsvCheckBox) +$TabCapture.Controls.Add($RdmCsvValidationComplete) +$TabCapture.Controls.Add($DrsRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) +$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) +$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) +$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) +$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) +$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) +$TabCapture.Controls.Add($CaptureUncheckButton) +$TabCapture.Controls.Add($CaptureCheckButton) +$TabCapture.Controls.Add($CaptureButton) +#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDraw = New-Object System.Windows.Forms.TabPage +$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDraw.Location = New-Object System.Drawing.Point(4, 22) +$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDraw.Size = New-Object System.Drawing.Size(982, 486) +$TabDraw.TabIndex = 2 +$TabDraw.Text = "Draw Visio" +$TabDraw.UseVisualStyleBackColor = $true +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton = New-Object System.Windows.Forms.Button +$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) +$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) +$OpenVisioButton.TabIndex = 83 +$OpenVisioButton.Text = "Open Visio Drawing" +$OpenVisioButton.UseVisualStyleBackColor = $false +$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton = New-Object System.Windows.Forms.Button +$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) +$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawCheckButton.TabIndex = 82 +$DrawCheckButton.Text = "Check All" +$DrawCheckButton.UseVisualStyleBackColor = $false +$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton = New-Object System.Windows.Forms.Button +$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawButton.Location = New-Object System.Drawing.Point(448, 450) +$DrawButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawButton.TabIndex = 81 +$DrawButton.Text = "Draw Visio" +$DrawButton.UseVisualStyleBackColor = $false +$DrawButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton = New-Object System.Windows.Forms.Button +$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) +$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawUncheckButton.TabIndex = 80 +$DrawUncheckButton.Text = "Uncheck All" +$DrawUncheckButton.UseVisualStyleBackColor = $false +$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOutputLabel = New-Object System.Windows.Forms.Label +$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) +$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) +$VisioOutputLabel.TabIndex = 46 +$VisioOutputLabel.Text = "Visio Output Folder:" +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton = New-Object System.Windows.Forms.Button +$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) +$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) +$VisioOpenOutputButton.TabIndex = 47 +$VisioOpenOutputButton.Text = "Select Visio Output Folder" +$VisioOpenOutputButton.UseVisualStyleBackColor = $false +$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputLabel = New-Object System.Windows.Forms.Label +$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) +$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) +$DrawCsvInputLabel.TabIndex = 0 +$DrawCsvInputLabel.Text = "CSV Input Folder:" +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton = New-Object System.Windows.Forms.Button +$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) +$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) +$DrawCsvInputButton.TabIndex = 1 +$DrawCsvInputButton.Text = "Select CSV Input Folder" +$DrawCsvInputButton.UseVisualStyleBackColor = $false +$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidation = New-Object System.Windows.Forms.Label +$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$vCenterCsvValidation.TabIndex = 2 +$vCenterCsvValidation.Text = "vCenter CSV File:" +#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) +$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationCheck.TabIndex = 3 +$vCenterCsvValidationCheck.Text = "" +#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidation = New-Object System.Windows.Forms.Label +$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatacenterCsvValidation.TabIndex = 4 +$DatacenterCsvValidation.Text = "Datacenter CSV File:" +#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) +$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationCheck.TabIndex = 5 +$DatacenterCsvValidationCheck.Text = "" +#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidation = New-Object System.Windows.Forms.Label +$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ClusterCsvValidation.TabIndex = 6 +$ClusterCsvValidation.Text = "Cluster CSV File:" +#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) +$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationCheck.TabIndex = 7 +$ClusterCsvValidationCheck.Text = "" +#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidation = New-Object System.Windows.Forms.Label +$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmHostCsvValidation.TabIndex = 8 +$VmHostCsvValidation.Text = "VmHost CSV File:" +#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) +$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationCheck.TabIndex = 9 +$VmHostCsvValidationCheck.Text = "" +#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidation = New-Object System.Windows.Forms.Label +$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmCsvValidation.TabIndex = 10 +$VmCsvValidation.Text = "VM CSV File:" +#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) +$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationCheck.TabIndex = 11 +$VmCsvValidationCheck.Text = "" +#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidation = New-Object System.Windows.Forms.Label +$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$TemplateCsvValidation.TabIndex = 12 +$TemplateCsvValidation.Text = "Template CSV File:" +#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label +$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) +$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationCheck.TabIndex = 13 +$TemplateCsvValidationCheck.Text = "" +#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreClusterCsvValidation.TabIndex = 14 +$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" +#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) +$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationCheck.TabIndex = 15 +$DatastoreClusterCsvValidationCheck.Text = "" +#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreCsvValidation.TabIndex = 16 +$DatastoreCsvValidation.Text = "Datastore CSV File:" +#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) +$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationCheck.TabIndex = 17 +$DatastoreCsvValidationCheck.Text = "" +#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) +$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VsSwitchCsvValidation.TabIndex = 18 +$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" +#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) +$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationCheck.TabIndex = 19 +$VsSwitchCsvValidationCheck.Text = "" +#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) +$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPortGroupCsvValidation.TabIndex = 20 +$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" +#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) +$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationCheck.TabIndex = 21 +$VssPortGroupCsvValidationCheck.Text = "" +#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) +$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssVmkernelCsvValidation.TabIndex = 22 +$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" +#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) +$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationCheck.TabIndex = 23 +$VssVmkernelCsvValidationCheck.Text = "" +#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidation = New-Object System.Windows.Forms.Label +$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) +$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPnicCsvValidation.TabIndex = 24 +$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" +#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) +$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationCheck.TabIndex = 25 +$VssPnicCsvValidationCheck.Text = "" +#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) +$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdSwitchCsvValidation.TabIndex = 26 +$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" +#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) +$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationCheck.TabIndex = 27 +$VdSwitchCsvValidationCheck.Text = "" +#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) +$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPortGroupCsvValidation.TabIndex = 28 +$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" +#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) +$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationCheck.TabIndex = 29 +$VdsPortGroupCsvValidationCheck.Text = "" +#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) +$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsVmkernelCsvValidation.TabIndex = 30 +$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" +#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) +$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationCheck.TabIndex = 31 +$VdsVmkernelCsvValidationCheck.Text = "" +#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) +$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPnicCsvValidation.TabIndex = 32 +$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" +#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) +$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationCheck.TabIndex = 33 +$VdsPnicCsvValidationCheck.Text = "" +#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidation = New-Object System.Windows.Forms.Label +$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) +$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$FolderCsvValidation.TabIndex = 34 +$FolderCsvValidation.Text = "Folder CSV File:" +#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label +$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) +$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationCheck.TabIndex = 35 +$FolderCsvValidationCheck.Text = "" +#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidation = New-Object System.Windows.Forms.Label +$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) +$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$RdmCsvValidation.TabIndex = 36 +$RdmCsvValidation.Text = "RDM CSV File:" +#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label +$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) +$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationCheck.TabIndex = 37 +$RdmCsvValidationCheck.Text = "" +#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) +$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsRuleCsvValidation.TabIndex = 38 +$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" +#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) +$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationCheck.TabIndex = 39 +$DrsRuleCsvValidationCheck.Text = "" +#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) +$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsClusterGroupCsvValidation.TabIndex = 40 +$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" +#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) +$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationCheck.TabIndex = 41 +$DrsClusterGroupCsvValidationCheck.Text = "" +#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) +$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsVmHostRuleCsvValidation.TabIndex = 42 +$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" +#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) +$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 +$DrsVmHostRuleCsvValidationCheck.Text = "" +#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) +$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ResourcePoolCsvValidation.TabIndex = 44 +$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" +#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) +$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationCheck.TabIndex = 45 +$ResourcePoolCsvValidationCheck.Text = "" +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton = New-Object System.Windows.Forms.Button +$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) +$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) +$CsvValidationButton.TabIndex = 2 +$CsvValidationButton.Text = "Check for CSVs" +$CsvValidationButton.UseVisualStyleBackColor = $false +$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Host_DrawCheckBox.Checked = $true +$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) +$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Host_DrawCheckBox.TabIndex = 48 +$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" +$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_Complete = New-Object System.Windows.Forms.Label +$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) +$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Host_Complete.TabIndex = 49 +$VM_to_Host_Complete.Text = "" +#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Folder_DrawCheckBox.Checked = $true +$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) +$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Folder_DrawCheckBox.TabIndex = 50 +$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" +$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label +$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) +$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Folder_Complete.TabIndex = 51 +$VM_to_Folder_Complete.Text = "" +#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMs_with_RDMs_DrawCheckBox.Checked = $true +$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) +$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 +$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" +$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label +$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) +$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMs_with_RDMs_Complete.TabIndex = 53 +$VMs_with_RDMs_Complete.Text = "" +#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$SRM_Protected_VMs_DrawCheckBox.Checked = $true +$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) +$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 +$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" +$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label +$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) +$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$SRM_Protected_VMs_Complete.TabIndex = 55 +$SRM_Protected_VMs_Complete.Text = "" +#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Datastore_DrawCheckBox.Checked = $true +$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) +$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Datastore_DrawCheckBox.TabIndex = 56 +$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" +$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label +$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) +$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Datastore_Complete.TabIndex = 57 +$VM_to_Datastore_Complete.Text = "" +#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_ResourcePool_DrawCheckBox.Checked = $true +$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) +$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 +$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" +$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label +$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) +$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_ResourcePool_Complete.TabIndex = 59 +$VM_to_ResourcePool_Complete.Text = "" +#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Datastore_to_Host_DrawCheckBox.Checked = $true +$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) +$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$Datastore_to_Host_DrawCheckBox.TabIndex = 60 +$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" +$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label +$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) +$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Datastore_to_Host_Complete.TabIndex = 61 +$Datastore_to_Host_Complete.Text = "" +#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true +$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) +$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 +$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" +$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label +$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) +$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) +$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 +$PhysicalNIC_to_vSwitch_Complete.Text = "" +#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSS_to_Host_DrawCheckBox.Checked = $true +$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) +$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSS_to_Host_DrawCheckBox.TabIndex = 64 +$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" +$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) +$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSS_to_Host_Complete.TabIndex = 65 +$VSS_to_Host_Complete.Text = "" +#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VSS_DrawCheckBox.Checked = $true +$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) +$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VSS_DrawCheckBox.TabIndex = 66 +$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" +$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) +$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VSS_Complete.TabIndex = 67 +$VMK_to_VSS_Complete.Text = "" +#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) +$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 +$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" +$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) +$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSSPortGroup_to_VM_Complete.TabIndex = 69 +$VSSPortGroup_to_VM_Complete.Text = "" +#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDS_to_Host_DrawCheckBox.Checked = $true +$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) +$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDS_to_Host_DrawCheckBox.TabIndex = 70 +$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" +$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) +$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDS_to_Host_Complete.TabIndex = 71 +$VDS_to_Host_Complete.Text = "" +#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VDS_DrawCheckBox.Checked = $true +$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) +$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VDS_DrawCheckBox.TabIndex = 72 +$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" +$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) +$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VDS_Complete.TabIndex = 73 +$VMK_to_VDS_Complete.Text = "" +#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) +$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 +$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" +$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) +$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDSPortGroup_to_VM_Complete.TabIndex = 75 +$VDSPortGroup_to_VM_Complete.Text = "" +#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true +$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) +$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 +$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" +$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label +$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) +$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Cluster_to_DRS_Rule_Complete.TabIndex = 77 +$Cluster_to_DRS_Rule_Complete.Text = "" + +$TabDraw.Controls.Add($OpenVisioButton) +$TabDraw.Controls.Add($DrawCheckButton) +$TabDraw.Controls.Add($DrawButton) +$TabDraw.Controls.Add($DrawUncheckButton) +$TabDraw.Controls.Add($VisioOutputLabel) +$TabDraw.Controls.Add($VisioOpenOutputButton) +$TabDraw.Controls.Add($DrawCsvInputLabel) +$TabDraw.Controls.Add($DrawCsvInputButton) +$TabDraw.Controls.Add($vCenterCsvValidation) +$TabDraw.Controls.Add($vCenterCsvValidationCheck) +$TabDraw.Controls.Add($DatacenterCsvValidation) +$TabDraw.Controls.Add($DatacenterCsvValidationCheck) +$TabDraw.Controls.Add($ClusterCsvValidation) +$TabDraw.Controls.Add($ClusterCsvValidationCheck) +$TabDraw.Controls.Add($VmHostCsvValidation) +$TabDraw.Controls.Add($VmHostCsvValidationCheck) +$TabDraw.Controls.Add($VmCsvValidation) +$TabDraw.Controls.Add($VmCsvValidationCheck) +$TabDraw.Controls.Add($TemplateCsvValidation) +$TabDraw.Controls.Add($TemplateCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreClusterCsvValidation) +$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreCsvValidation) +$TabDraw.Controls.Add($DatastoreCsvValidationCheck) +$TabDraw.Controls.Add($VsSwitchCsvValidation) +$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VssPortGroupCsvValidation) +$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VssVmkernelCsvValidation) +$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VssPnicCsvValidation) +$TabDraw.Controls.Add($VssPnicCsvValidationCheck) +$TabDraw.Controls.Add($VdSwitchCsvValidation) +$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VdsPortGroupCsvValidation) +$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VdsVmkernelCsvValidation) +$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VdsPnicCsvValidation) +$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) +$TabDraw.Controls.Add($FolderCsvValidation) +$TabDraw.Controls.Add($FolderCsvValidationCheck) +$TabDraw.Controls.Add($RdmCsvValidation) +$TabDraw.Controls.Add($RdmCsvValidationCheck) +$TabDraw.Controls.Add($DrsRuleCsvValidation) +$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) +$TabDraw.Controls.Add($ResourcePoolCsvValidation) +$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) +$TabDraw.Controls.Add($CsvValidationButton) +$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Host_Complete) +$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Folder_Complete) +$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) +$TabDraw.Controls.Add($VMs_with_RDMs_Complete) +$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) +$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) +$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Datastore_Complete) +$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) +$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($Datastore_to_Host_Complete) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) +$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VSS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VSS_Complete) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VDS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VDS_Complete) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) +$SubTab.Controls.Add($TabDirections) +$SubTab.Controls.Add($TabCapture) +$SubTab.Controls.Add($TabDraw) +$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText +$SubTab.SelectedIndex = 0 +$vDiagram.Controls.Add($MainMenu) +$vDiagram.Controls.Add($MainTab) +$vDiagram.Controls.Add($SubTab) +#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$VisioBrowse.Description = "Select a directory" +$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$DrawCsvBrowse.Description = "Select a directory" +$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$CaptureCsvBrowse.Description = "Select a directory" +$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + +#endregion + +#region Custom Code +#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellCheck = $PSVersionTable.PSVersion +if ($PowershellCheck.Major -ge 4) +{ + $PowershellInstalled.Forecolor = "Green" + $PowershellInstalled.Text = "Installed Version $PowershellCheck" +} +else +{ + $PowershellInstalled.Forecolor = "Red" + $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" +} +#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) +$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) +if ($PowerCliModuleCheck -ne $null) +{ + $PowerCliModuleInstalled.Forecolor = "Green" + $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" +} +else +{ + $PowerCliModuleInstalled.Forecolor = "Red" + $PowerCliModuleInstalled.Text = "Not Installed" +} +#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerClI Installed" +} +elseif ($PowerCliModuleCheck -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerCLI Module Installed" +} +else +{ + $PowerCliInstalled.Forecolor = "Red" + $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" +} +#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) +{ + $VisioInstalled.Forecolor = "Green" + $VisioInstalled.Text = "Installed" +} +else +{ + $VisioInstalled.Forecolor = "Red" + $VisioInstalled.Text = "Visio is Not Installed" +} +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) +$ConnectButton.Add_Click({ Connect_vCenter_Main }) +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } +Check_CaptureCsvFolder } ) +#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton.Add_Click({ + if($CaptureCsvFolder -eq $null) + { + $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" + } + else + { + if ($vCenterCsvCheckBox.Checked -eq "True") + { + $vCenterCsvValidationComplete.Forecolor = "Blue" + $vCenterCsvValidationComplete.Text = "Processing ....." + vCenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" + $vCenterCsvComplete = Test-Path $vCenterExportFileComplete + if ($vCenterCsvComplete -eq $True) + { + $vCenterCsvValidationComplete.Forecolor = "Green" + $vCenterCsvValidationComplete.Text = "Complete" + } + else + { + $vCenterCsvValidationComplete.Forecolor = "Red" + $vCenterCsvValidationComplete.Text = "Not Complete" + } + } + Connect_vCenter + $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager + if ($Connected -eq $null) { Connect_vCenter_Main } + $ConnectButton.Forecolor = [System.Drawing.Color]::Green + $ConnectButton.Text = "Connected to $DefaultViserver" + if ($DatacenterCsvCheckBox.Checked -eq "True") + { + $DatacenterCsvValidationComplete.Forecolor = "Blue" + $DatacenterCsvValidationComplete.Text = "Processing ....." + Datacenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" + $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete + if ($DatacenterCsvComplete -eq $True) + { + $DatacenterCsvValidationComplete.Forecolor = "Green" + $DatacenterCsvValidationComplete.Text = "Complete" + } + else + { + $DatacenterCsvValidationComplete.Forecolor = "Red" + $DatacenterCsvValidationComplete.Text = "Not Complete" + } + } + if ($ClusterCsvCheckBox.Checked -eq "True") + { + $ClusterCsvValidationComplete.Forecolor = "Blue" + $ClusterCsvValidationComplete.Text = "Processing ....." + Cluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" + $ClusterCsvComplete = Test-Path $ClusterExportFileComplete + if ($ClusterCsvComplete -eq $True) + { + $ClusterCsvValidationComplete.Forecolor = "Green" + $ClusterCsvValidationComplete.Text = "Complete" + } + else + { + $ClusterCsvValidationComplete.Forecolor = "Red" + $ClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmHostCsvCheckBox.Checked -eq "True") + { + $VmHostCsvValidationComplete.Forecolor = "Blue" + $VmHostCsvValidationComplete.Text = "Processing ....." + VmHost_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" + $VmHostCsvComplete = Test-Path $VmHostExportFileComplete + if ($VmHostCsvComplete -eq $True) + { + $VmHostCsvValidationComplete.Forecolor = "Green" + $VmHostCsvValidationComplete.Text = "Complete" + } + else + { + $VmHostCsvValidationComplete.Forecolor = "Red" + $VmHostCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmCsvCheckBox.Checked -eq "True") + { + $VmCsvValidationComplete.Forecolor = "Blue" + $VmCsvValidationComplete.Text = "Processing ....." + Vm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" + $VmCsvComplete = Test-Path $VmExportFileComplete + if ($VmCsvComplete -eq $True) + { + $VmCsvValidationComplete.Forecolor = "Green" + $VmCsvValidationComplete.Text = "Complete" + } + else + { + $VmCsvValidationComplete.Forecolor = "Red" + $VmCsvValidationComplete.Text = "Not Complete" + } + } + if ($TemplateCsvCheckBox.Checked -eq "True") + { + $TemplateCsvValidationComplete.Forecolor = "Blue" + $TemplateCsvValidationComplete.Text = "Processing ....." + Template_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" + $TemplateCsvComplete = Test-Path $TemplateExportFileComplete + if ($TemplateCsvComplete -eq $True) + { + $TemplateCsvValidationComplete.Forecolor = "Green" + $TemplateCsvValidationComplete.Text = "Complete" + } + else + { + $TemplateCsvValidationComplete.Forecolor = "Red" + $TemplateCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreClusterCsvCheckBox.Checked -eq "True") + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" + $DatastoreClusterCsvValidationComplete.Text = "Processing ....." + DatastoreCluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete + if ($DatastoreClusterCsvComplete -eq $True) + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Green" + $DatastoreClusterCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Red" + $DatastoreClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreCsvCheckBox.Checked -eq "True") + { + $DatastoreCsvValidationComplete.Forecolor = "Blue" + $DatastoreCsvValidationComplete.Text = "Processing ....." + Datastore_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" + $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete + if ($DatastoreCsvComplete -eq $True) + { + $DatastoreCsvValidationComplete.Forecolor = "Green" + $DatastoreCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreCsvValidationComplete.Forecolor = "Red" + $DatastoreCsvValidationComplete.Text = "Not Complete" + } + } + if ($VsSwitchCsvCheckBox.Checked -eq "True") + { + $VsSwitchCsvValidationComplete.Forecolor = "Blue" + $VsSwitchCsvValidationComplete.Text = "Processing ....." + VsSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" + $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete + if ($vSSwitchCsvComplete -eq $True) + { + $vSSwitchCsvValidationComplete.Forecolor = "Green" + $vSSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $vSSwitchCsvValidationComplete.Forecolor = "Red" + $vSSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPortGroupCsvCheckBox.Checked -eq "True") + { + $VssPortGroupCsvValidationComplete.Forecolor = "Blue" + $VssPortGroupCsvValidationComplete.Text = "Processing ....." + VssPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete + if ($VssPortGroupCsvComplete -eq $True) + { + $VssPortGroupCsvValidationComplete.Forecolor = "Green" + $VssPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VssPortGroupCsvValidationComplete.Forecolor = "Red" + $VssPortGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssVmkernelCsvCheckBox.Checked -eq "True") + { + $VssVmkernelCsvValidationComplete.Forecolor = "Blue" + $VssVmkernelCsvValidationComplete.Text = "Processing ....." + VssVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete + if ($VssVmkernelCsvComplete -eq $True) + { + $VssVmkernelCsvValidationComplete.Forecolor = "Green" + $VssVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VssVmkernelCsvValidationComplete.Forecolor = "Red" + $VssVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPnicCsvCheckBox.Checked -eq "True") + { + $VssPnicCsvValidationComplete.Forecolor = "Blue" + $VssPnicCsvValidationComplete.Text = "Processing ....." + VssPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" + $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete + if ($VssPnicCsvComplete -eq $True) + { + $VssPnicCsvValidationComplete.Forecolor = "Green" + $VssPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VssPnicCsvValidationComplete.Forecolor = "Red" + $VssPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdSwitchCsvCheckBox.Checked -eq "True") + { + $VdSwitchCsvValidationComplete.Forecolor = "Blue" + $VdSwitchCsvValidationComplete.Text = "Processing ....." + VdSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" + $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete + if ($VdSwitchCsvComplete -eq $True) + { + $VdSwitchCsvValidationComplete.Forecolor = "Green" + $VdSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $VdSwitchCsvValidationComplete.Forecolor = "Red" + $VdSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPortGroupCsvCheckBox.Checked -eq "True") + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" + $VdsPortGroupCsvValidationComplete.Text = "Processing ....." + VdsPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete + if ($VdsPortGroupCsvComplete -eq $True) + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Green" + $VdsPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Red" + $VdsPortGroupCsvValidationComplete.Text = "Not Complete" + + } + } + if ($VdsVmkernelCsvCheckBox.Checked -eq "True") + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" + $VdsVmkernelCsvValidationComplete.Text = "Processing ....." + VdsVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete + if ($VdsVmkernelCsvComplete -eq $True) + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Green" + $VdsVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Red" + $VdsVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPnicCsvCheckBox.Checked -eq "True") + { + $VdsPnicCsvValidationComplete.Forecolor = "Blue" + $VdsPnicCsvValidationComplete.Text = "Processing ....." + VdsPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" + $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete + if ($VdsPnicCsvComplete -eq $True) + { + $VdsPnicCsvValidationComplete.Forecolor = "Green" + $VdsPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPnicCsvValidationComplete.Forecolor = "Red" + $VdsPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($FolderCsvCheckBox.Checked -eq "True") + { + $FolderCsvValidationComplete.Forecolor = "Blue" + $FolderCsvValidationComplete.Text = "Processing ....." + Folder_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" + $FolderCsvComplete = Test-Path $FolderExportFileComplete + if ($FolderCsvComplete -eq $True) + { + $FolderCsvValidationComplete.Forecolor = "Green" + $FolderCsvValidationComplete.Text = "Complete" + } + else + { + $FolderCsvValidationComplete.Forecolor = "Red" + $FolderCsvValidationComplete.Text = "Not Complete" + } + } + if ($RdmCsvCheckBox.Checked -eq "True") + { + $RdmCsvValidationComplete.Forecolor = "Blue" + $RdmCsvValidationComplete.Text = "Processing ....." + Rdm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" + $RdmCsvComplete = Test-Path $RdmExportFileComplete + if ($RdmCsvComplete -eq $True) + { + $RdmCsvValidationComplete.Forecolor = "Green" + $RdmCsvValidationComplete.Text = "Complete" + } + else + { + $RdmCsvValidationComplete.Forecolor = "Red" + $RdmCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsRuleCsvCheckBox.Checked -eq "True") + { + $DrsRuleCsvValidationComplete.Forecolor = "Blue" + $DrsRuleCsvValidationComplete.Text = "Processing ....." + Drs_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" + $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete + if ($DrsRuleCsvComplete -eq $True) + { + $DrsRuleCsvValidationComplete.Forecolor = "Green" + $DrsRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsRuleCsvValidationComplete.Forecolor = "Red" + $DrsRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" + $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." + Drs_Cluster_Group_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete + if ($DrsClusterGroupCsvComplete -eq $True) + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" + $DrsClusterGroupCsvValidationComplete.Text = "Complete" + } + else + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" + $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" + $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." + Drs_VmHost_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete + if ($DrsVmHostRuleCsvComplete -eq $True) + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" + $DrsVmHostRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" + $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($ResourcePoolCsvCheckBox.Checked -eq "True") + { + $ResourcePoolCsvValidationComplete.Forecolor = "Blue" + $ResourcePoolCsvValidationComplete.Text = "Processing ....." + Resource_Pool_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete + if ($ResourcePoolCsvComplete -eq $True) + { + $ResourcePoolCsvValidationComplete.Forecolor = "Green" + $ResourcePoolCsvValidationComplete.Text = "Complete" + } + else + { + $ResourcePoolCsvValidationComplete.Forecolor = "Red" + $ResourcePoolCsvValidationComplete.Text = "Not Complete" + } + } + Disconnect_vCenter + $ConnectButton.Forecolor = [System.Drawing.Color]::Red + $ConnectButton.Text = "Disconnected" + $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" + } +}) +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) +$TabDraw.Controls.Add($DrawCsvInputButton) +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton.Add_Click( +{ + $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text + $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" + $vCenterCsvExists = Test-Path $vCenterExportFile + $TabDraw.Controls.Add($vCenterCsvValidationCheck) + if ($vCenterCsvExists -eq $True) + { + + $vCenterCsvValidationCheck.Forecolor = "Green" + $vCenterCsvValidationCheck.Text = "Present" + } + else + { + $vCenterCsvValidationCheck.Forecolor = "Red" + $vCenterCsvValidationCheck.Text = "Not Present" + } + + $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" + $DatacenterCsvExists = Test-Path $DatacenterExportFile + $TabDraw.Controls.Add($DatacenterCsvValidationCheck) + + if ($DatacenterCsvExists -eq $True) + { + $DatacenterCsvValidationCheck.Forecolor = "Green" + $DatacenterCsvValidationCheck.Text = "Present" + } + else + { + $DatacenterCsvValidationCheck.Forecolor = "Red" + $DatacenterCsvValidationCheck.Text = "Not Present" + } + + $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" + $ClusterCsvExists = Test-Path $ClusterExportFile + $TabDraw.Controls.Add($ClusterCsvValidationCheck) + + if ($ClusterCsvExists -eq $True) + { + $ClusterCsvValidationCheck.Forecolor = "Green" + $ClusterCsvValidationCheck.Text = "Present" + } + else + { + $ClusterCsvValidationCheck.Forecolor = "Red" + $ClusterCsvValidationCheck.Text = "Not Present" + } + + $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" + $VmHostCsvExists = Test-Path $VmHostExportFile + $TabDraw.Controls.Add($VmHostCsvValidationCheck) + + if ($VmHostCsvExists -eq $True) + { + $VmHostCsvValidationCheck.Forecolor = "Green" + $VmHostCsvValidationCheck.Text = "Present" + } + else + { + $VmHostCsvValidationCheck.Forecolor = "Red" + $VmHostCsvValidationCheck.Text = "Not Present" + } + + $VmExportFile = $CsvInputDir + "-VmExport.csv" + $VmCsvExists = Test-Path $VmExportFile + $TabDraw.Controls.Add($VmCsvValidationCheck) + + if ($VmCsvExists -eq $True) + { + $VmCsvValidationCheck.Forecolor = "Green" + $VmCsvValidationCheck.Text = "Present" + } + else + { + $VmCsvValidationCheck.Forecolor = "Red" + $VmCsvValidationCheck.Text = "Not Present" + } + + $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" + $TemplateCsvExists = Test-Path $TemplateExportFile + $TabDraw.Controls.Add($TemplateCsvValidationCheck) + + if ($TemplateCsvExists -eq $True) + { + $TemplateCsvValidationCheck.Forecolor = "Green" + $TemplateCsvValidationCheck.Text = "Present" + } + else + { + $TemplateCsvValidationCheck.Forecolor = "Red" + $TemplateCsvValidationCheck.Text = "Not Present" + } + + $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile + $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) + + if ($DatastoreClusterCsvExists -eq $True) + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Green" + $DatastoreClusterCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Red" + $DatastoreClusterCsvValidationCheck.Text = "Not Present" + } + + $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" + $DatastoreCsvExists = Test-Path $DatastoreExportFile + $TabDraw.Controls.Add($DatastoreCsvValidationCheck) + + if ($DatastoreCsvExists -eq $True) + { + $DatastoreCsvValidationCheck.Forecolor = "Green" + $DatastoreCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreCsvValidationCheck.Forecolor = "Red" + $DatastoreCsvValidationCheck.Text = "Not Present" + } + + $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" + $VsSwitchCsvExists = Test-Path $VsSwitchExportFile + $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) + + if ($VsSwitchCsvExists -eq $True) + { + $VsSwitchCsvValidationCheck.Forecolor = "Green" + $VsSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VsSwitchCsvValidationCheck.Forecolor = "Red" + $VsSwitchCsvValidationCheck.Text = "Not Present" + $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile + $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) + + if ($VssPortGroupCsvExists -eq $True) + { + $VssPortGroupCsvValidationCheck.Forecolor = "Green" + $VssPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VssPortGroupCsvValidationCheck.Forecolor = "Red" + $VssPortGroupCsvValidationCheck.Text = "Not Present" + $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile + $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) + + if ($VssVmkernelCsvExists -eq $True) + { + $VssVmkernelCsvValidationCheck.Forecolor = "Green" + $VssVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VssVmkernelCsvValidationCheck.Forecolor = "Red" + $VssVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" + $VssPnicCsvExists = Test-Path $VssPnicExportFile + $TabDraw.Controls.Add($VssPnicCsvValidationCheck) + + if ($VssPnicCsvExists -eq $True) + { + $VssPnicCsvValidationCheck.Forecolor = "Green" + $VssPnicCsvValidationCheck.Text = "Present" + } + else + { + $VssPnicCsvValidationCheck.Forecolor = "Red" + $VssPnicCsvValidationCheck.Text = "Not Present" + } + + $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" + $VdSwitchCsvExists = Test-Path $VdSwitchExportFile + $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) + + if ($VdSwitchCsvExists -eq $True) + { + $VdSwitchCsvValidationCheck.Forecolor = "Green" + $VdSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VdSwitchCsvValidationCheck.Forecolor = "Red" + $VdSwitchCsvValidationCheck.Text = "Not Present" + $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile + $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) + + if ($VdsPortGroupCsvExists -eq $True) + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Green" + $VdsPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Red" + $VdsPortGroupCsvValidationCheck.Text = "Not Present" + $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile + $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) + + if ($VdsVmkernelCsvExists -eq $True) + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Green" + $VdsVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Red" + $VdsVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" + $VdsPnicCsvExists = Test-Path $VdsPnicExportFile + $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) + + if ($VdsPnicCsvExists -eq $True) + { + $VdsPnicCsvValidationCheck.Forecolor = "Green" + $VdsPnicCsvValidationCheck.Text = "Present" + } + else + { + $VdsPnicCsvValidationCheck.Forecolor = "Red" + $VdsPnicCsvValidationCheck.Text = "Not Present" + } + + $FolderExportFile = $CsvInputDir + "-FolderExport.csv" + $FolderCsvExists = Test-Path $FolderExportFile + $TabDraw.Controls.Add($FolderCsvValidationCheck) + + if ($FolderCsvExists -eq $True) + { + $FolderCsvValidationCheck.Forecolor = "Green" + $FolderCsvValidationCheck.Text = "Present" + } + else + { + $FolderCsvValidationCheck.Forecolor = "Red" + $FolderCsvValidationCheck.Text = "Not Present" + } + + $RdmExportFile = $CsvInputDir + "-RdmExport.csv" + $RdmCsvExists = Test-Path $RdmExportFile + $TabDraw.Controls.Add($RdmCsvValidationCheck) + + if ($RdmCsvExists -eq $True) + { + $RdmCsvValidationCheck.Forecolor = "Green" + $RdmCsvValidationCheck.Text = "Present" + } + else + { + $RdmCsvValidationCheck.Forecolor = "Red" + $RdmCsvValidationCheck.Text = "Not Present" + $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" + $DrsRuleCsvExists = Test-Path $DrsRuleExportFile + $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) + + if ($DrsRuleCsvExists -eq $True) + { + $DrsRuleCsvValidationCheck.Forecolor = "Green" + $DrsRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsRuleCsvValidationCheck.Forecolor = "Red" + $DrsRuleCsvValidationCheck.Text = "Not Present" + $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile + $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) + + if ($DrsClusterGroupCsvExists -eq $True) + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" + $DrsClusterGroupCsvValidationCheck.Text = "Present" + } + else + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" + $DrsClusterGroupCsvValidationCheck.Text = "Not Present" + } + + $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile + $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) + + if ($DrsVmHostRuleCsvExists -eq $True) + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" + $DrsVmHostRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" + $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" + } + + $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile + $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) + + if ($ResourcePoolCsvExists -eq $True) + { + $ResourcePoolCsvValidationCheck.Forecolor = "Green" + $ResourcePoolCsvValidationCheck.Text = "Present" + } + else + { + $ResourcePoolCsvValidationCheck.Forecolor = "Red" + $ResourcePoolCsvValidationCheck.Text = "Not Present" + $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" + } +} ) +$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) +$TabDraw.Controls.Add($CsvValidationButton) +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) +$TabDraw.Controls.Add($VisioOpenOutputButton) +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) +$TabDraw.Controls.Add($DrawUncheckButton) +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) +$TabDraw.Controls.Add($DrawCheckButton) +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; +if ($VM_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Host_Complete.Forecolor = "Blue" + $VM_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Host_Complete) + VM_to_Host + $VM_to_Host_Complete.Forecolor = "Green" + $VM_to_Host_Complete.Text = "Complete" + $TabDraw.Controls.Add($VM_to_Host_Complete) +} +if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Folder_Complete.Forecolor = "Blue" + $VM_to_Folder_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Folder_Complete) + VM_to_Folder + $VM_to_Folder_Complete.Forecolor = "Green" + $VM_to_Folder_Complete.Text = "Complete" +} +if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") +{ + $VMs_with_RDMs_Complete.Forecolor = "Blue" + $VMs_with_RDMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMs_with_RDMs_Complete) + VMs_with_RDMs + $VMs_with_RDMs_Complete.Forecolor = "Green" + $VMs_with_RDMs_Complete.Text = "Complete" +} +if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") +{ + $SRM_Protected_VMs_Complete.Forecolor = "Blue" + $SRM_Protected_VMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) + SRM_Protected_VMs + $SRM_Protected_VMs_Complete.Forecolor = "Green" + $SRM_Protected_VMs_Complete.Text = "Complete" +} +if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Datastore_Complete.Forecolor = "Blue" + $VM_to_Datastore_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Datastore_Complete) + VM_to_Datastore + $VM_to_Datastore_Complete.Forecolor = "Green" + $VM_to_Datastore_Complete.Text = "Complete" +} +if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") +{ + $VM_to_ResourcePool_Complete.Forecolor = "Blue" + $VM_to_ResourcePool_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) + VM_to_ResourcePool + $VM_to_ResourcePool_Complete.Forecolor = "Green" + $VM_to_ResourcePool_Complete.Text = "Complete" +} +if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") +{ + $Datastore_to_Host_Complete.Forecolor = "Blue" + $Datastore_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Datastore_to_Host_Complete) + Datastore_to_Host + $Datastore_to_Host_Complete.Forecolor = "Green" + $Datastore_to_Host_Complete.Text = "Complete" +} +if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") +{ + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" + $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) + PhysicalNIC_to_vSwitch + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" + $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" +} +if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VSS_to_Host_Complete.Forecolor = "Blue" + $VSS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSS_to_Host_Complete) + VSS_to_Host + $VSS_to_Host_Complete.Forecolor = "Green" + $VSS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VSS_Complete.Forecolor = "Blue" + $VMK_to_VSS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VSS_Complete) + VMK_to_VSS + $VMK_to_VSS_Complete.Forecolor = "Green" + $VMK_to_VSS_Complete.Text = "Complete" +} +if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VSSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) + VSSPortGroup_to_VM + $VSSPortGroup_to_VM_Complete.Forecolor = "Green" + $VSSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VDS_to_Host_Complete.Forecolor = "Blue" + $VDS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDS_to_Host_Complete) + VDS_to_Host + $VDS_to_Host_Complete.Forecolor = "Green" + $VDS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VDS_Complete.Forecolor = "Blue" + $VMK_to_VDS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VDS_Complete) + VMK_to_VDS + $VMK_to_VDS_Complete.Forecolor = "Green" + $VMK_to_VDS_Complete.Text = "Complete" +} +if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VDSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) + VDSPortGroup_to_VM + $VDSPortGroup_to_VM_Complete.Forecolor = "Green" + $VDSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") +{ + $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" + $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) + Cluster_to_DRS_Rule + $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" + $Cluster_to_DRS_Rule_Complete.Text = "Complete" +}; +$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) +$TabDraw.Controls.Add($DrawButton) +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton.Add_Click({Open_Final_Visio}) +$TabDraw.Controls.Add($OpenVisioButton) + +#endregion + +#region Event Loop + +function Main{ + [System.Windows.Forms.Application]::EnableVisualStyles() + [System.Windows.Forms.Application]::Run($vDiagram) +} + +#endregion + +#endregion + +#region Event Handlers + +#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect_vCenter_Main +{ + $MainVC = $MainVcenterTextBox.Text + $MainUser = $UserNameTextBox.Text + $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text +} + +function Connect_vCenter +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $User = $UserNameTextBox.Text + $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text +} + +function Disconnect_vCenter +{ + $Disconnect = Disconnect-ViServer * -Confirm:$false +} +#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Find_CaptureCsvFolder +{ + $CaptureCsvBrowseLoop = $True + while ($CaptureCsvBrowseLoop) + { + if ($CaptureCsvBrowse.ShowDialog() -eq "OK") + { + $CaptureCsvBrowseLoop = $False + } + else + { + $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($CaptureCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath +} + +function Check_CaptureCsvFolder +{ + $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $CheckContentDir = $CheckContentPath + "*.csv" + $CheckContent = Test-Path $CheckContentDir + if ($CheckContent -eq "True") + { + $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") + switch ($CheckContents_CaptureCsvFolder) { + 'Yes' + { + del $CheckContentDir + } + + 'No' + { + $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog + $CheckContentCsvBrowse.Description = "Select a directory to copy files to" + $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + $CheckContentCsvBrowse.ShowDialog() + $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath + copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder + del $CheckContentDir + } + } + } +} + +function Find_DrawCsvFolder +{ + $DrawCsvBrowseLoop = $True + while ($DrawCsvBrowseLoop) + { + if ($DrawCsvBrowse.ShowDialog() -eq "OK") + { + $DrawCsvBrowseLoop = $False + } + else + { + $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($DrawCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath +} + +function Find_DrawVisioFolder +{ + $VisioBrowseLoop = $True + while($VisioBrowseLoop) + { + if ($VisioBrowse.ShowDialog() -eq "OK") + { + $VisioBrowseLoop = $False + } + else + { + $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if($VisioBrowseRes -eq "Cancel") + { + return + } + } + } + $global:VisioFolder = $VisioBrowse.SelectedPath +} +#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function vCenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, + @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation + + if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) + { + $null + } + else + { + Disconnect_vCenter + } +} + +function Datacenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort-Object Name | + Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation +} + +function Cluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, + @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, + @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, + @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, + @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, + @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, + @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, + @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, + @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, + @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation +} + +function VmHost_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent + while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent + } + if ($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name } } }, + @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent + while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent + } + if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, + @{ N = "Version" ; E = { $_.Config.Product.Version } }, + @{ N = "Build" ; E = { $_.Config.Product.Build } }, + @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, + @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, + @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, + @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, + @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, + @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, + @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, + @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, + @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, + @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, + @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, + @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation +} + +function Vm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select-Object Name , + @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, + @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, + @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, + @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, + @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, + @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, + @{ N = "OS" ; E = { $_.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.Config.Version } }, + @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, + @{ N = 'Folder' ; E = { $Folder.Name } }, + @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, + @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, + @{ N = "IP" ; E = { $_.Guest.IpAddress } }, + @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, + @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, + @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, + @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation + } +} + +function Template_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + foreach ($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { $VmHost.name } }, + @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, + @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, + @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, + @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, + @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, + @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, + @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, + @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation + } +} + +function DatastoreCluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, + @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, + @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation +} + +function Datastore_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, + @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, + @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, + @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, + @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, + @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, + @{ N = "Accessible" ; E = { $_.State } }, + @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation +} + +function VsSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "Nic" ; E = { $_.Nic } }, + @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, + @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, + @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, + @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, + @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation +} + +function VssPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "VLanId" ; E = { $_.VLanId } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VssVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation + } + } + } +} + +function VssPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation + } + } +} + +function VdSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + foreach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "Vendor" ; E = { $_.Vendor } }, + @{ N = "Version" ; E = { $_.Version } }, + @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, + @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation + } +} + +function VdsPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, + @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, + @{ N = "NumPorts" ; E = { $_.NumPorts } }, + @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, + @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, + @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VdsVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation + + } + } +} + +function VdsPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | + Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch } }, + @{ N = "Portgroup" ; E = { $_.Portgroup } }, + @{ N = "ConnectedEntity" ; E = { $_.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation + } + } +} + +function Folder_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + foreach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -type VM | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation + } +} + +function Rdm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | + Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, + @{ N = "Vm" ; E = { $_.Parent } }, + @{ N = "Label" ; E = { $_.Name } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, + @{ N = "DiskType" ; E = { $_.DiskType } }, + @{ N = "Persistence" ; E = { $_.Persistence } }, + @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, + @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, + @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation +} + +function Drs_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation + } +} + +function Drs_Cluster_Group_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "GroupType" ; E = { $_.GroupType } }, + @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation + } +} + +function Drs_VmHost_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) + { + Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "VMGroup" ; E = { $_.VMGroup } }, + @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, + @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, + @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation + } + } +} + +function Resource_Pool_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) + { + Get-ResourcePool $ResourcePool | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Cluster" ; E = { $Cluster.Name } }, + @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, + @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, + @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, + @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, + @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, + @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, + @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, + @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, + @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, + @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation + } + } +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect-VisioObject($firstObj, $secondObj) +{ + $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) + $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) + $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) +} + +function Add-VisioObjectVC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectCluster($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHost($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectTemplate($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectSRM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDatastore($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHardDisk($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.ScsiCanonicalName + return $shpObj +} + +function Add-VisioObjectFolder($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVsSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVssPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVMK($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsClusterGroup($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDRSVMHostRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectResourcePool($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Create_Visio_Base +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $DocObj = $docsObj.Add("") + $DocObj.SaveAs($Savefile) + $AppVisio.Quit() +} + +function VM_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Host" + $Page = $DocsObj.Pages('VM to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Folder +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Folder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + $FolderImport = Import-Csv $FolderExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Folder" + $Page = $DocsObj.Pages('VM to Folder') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Folder') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Folder Object + $FolderObj = $stnObj.Masters.Item("Folder") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $FolderObject = Add-VisioObjectFolder $FolderObj $Folder + $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' + Connect-VisioObject $DatacenterObject $FolderObject + $y += 1.50 + + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $FolderObject $TemplateObject + $FolderObject = $TemplateObject + } + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $FolderObject $VMObject + $FolderObject = $VMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMs_with_RDMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + # RDM's + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + $RdmImport = Import-Csv $RdmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" + $Page = $DocsObj.Pages('VM w/ RDMs') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM w/ RDMs') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # RDM Object + $RDMObj = $stnObj.Masters.Item("RDM") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ClusterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 3.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatacenterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 2.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function SRM_Protected_VMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "SRM VM" + $Page = $DocsObj.Pages('SRM VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('SRM VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # SRM Protected VM Object + $SRMObj = $stnObj.Masters.Item("SRM Protected Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Datastore +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Datastore" + $Page = $DocsObj.Pages('VM to Datastore') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Datastore') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $ClusterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $ClusterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_ResourcePool +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # ResourcePool + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + $ResourcePoolImport = Import-Csv $ResourcePoolExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" + $Page = $DocsObj.Pages('VM to Resource Pool') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Resource Pool') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Resource Pool Object + $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool + # Name + $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' + # Cluster + $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' + # CpuSharesLevel + $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' + # NumCpuShares + $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' + # CpuReservationMHz + $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' + # CpuExpandableReservation + $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' + # CpuLimitMHz + $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' + # MemSharesLevel + $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' + # NumMemShares + $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' + # MemReservationGB + $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' + # MemExpandableReservation + $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' + # MemLimitGB + $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' + Connect-VisioObject $ClusterObject $ResourcePoolObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ResourcePoolObject $VMObject + $ResourcePoolObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Datastore_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Datastore to Host" + $Page = $DocsObj.Pages('Datastore to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Datastore to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function PhysicalNIC_to_vSwitch +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "PNIC to switch" + $Page = $DocsObj.Pages('PNIC to Switch') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('PNIC to Switch') + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + $y += 1.50 + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSS to Host" + $Page = $DocsObj.Pages('VSS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VSS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VSS" + $Page = $DocsObj.Pages('VMK to VSS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VSS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" + $Page = $DocsObj.Pages('VSSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDS to Host" + $Page = $DocsObj.Pages('VDS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VDS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VDS" + $Page = $DocsObj.Pages('VMK to VDS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VDS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" + $Page = $DocsObj.Pages('VDSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $DatacenterObject $VdSwitchObject + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x = 6.00 + $y += 1.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VPGObject $VMObject + $VPGObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Cluster_to_DRS_Rule +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # DRS Rule + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + $DrsRuleImport = Import-Csv $DrsRuleExportFile + # DRS Cluster Group + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile + # DRS VmHost Rule + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" + $Page = $DocsObj.Pages('Cluster to DRS Rule') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Cluster to DRS Rule') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # DRS Rule + $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") + # DRS Cluster Group + $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") + # DRS Host Rule + $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") + # Microsoft VM Object + $MSObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LXObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + $y += 1.50 + + foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule + # Name + $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' + # VM Affinity + $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' + # DRS Rule Enabled + $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' + # DRS Rule Mandatory + $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' + Connect-VisioObject $ClusterObject $DRSObject + #$ClusterObject = $DRSObject + $y += 1.50 + } + foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule + # Name + $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' + # Enabled + $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' + # Type + $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' + # VMGroup + $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' + # VMHostGroup + $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' + # AffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' + # AntiAffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' + Connect-VisioObject $ClusterObject $DRSVMHostRuleObject + $y += 1.50 + #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject + #$DrsClusterGroupObject = $DRSVMHostRuleObject + + foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) + { + $x += 2.50 + $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup + # Name + $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' + # GroupType + $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' + # Members + $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' + Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject + $DRSVMHostRuleObject = $DrsClusterGroupObject + + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Open_Final_Visio +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.Application + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null +} + +Main + +#endregion \ No newline at end of file From 6c5274c4c8b096df23f573c744ccbe03c9fbf979 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Fri, 13 Apr 2018 08:39:34 -0400 Subject: [PATCH 06/19] vDiagram_2.0.1 - Scheduled Task --- .../vDiagram_Scheduled_Task_2.0.1.ps1 | 593 ++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100644 vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 new file mode 100644 index 0000000..13421ae --- /dev/null +++ b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 @@ -0,0 +1,593 @@ +$Date = (Get-Date -format "yyyy_MM_dd") +$7zip = "C:\Program Files\7-Zip\7z.exe" + +# Variables +$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." +$vCenterShortName = "Replace with vCenter name." +$CsvDir = "C:\vDiagram\Capture" +$SMTPserver = "SMTP Server" +$Mailfrom = "outbound@email.com" +$Mailto = "you@email.com" +$Subject = "vDiagram 2.0 Files" +$ReportFile = "C:\vDiagram\Zip" +$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" +$AttachmentFile = $ZipFile +$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" + + +#region Functions +#region PsCreds +#region Export-PSCredential +Function Export-PSCredential { + param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) + + # Look at the object type of the $Credential parameter to determine how to handle it + switch ( $Credential.GetType().Name ) { + # It is a credential, so continue + PSCredential { continue } + # It is a string, so use that as the username and prompt for the password + String { $Credential = Get-Credential -credential $Credential } + # In all other caess, throw an error and exit + default { Throw "You must specify a credential object to export to disk." } + } + + # Create temporary object to be serialized to disk + $export = "" | Select-Object Username, EncryptedPassword + + # Give object a type name which can be identified later + #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) + + $export.Username = $Credential.Username + + # Encrypt SecureString password using Data Protection API + # Only the current user account can decrypt this cipher + $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString + + # Export using the Export-Clixml cmdlet + $export | Export-Clixml $Path + Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine + + # Return FileInfo object referring to saved credentials + Get-Item $Path +} +Export-PSCredential +#endregion Export-PSCredential + +#region Import-PSCredential +Function Import-PSCredential { + param ( $Path = "credentials.xml" ) + + # Import credential file + $import = Import-Clixml $Path + + # Test for valid import + if ( !$import.UserName -or !$import.EncryptedPassword ) { + Throw "Input is not a valid ExportedPSCredential object, exiting." + } + $Username = $import.Username + + # Decrypt the password and store as a SecureString object for safekeeping + $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString + + # Build the new credential object + $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass + Write-Output $Credential +} +#endregion Import-PSCredential + +#endregion PsCreds + +#region vCenterFunctions +#region Connect_vCenter_Main +Function Connect_vCenter_Main +{ + $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter_Main + +#region Connect_vCenter +Function Connect_vCenter +{ + $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter + +#region Disconnect_vCenter +Function Disconnect_vCenter +{ + Disconnect-ViServer * -Confirm:$False +} +#endregion Disconnect_vCenter +#endregion vCenterFunctions + +#region CsvExportFunctions +#region vCenter_Export +Function vCenter_Export +{ + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, + @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, + @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo + Disconnect_vCenter +} +#endregion vCenter_Export + +#region Datacenter_Export +Function Datacenter_Export +{ + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo +} +#endregion Datacenter_Export + +#region Cluster_Export +Function Cluster_Export +{ + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, + @{N="HAEnabled";E={$_.HAEnabled}}, + @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, + @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, + @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, + @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, + @{N="DrsEnabled";E={$_.DrsEnabled}}, + @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, + @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, + @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo +} +#endregion Cluster_Export + +#region VmHost_Export +Function VmHost_Export +{ + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={ + $Datacenter = Get-View -Id $_.Parent -Property Name,Parent + While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent + } + If($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name}}}, + @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent + While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent + } + If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, + @{N="Version";E={$_.Config.Product.Version}}, + @{N="Build";E={$_.Config.Product.Build}}, + @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, + @{N="Model";E={$_.Summary.Hardware.Model}}, + @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, + @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, + @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, + @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, + @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, + @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, + @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, + @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, + @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, + @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo +} +#endregion VmHost_Export + +#region Vm_Export +Function Vm_Export +{ + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select Name, + @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, + @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, + @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, + @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, + @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, + @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, + @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, + @{N="OS";E={$_.Config.GuestFullName}}, + @{N="Version";E={$_.Config.Version}}, + @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, + @{N='Folder';E={$Folder.Name}}, + @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, + @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, + @{N="IP";E={$_.Guest.IpAddress}}, + @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, + @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, + @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, + @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo + } +} +#endregion Vm_Export + +#region Template_Export +Function Template_Export +{ + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + ForEach($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$VmHost | Get-Datacenter}}, + @{N="Cluster";E={$VmHost | Get-Cluster}}, + @{N="VmHost";E={$VmHost.name}}, + @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, + @{N="Folder";E={Get-Folder -Id $_.FolderId}}, + @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, + @{N="Version";E={$_.ExtensionData.Config.Version}}, + @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, + @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, + @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, + @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, + @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo + } +} +#endregion Template_Export + +#region DatastoreCluster_Export +Function DatastoreCluster_Export +{ + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, + @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, + @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, + @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, + @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo +} +#endregion DatastoreCluster_Export + +#region Datastore_Export +Function Datastore_Export +{ + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, + @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, + @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, + @{N="Type";E={$_.Type}}, + @{N="FileSystemVersion";E={$_.FileSystemVersion}}, + @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, + @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, + @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, + @{N="Accessible";E={$_.State}}, + @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo +} +#endregion Datastore_Export + +#region VsSwitch_Export +Function VsSwitch_Export +{ + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="Nic";E={$_.Nic}}, + @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, + @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, + @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, + @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, + @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, + @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, + @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, + @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, + @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo +} +#endregion VsSwitch_Export + +#region VssPort_Export +Function VssPort_Export +{ + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="VLanId";E={$_.VLanId}}, + @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPort_Export + +#region VssVmk_Export +Function VssVmk_Export +{ + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo + } + } + } +} +#endregion VssVmk_Export + +#region VssPnic_Export +Function VssPnic_Export +{ + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPnic_Export + +#region VdSwitch_Export +Function VdSwitch_Export +{ + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + ForEach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="Vendor";E={$_.Vendor}}, + @{N="Version";E={$_.Version}}, + @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, + @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo + } +} +#endregion VdSwitch_Export + +#region VdsPort_Export +Function VdsPort_Export +{ + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}}, + @{N="VdSwitch";E={$_.VdSwitch}}, + @{N="NumPorts";E={$_.NumPorts}}, + @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, + @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, + @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, + @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, + @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, + @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPort_Export + +#region VdsVmk_Export +Function VdsVmk_Export +{ + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo + + } + } +} +#endregion VdsVmk_Export + +#region VdsPnic_Export +Function VdsPnic_Export +{ + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch}}, + @{N="Portgroup";E={$_.Portgroup}}, + @{N="ConnectedEntity";E={$_.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPnic_Export + +#region Folder_Export +Function Folder_Export +{ + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + ForEach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo + } +} +#endregion Folder_Export + +#region Rdm_Export +Function Rdm_Export +{ + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, + @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, + @{N="Vm";E={$_.Parent}}, + @{N="Label";E={$_.Name}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, + @{N="DiskType";E={$_.DiskType}}, + @{N="Persistence";E={$_.Persistence}}, + @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, + @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, + @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo +} +#endregion Rdm_Export + +#region Drs_Rule_Export +Function Drs_Rule_Export +{ + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Type";E={$_.Type}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Rule_Export + +#region Drs_Cluster_Group_Export +Function Drs_Cluster_Group_Export +{ + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="GroupType";E={$_.GroupType}}, + @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Cluster_Group_Export + +#region Drs_VmHost_Rule_Export +Function Drs_VmHost_Rule_Export +{ + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) + { + Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Type";E={$_.Type}}, + @{N="VMGroup";E={$_.VMGroup}}, + @{N="VMHostGroup";E={$_.VMHostGroup}}, + @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, + @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo + } + } +} +#endregion Drs_VmHost_Rule_Export + +#region Resource_Pool_Export +Function Resource_Pool_Export +{ + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) + { + Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Cluster";E={$Cluster.Name}}, + @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, + @{N="NumCpuShares";E={$_.NumCpuShares}}, + @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, + @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, + @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, + @{N="MemSharesLevel";E={$_.MemSharesLevel}}, + @{N="NumMemShares";E={$_.NumMemShares}}, + @{N="MemReservationGB";E={$_.MemReservationGB}}, + @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, + @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo + } + } +} +#endregion Resource_Pool_Export + +#endregion CsvExportFunctions + +#endregion Functions + +Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter + +#Zip Files +cd $CsvDir +dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } + +#Send E-mail +Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile + +#Clear CSV Folder +cd $CsvDir +del *.csv \ No newline at end of file From 5969fb2c52fc4725bce1938a2eda3b061a37f9c0 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Fri, 13 Apr 2018 08:41:47 -0400 Subject: [PATCH 07/19] vDiagram_2.0.1 --- vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 | 8807 ++++++++++++++++++++++ 1 file changed, 8807 insertions(+) create mode 100644 vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 diff --git a/vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 b/vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 new file mode 100644 index 0000000..c13525d --- /dev/null +++ b/vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 @@ -0,0 +1,8807 @@ +<# +.SYNOPSIS + vDiagram Visio Drawing Tool + +.DESCRIPTION + vDiagram Visio Drawing Tool + +.NOTES + File Name : vDiagram2.0.1.ps1 + Author : Tony Gonzalez + Author : Jason Hopkins + Based on : vDiagram by Alan Renouf + Version : 2.0.0 + +.USAGE NOTES + Ensure to unblock files before unzipping + Ensure to run as administrator + Required Files: + PowerCLI or PowerShell 5.0 with PowerCLI Modules installed + Active connection to vCenter to capture data + MS Visio + +.CHANGE LOG + - 04/12/2018 - v2.0.1 + Added MAC Addresses to VMs & Templates + Added a check to see if prior CSVs are still present + Added option to copy prior CSVs to new folder + + - 04/11/2018 - v2.0.0 + Presented as a Community Theater Session at South Florida VMUG + Feature enhancement requests collected +#> + +#region ScriptForm Designer + +#region Constructor + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") +#endregion + +#region Post-Constructor Custom Code +$MyVer = "2.0.1" +$LastUpdated = "April 12, 2018" +$About = +@" + + vDiagram $MyVer + + Contributors: Tony Gonzalez of RoundTower Technologies LLC + Jason Hopkins of RoundTower Technologies LLC + + Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram + + Created: February 13, 2018 + + Last Updated: $LastUpdated + +"@ +#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" +if (!(Test-Path $TestShapes)) +{ + $CurrentLocation = Get-Location + copy $CurrentLocation\vDiagram.vssx $TestShapes + Write-Host "Copying Shapes File to My Shapes" +} +$shpFile = "\vDiagram.vssx" +#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Set_WindowStyle { +param( + [Parameter()] + [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', + 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', + 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] + $Style = 'SHOW', + [Parameter()] + $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle +) + $WindowStates = @{ + FORCEMINIMIZE = 11; HIDE = 0 + MAXIMIZE = 3; MINIMIZE = 6 + RESTORE = 9; SHOW = 5 + SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 + SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 + SHOWNA = 8; SHOWNOACTIVATE = 4 + SHOWNORMAL = 1 + } + Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) + + $Win32ShowWindowAsync = Add-Type –memberDefinition @” + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); +“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru + + $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null +} +Set_WindowStyle MINIMIZE +#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function About_Config +{ + + $About + + #Add objects for About + $AboutForm = New-Object System.Windows.Forms.Form + $AboutTextBox = New-Object System.Windows.Forms.RichTextBox + + #About Form + $AboutForm.Icon = $Icon + $AboutForm.AutoScroll = $True + $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) + $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutForm.Name = "About" + $AboutForm.StartPosition = 1 + $AboutForm.Text = "About vDiagram $MyVer" + + $AboutTextBox.Anchor = 15 + $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) + $AboutTextBox.BorderStyle = 0 + $AboutTextBox.Font = "Tahoma" + $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) + $AboutTextBox.Name = "AboutTextBox" + $AboutTextBox.ReadOnly = $True + $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) + $AboutTextBox.Text = $About + + $AboutForm.Controls.Add($AboutTextBox) + + $AboutForm.Show() | Out-Null +} +#endregion + +#region Form Creation +#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vDiagram = New-Object System.Windows.Forms.Form +$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) +$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") +$vDiagram.Icon = $Icon +$vDiagram.Text = "vDiagram 2.0" +$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan +#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainMenu = New-Object System.Windows.Forms.MenuStrip +$MainMenu.Location = New-Object System.Drawing.Point(0, 0) +$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) +$MainMenu.TabIndex = 1 +$MainMenu.Text = "MainMenu" +#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) +$FileToolStripMenuItem.Text = "File" +#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) +$ExitToolStripMenuItem.Text = "Exit" +$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) +$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) +#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) +$HelpToolStripMenuItem.Text = "Help" +#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) +$AboutToolStripMenuItem.Text = "About" +$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) +$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) +$AboutToolStripMenuItem.Add_Click({About_Config}) +#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainTab = New-Object System.Windows.Forms.TabControl +$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) +$MainTab.Location = New-Object System.Drawing.Point(10, 30) +$MainTab.Size = New-Object System.Drawing.Size(990, 98) +$MainTab.TabIndex = 0 +$MainTab.Text = "MainTabs" +#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Prerequisites = New-Object System.Windows.Forms.TabPage +$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) +$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) +$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) +$Prerequisites.TabIndex = 0 +$Prerequisites.Text = "Prerequisites" +$Prerequisites.BackColor = [System.Drawing.Color]::LightGray +#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellLabel = New-Object System.Windows.Forms.Label +$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) +$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) +$PowershellLabel.TabIndex = 1 +$PowershellLabel.Text = "Powershell:" +#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellInstalled = New-Object System.Windows.Forms.Label +$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) +$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) +$PowershellInstalled.TabIndex = 2 +$PowershellInstalled.Text = "" +$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleLabel = New-Object System.Windows.Forms.Label +$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) +$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) +$PowerCliModuleLabel.TabIndex = 3 +$PowerCliModuleLabel.Text = "PowerCLI Module:" +#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label +$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) +$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) +$PowerCliModuleInstalled.TabIndex = 4 +$PowerCliModuleInstalled.Text = "" +$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliLabel = New-Object System.Windows.Forms.Label +$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) +$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) +$PowerCliLabel.TabIndex = 5 +$PowerCliLabel.Text = "PowerCLI:" +#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliInstalled = New-Object System.Windows.Forms.Label +$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) +$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) +$PowerCliInstalled.TabIndex = 6 +$PowerCliInstalled.Text = "" +$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioLabel = New-Object System.Windows.Forms.Label +$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) +$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) +$VisioLabel.TabIndex = 7 +$VisioLabel.Text = "Visio:" +#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioInstalled = New-Object System.Windows.Forms.Label +$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) +$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) +$VisioInstalled.TabIndex = 8 +$VisioInstalled.Text = "" +$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray +$Prerequisites.Controls.Add($PowershellLabel) +$Prerequisites.Controls.Add($PowershellInstalled) +$Prerequisites.Controls.Add($PowerCliModuleLabel) +$Prerequisites.Controls.Add($PowerCliModuleInstalled) +$Prerequisites.Controls.Add($PowerCliLabel) +$Prerequisites.Controls.Add($PowerCliInstalled) +$Prerequisites.Controls.Add($VisioLabel) +$Prerequisites.Controls.Add($VisioInstalled) +#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfo = New-Object System.Windows.Forms.TabPage +$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) +$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) +$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) +$vCenterInfo.TabIndex = 0 +$vCenterInfo.Text = "vCenter Info" +$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray +#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterLabel = New-Object System.Windows.Forms.Label +$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) +$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) +$MainVcenterLabel.TabIndex = 1 +$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" +#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox +$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) +$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) +$MainVcenterTextBox.TabIndex = 2 +$MainVcenterTextBox.Text = "" +#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterLabel = New-Object System.Windows.Forms.Label +$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) +$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) +$TargetVcenterLabel.TabIndex = 3 +$TargetVcenterLabel.Text = "Name of target vCenter:" +#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox +$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) +$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) +$TargetVcenterTextBox.TabIndex = 4 +$TargetVcenterTextBox.Text = "" +#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameLabel = New-Object System.Windows.Forms.Label +$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) +$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) +$UserNameLabel.TabIndex = 5 +$UserNameLabel.Text = "vCenter User Name:" +#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameTextBox = New-Object System.Windows.Forms.TextBox +$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) +$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) +$UserNameTextBox.TabIndex = 6 +$UserNameTextBox.Text = "" +#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) +$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) +$PasswordLabel.TabIndex = 7 +$PasswordLabel.Text = "Password:" +#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordTextBox = New-Object System.Windows.Forms.TextBox +$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) +$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) +$PasswordTextBox.TabIndex = 8 +$PasswordTextBox.Text = "" +$PasswordTextBox.UseSystemPasswordChar = $true +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton = New-Object System.Windows.Forms.Button +$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) +$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) +$ConnectButton.TabIndex = 9 +$ConnectButton.Text = "Connect to vCenter" +$ConnectButton.UseVisualStyleBackColor = $true +$vCenterInfo.Controls.Add($MainVcenterLabel) +$vCenterInfo.Controls.Add($MainVcenterTextBox) +$vCenterInfo.Controls.Add($TargetVcenterLabel) +$vCenterInfo.Controls.Add($TargetVcenterTextBox) +$vCenterInfo.Controls.Add($UserNameLabel) +$vCenterInfo.Controls.Add($UserNameTextBox) +$vCenterInfo.Controls.Add($PasswordLabel) +$vCenterInfo.Controls.Add($PasswordTextBox) +$vCenterInfo.Controls.Add($ConnectButton) +$MainTab.Controls.Add($Prerequisites) +$MainTab.Controls.Add($vCenterInfo) +$MainTab.SelectedIndex = 0 +#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SubTab = New-Object System.Windows.Forms.TabControl +$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$SubTab.Location = New-Object System.Drawing.Point(10, 136) +$SubTab.Size = New-Object System.Drawing.Size(990, 512) +$SubTab.TabIndex = 0 +$SubTab.Text = "SubTabs" +#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDirections = New-Object System.Windows.Forms.TabPage +$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDirections.Location = New-Object System.Drawing.Point(4, 22) +$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDirections.Size = New-Object System.Drawing.Size(982, 486) +$TabDirections.TabIndex = 0 +$TabDirections.Text = "Directions" +$TabDirections.UseVisualStyleBackColor = $true +#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesHeading = New-Object System.Windows.Forms.Label +$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) +$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) +$PrerequisitesHeading.TabIndex = 0 +$PrerequisitesHeading.Text = "Prerequisites Tab" +#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesDirections = New-Object System.Windows.Forms.Label +$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) +$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) +$PrerequisitesDirections.TabIndex = 1 +$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." +#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoHeading = New-Object System.Windows.Forms.Label +$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) +$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) +$vCenterInfoHeading.TabIndex = 2 +$vCenterInfoHeading.Text = "vCenter Info Tab" +#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoDirections = New-Object System.Windows.Forms.Label +$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) +$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) +$vCenterInfoDirections.TabIndex = 3 +$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." +#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvHeading = New-Object System.Windows.Forms.Label +$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) +$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) +$CaptureCsvHeading.TabIndex = 4 +$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" +#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureDirections = New-Object System.Windows.Forms.Label +$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) +$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) +$CaptureDirections.TabIndex = 5 +$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." +#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawHeading = New-Object System.Windows.Forms.Label +$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) +$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) +$DrawHeading.TabIndex = 6 +$DrawHeading.Text = "Draw Visio Tab" +#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawDirections = New-Object System.Windows.Forms.Label +$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) +$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) +$DrawDirections.TabIndex = 7 +$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." +$TabDirections.Controls.Add($PrerequisitesHeading) +$TabDirections.Controls.Add($PrerequisitesDirections) +$TabDirections.Controls.Add($vCenterInfoHeading) +$TabDirections.Controls.Add($vCenterInfoDirections) +$TabDirections.Controls.Add($CaptureCsvHeading) +$TabDirections.Controls.Add($CaptureDirections) +$TabDirections.Controls.Add($DrawHeading) +$TabDirections.Controls.Add($DrawDirections) +#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabCapture = New-Object System.Windows.Forms.TabPage +$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabCapture.Location = New-Object System.Drawing.Point(4, 22) +$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) +$TabCapture.Size = New-Object System.Drawing.Size(982, 486) +$TabCapture.TabIndex = 3 +$TabCapture.Text = "Capture CSVs for Visio" +$TabCapture.UseVisualStyleBackColor = $true +#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label +$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) +$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) +$CaptureCsvOutputLabel.TabIndex = 0 +$CaptureCsvOutputLabel.Text = "CSV Output Folder:" +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button +$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) +$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) +$CaptureCsvOutputButton.TabIndex = 0 +$CaptureCsvOutputButton.Text = "Select Output Folder" +$CaptureCsvOutputButton.UseVisualStyleBackColor = $false +$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$vCenterCsvCheckBox.Checked = $true +$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$vCenterCsvCheckBox.TabIndex = 1 +$vCenterCsvCheckBox.Text = "Export vCenter Info" +$vCenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) +$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationComplete.TabIndex = 26 +$vCenterCsvValidationComplete.Text = "" +#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatacenterCsvCheckBox.Checked = $true +$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatacenterCsvCheckBox.TabIndex = 2 +$DatacenterCsvCheckBox.Text = "Export Datacenter Info" +$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) +$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationComplete.TabIndex = 27 +$DatacenterCsvValidationComplete.Text = "" +#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ClusterCsvCheckBox.Checked = $true +$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ClusterCsvCheckBox.TabIndex = 3 +$ClusterCsvCheckBox.Text = "Export Cluster Info" +$ClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) +$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationComplete.TabIndex = 28 +$ClusterCsvValidationComplete.Text = "" +#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmHostCsvCheckBox.Checked = $true +$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmHostCsvCheckBox.TabIndex = 4 +$VmHostCsvCheckBox.Text = "Export VmHost Info" +$VmHostCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) +$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationComplete.TabIndex = 29 +$VmHostCsvValidationComplete.Text = "" +#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmCsvCheckBox.Checked = $true +$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmCsvCheckBox.TabIndex = 5 +$VmCsvCheckBox.Text = "Export Vm Info" +$VmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) +$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationComplete.TabIndex = 30 +$VmCsvValidationComplete.Text = "" +#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$TemplateCsvCheckBox.Checked = $true +$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$TemplateCsvCheckBox.TabIndex = 6 +$TemplateCsvCheckBox.Text = "Export Template Info" +$TemplateCsvCheckBox.UseVisualStyleBackColor = $true +#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label +$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) +$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationComplete.TabIndex = 31 +$TemplateCsvValidationComplete.Text = "" +#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreClusterCsvCheckBox.Checked = $true +$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreClusterCsvCheckBox.TabIndex = 7 +$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" +$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) +$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationComplete.TabIndex = 32 +$DatastoreClusterCsvValidationComplete.Text = "" +#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreCsvCheckBox.Checked = $true +$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreCsvCheckBox.TabIndex = 8 +$DatastoreCsvCheckBox.Text = "Export Datastore Info" +$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) +$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationComplete.TabIndex = 33 +$DatastoreCsvValidationComplete.Text = "" +#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VsSwitchCsvCheckBox.Checked = $true +$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) +$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VsSwitchCsvCheckBox.TabIndex = 9 +$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" +$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) +$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationComplete.TabIndex = 34 +$VsSwitchCsvValidationComplete.Text = "" +#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPortGroupCsvCheckBox.Checked = $true +$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) +$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPortGroupCsvCheckBox.TabIndex = 10 +$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" +$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) +$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationComplete.TabIndex = 35 +$VssPortGroupCsvValidationComplete.Text = "" +#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssVmkernelCsvCheckBox.Checked = $true +$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) +$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssVmkernelCsvCheckBox.TabIndex = 11 +$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" +$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) +$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationComplete.TabIndex = 36 +$VssVmkernelCsvValidationComplete.Text = "" +#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPnicCsvCheckBox.Checked = $true +$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) +$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPnicCsvCheckBox.TabIndex = 12 +$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" +$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) +$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationComplete.TabIndex = 37 +$VssPnicCsvValidationComplete.Text = "" +#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdSwitchCsvCheckBox.Checked = $true +$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) +$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdSwitchCsvCheckBox.TabIndex = 13 +$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" +$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) +$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationComplete.TabIndex = 38 +$VdSwitchCsvValidationComplete.Text = "" +#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPortGroupCsvCheckBox.Checked = $true +$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) +$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPortGroupCsvCheckBox.TabIndex = 14 +$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" +$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) +$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationComplete.TabIndex = 39 +$VdsPortGroupCsvValidationComplete.Text = "" +#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsVmkernelCsvCheckBox.Checked = $true +$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) +$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsVmkernelCsvCheckBox.TabIndex = 15 +$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" +$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) +$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationComplete.TabIndex = 40 +$VdsVmkernelCsvValidationComplete.Text = "" +#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPnicCsvCheckBox.Checked = $true +$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) +$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPnicCsvCheckBox.TabIndex = 16 +$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" +$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) +$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationComplete.TabIndex = 41 +$VdsPnicCsvValidationComplete.Text = "" +#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$FolderCsvCheckBox.Checked = $true +$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) +$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$FolderCsvCheckBox.TabIndex = 17 +$FolderCsvCheckBox.Text = "Export Folder Info" +$FolderCsvCheckBox.UseVisualStyleBackColor = $true +#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label +$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) +$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationComplete.TabIndex = 42 +$FolderCsvValidationComplete.Text = "" +#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$RdmCsvCheckBox.Checked = $true +$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) +$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$RdmCsvCheckBox.TabIndex = 18 +$RdmCsvCheckBox.Text = "Export RDM Info" +$RdmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label +$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) +$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationComplete.TabIndex = 43 +$RdmCsvValidationComplete.Text = "" +#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsRuleCsvCheckBox.Checked = $true +$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) +$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsRuleCsvCheckBox.TabIndex = 19 +$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" +$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) +$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationComplete.TabIndex = 44 +$DrsRuleCsvValidationComplete.Text = "" +#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsClusterGroupCsvCheckBox.Checked = $true +$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) +$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsClusterGroupCsvCheckBox.TabIndex = 20 +$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" +$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) +$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationComplete.TabIndex = 45 +$DrsClusterGroupCsvValidationComplete.Text = "" +#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsVmHostRuleCsvCheckBox.Checked = $true +$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) +$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsVmHostRuleCsvCheckBox.TabIndex = 21 +$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" +$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) +$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 +$DrsVmHostRuleCsvValidationComplete.Text = "" +#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ResourcePoolCsvCheckBox.Checked = $true +$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) +$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ResourcePoolCsvCheckBox.TabIndex = 22 +$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" +$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) +$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationComplete.TabIndex = 47 +$ResourcePoolCsvValidationComplete.Text = "" +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton = New-Object System.Windows.Forms.Button +$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) +$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureUncheckButton.TabIndex = 23 +$CaptureUncheckButton.Text = "Uncheck All" +$CaptureUncheckButton.UseVisualStyleBackColor = $false +$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton = New-Object System.Windows.Forms.Button +$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) +$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureCheckButton.TabIndex = 24 +$CaptureCheckButton.Text = "Check All" +$CaptureCheckButton.UseVisualStyleBackColor = $false +$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton = New-Object System.Windows.Forms.Button +$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) +$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureButton.TabIndex = 25 +$CaptureButton.Text = "Collect CSV Data" +$CaptureButton.UseVisualStyleBackColor = $false +$CaptureButton.BackColor = [System.Drawing.Color]::LightGray +$TabCapture.Controls.Add($CaptureCsvOutputLabel) +$TabCapture.Controls.Add($CaptureCsvOutputButton) +$TabCapture.Controls.Add($vCenterCsvCheckBox) +$TabCapture.Controls.Add($vCenterCsvValidationComplete) +$TabCapture.Controls.Add($DatacenterCsvCheckBox) +$TabCapture.Controls.Add($DatacenterCsvValidationComplete) +$TabCapture.Controls.Add($ClusterCsvCheckBox) +$TabCapture.Controls.Add($ClusterCsvValidationComplete) +$TabCapture.Controls.Add($VmHostCsvCheckBox) +$TabCapture.Controls.Add($VmHostCsvValidationComplete) +$TabCapture.Controls.Add($VmCsvCheckBox) +$TabCapture.Controls.Add($VmCsvValidationComplete) +$TabCapture.Controls.Add($TemplateCsvCheckBox) +$TabCapture.Controls.Add($TemplateCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) +$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreCsvCheckBox) +$TabCapture.Controls.Add($DatastoreCsvValidationComplete) +$TabCapture.Controls.Add($VsSwitchCsvCheckBox) +$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VssPnicCsvCheckBox) +$TabCapture.Controls.Add($VssPnicCsvValidationComplete) +$TabCapture.Controls.Add($VdSwitchCsvCheckBox) +$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VdsPnicCsvCheckBox) +$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) +$TabCapture.Controls.Add($FolderCsvCheckBox) +$TabCapture.Controls.Add($FolderCsvValidationComplete) +$TabCapture.Controls.Add($RdmCsvCheckBox) +$TabCapture.Controls.Add($RdmCsvValidationComplete) +$TabCapture.Controls.Add($DrsRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) +$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) +$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) +$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) +$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) +$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) +$TabCapture.Controls.Add($CaptureUncheckButton) +$TabCapture.Controls.Add($CaptureCheckButton) +$TabCapture.Controls.Add($CaptureButton) +#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDraw = New-Object System.Windows.Forms.TabPage +$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDraw.Location = New-Object System.Drawing.Point(4, 22) +$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDraw.Size = New-Object System.Drawing.Size(982, 486) +$TabDraw.TabIndex = 2 +$TabDraw.Text = "Draw Visio" +$TabDraw.UseVisualStyleBackColor = $true +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton = New-Object System.Windows.Forms.Button +$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) +$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) +$OpenVisioButton.TabIndex = 83 +$OpenVisioButton.Text = "Open Visio Drawing" +$OpenVisioButton.UseVisualStyleBackColor = $false +$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton = New-Object System.Windows.Forms.Button +$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) +$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawCheckButton.TabIndex = 82 +$DrawCheckButton.Text = "Check All" +$DrawCheckButton.UseVisualStyleBackColor = $false +$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton = New-Object System.Windows.Forms.Button +$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawButton.Location = New-Object System.Drawing.Point(448, 450) +$DrawButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawButton.TabIndex = 81 +$DrawButton.Text = "Draw Visio" +$DrawButton.UseVisualStyleBackColor = $false +$DrawButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton = New-Object System.Windows.Forms.Button +$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) +$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawUncheckButton.TabIndex = 80 +$DrawUncheckButton.Text = "Uncheck All" +$DrawUncheckButton.UseVisualStyleBackColor = $false +$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOutputLabel = New-Object System.Windows.Forms.Label +$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) +$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) +$VisioOutputLabel.TabIndex = 46 +$VisioOutputLabel.Text = "Visio Output Folder:" +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton = New-Object System.Windows.Forms.Button +$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) +$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) +$VisioOpenOutputButton.TabIndex = 47 +$VisioOpenOutputButton.Text = "Select Visio Output Folder" +$VisioOpenOutputButton.UseVisualStyleBackColor = $false +$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputLabel = New-Object System.Windows.Forms.Label +$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) +$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) +$DrawCsvInputLabel.TabIndex = 0 +$DrawCsvInputLabel.Text = "CSV Input Folder:" +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton = New-Object System.Windows.Forms.Button +$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) +$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) +$DrawCsvInputButton.TabIndex = 1 +$DrawCsvInputButton.Text = "Select CSV Input Folder" +$DrawCsvInputButton.UseVisualStyleBackColor = $false +$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidation = New-Object System.Windows.Forms.Label +$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$vCenterCsvValidation.TabIndex = 2 +$vCenterCsvValidation.Text = "vCenter CSV File:" +#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) +$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationCheck.TabIndex = 3 +$vCenterCsvValidationCheck.Text = "" +#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidation = New-Object System.Windows.Forms.Label +$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatacenterCsvValidation.TabIndex = 4 +$DatacenterCsvValidation.Text = "Datacenter CSV File:" +#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) +$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationCheck.TabIndex = 5 +$DatacenterCsvValidationCheck.Text = "" +#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidation = New-Object System.Windows.Forms.Label +$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ClusterCsvValidation.TabIndex = 6 +$ClusterCsvValidation.Text = "Cluster CSV File:" +#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) +$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationCheck.TabIndex = 7 +$ClusterCsvValidationCheck.Text = "" +#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidation = New-Object System.Windows.Forms.Label +$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmHostCsvValidation.TabIndex = 8 +$VmHostCsvValidation.Text = "VmHost CSV File:" +#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) +$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationCheck.TabIndex = 9 +$VmHostCsvValidationCheck.Text = "" +#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidation = New-Object System.Windows.Forms.Label +$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmCsvValidation.TabIndex = 10 +$VmCsvValidation.Text = "VM CSV File:" +#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) +$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationCheck.TabIndex = 11 +$VmCsvValidationCheck.Text = "" +#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidation = New-Object System.Windows.Forms.Label +$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$TemplateCsvValidation.TabIndex = 12 +$TemplateCsvValidation.Text = "Template CSV File:" +#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label +$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) +$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationCheck.TabIndex = 13 +$TemplateCsvValidationCheck.Text = "" +#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreClusterCsvValidation.TabIndex = 14 +$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" +#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) +$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationCheck.TabIndex = 15 +$DatastoreClusterCsvValidationCheck.Text = "" +#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreCsvValidation.TabIndex = 16 +$DatastoreCsvValidation.Text = "Datastore CSV File:" +#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) +$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationCheck.TabIndex = 17 +$DatastoreCsvValidationCheck.Text = "" +#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) +$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VsSwitchCsvValidation.TabIndex = 18 +$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" +#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) +$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationCheck.TabIndex = 19 +$VsSwitchCsvValidationCheck.Text = "" +#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) +$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPortGroupCsvValidation.TabIndex = 20 +$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" +#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) +$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationCheck.TabIndex = 21 +$VssPortGroupCsvValidationCheck.Text = "" +#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) +$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssVmkernelCsvValidation.TabIndex = 22 +$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" +#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) +$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationCheck.TabIndex = 23 +$VssVmkernelCsvValidationCheck.Text = "" +#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidation = New-Object System.Windows.Forms.Label +$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) +$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPnicCsvValidation.TabIndex = 24 +$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" +#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) +$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationCheck.TabIndex = 25 +$VssPnicCsvValidationCheck.Text = "" +#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) +$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdSwitchCsvValidation.TabIndex = 26 +$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" +#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) +$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationCheck.TabIndex = 27 +$VdSwitchCsvValidationCheck.Text = "" +#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) +$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPortGroupCsvValidation.TabIndex = 28 +$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" +#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) +$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationCheck.TabIndex = 29 +$VdsPortGroupCsvValidationCheck.Text = "" +#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) +$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsVmkernelCsvValidation.TabIndex = 30 +$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" +#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) +$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationCheck.TabIndex = 31 +$VdsVmkernelCsvValidationCheck.Text = "" +#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) +$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPnicCsvValidation.TabIndex = 32 +$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" +#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) +$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationCheck.TabIndex = 33 +$VdsPnicCsvValidationCheck.Text = "" +#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidation = New-Object System.Windows.Forms.Label +$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) +$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$FolderCsvValidation.TabIndex = 34 +$FolderCsvValidation.Text = "Folder CSV File:" +#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label +$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) +$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationCheck.TabIndex = 35 +$FolderCsvValidationCheck.Text = "" +#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidation = New-Object System.Windows.Forms.Label +$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) +$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$RdmCsvValidation.TabIndex = 36 +$RdmCsvValidation.Text = "RDM CSV File:" +#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label +$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) +$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationCheck.TabIndex = 37 +$RdmCsvValidationCheck.Text = "" +#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) +$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsRuleCsvValidation.TabIndex = 38 +$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" +#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) +$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationCheck.TabIndex = 39 +$DrsRuleCsvValidationCheck.Text = "" +#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) +$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsClusterGroupCsvValidation.TabIndex = 40 +$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" +#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) +$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationCheck.TabIndex = 41 +$DrsClusterGroupCsvValidationCheck.Text = "" +#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) +$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsVmHostRuleCsvValidation.TabIndex = 42 +$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" +#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) +$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 +$DrsVmHostRuleCsvValidationCheck.Text = "" +#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) +$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ResourcePoolCsvValidation.TabIndex = 44 +$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" +#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) +$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationCheck.TabIndex = 45 +$ResourcePoolCsvValidationCheck.Text = "" +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton = New-Object System.Windows.Forms.Button +$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) +$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) +$CsvValidationButton.TabIndex = 2 +$CsvValidationButton.Text = "Check for CSVs" +$CsvValidationButton.UseVisualStyleBackColor = $false +$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Host_DrawCheckBox.Checked = $true +$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) +$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Host_DrawCheckBox.TabIndex = 48 +$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" +$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_Complete = New-Object System.Windows.Forms.Label +$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) +$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Host_Complete.TabIndex = 49 +$VM_to_Host_Complete.Text = "" +#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Folder_DrawCheckBox.Checked = $true +$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) +$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Folder_DrawCheckBox.TabIndex = 50 +$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" +$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label +$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) +$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Folder_Complete.TabIndex = 51 +$VM_to_Folder_Complete.Text = "" +#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMs_with_RDMs_DrawCheckBox.Checked = $true +$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) +$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 +$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" +$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label +$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) +$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMs_with_RDMs_Complete.TabIndex = 53 +$VMs_with_RDMs_Complete.Text = "" +#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$SRM_Protected_VMs_DrawCheckBox.Checked = $true +$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) +$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 +$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" +$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label +$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) +$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$SRM_Protected_VMs_Complete.TabIndex = 55 +$SRM_Protected_VMs_Complete.Text = "" +#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Datastore_DrawCheckBox.Checked = $true +$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) +$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Datastore_DrawCheckBox.TabIndex = 56 +$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" +$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label +$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) +$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Datastore_Complete.TabIndex = 57 +$VM_to_Datastore_Complete.Text = "" +#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_ResourcePool_DrawCheckBox.Checked = $true +$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) +$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 +$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" +$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label +$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) +$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_ResourcePool_Complete.TabIndex = 59 +$VM_to_ResourcePool_Complete.Text = "" +#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Datastore_to_Host_DrawCheckBox.Checked = $true +$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) +$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$Datastore_to_Host_DrawCheckBox.TabIndex = 60 +$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" +$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label +$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) +$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Datastore_to_Host_Complete.TabIndex = 61 +$Datastore_to_Host_Complete.Text = "" +#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true +$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) +$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 +$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" +$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label +$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) +$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) +$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 +$PhysicalNIC_to_vSwitch_Complete.Text = "" +#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSS_to_Host_DrawCheckBox.Checked = $true +$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) +$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSS_to_Host_DrawCheckBox.TabIndex = 64 +$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" +$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) +$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSS_to_Host_Complete.TabIndex = 65 +$VSS_to_Host_Complete.Text = "" +#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VSS_DrawCheckBox.Checked = $true +$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) +$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VSS_DrawCheckBox.TabIndex = 66 +$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" +$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) +$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VSS_Complete.TabIndex = 67 +$VMK_to_VSS_Complete.Text = "" +#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) +$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 +$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" +$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) +$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSSPortGroup_to_VM_Complete.TabIndex = 69 +$VSSPortGroup_to_VM_Complete.Text = "" +#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDS_to_Host_DrawCheckBox.Checked = $true +$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) +$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDS_to_Host_DrawCheckBox.TabIndex = 70 +$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" +$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) +$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDS_to_Host_Complete.TabIndex = 71 +$VDS_to_Host_Complete.Text = "" +#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VDS_DrawCheckBox.Checked = $true +$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) +$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VDS_DrawCheckBox.TabIndex = 72 +$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" +$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) +$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VDS_Complete.TabIndex = 73 +$VMK_to_VDS_Complete.Text = "" +#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) +$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 +$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" +$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) +$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDSPortGroup_to_VM_Complete.TabIndex = 75 +$VDSPortGroup_to_VM_Complete.Text = "" +#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true +$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) +$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 +$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" +$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label +$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) +$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Cluster_to_DRS_Rule_Complete.TabIndex = 77 +$Cluster_to_DRS_Rule_Complete.Text = "" + +$TabDraw.Controls.Add($OpenVisioButton) +$TabDraw.Controls.Add($DrawCheckButton) +$TabDraw.Controls.Add($DrawButton) +$TabDraw.Controls.Add($DrawUncheckButton) +$TabDraw.Controls.Add($VisioOutputLabel) +$TabDraw.Controls.Add($VisioOpenOutputButton) +$TabDraw.Controls.Add($DrawCsvInputLabel) +$TabDraw.Controls.Add($DrawCsvInputButton) +$TabDraw.Controls.Add($vCenterCsvValidation) +$TabDraw.Controls.Add($vCenterCsvValidationCheck) +$TabDraw.Controls.Add($DatacenterCsvValidation) +$TabDraw.Controls.Add($DatacenterCsvValidationCheck) +$TabDraw.Controls.Add($ClusterCsvValidation) +$TabDraw.Controls.Add($ClusterCsvValidationCheck) +$TabDraw.Controls.Add($VmHostCsvValidation) +$TabDraw.Controls.Add($VmHostCsvValidationCheck) +$TabDraw.Controls.Add($VmCsvValidation) +$TabDraw.Controls.Add($VmCsvValidationCheck) +$TabDraw.Controls.Add($TemplateCsvValidation) +$TabDraw.Controls.Add($TemplateCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreClusterCsvValidation) +$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreCsvValidation) +$TabDraw.Controls.Add($DatastoreCsvValidationCheck) +$TabDraw.Controls.Add($VsSwitchCsvValidation) +$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VssPortGroupCsvValidation) +$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VssVmkernelCsvValidation) +$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VssPnicCsvValidation) +$TabDraw.Controls.Add($VssPnicCsvValidationCheck) +$TabDraw.Controls.Add($VdSwitchCsvValidation) +$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VdsPortGroupCsvValidation) +$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VdsVmkernelCsvValidation) +$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VdsPnicCsvValidation) +$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) +$TabDraw.Controls.Add($FolderCsvValidation) +$TabDraw.Controls.Add($FolderCsvValidationCheck) +$TabDraw.Controls.Add($RdmCsvValidation) +$TabDraw.Controls.Add($RdmCsvValidationCheck) +$TabDraw.Controls.Add($DrsRuleCsvValidation) +$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) +$TabDraw.Controls.Add($ResourcePoolCsvValidation) +$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) +$TabDraw.Controls.Add($CsvValidationButton) +$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Host_Complete) +$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Folder_Complete) +$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) +$TabDraw.Controls.Add($VMs_with_RDMs_Complete) +$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) +$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) +$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Datastore_Complete) +$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) +$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($Datastore_to_Host_Complete) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) +$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VSS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VSS_Complete) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VDS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VDS_Complete) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) +$SubTab.Controls.Add($TabDirections) +$SubTab.Controls.Add($TabCapture) +$SubTab.Controls.Add($TabDraw) +$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText +$SubTab.SelectedIndex = 0 +$vDiagram.Controls.Add($MainMenu) +$vDiagram.Controls.Add($MainTab) +$vDiagram.Controls.Add($SubTab) +#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$VisioBrowse.Description = "Select a directory" +$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$DrawCsvBrowse.Description = "Select a directory" +$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$CaptureCsvBrowse.Description = "Select a directory" +$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + +#endregion + +#region Custom Code +#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellCheck = $PSVersionTable.PSVersion +if ($PowershellCheck.Major -ge 4) +{ + $PowershellInstalled.Forecolor = "Green" + $PowershellInstalled.Text = "Installed Version $PowershellCheck" +} +else +{ + $PowershellInstalled.Forecolor = "Red" + $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" +} +#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) +$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) +if ($PowerCliModuleCheck -ne $null) +{ + $PowerCliModuleInstalled.Forecolor = "Green" + $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" +} +else +{ + $PowerCliModuleInstalled.Forecolor = "Red" + $PowerCliModuleInstalled.Text = "Not Installed" +} +#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerClI Installed" +} +elseif ($PowerCliModuleCheck -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerCLI Module Installed" +} +else +{ + $PowerCliInstalled.Forecolor = "Red" + $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" +} +#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) +{ + $VisioInstalled.Forecolor = "Green" + $VisioInstalled.Text = "Installed" +} +else +{ + $VisioInstalled.Forecolor = "Red" + $VisioInstalled.Text = "Visio is Not Installed" +} +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) +$ConnectButton.Add_Click({ Connect_vCenter_Main }) +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } +Check_CaptureCsvFolder } ) +#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton.Add_Click({ + if($CaptureCsvFolder -eq $null) + { + $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" + } + else + { + if ($vCenterCsvCheckBox.Checked -eq "True") + { + $vCenterCsvValidationComplete.Forecolor = "Blue" + $vCenterCsvValidationComplete.Text = "Processing ....." + vCenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" + $vCenterCsvComplete = Test-Path $vCenterExportFileComplete + if ($vCenterCsvComplete -eq $True) + { + $vCenterCsvValidationComplete.Forecolor = "Green" + $vCenterCsvValidationComplete.Text = "Complete" + } + else + { + $vCenterCsvValidationComplete.Forecolor = "Red" + $vCenterCsvValidationComplete.Text = "Not Complete" + } + } + Connect_vCenter + $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager + if ($Connected -eq $null) { Connect_vCenter_Main } + $ConnectButton.Forecolor = [System.Drawing.Color]::Green + $ConnectButton.Text = "Connected to $DefaultViserver" + if ($DatacenterCsvCheckBox.Checked -eq "True") + { + $DatacenterCsvValidationComplete.Forecolor = "Blue" + $DatacenterCsvValidationComplete.Text = "Processing ....." + Datacenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" + $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete + if ($DatacenterCsvComplete -eq $True) + { + $DatacenterCsvValidationComplete.Forecolor = "Green" + $DatacenterCsvValidationComplete.Text = "Complete" + } + else + { + $DatacenterCsvValidationComplete.Forecolor = "Red" + $DatacenterCsvValidationComplete.Text = "Not Complete" + } + } + if ($ClusterCsvCheckBox.Checked -eq "True") + { + $ClusterCsvValidationComplete.Forecolor = "Blue" + $ClusterCsvValidationComplete.Text = "Processing ....." + Cluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" + $ClusterCsvComplete = Test-Path $ClusterExportFileComplete + if ($ClusterCsvComplete -eq $True) + { + $ClusterCsvValidationComplete.Forecolor = "Green" + $ClusterCsvValidationComplete.Text = "Complete" + } + else + { + $ClusterCsvValidationComplete.Forecolor = "Red" + $ClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmHostCsvCheckBox.Checked -eq "True") + { + $VmHostCsvValidationComplete.Forecolor = "Blue" + $VmHostCsvValidationComplete.Text = "Processing ....." + VmHost_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" + $VmHostCsvComplete = Test-Path $VmHostExportFileComplete + if ($VmHostCsvComplete -eq $True) + { + $VmHostCsvValidationComplete.Forecolor = "Green" + $VmHostCsvValidationComplete.Text = "Complete" + } + else + { + $VmHostCsvValidationComplete.Forecolor = "Red" + $VmHostCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmCsvCheckBox.Checked -eq "True") + { + $VmCsvValidationComplete.Forecolor = "Blue" + $VmCsvValidationComplete.Text = "Processing ....." + Vm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" + $VmCsvComplete = Test-Path $VmExportFileComplete + if ($VmCsvComplete -eq $True) + { + $VmCsvValidationComplete.Forecolor = "Green" + $VmCsvValidationComplete.Text = "Complete" + } + else + { + $VmCsvValidationComplete.Forecolor = "Red" + $VmCsvValidationComplete.Text = "Not Complete" + } + } + if ($TemplateCsvCheckBox.Checked -eq "True") + { + $TemplateCsvValidationComplete.Forecolor = "Blue" + $TemplateCsvValidationComplete.Text = "Processing ....." + Template_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" + $TemplateCsvComplete = Test-Path $TemplateExportFileComplete + if ($TemplateCsvComplete -eq $True) + { + $TemplateCsvValidationComplete.Forecolor = "Green" + $TemplateCsvValidationComplete.Text = "Complete" + } + else + { + $TemplateCsvValidationComplete.Forecolor = "Red" + $TemplateCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreClusterCsvCheckBox.Checked -eq "True") + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" + $DatastoreClusterCsvValidationComplete.Text = "Processing ....." + DatastoreCluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete + if ($DatastoreClusterCsvComplete -eq $True) + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Green" + $DatastoreClusterCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Red" + $DatastoreClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreCsvCheckBox.Checked -eq "True") + { + $DatastoreCsvValidationComplete.Forecolor = "Blue" + $DatastoreCsvValidationComplete.Text = "Processing ....." + Datastore_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" + $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete + if ($DatastoreCsvComplete -eq $True) + { + $DatastoreCsvValidationComplete.Forecolor = "Green" + $DatastoreCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreCsvValidationComplete.Forecolor = "Red" + $DatastoreCsvValidationComplete.Text = "Not Complete" + } + } + if ($VsSwitchCsvCheckBox.Checked -eq "True") + { + $VsSwitchCsvValidationComplete.Forecolor = "Blue" + $VsSwitchCsvValidationComplete.Text = "Processing ....." + VsSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" + $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete + if ($vSSwitchCsvComplete -eq $True) + { + $vSSwitchCsvValidationComplete.Forecolor = "Green" + $vSSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $vSSwitchCsvValidationComplete.Forecolor = "Red" + $vSSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPortGroupCsvCheckBox.Checked -eq "True") + { + $VssPortGroupCsvValidationComplete.Forecolor = "Blue" + $VssPortGroupCsvValidationComplete.Text = "Processing ....." + VssPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete + if ($VssPortGroupCsvComplete -eq $True) + { + $VssPortGroupCsvValidationComplete.Forecolor = "Green" + $VssPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VssPortGroupCsvValidationComplete.Forecolor = "Red" + $VssPortGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssVmkernelCsvCheckBox.Checked -eq "True") + { + $VssVmkernelCsvValidationComplete.Forecolor = "Blue" + $VssVmkernelCsvValidationComplete.Text = "Processing ....." + VssVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete + if ($VssVmkernelCsvComplete -eq $True) + { + $VssVmkernelCsvValidationComplete.Forecolor = "Green" + $VssVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VssVmkernelCsvValidationComplete.Forecolor = "Red" + $VssVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPnicCsvCheckBox.Checked -eq "True") + { + $VssPnicCsvValidationComplete.Forecolor = "Blue" + $VssPnicCsvValidationComplete.Text = "Processing ....." + VssPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" + $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete + if ($VssPnicCsvComplete -eq $True) + { + $VssPnicCsvValidationComplete.Forecolor = "Green" + $VssPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VssPnicCsvValidationComplete.Forecolor = "Red" + $VssPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdSwitchCsvCheckBox.Checked -eq "True") + { + $VdSwitchCsvValidationComplete.Forecolor = "Blue" + $VdSwitchCsvValidationComplete.Text = "Processing ....." + VdSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" + $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete + if ($VdSwitchCsvComplete -eq $True) + { + $VdSwitchCsvValidationComplete.Forecolor = "Green" + $VdSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $VdSwitchCsvValidationComplete.Forecolor = "Red" + $VdSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPortGroupCsvCheckBox.Checked -eq "True") + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" + $VdsPortGroupCsvValidationComplete.Text = "Processing ....." + VdsPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete + if ($VdsPortGroupCsvComplete -eq $True) + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Green" + $VdsPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Red" + $VdsPortGroupCsvValidationComplete.Text = "Not Complete" + + } + } + if ($VdsVmkernelCsvCheckBox.Checked -eq "True") + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" + $VdsVmkernelCsvValidationComplete.Text = "Processing ....." + VdsVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete + if ($VdsVmkernelCsvComplete -eq $True) + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Green" + $VdsVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Red" + $VdsVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPnicCsvCheckBox.Checked -eq "True") + { + $VdsPnicCsvValidationComplete.Forecolor = "Blue" + $VdsPnicCsvValidationComplete.Text = "Processing ....." + VdsPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" + $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete + if ($VdsPnicCsvComplete -eq $True) + { + $VdsPnicCsvValidationComplete.Forecolor = "Green" + $VdsPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPnicCsvValidationComplete.Forecolor = "Red" + $VdsPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($FolderCsvCheckBox.Checked -eq "True") + { + $FolderCsvValidationComplete.Forecolor = "Blue" + $FolderCsvValidationComplete.Text = "Processing ....." + Folder_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" + $FolderCsvComplete = Test-Path $FolderExportFileComplete + if ($FolderCsvComplete -eq $True) + { + $FolderCsvValidationComplete.Forecolor = "Green" + $FolderCsvValidationComplete.Text = "Complete" + } + else + { + $FolderCsvValidationComplete.Forecolor = "Red" + $FolderCsvValidationComplete.Text = "Not Complete" + } + } + if ($RdmCsvCheckBox.Checked -eq "True") + { + $RdmCsvValidationComplete.Forecolor = "Blue" + $RdmCsvValidationComplete.Text = "Processing ....." + Rdm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" + $RdmCsvComplete = Test-Path $RdmExportFileComplete + if ($RdmCsvComplete -eq $True) + { + $RdmCsvValidationComplete.Forecolor = "Green" + $RdmCsvValidationComplete.Text = "Complete" + } + else + { + $RdmCsvValidationComplete.Forecolor = "Red" + $RdmCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsRuleCsvCheckBox.Checked -eq "True") + { + $DrsRuleCsvValidationComplete.Forecolor = "Blue" + $DrsRuleCsvValidationComplete.Text = "Processing ....." + Drs_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" + $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete + if ($DrsRuleCsvComplete -eq $True) + { + $DrsRuleCsvValidationComplete.Forecolor = "Green" + $DrsRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsRuleCsvValidationComplete.Forecolor = "Red" + $DrsRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" + $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." + Drs_Cluster_Group_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete + if ($DrsClusterGroupCsvComplete -eq $True) + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" + $DrsClusterGroupCsvValidationComplete.Text = "Complete" + } + else + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" + $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" + $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." + Drs_VmHost_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete + if ($DrsVmHostRuleCsvComplete -eq $True) + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" + $DrsVmHostRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" + $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($ResourcePoolCsvCheckBox.Checked -eq "True") + { + $ResourcePoolCsvValidationComplete.Forecolor = "Blue" + $ResourcePoolCsvValidationComplete.Text = "Processing ....." + Resource_Pool_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete + if ($ResourcePoolCsvComplete -eq $True) + { + $ResourcePoolCsvValidationComplete.Forecolor = "Green" + $ResourcePoolCsvValidationComplete.Text = "Complete" + } + else + { + $ResourcePoolCsvValidationComplete.Forecolor = "Red" + $ResourcePoolCsvValidationComplete.Text = "Not Complete" + } + } + Disconnect_vCenter + $ConnectButton.Forecolor = [System.Drawing.Color]::Red + $ConnectButton.Text = "Disconnected" + $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" + } +}) +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) +$TabDraw.Controls.Add($DrawCsvInputButton) +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton.Add_Click( +{ + $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text + $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" + $vCenterCsvExists = Test-Path $vCenterExportFile + $TabDraw.Controls.Add($vCenterCsvValidationCheck) + if ($vCenterCsvExists -eq $True) + { + + $vCenterCsvValidationCheck.Forecolor = "Green" + $vCenterCsvValidationCheck.Text = "Present" + } + else + { + $vCenterCsvValidationCheck.Forecolor = "Red" + $vCenterCsvValidationCheck.Text = "Not Present" + } + + $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" + $DatacenterCsvExists = Test-Path $DatacenterExportFile + $TabDraw.Controls.Add($DatacenterCsvValidationCheck) + + if ($DatacenterCsvExists -eq $True) + { + $DatacenterCsvValidationCheck.Forecolor = "Green" + $DatacenterCsvValidationCheck.Text = "Present" + } + else + { + $DatacenterCsvValidationCheck.Forecolor = "Red" + $DatacenterCsvValidationCheck.Text = "Not Present" + } + + $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" + $ClusterCsvExists = Test-Path $ClusterExportFile + $TabDraw.Controls.Add($ClusterCsvValidationCheck) + + if ($ClusterCsvExists -eq $True) + { + $ClusterCsvValidationCheck.Forecolor = "Green" + $ClusterCsvValidationCheck.Text = "Present" + } + else + { + $ClusterCsvValidationCheck.Forecolor = "Red" + $ClusterCsvValidationCheck.Text = "Not Present" + } + + $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" + $VmHostCsvExists = Test-Path $VmHostExportFile + $TabDraw.Controls.Add($VmHostCsvValidationCheck) + + if ($VmHostCsvExists -eq $True) + { + $VmHostCsvValidationCheck.Forecolor = "Green" + $VmHostCsvValidationCheck.Text = "Present" + } + else + { + $VmHostCsvValidationCheck.Forecolor = "Red" + $VmHostCsvValidationCheck.Text = "Not Present" + } + + $VmExportFile = $CsvInputDir + "-VmExport.csv" + $VmCsvExists = Test-Path $VmExportFile + $TabDraw.Controls.Add($VmCsvValidationCheck) + + if ($VmCsvExists -eq $True) + { + $VmCsvValidationCheck.Forecolor = "Green" + $VmCsvValidationCheck.Text = "Present" + } + else + { + $VmCsvValidationCheck.Forecolor = "Red" + $VmCsvValidationCheck.Text = "Not Present" + } + + $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" + $TemplateCsvExists = Test-Path $TemplateExportFile + $TabDraw.Controls.Add($TemplateCsvValidationCheck) + + if ($TemplateCsvExists -eq $True) + { + $TemplateCsvValidationCheck.Forecolor = "Green" + $TemplateCsvValidationCheck.Text = "Present" + } + else + { + $TemplateCsvValidationCheck.Forecolor = "Red" + $TemplateCsvValidationCheck.Text = "Not Present" + } + + $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile + $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) + + if ($DatastoreClusterCsvExists -eq $True) + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Green" + $DatastoreClusterCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Red" + $DatastoreClusterCsvValidationCheck.Text = "Not Present" + } + + $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" + $DatastoreCsvExists = Test-Path $DatastoreExportFile + $TabDraw.Controls.Add($DatastoreCsvValidationCheck) + + if ($DatastoreCsvExists -eq $True) + { + $DatastoreCsvValidationCheck.Forecolor = "Green" + $DatastoreCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreCsvValidationCheck.Forecolor = "Red" + $DatastoreCsvValidationCheck.Text = "Not Present" + } + + $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" + $VsSwitchCsvExists = Test-Path $VsSwitchExportFile + $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) + + if ($VsSwitchCsvExists -eq $True) + { + $VsSwitchCsvValidationCheck.Forecolor = "Green" + $VsSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VsSwitchCsvValidationCheck.Forecolor = "Red" + $VsSwitchCsvValidationCheck.Text = "Not Present" + $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile + $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) + + if ($VssPortGroupCsvExists -eq $True) + { + $VssPortGroupCsvValidationCheck.Forecolor = "Green" + $VssPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VssPortGroupCsvValidationCheck.Forecolor = "Red" + $VssPortGroupCsvValidationCheck.Text = "Not Present" + $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile + $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) + + if ($VssVmkernelCsvExists -eq $True) + { + $VssVmkernelCsvValidationCheck.Forecolor = "Green" + $VssVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VssVmkernelCsvValidationCheck.Forecolor = "Red" + $VssVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" + $VssPnicCsvExists = Test-Path $VssPnicExportFile + $TabDraw.Controls.Add($VssPnicCsvValidationCheck) + + if ($VssPnicCsvExists -eq $True) + { + $VssPnicCsvValidationCheck.Forecolor = "Green" + $VssPnicCsvValidationCheck.Text = "Present" + } + else + { + $VssPnicCsvValidationCheck.Forecolor = "Red" + $VssPnicCsvValidationCheck.Text = "Not Present" + } + + $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" + $VdSwitchCsvExists = Test-Path $VdSwitchExportFile + $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) + + if ($VdSwitchCsvExists -eq $True) + { + $VdSwitchCsvValidationCheck.Forecolor = "Green" + $VdSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VdSwitchCsvValidationCheck.Forecolor = "Red" + $VdSwitchCsvValidationCheck.Text = "Not Present" + $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile + $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) + + if ($VdsPortGroupCsvExists -eq $True) + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Green" + $VdsPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Red" + $VdsPortGroupCsvValidationCheck.Text = "Not Present" + $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile + $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) + + if ($VdsVmkernelCsvExists -eq $True) + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Green" + $VdsVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Red" + $VdsVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" + $VdsPnicCsvExists = Test-Path $VdsPnicExportFile + $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) + + if ($VdsPnicCsvExists -eq $True) + { + $VdsPnicCsvValidationCheck.Forecolor = "Green" + $VdsPnicCsvValidationCheck.Text = "Present" + } + else + { + $VdsPnicCsvValidationCheck.Forecolor = "Red" + $VdsPnicCsvValidationCheck.Text = "Not Present" + } + + $FolderExportFile = $CsvInputDir + "-FolderExport.csv" + $FolderCsvExists = Test-Path $FolderExportFile + $TabDraw.Controls.Add($FolderCsvValidationCheck) + + if ($FolderCsvExists -eq $True) + { + $FolderCsvValidationCheck.Forecolor = "Green" + $FolderCsvValidationCheck.Text = "Present" + } + else + { + $FolderCsvValidationCheck.Forecolor = "Red" + $FolderCsvValidationCheck.Text = "Not Present" + } + + $RdmExportFile = $CsvInputDir + "-RdmExport.csv" + $RdmCsvExists = Test-Path $RdmExportFile + $TabDraw.Controls.Add($RdmCsvValidationCheck) + + if ($RdmCsvExists -eq $True) + { + $RdmCsvValidationCheck.Forecolor = "Green" + $RdmCsvValidationCheck.Text = "Present" + } + else + { + $RdmCsvValidationCheck.Forecolor = "Red" + $RdmCsvValidationCheck.Text = "Not Present" + $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" + $DrsRuleCsvExists = Test-Path $DrsRuleExportFile + $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) + + if ($DrsRuleCsvExists -eq $True) + { + $DrsRuleCsvValidationCheck.Forecolor = "Green" + $DrsRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsRuleCsvValidationCheck.Forecolor = "Red" + $DrsRuleCsvValidationCheck.Text = "Not Present" + $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile + $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) + + if ($DrsClusterGroupCsvExists -eq $True) + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" + $DrsClusterGroupCsvValidationCheck.Text = "Present" + } + else + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" + $DrsClusterGroupCsvValidationCheck.Text = "Not Present" + } + + $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile + $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) + + if ($DrsVmHostRuleCsvExists -eq $True) + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" + $DrsVmHostRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" + $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" + } + + $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile + $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) + + if ($ResourcePoolCsvExists -eq $True) + { + $ResourcePoolCsvValidationCheck.Forecolor = "Green" + $ResourcePoolCsvValidationCheck.Text = "Present" + } + else + { + $ResourcePoolCsvValidationCheck.Forecolor = "Red" + $ResourcePoolCsvValidationCheck.Text = "Not Present" + $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" + } +} ) +$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) +$TabDraw.Controls.Add($CsvValidationButton) +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) +$TabDraw.Controls.Add($VisioOpenOutputButton) +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) +$TabDraw.Controls.Add($DrawUncheckButton) +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) +$TabDraw.Controls.Add($DrawCheckButton) +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; +if ($VM_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Host_Complete.Forecolor = "Blue" + $VM_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Host_Complete) + VM_to_Host + $VM_to_Host_Complete.Forecolor = "Green" + $VM_to_Host_Complete.Text = "Complete" + $TabDraw.Controls.Add($VM_to_Host_Complete) +} +if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Folder_Complete.Forecolor = "Blue" + $VM_to_Folder_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Folder_Complete) + VM_to_Folder + $VM_to_Folder_Complete.Forecolor = "Green" + $VM_to_Folder_Complete.Text = "Complete" +} +if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") +{ + $VMs_with_RDMs_Complete.Forecolor = "Blue" + $VMs_with_RDMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMs_with_RDMs_Complete) + VMs_with_RDMs + $VMs_with_RDMs_Complete.Forecolor = "Green" + $VMs_with_RDMs_Complete.Text = "Complete" +} +if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") +{ + $SRM_Protected_VMs_Complete.Forecolor = "Blue" + $SRM_Protected_VMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) + SRM_Protected_VMs + $SRM_Protected_VMs_Complete.Forecolor = "Green" + $SRM_Protected_VMs_Complete.Text = "Complete" +} +if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Datastore_Complete.Forecolor = "Blue" + $VM_to_Datastore_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Datastore_Complete) + VM_to_Datastore + $VM_to_Datastore_Complete.Forecolor = "Green" + $VM_to_Datastore_Complete.Text = "Complete" +} +if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") +{ + $VM_to_ResourcePool_Complete.Forecolor = "Blue" + $VM_to_ResourcePool_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) + VM_to_ResourcePool + $VM_to_ResourcePool_Complete.Forecolor = "Green" + $VM_to_ResourcePool_Complete.Text = "Complete" +} +if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") +{ + $Datastore_to_Host_Complete.Forecolor = "Blue" + $Datastore_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Datastore_to_Host_Complete) + Datastore_to_Host + $Datastore_to_Host_Complete.Forecolor = "Green" + $Datastore_to_Host_Complete.Text = "Complete" +} +if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") +{ + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" + $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) + PhysicalNIC_to_vSwitch + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" + $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" +} +if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VSS_to_Host_Complete.Forecolor = "Blue" + $VSS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSS_to_Host_Complete) + VSS_to_Host + $VSS_to_Host_Complete.Forecolor = "Green" + $VSS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VSS_Complete.Forecolor = "Blue" + $VMK_to_VSS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VSS_Complete) + VMK_to_VSS + $VMK_to_VSS_Complete.Forecolor = "Green" + $VMK_to_VSS_Complete.Text = "Complete" +} +if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VSSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) + VSSPortGroup_to_VM + $VSSPortGroup_to_VM_Complete.Forecolor = "Green" + $VSSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VDS_to_Host_Complete.Forecolor = "Blue" + $VDS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDS_to_Host_Complete) + VDS_to_Host + $VDS_to_Host_Complete.Forecolor = "Green" + $VDS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VDS_Complete.Forecolor = "Blue" + $VMK_to_VDS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VDS_Complete) + VMK_to_VDS + $VMK_to_VDS_Complete.Forecolor = "Green" + $VMK_to_VDS_Complete.Text = "Complete" +} +if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VDSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) + VDSPortGroup_to_VM + $VDSPortGroup_to_VM_Complete.Forecolor = "Green" + $VDSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") +{ + $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" + $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) + Cluster_to_DRS_Rule + $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" + $Cluster_to_DRS_Rule_Complete.Text = "Complete" +}; +$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) +$TabDraw.Controls.Add($DrawButton) +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton.Add_Click({Open_Final_Visio}) +$TabDraw.Controls.Add($OpenVisioButton) + +#endregion + +#region Event Loop + +function Main{ + [System.Windows.Forms.Application]::EnableVisualStyles() + [System.Windows.Forms.Application]::Run($vDiagram) +} + +#endregion + +#endregion + +#region Event Handlers + +#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect_vCenter_Main +{ + $MainVC = $MainVcenterTextBox.Text + $MainUser = $UserNameTextBox.Text + $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text +} + +function Connect_vCenter +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $User = $UserNameTextBox.Text + $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text +} + +function Disconnect_vCenter +{ + $Disconnect = Disconnect-ViServer * -Confirm:$false +} +#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Find_CaptureCsvFolder +{ + $CaptureCsvBrowseLoop = $True + while ($CaptureCsvBrowseLoop) + { + if ($CaptureCsvBrowse.ShowDialog() -eq "OK") + { + $CaptureCsvBrowseLoop = $False + } + else + { + $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($CaptureCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath +} + +function Check_CaptureCsvFolder +{ + $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $CheckContentDir = $CheckContentPath + "*.csv" + $CheckContent = Test-Path $CheckContentDir + if ($CheckContent -eq "True") + { + $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") + switch ($CheckContents_CaptureCsvFolder) { + 'Yes' + { + del $CheckContentDir + } + + 'No' + { + $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog + $CheckContentCsvBrowse.Description = "Select a directory to copy files to" + $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + $CheckContentCsvBrowse.ShowDialog() + $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath + copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder + del $CheckContentDir + } + } + } +} + +function Find_DrawCsvFolder +{ + $DrawCsvBrowseLoop = $True + while ($DrawCsvBrowseLoop) + { + if ($DrawCsvBrowse.ShowDialog() -eq "OK") + { + $DrawCsvBrowseLoop = $False + } + else + { + $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($DrawCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath +} + +function Find_DrawVisioFolder +{ + $VisioBrowseLoop = $True + while($VisioBrowseLoop) + { + if ($VisioBrowse.ShowDialog() -eq "OK") + { + $VisioBrowseLoop = $False + } + else + { + $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if($VisioBrowseRes -eq "Cancel") + { + return + } + } + } + $global:VisioFolder = $VisioBrowse.SelectedPath +} +#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function vCenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, + @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation + + if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) + { + $null + } + else + { + Disconnect_vCenter + } +} + +function Datacenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort-Object Name | + Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation +} + +function Cluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, + @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, + @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, + @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, + @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, + @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, + @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, + @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, + @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, + @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation +} + +function VmHost_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent + while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent + } + if ($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name } } }, + @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent + while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent + } + if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, + @{ N = "Version" ; E = { $_.Config.Product.Version } }, + @{ N = "Build" ; E = { $_.Config.Product.Build } }, + @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, + @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, + @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, + @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, + @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, + @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, + @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, + @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, + @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, + @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, + @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, + @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation +} + +function Vm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select-Object Name , + @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, + @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, + @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, + @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, + @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, + @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, + @{ N = "OS" ; E = { $_.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.Config.Version } }, + @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, + @{ N = 'Folder' ; E = { $Folder.Name } }, + @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, + @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, + @{ N = "IP" ; E = { $_.Guest.IpAddress } }, + @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, + @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, + @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, + @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation + } +} + +function Template_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + foreach ($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { $VmHost.name } }, + @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, + @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, + @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, + @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, + @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, + @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, + @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, + @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation + } +} + +function DatastoreCluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, + @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, + @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation +} + +function Datastore_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, + @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, + @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, + @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, + @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, + @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, + @{ N = "Accessible" ; E = { $_.State } }, + @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation +} + +function VsSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "Nic" ; E = { $_.Nic } }, + @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, + @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, + @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, + @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, + @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation +} + +function VssPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "VLanId" ; E = { $_.VLanId } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VssVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation + } + } + } +} + +function VssPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation + } + } +} + +function VdSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + foreach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "Vendor" ; E = { $_.Vendor } }, + @{ N = "Version" ; E = { $_.Version } }, + @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, + @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation + } +} + +function VdsPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, + @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, + @{ N = "NumPorts" ; E = { $_.NumPorts } }, + @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, + @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, + @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VdsVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation + + } + } +} + +function VdsPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | + Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch } }, + @{ N = "Portgroup" ; E = { $_.Portgroup } }, + @{ N = "ConnectedEntity" ; E = { $_.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation + } + } +} + +function Folder_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + foreach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -type VM | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation + } +} + +function Rdm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | + Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, + @{ N = "Vm" ; E = { $_.Parent } }, + @{ N = "Label" ; E = { $_.Name } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, + @{ N = "DiskType" ; E = { $_.DiskType } }, + @{ N = "Persistence" ; E = { $_.Persistence } }, + @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, + @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, + @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation +} + +function Drs_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation + } +} + +function Drs_Cluster_Group_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "GroupType" ; E = { $_.GroupType } }, + @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation + } +} + +function Drs_VmHost_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) + { + Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "VMGroup" ; E = { $_.VMGroup } }, + @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, + @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, + @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation + } + } +} + +function Resource_Pool_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) + { + Get-ResourcePool $ResourcePool | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Cluster" ; E = { $Cluster.Name } }, + @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, + @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, + @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, + @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, + @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, + @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, + @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, + @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, + @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, + @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation + } + } +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect-VisioObject($firstObj, $secondObj) +{ + $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) + $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) + $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) +} + +function Add-VisioObjectVC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectCluster($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHost($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectTemplate($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectSRM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDatastore($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHardDisk($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.ScsiCanonicalName + return $shpObj +} + +function Add-VisioObjectFolder($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVsSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVssPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVMK($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsClusterGroup($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDRSVMHostRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectResourcePool($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Create_Visio_Base +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $DocObj = $docsObj.Add("") + $DocObj.SaveAs($Savefile) + $AppVisio.Quit() +} + +function VM_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Host" + $Page = $DocsObj.Pages('VM to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Folder +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Folder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + $FolderImport = Import-Csv $FolderExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Folder" + $Page = $DocsObj.Pages('VM to Folder') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Folder') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Folder Object + $FolderObj = $stnObj.Masters.Item("Folder") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $FolderObject = Add-VisioObjectFolder $FolderObj $Folder + $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' + Connect-VisioObject $DatacenterObject $FolderObject + $y += 1.50 + + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $FolderObject $TemplateObject + $FolderObject = $TemplateObject + } + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $FolderObject $VMObject + $FolderObject = $VMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMs_with_RDMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + # RDM's + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + $RdmImport = Import-Csv $RdmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" + $Page = $DocsObj.Pages('VM w/ RDMs') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM w/ RDMs') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # RDM Object + $RDMObj = $stnObj.Masters.Item("RDM") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ClusterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 3.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatacenterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 2.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function SRM_Protected_VMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "SRM VM" + $Page = $DocsObj.Pages('SRM VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('SRM VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # SRM Protected VM Object + $SRMObj = $stnObj.Masters.Item("SRM Protected Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Datastore +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Datastore" + $Page = $DocsObj.Pages('VM to Datastore') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Datastore') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $ClusterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $ClusterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_ResourcePool +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # ResourcePool + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + $ResourcePoolImport = Import-Csv $ResourcePoolExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" + $Page = $DocsObj.Pages('VM to Resource Pool') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Resource Pool') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Resource Pool Object + $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool + # Name + $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' + # Cluster + $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' + # CpuSharesLevel + $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' + # NumCpuShares + $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' + # CpuReservationMHz + $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' + # CpuExpandableReservation + $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' + # CpuLimitMHz + $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' + # MemSharesLevel + $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' + # NumMemShares + $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' + # MemReservationGB + $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' + # MemExpandableReservation + $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' + # MemLimitGB + $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' + Connect-VisioObject $ClusterObject $ResourcePoolObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ResourcePoolObject $VMObject + $ResourcePoolObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Datastore_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Datastore to Host" + $Page = $DocsObj.Pages('Datastore to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Datastore to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function PhysicalNIC_to_vSwitch +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "PNIC to switch" + $Page = $DocsObj.Pages('PNIC to Switch') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('PNIC to Switch') + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + $y += 1.50 + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSS to Host" + $Page = $DocsObj.Pages('VSS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VSS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VSS" + $Page = $DocsObj.Pages('VMK to VSS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VSS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" + $Page = $DocsObj.Pages('VSSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDS to Host" + $Page = $DocsObj.Pages('VDS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VDS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VDS" + $Page = $DocsObj.Pages('VMK to VDS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VDS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" + $Page = $DocsObj.Pages('VDSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $DatacenterObject $VdSwitchObject + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x = 6.00 + $y += 1.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VPGObject $VMObject + $VPGObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Cluster_to_DRS_Rule +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # DRS Rule + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + $DrsRuleImport = Import-Csv $DrsRuleExportFile + # DRS Cluster Group + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile + # DRS VmHost Rule + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" + $Page = $DocsObj.Pages('Cluster to DRS Rule') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Cluster to DRS Rule') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # DRS Rule + $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") + # DRS Cluster Group + $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") + # DRS Host Rule + $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") + # Microsoft VM Object + $MSObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LXObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + $y += 1.50 + + foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule + # Name + $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' + # VM Affinity + $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' + # DRS Rule Enabled + $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' + # DRS Rule Mandatory + $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' + Connect-VisioObject $ClusterObject $DRSObject + #$ClusterObject = $DRSObject + $y += 1.50 + } + foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule + # Name + $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' + # Enabled + $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' + # Type + $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' + # VMGroup + $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' + # VMHostGroup + $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' + # AffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' + # AntiAffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' + Connect-VisioObject $ClusterObject $DRSVMHostRuleObject + $y += 1.50 + #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject + #$DrsClusterGroupObject = $DRSVMHostRuleObject + + foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) + { + $x += 2.50 + $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup + # Name + $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' + # GroupType + $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' + # Members + $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' + Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject + $DRSVMHostRuleObject = $DrsClusterGroupObject + + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Open_Final_Visio +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.Application + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null +} + +Main + +#endregion \ No newline at end of file From 31b22d0ffd4fc1cf50fe7b698d12d290b7b3dcb6 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Fri, 13 Apr 2018 08:42:42 -0400 Subject: [PATCH 08/19] vDiagram_2.0.1 --- vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 | 8807 ---------------------- 1 file changed, 8807 deletions(-) delete mode 100644 vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 diff --git a/vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 b/vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 deleted file mode 100644 index c13525d..0000000 --- a/vDiagram_2.0.1/delete/vDiagram_2.0.1.ps1 +++ /dev/null @@ -1,8807 +0,0 @@ -<# -.SYNOPSIS - vDiagram Visio Drawing Tool - -.DESCRIPTION - vDiagram Visio Drawing Tool - -.NOTES - File Name : vDiagram2.0.1.ps1 - Author : Tony Gonzalez - Author : Jason Hopkins - Based on : vDiagram by Alan Renouf - Version : 2.0.0 - -.USAGE NOTES - Ensure to unblock files before unzipping - Ensure to run as administrator - Required Files: - PowerCLI or PowerShell 5.0 with PowerCLI Modules installed - Active connection to vCenter to capture data - MS Visio - -.CHANGE LOG - - 04/12/2018 - v2.0.1 - Added MAC Addresses to VMs & Templates - Added a check to see if prior CSVs are still present - Added option to copy prior CSVs to new folder - - - 04/11/2018 - v2.0.0 - Presented as a Community Theater Session at South Florida VMUG - Feature enhancement requests collected -#> - -#region ScriptForm Designer - -#region Constructor - -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") -[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") -#endregion - -#region Post-Constructor Custom Code -$MyVer = "2.0.1" -$LastUpdated = "April 12, 2018" -$About = -@" - - vDiagram $MyVer - - Contributors: Tony Gonzalez of RoundTower Technologies LLC - Jason Hopkins of RoundTower Technologies LLC - - Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram - - Created: February 13, 2018 - - Last Updated: $LastUpdated - -"@ -#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" -if (!(Test-Path $TestShapes)) -{ - $CurrentLocation = Get-Location - copy $CurrentLocation\vDiagram.vssx $TestShapes - Write-Host "Copying Shapes File to My Shapes" -} -$shpFile = "\vDiagram.vssx" -#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Set_WindowStyle { -param( - [Parameter()] - [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', - 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', - 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] - $Style = 'SHOW', - [Parameter()] - $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle -) - $WindowStates = @{ - FORCEMINIMIZE = 11; HIDE = 0 - MAXIMIZE = 3; MINIMIZE = 6 - RESTORE = 9; SHOW = 5 - SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 - SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 - SHOWNA = 8; SHOWNOACTIVATE = 4 - SHOWNORMAL = 1 - } - Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) - - $Win32ShowWindowAsync = Add-Type –memberDefinition @” - [DllImport("user32.dll")] - public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); -“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru - - $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null -} -Set_WindowStyle MINIMIZE -#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function About_Config -{ - - $About - - #Add objects for About - $AboutForm = New-Object System.Windows.Forms.Form - $AboutTextBox = New-Object System.Windows.Forms.RichTextBox - - #About Form - $AboutForm.Icon = $Icon - $AboutForm.AutoScroll = $True - $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) - $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutForm.Name = "About" - $AboutForm.StartPosition = 1 - $AboutForm.Text = "About vDiagram $MyVer" - - $AboutTextBox.Anchor = 15 - $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) - $AboutTextBox.BorderStyle = 0 - $AboutTextBox.Font = "Tahoma" - $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) - $AboutTextBox.Name = "AboutTextBox" - $AboutTextBox.ReadOnly = $True - $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) - $AboutTextBox.Text = $About - - $AboutForm.Controls.Add($AboutTextBox) - - $AboutForm.Show() | Out-Null -} -#endregion - -#region Form Creation -#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vDiagram = New-Object System.Windows.Forms.Form -$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) -$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") -$vDiagram.Icon = $Icon -$vDiagram.Text = "vDiagram 2.0" -$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan -#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainMenu = New-Object System.Windows.Forms.MenuStrip -$MainMenu.Location = New-Object System.Drawing.Point(0, 0) -$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) -$MainMenu.TabIndex = 1 -$MainMenu.Text = "MainMenu" -#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) -$FileToolStripMenuItem.Text = "File" -#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) -$ExitToolStripMenuItem.Text = "Exit" -$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) -$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) -#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) -$HelpToolStripMenuItem.Text = "Help" -#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) -$AboutToolStripMenuItem.Text = "About" -$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) -$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) -$AboutToolStripMenuItem.Add_Click({About_Config}) -#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainTab = New-Object System.Windows.Forms.TabControl -$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) -$MainTab.Location = New-Object System.Drawing.Point(10, 30) -$MainTab.Size = New-Object System.Drawing.Size(990, 98) -$MainTab.TabIndex = 0 -$MainTab.Text = "MainTabs" -#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Prerequisites = New-Object System.Windows.Forms.TabPage -$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) -$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) -$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) -$Prerequisites.TabIndex = 0 -$Prerequisites.Text = "Prerequisites" -$Prerequisites.BackColor = [System.Drawing.Color]::LightGray -#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellLabel = New-Object System.Windows.Forms.Label -$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) -$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) -$PowershellLabel.TabIndex = 1 -$PowershellLabel.Text = "Powershell:" -#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellInstalled = New-Object System.Windows.Forms.Label -$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) -$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) -$PowershellInstalled.TabIndex = 2 -$PowershellInstalled.Text = "" -$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleLabel = New-Object System.Windows.Forms.Label -$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) -$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) -$PowerCliModuleLabel.TabIndex = 3 -$PowerCliModuleLabel.Text = "PowerCLI Module:" -#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label -$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) -$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) -$PowerCliModuleInstalled.TabIndex = 4 -$PowerCliModuleInstalled.Text = "" -$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliLabel = New-Object System.Windows.Forms.Label -$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) -$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) -$PowerCliLabel.TabIndex = 5 -$PowerCliLabel.Text = "PowerCLI:" -#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliInstalled = New-Object System.Windows.Forms.Label -$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) -$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) -$PowerCliInstalled.TabIndex = 6 -$PowerCliInstalled.Text = "" -$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioLabel = New-Object System.Windows.Forms.Label -$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) -$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) -$VisioLabel.TabIndex = 7 -$VisioLabel.Text = "Visio:" -#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioInstalled = New-Object System.Windows.Forms.Label -$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) -$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) -$VisioInstalled.TabIndex = 8 -$VisioInstalled.Text = "" -$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray -$Prerequisites.Controls.Add($PowershellLabel) -$Prerequisites.Controls.Add($PowershellInstalled) -$Prerequisites.Controls.Add($PowerCliModuleLabel) -$Prerequisites.Controls.Add($PowerCliModuleInstalled) -$Prerequisites.Controls.Add($PowerCliLabel) -$Prerequisites.Controls.Add($PowerCliInstalled) -$Prerequisites.Controls.Add($VisioLabel) -$Prerequisites.Controls.Add($VisioInstalled) -#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfo = New-Object System.Windows.Forms.TabPage -$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) -$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) -$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) -$vCenterInfo.TabIndex = 0 -$vCenterInfo.Text = "vCenter Info" -$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray -#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterLabel = New-Object System.Windows.Forms.Label -$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) -$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) -$MainVcenterLabel.TabIndex = 1 -$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" -#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox -$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) -$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) -$MainVcenterTextBox.TabIndex = 2 -$MainVcenterTextBox.Text = "" -#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterLabel = New-Object System.Windows.Forms.Label -$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) -$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) -$TargetVcenterLabel.TabIndex = 3 -$TargetVcenterLabel.Text = "Name of target vCenter:" -#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox -$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) -$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) -$TargetVcenterTextBox.TabIndex = 4 -$TargetVcenterTextBox.Text = "" -#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameLabel = New-Object System.Windows.Forms.Label -$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) -$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) -$UserNameLabel.TabIndex = 5 -$UserNameLabel.Text = "vCenter User Name:" -#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameTextBox = New-Object System.Windows.Forms.TextBox -$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) -$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) -$UserNameTextBox.TabIndex = 6 -$UserNameTextBox.Text = "" -#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordLabel = New-Object System.Windows.Forms.Label -$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) -$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) -$PasswordLabel.TabIndex = 7 -$PasswordLabel.Text = "Password:" -#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordTextBox = New-Object System.Windows.Forms.TextBox -$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) -$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) -$PasswordTextBox.TabIndex = 8 -$PasswordTextBox.Text = "" -$PasswordTextBox.UseSystemPasswordChar = $true -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton = New-Object System.Windows.Forms.Button -$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) -$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) -$ConnectButton.TabIndex = 9 -$ConnectButton.Text = "Connect to vCenter" -$ConnectButton.UseVisualStyleBackColor = $true -$vCenterInfo.Controls.Add($MainVcenterLabel) -$vCenterInfo.Controls.Add($MainVcenterTextBox) -$vCenterInfo.Controls.Add($TargetVcenterLabel) -$vCenterInfo.Controls.Add($TargetVcenterTextBox) -$vCenterInfo.Controls.Add($UserNameLabel) -$vCenterInfo.Controls.Add($UserNameTextBox) -$vCenterInfo.Controls.Add($PasswordLabel) -$vCenterInfo.Controls.Add($PasswordTextBox) -$vCenterInfo.Controls.Add($ConnectButton) -$MainTab.Controls.Add($Prerequisites) -$MainTab.Controls.Add($vCenterInfo) -$MainTab.SelectedIndex = 0 -#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SubTab = New-Object System.Windows.Forms.TabControl -$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$SubTab.Location = New-Object System.Drawing.Point(10, 136) -$SubTab.Size = New-Object System.Drawing.Size(990, 512) -$SubTab.TabIndex = 0 -$SubTab.Text = "SubTabs" -#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDirections = New-Object System.Windows.Forms.TabPage -$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDirections.Location = New-Object System.Drawing.Point(4, 22) -$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDirections.Size = New-Object System.Drawing.Size(982, 486) -$TabDirections.TabIndex = 0 -$TabDirections.Text = "Directions" -$TabDirections.UseVisualStyleBackColor = $true -#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesHeading = New-Object System.Windows.Forms.Label -$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) -$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) -$PrerequisitesHeading.TabIndex = 0 -$PrerequisitesHeading.Text = "Prerequisites Tab" -#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesDirections = New-Object System.Windows.Forms.Label -$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) -$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) -$PrerequisitesDirections.TabIndex = 1 -$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." -#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoHeading = New-Object System.Windows.Forms.Label -$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) -$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) -$vCenterInfoHeading.TabIndex = 2 -$vCenterInfoHeading.Text = "vCenter Info Tab" -#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoDirections = New-Object System.Windows.Forms.Label -$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) -$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) -$vCenterInfoDirections.TabIndex = 3 -$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." -#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvHeading = New-Object System.Windows.Forms.Label -$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) -$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) -$CaptureCsvHeading.TabIndex = 4 -$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" -#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureDirections = New-Object System.Windows.Forms.Label -$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) -$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) -$CaptureDirections.TabIndex = 5 -$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." -#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawHeading = New-Object System.Windows.Forms.Label -$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) -$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) -$DrawHeading.TabIndex = 6 -$DrawHeading.Text = "Draw Visio Tab" -#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawDirections = New-Object System.Windows.Forms.Label -$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) -$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) -$DrawDirections.TabIndex = 7 -$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." -$TabDirections.Controls.Add($PrerequisitesHeading) -$TabDirections.Controls.Add($PrerequisitesDirections) -$TabDirections.Controls.Add($vCenterInfoHeading) -$TabDirections.Controls.Add($vCenterInfoDirections) -$TabDirections.Controls.Add($CaptureCsvHeading) -$TabDirections.Controls.Add($CaptureDirections) -$TabDirections.Controls.Add($DrawHeading) -$TabDirections.Controls.Add($DrawDirections) -#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabCapture = New-Object System.Windows.Forms.TabPage -$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabCapture.Location = New-Object System.Drawing.Point(4, 22) -$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) -$TabCapture.Size = New-Object System.Drawing.Size(982, 486) -$TabCapture.TabIndex = 3 -$TabCapture.Text = "Capture CSVs for Visio" -$TabCapture.UseVisualStyleBackColor = $true -#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label -$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) -$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) -$CaptureCsvOutputLabel.TabIndex = 0 -$CaptureCsvOutputLabel.Text = "CSV Output Folder:" -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button -$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) -$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) -$CaptureCsvOutputButton.TabIndex = 0 -$CaptureCsvOutputButton.Text = "Select Output Folder" -$CaptureCsvOutputButton.UseVisualStyleBackColor = $false -$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$vCenterCsvCheckBox.Checked = $true -$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$vCenterCsvCheckBox.TabIndex = 1 -$vCenterCsvCheckBox.Text = "Export vCenter Info" -$vCenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) -$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationComplete.TabIndex = 26 -$vCenterCsvValidationComplete.Text = "" -#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatacenterCsvCheckBox.Checked = $true -$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatacenterCsvCheckBox.TabIndex = 2 -$DatacenterCsvCheckBox.Text = "Export Datacenter Info" -$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) -$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationComplete.TabIndex = 27 -$DatacenterCsvValidationComplete.Text = "" -#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ClusterCsvCheckBox.Checked = $true -$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ClusterCsvCheckBox.TabIndex = 3 -$ClusterCsvCheckBox.Text = "Export Cluster Info" -$ClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) -$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationComplete.TabIndex = 28 -$ClusterCsvValidationComplete.Text = "" -#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmHostCsvCheckBox.Checked = $true -$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmHostCsvCheckBox.TabIndex = 4 -$VmHostCsvCheckBox.Text = "Export VmHost Info" -$VmHostCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) -$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationComplete.TabIndex = 29 -$VmHostCsvValidationComplete.Text = "" -#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmCsvCheckBox.Checked = $true -$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmCsvCheckBox.TabIndex = 5 -$VmCsvCheckBox.Text = "Export Vm Info" -$VmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) -$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationComplete.TabIndex = 30 -$VmCsvValidationComplete.Text = "" -#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$TemplateCsvCheckBox.Checked = $true -$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$TemplateCsvCheckBox.TabIndex = 6 -$TemplateCsvCheckBox.Text = "Export Template Info" -$TemplateCsvCheckBox.UseVisualStyleBackColor = $true -#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label -$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) -$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationComplete.TabIndex = 31 -$TemplateCsvValidationComplete.Text = "" -#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreClusterCsvCheckBox.Checked = $true -$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreClusterCsvCheckBox.TabIndex = 7 -$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" -$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) -$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationComplete.TabIndex = 32 -$DatastoreClusterCsvValidationComplete.Text = "" -#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreCsvCheckBox.Checked = $true -$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreCsvCheckBox.TabIndex = 8 -$DatastoreCsvCheckBox.Text = "Export Datastore Info" -$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) -$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationComplete.TabIndex = 33 -$DatastoreCsvValidationComplete.Text = "" -#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VsSwitchCsvCheckBox.Checked = $true -$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) -$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VsSwitchCsvCheckBox.TabIndex = 9 -$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" -$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) -$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationComplete.TabIndex = 34 -$VsSwitchCsvValidationComplete.Text = "" -#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPortGroupCsvCheckBox.Checked = $true -$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) -$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPortGroupCsvCheckBox.TabIndex = 10 -$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" -$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) -$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationComplete.TabIndex = 35 -$VssPortGroupCsvValidationComplete.Text = "" -#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssVmkernelCsvCheckBox.Checked = $true -$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) -$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssVmkernelCsvCheckBox.TabIndex = 11 -$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" -$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) -$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationComplete.TabIndex = 36 -$VssVmkernelCsvValidationComplete.Text = "" -#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPnicCsvCheckBox.Checked = $true -$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) -$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPnicCsvCheckBox.TabIndex = 12 -$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" -$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) -$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationComplete.TabIndex = 37 -$VssPnicCsvValidationComplete.Text = "" -#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdSwitchCsvCheckBox.Checked = $true -$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) -$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdSwitchCsvCheckBox.TabIndex = 13 -$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" -$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) -$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationComplete.TabIndex = 38 -$VdSwitchCsvValidationComplete.Text = "" -#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPortGroupCsvCheckBox.Checked = $true -$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) -$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPortGroupCsvCheckBox.TabIndex = 14 -$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" -$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) -$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationComplete.TabIndex = 39 -$VdsPortGroupCsvValidationComplete.Text = "" -#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsVmkernelCsvCheckBox.Checked = $true -$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) -$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsVmkernelCsvCheckBox.TabIndex = 15 -$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" -$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) -$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationComplete.TabIndex = 40 -$VdsVmkernelCsvValidationComplete.Text = "" -#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPnicCsvCheckBox.Checked = $true -$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) -$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPnicCsvCheckBox.TabIndex = 16 -$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" -$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) -$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationComplete.TabIndex = 41 -$VdsPnicCsvValidationComplete.Text = "" -#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$FolderCsvCheckBox.Checked = $true -$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) -$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$FolderCsvCheckBox.TabIndex = 17 -$FolderCsvCheckBox.Text = "Export Folder Info" -$FolderCsvCheckBox.UseVisualStyleBackColor = $true -#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label -$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) -$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationComplete.TabIndex = 42 -$FolderCsvValidationComplete.Text = "" -#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$RdmCsvCheckBox.Checked = $true -$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) -$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$RdmCsvCheckBox.TabIndex = 18 -$RdmCsvCheckBox.Text = "Export RDM Info" -$RdmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label -$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) -$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationComplete.TabIndex = 43 -$RdmCsvValidationComplete.Text = "" -#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsRuleCsvCheckBox.Checked = $true -$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) -$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsRuleCsvCheckBox.TabIndex = 19 -$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" -$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) -$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationComplete.TabIndex = 44 -$DrsRuleCsvValidationComplete.Text = "" -#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsClusterGroupCsvCheckBox.Checked = $true -$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) -$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsClusterGroupCsvCheckBox.TabIndex = 20 -$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" -$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) -$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationComplete.TabIndex = 45 -$DrsClusterGroupCsvValidationComplete.Text = "" -#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsVmHostRuleCsvCheckBox.Checked = $true -$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) -$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsVmHostRuleCsvCheckBox.TabIndex = 21 -$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" -$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) -$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 -$DrsVmHostRuleCsvValidationComplete.Text = "" -#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ResourcePoolCsvCheckBox.Checked = $true -$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) -$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ResourcePoolCsvCheckBox.TabIndex = 22 -$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" -$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) -$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationComplete.TabIndex = 47 -$ResourcePoolCsvValidationComplete.Text = "" -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton = New-Object System.Windows.Forms.Button -$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) -$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureUncheckButton.TabIndex = 23 -$CaptureUncheckButton.Text = "Uncheck All" -$CaptureUncheckButton.UseVisualStyleBackColor = $false -$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton = New-Object System.Windows.Forms.Button -$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) -$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureCheckButton.TabIndex = 24 -$CaptureCheckButton.Text = "Check All" -$CaptureCheckButton.UseVisualStyleBackColor = $false -$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton = New-Object System.Windows.Forms.Button -$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) -$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureButton.TabIndex = 25 -$CaptureButton.Text = "Collect CSV Data" -$CaptureButton.UseVisualStyleBackColor = $false -$CaptureButton.BackColor = [System.Drawing.Color]::LightGray -$TabCapture.Controls.Add($CaptureCsvOutputLabel) -$TabCapture.Controls.Add($CaptureCsvOutputButton) -$TabCapture.Controls.Add($vCenterCsvCheckBox) -$TabCapture.Controls.Add($vCenterCsvValidationComplete) -$TabCapture.Controls.Add($DatacenterCsvCheckBox) -$TabCapture.Controls.Add($DatacenterCsvValidationComplete) -$TabCapture.Controls.Add($ClusterCsvCheckBox) -$TabCapture.Controls.Add($ClusterCsvValidationComplete) -$TabCapture.Controls.Add($VmHostCsvCheckBox) -$TabCapture.Controls.Add($VmHostCsvValidationComplete) -$TabCapture.Controls.Add($VmCsvCheckBox) -$TabCapture.Controls.Add($VmCsvValidationComplete) -$TabCapture.Controls.Add($TemplateCsvCheckBox) -$TabCapture.Controls.Add($TemplateCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) -$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreCsvCheckBox) -$TabCapture.Controls.Add($DatastoreCsvValidationComplete) -$TabCapture.Controls.Add($VsSwitchCsvCheckBox) -$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VssPnicCsvCheckBox) -$TabCapture.Controls.Add($VssPnicCsvValidationComplete) -$TabCapture.Controls.Add($VdSwitchCsvCheckBox) -$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VdsPnicCsvCheckBox) -$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) -$TabCapture.Controls.Add($FolderCsvCheckBox) -$TabCapture.Controls.Add($FolderCsvValidationComplete) -$TabCapture.Controls.Add($RdmCsvCheckBox) -$TabCapture.Controls.Add($RdmCsvValidationComplete) -$TabCapture.Controls.Add($DrsRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) -$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) -$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) -$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) -$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) -$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) -$TabCapture.Controls.Add($CaptureUncheckButton) -$TabCapture.Controls.Add($CaptureCheckButton) -$TabCapture.Controls.Add($CaptureButton) -#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDraw = New-Object System.Windows.Forms.TabPage -$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDraw.Location = New-Object System.Drawing.Point(4, 22) -$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDraw.Size = New-Object System.Drawing.Size(982, 486) -$TabDraw.TabIndex = 2 -$TabDraw.Text = "Draw Visio" -$TabDraw.UseVisualStyleBackColor = $true -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton = New-Object System.Windows.Forms.Button -$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) -$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) -$OpenVisioButton.TabIndex = 83 -$OpenVisioButton.Text = "Open Visio Drawing" -$OpenVisioButton.UseVisualStyleBackColor = $false -$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton = New-Object System.Windows.Forms.Button -$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) -$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawCheckButton.TabIndex = 82 -$DrawCheckButton.Text = "Check All" -$DrawCheckButton.UseVisualStyleBackColor = $false -$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton = New-Object System.Windows.Forms.Button -$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawButton.Location = New-Object System.Drawing.Point(448, 450) -$DrawButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawButton.TabIndex = 81 -$DrawButton.Text = "Draw Visio" -$DrawButton.UseVisualStyleBackColor = $false -$DrawButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton = New-Object System.Windows.Forms.Button -$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) -$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawUncheckButton.TabIndex = 80 -$DrawUncheckButton.Text = "Uncheck All" -$DrawUncheckButton.UseVisualStyleBackColor = $false -$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOutputLabel = New-Object System.Windows.Forms.Label -$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) -$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) -$VisioOutputLabel.TabIndex = 46 -$VisioOutputLabel.Text = "Visio Output Folder:" -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton = New-Object System.Windows.Forms.Button -$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) -$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) -$VisioOpenOutputButton.TabIndex = 47 -$VisioOpenOutputButton.Text = "Select Visio Output Folder" -$VisioOpenOutputButton.UseVisualStyleBackColor = $false -$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputLabel = New-Object System.Windows.Forms.Label -$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) -$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) -$DrawCsvInputLabel.TabIndex = 0 -$DrawCsvInputLabel.Text = "CSV Input Folder:" -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton = New-Object System.Windows.Forms.Button -$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) -$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) -$DrawCsvInputButton.TabIndex = 1 -$DrawCsvInputButton.Text = "Select CSV Input Folder" -$DrawCsvInputButton.UseVisualStyleBackColor = $false -$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidation = New-Object System.Windows.Forms.Label -$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$vCenterCsvValidation.TabIndex = 2 -$vCenterCsvValidation.Text = "vCenter CSV File:" -#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) -$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationCheck.TabIndex = 3 -$vCenterCsvValidationCheck.Text = "" -#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidation = New-Object System.Windows.Forms.Label -$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatacenterCsvValidation.TabIndex = 4 -$DatacenterCsvValidation.Text = "Datacenter CSV File:" -#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) -$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationCheck.TabIndex = 5 -$DatacenterCsvValidationCheck.Text = "" -#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidation = New-Object System.Windows.Forms.Label -$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ClusterCsvValidation.TabIndex = 6 -$ClusterCsvValidation.Text = "Cluster CSV File:" -#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) -$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationCheck.TabIndex = 7 -$ClusterCsvValidationCheck.Text = "" -#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidation = New-Object System.Windows.Forms.Label -$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmHostCsvValidation.TabIndex = 8 -$VmHostCsvValidation.Text = "VmHost CSV File:" -#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) -$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationCheck.TabIndex = 9 -$VmHostCsvValidationCheck.Text = "" -#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidation = New-Object System.Windows.Forms.Label -$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmCsvValidation.TabIndex = 10 -$VmCsvValidation.Text = "VM CSV File:" -#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) -$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationCheck.TabIndex = 11 -$VmCsvValidationCheck.Text = "" -#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidation = New-Object System.Windows.Forms.Label -$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$TemplateCsvValidation.TabIndex = 12 -$TemplateCsvValidation.Text = "Template CSV File:" -#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label -$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) -$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationCheck.TabIndex = 13 -$TemplateCsvValidationCheck.Text = "" -#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreClusterCsvValidation.TabIndex = 14 -$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" -#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) -$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationCheck.TabIndex = 15 -$DatastoreClusterCsvValidationCheck.Text = "" -#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreCsvValidation.TabIndex = 16 -$DatastoreCsvValidation.Text = "Datastore CSV File:" -#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) -$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationCheck.TabIndex = 17 -$DatastoreCsvValidationCheck.Text = "" -#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) -$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VsSwitchCsvValidation.TabIndex = 18 -$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" -#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) -$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationCheck.TabIndex = 19 -$VsSwitchCsvValidationCheck.Text = "" -#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) -$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPortGroupCsvValidation.TabIndex = 20 -$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" -#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) -$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationCheck.TabIndex = 21 -$VssPortGroupCsvValidationCheck.Text = "" -#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) -$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssVmkernelCsvValidation.TabIndex = 22 -$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" -#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) -$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationCheck.TabIndex = 23 -$VssVmkernelCsvValidationCheck.Text = "" -#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidation = New-Object System.Windows.Forms.Label -$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) -$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPnicCsvValidation.TabIndex = 24 -$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" -#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) -$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationCheck.TabIndex = 25 -$VssPnicCsvValidationCheck.Text = "" -#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) -$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdSwitchCsvValidation.TabIndex = 26 -$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" -#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) -$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationCheck.TabIndex = 27 -$VdSwitchCsvValidationCheck.Text = "" -#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) -$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPortGroupCsvValidation.TabIndex = 28 -$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" -#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) -$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationCheck.TabIndex = 29 -$VdsPortGroupCsvValidationCheck.Text = "" -#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) -$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsVmkernelCsvValidation.TabIndex = 30 -$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" -#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) -$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationCheck.TabIndex = 31 -$VdsVmkernelCsvValidationCheck.Text = "" -#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) -$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPnicCsvValidation.TabIndex = 32 -$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" -#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) -$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationCheck.TabIndex = 33 -$VdsPnicCsvValidationCheck.Text = "" -#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidation = New-Object System.Windows.Forms.Label -$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) -$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$FolderCsvValidation.TabIndex = 34 -$FolderCsvValidation.Text = "Folder CSV File:" -#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label -$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) -$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationCheck.TabIndex = 35 -$FolderCsvValidationCheck.Text = "" -#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidation = New-Object System.Windows.Forms.Label -$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) -$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$RdmCsvValidation.TabIndex = 36 -$RdmCsvValidation.Text = "RDM CSV File:" -#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label -$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) -$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationCheck.TabIndex = 37 -$RdmCsvValidationCheck.Text = "" -#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) -$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsRuleCsvValidation.TabIndex = 38 -$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" -#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) -$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationCheck.TabIndex = 39 -$DrsRuleCsvValidationCheck.Text = "" -#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) -$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsClusterGroupCsvValidation.TabIndex = 40 -$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" -#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) -$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationCheck.TabIndex = 41 -$DrsClusterGroupCsvValidationCheck.Text = "" -#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) -$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsVmHostRuleCsvValidation.TabIndex = 42 -$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" -#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) -$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 -$DrsVmHostRuleCsvValidationCheck.Text = "" -#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) -$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ResourcePoolCsvValidation.TabIndex = 44 -$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" -#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) -$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationCheck.TabIndex = 45 -$ResourcePoolCsvValidationCheck.Text = "" -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton = New-Object System.Windows.Forms.Button -$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) -$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) -$CsvValidationButton.TabIndex = 2 -$CsvValidationButton.Text = "Check for CSVs" -$CsvValidationButton.UseVisualStyleBackColor = $false -$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Host_DrawCheckBox.Checked = $true -$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) -$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Host_DrawCheckBox.TabIndex = 48 -$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" -$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_Complete = New-Object System.Windows.Forms.Label -$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) -$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Host_Complete.TabIndex = 49 -$VM_to_Host_Complete.Text = "" -#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Folder_DrawCheckBox.Checked = $true -$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) -$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Folder_DrawCheckBox.TabIndex = 50 -$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" -$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label -$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) -$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Folder_Complete.TabIndex = 51 -$VM_to_Folder_Complete.Text = "" -#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMs_with_RDMs_DrawCheckBox.Checked = $true -$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) -$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 -$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" -$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label -$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) -$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMs_with_RDMs_Complete.TabIndex = 53 -$VMs_with_RDMs_Complete.Text = "" -#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$SRM_Protected_VMs_DrawCheckBox.Checked = $true -$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) -$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 -$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" -$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label -$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) -$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$SRM_Protected_VMs_Complete.TabIndex = 55 -$SRM_Protected_VMs_Complete.Text = "" -#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Datastore_DrawCheckBox.Checked = $true -$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) -$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Datastore_DrawCheckBox.TabIndex = 56 -$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" -$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label -$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) -$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Datastore_Complete.TabIndex = 57 -$VM_to_Datastore_Complete.Text = "" -#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_ResourcePool_DrawCheckBox.Checked = $true -$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) -$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 -$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" -$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label -$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) -$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_ResourcePool_Complete.TabIndex = 59 -$VM_to_ResourcePool_Complete.Text = "" -#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Datastore_to_Host_DrawCheckBox.Checked = $true -$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) -$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$Datastore_to_Host_DrawCheckBox.TabIndex = 60 -$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" -$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label -$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) -$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Datastore_to_Host_Complete.TabIndex = 61 -$Datastore_to_Host_Complete.Text = "" -#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true -$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) -$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 -$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" -$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label -$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) -$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) -$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 -$PhysicalNIC_to_vSwitch_Complete.Text = "" -#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSS_to_Host_DrawCheckBox.Checked = $true -$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) -$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSS_to_Host_DrawCheckBox.TabIndex = 64 -$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" -$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) -$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSS_to_Host_Complete.TabIndex = 65 -$VSS_to_Host_Complete.Text = "" -#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VSS_DrawCheckBox.Checked = $true -$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) -$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VSS_DrawCheckBox.TabIndex = 66 -$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" -$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) -$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VSS_Complete.TabIndex = 67 -$VMK_to_VSS_Complete.Text = "" -#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) -$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 -$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" -$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) -$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSSPortGroup_to_VM_Complete.TabIndex = 69 -$VSSPortGroup_to_VM_Complete.Text = "" -#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDS_to_Host_DrawCheckBox.Checked = $true -$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) -$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDS_to_Host_DrawCheckBox.TabIndex = 70 -$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" -$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) -$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDS_to_Host_Complete.TabIndex = 71 -$VDS_to_Host_Complete.Text = "" -#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VDS_DrawCheckBox.Checked = $true -$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) -$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VDS_DrawCheckBox.TabIndex = 72 -$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" -$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) -$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VDS_Complete.TabIndex = 73 -$VMK_to_VDS_Complete.Text = "" -#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) -$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 -$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" -$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) -$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDSPortGroup_to_VM_Complete.TabIndex = 75 -$VDSPortGroup_to_VM_Complete.Text = "" -#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true -$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) -$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 -$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" -$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label -$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) -$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Cluster_to_DRS_Rule_Complete.TabIndex = 77 -$Cluster_to_DRS_Rule_Complete.Text = "" - -$TabDraw.Controls.Add($OpenVisioButton) -$TabDraw.Controls.Add($DrawCheckButton) -$TabDraw.Controls.Add($DrawButton) -$TabDraw.Controls.Add($DrawUncheckButton) -$TabDraw.Controls.Add($VisioOutputLabel) -$TabDraw.Controls.Add($VisioOpenOutputButton) -$TabDraw.Controls.Add($DrawCsvInputLabel) -$TabDraw.Controls.Add($DrawCsvInputButton) -$TabDraw.Controls.Add($vCenterCsvValidation) -$TabDraw.Controls.Add($vCenterCsvValidationCheck) -$TabDraw.Controls.Add($DatacenterCsvValidation) -$TabDraw.Controls.Add($DatacenterCsvValidationCheck) -$TabDraw.Controls.Add($ClusterCsvValidation) -$TabDraw.Controls.Add($ClusterCsvValidationCheck) -$TabDraw.Controls.Add($VmHostCsvValidation) -$TabDraw.Controls.Add($VmHostCsvValidationCheck) -$TabDraw.Controls.Add($VmCsvValidation) -$TabDraw.Controls.Add($VmCsvValidationCheck) -$TabDraw.Controls.Add($TemplateCsvValidation) -$TabDraw.Controls.Add($TemplateCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreClusterCsvValidation) -$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreCsvValidation) -$TabDraw.Controls.Add($DatastoreCsvValidationCheck) -$TabDraw.Controls.Add($VsSwitchCsvValidation) -$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VssPortGroupCsvValidation) -$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VssVmkernelCsvValidation) -$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VssPnicCsvValidation) -$TabDraw.Controls.Add($VssPnicCsvValidationCheck) -$TabDraw.Controls.Add($VdSwitchCsvValidation) -$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VdsPortGroupCsvValidation) -$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VdsVmkernelCsvValidation) -$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VdsPnicCsvValidation) -$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) -$TabDraw.Controls.Add($FolderCsvValidation) -$TabDraw.Controls.Add($FolderCsvValidationCheck) -$TabDraw.Controls.Add($RdmCsvValidation) -$TabDraw.Controls.Add($RdmCsvValidationCheck) -$TabDraw.Controls.Add($DrsRuleCsvValidation) -$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) -$TabDraw.Controls.Add($ResourcePoolCsvValidation) -$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) -$TabDraw.Controls.Add($CsvValidationButton) -$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Host_Complete) -$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Folder_Complete) -$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) -$TabDraw.Controls.Add($VMs_with_RDMs_Complete) -$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) -$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) -$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Datastore_Complete) -$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) -$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($Datastore_to_Host_Complete) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) -$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VSS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VSS_Complete) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VDS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VDS_Complete) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) -$SubTab.Controls.Add($TabDirections) -$SubTab.Controls.Add($TabCapture) -$SubTab.Controls.Add($TabDraw) -$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText -$SubTab.SelectedIndex = 0 -$vDiagram.Controls.Add($MainMenu) -$vDiagram.Controls.Add($MainTab) -$vDiagram.Controls.Add($SubTab) -#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$VisioBrowse.Description = "Select a directory" -$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$DrawCsvBrowse.Description = "Select a directory" -$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$CaptureCsvBrowse.Description = "Select a directory" -$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - -#endregion - -#region Custom Code -#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellCheck = $PSVersionTable.PSVersion -if ($PowershellCheck.Major -ge 4) -{ - $PowershellInstalled.Forecolor = "Green" - $PowershellInstalled.Text = "Installed Version $PowershellCheck" -} -else -{ - $PowershellInstalled.Forecolor = "Red" - $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" -} -#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) -$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) -if ($PowerCliModuleCheck -ne $null) -{ - $PowerCliModuleInstalled.Forecolor = "Green" - $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" -} -else -{ - $PowerCliModuleInstalled.Forecolor = "Red" - $PowerCliModuleInstalled.Text = "Not Installed" -} -#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerClI Installed" -} -elseif ($PowerCliModuleCheck -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerCLI Module Installed" -} -else -{ - $PowerCliInstalled.Forecolor = "Red" - $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" -} -#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) -{ - $VisioInstalled.Forecolor = "Green" - $VisioInstalled.Text = "Installed" -} -else -{ - $VisioInstalled.Forecolor = "Red" - $VisioInstalled.Text = "Visio is Not Installed" -} -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) -$ConnectButton.Add_Click({ Connect_vCenter_Main }) -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } -Check_CaptureCsvFolder } ) -#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton.Add_Click({ - if($CaptureCsvFolder -eq $null) - { - $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" - } - else - { - if ($vCenterCsvCheckBox.Checked -eq "True") - { - $vCenterCsvValidationComplete.Forecolor = "Blue" - $vCenterCsvValidationComplete.Text = "Processing ....." - vCenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" - $vCenterCsvComplete = Test-Path $vCenterExportFileComplete - if ($vCenterCsvComplete -eq $True) - { - $vCenterCsvValidationComplete.Forecolor = "Green" - $vCenterCsvValidationComplete.Text = "Complete" - } - else - { - $vCenterCsvValidationComplete.Forecolor = "Red" - $vCenterCsvValidationComplete.Text = "Not Complete" - } - } - Connect_vCenter - $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager - if ($Connected -eq $null) { Connect_vCenter_Main } - $ConnectButton.Forecolor = [System.Drawing.Color]::Green - $ConnectButton.Text = "Connected to $DefaultViserver" - if ($DatacenterCsvCheckBox.Checked -eq "True") - { - $DatacenterCsvValidationComplete.Forecolor = "Blue" - $DatacenterCsvValidationComplete.Text = "Processing ....." - Datacenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" - $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete - if ($DatacenterCsvComplete -eq $True) - { - $DatacenterCsvValidationComplete.Forecolor = "Green" - $DatacenterCsvValidationComplete.Text = "Complete" - } - else - { - $DatacenterCsvValidationComplete.Forecolor = "Red" - $DatacenterCsvValidationComplete.Text = "Not Complete" - } - } - if ($ClusterCsvCheckBox.Checked -eq "True") - { - $ClusterCsvValidationComplete.Forecolor = "Blue" - $ClusterCsvValidationComplete.Text = "Processing ....." - Cluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" - $ClusterCsvComplete = Test-Path $ClusterExportFileComplete - if ($ClusterCsvComplete -eq $True) - { - $ClusterCsvValidationComplete.Forecolor = "Green" - $ClusterCsvValidationComplete.Text = "Complete" - } - else - { - $ClusterCsvValidationComplete.Forecolor = "Red" - $ClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmHostCsvCheckBox.Checked -eq "True") - { - $VmHostCsvValidationComplete.Forecolor = "Blue" - $VmHostCsvValidationComplete.Text = "Processing ....." - VmHost_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" - $VmHostCsvComplete = Test-Path $VmHostExportFileComplete - if ($VmHostCsvComplete -eq $True) - { - $VmHostCsvValidationComplete.Forecolor = "Green" - $VmHostCsvValidationComplete.Text = "Complete" - } - else - { - $VmHostCsvValidationComplete.Forecolor = "Red" - $VmHostCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmCsvCheckBox.Checked -eq "True") - { - $VmCsvValidationComplete.Forecolor = "Blue" - $VmCsvValidationComplete.Text = "Processing ....." - Vm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" - $VmCsvComplete = Test-Path $VmExportFileComplete - if ($VmCsvComplete -eq $True) - { - $VmCsvValidationComplete.Forecolor = "Green" - $VmCsvValidationComplete.Text = "Complete" - } - else - { - $VmCsvValidationComplete.Forecolor = "Red" - $VmCsvValidationComplete.Text = "Not Complete" - } - } - if ($TemplateCsvCheckBox.Checked -eq "True") - { - $TemplateCsvValidationComplete.Forecolor = "Blue" - $TemplateCsvValidationComplete.Text = "Processing ....." - Template_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" - $TemplateCsvComplete = Test-Path $TemplateExportFileComplete - if ($TemplateCsvComplete -eq $True) - { - $TemplateCsvValidationComplete.Forecolor = "Green" - $TemplateCsvValidationComplete.Text = "Complete" - } - else - { - $TemplateCsvValidationComplete.Forecolor = "Red" - $TemplateCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreClusterCsvCheckBox.Checked -eq "True") - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" - $DatastoreClusterCsvValidationComplete.Text = "Processing ....." - DatastoreCluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete - if ($DatastoreClusterCsvComplete -eq $True) - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Green" - $DatastoreClusterCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Red" - $DatastoreClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreCsvCheckBox.Checked -eq "True") - { - $DatastoreCsvValidationComplete.Forecolor = "Blue" - $DatastoreCsvValidationComplete.Text = "Processing ....." - Datastore_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" - $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete - if ($DatastoreCsvComplete -eq $True) - { - $DatastoreCsvValidationComplete.Forecolor = "Green" - $DatastoreCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreCsvValidationComplete.Forecolor = "Red" - $DatastoreCsvValidationComplete.Text = "Not Complete" - } - } - if ($VsSwitchCsvCheckBox.Checked -eq "True") - { - $VsSwitchCsvValidationComplete.Forecolor = "Blue" - $VsSwitchCsvValidationComplete.Text = "Processing ....." - VsSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" - $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete - if ($vSSwitchCsvComplete -eq $True) - { - $vSSwitchCsvValidationComplete.Forecolor = "Green" - $vSSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $vSSwitchCsvValidationComplete.Forecolor = "Red" - $vSSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPortGroupCsvCheckBox.Checked -eq "True") - { - $VssPortGroupCsvValidationComplete.Forecolor = "Blue" - $VssPortGroupCsvValidationComplete.Text = "Processing ....." - VssPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete - if ($VssPortGroupCsvComplete -eq $True) - { - $VssPortGroupCsvValidationComplete.Forecolor = "Green" - $VssPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VssPortGroupCsvValidationComplete.Forecolor = "Red" - $VssPortGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssVmkernelCsvCheckBox.Checked -eq "True") - { - $VssVmkernelCsvValidationComplete.Forecolor = "Blue" - $VssVmkernelCsvValidationComplete.Text = "Processing ....." - VssVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete - if ($VssVmkernelCsvComplete -eq $True) - { - $VssVmkernelCsvValidationComplete.Forecolor = "Green" - $VssVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VssVmkernelCsvValidationComplete.Forecolor = "Red" - $VssVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPnicCsvCheckBox.Checked -eq "True") - { - $VssPnicCsvValidationComplete.Forecolor = "Blue" - $VssPnicCsvValidationComplete.Text = "Processing ....." - VssPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" - $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete - if ($VssPnicCsvComplete -eq $True) - { - $VssPnicCsvValidationComplete.Forecolor = "Green" - $VssPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VssPnicCsvValidationComplete.Forecolor = "Red" - $VssPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdSwitchCsvCheckBox.Checked -eq "True") - { - $VdSwitchCsvValidationComplete.Forecolor = "Blue" - $VdSwitchCsvValidationComplete.Text = "Processing ....." - VdSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" - $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete - if ($VdSwitchCsvComplete -eq $True) - { - $VdSwitchCsvValidationComplete.Forecolor = "Green" - $VdSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $VdSwitchCsvValidationComplete.Forecolor = "Red" - $VdSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPortGroupCsvCheckBox.Checked -eq "True") - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" - $VdsPortGroupCsvValidationComplete.Text = "Processing ....." - VdsPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete - if ($VdsPortGroupCsvComplete -eq $True) - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Green" - $VdsPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Red" - $VdsPortGroupCsvValidationComplete.Text = "Not Complete" - - } - } - if ($VdsVmkernelCsvCheckBox.Checked -eq "True") - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" - $VdsVmkernelCsvValidationComplete.Text = "Processing ....." - VdsVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete - if ($VdsVmkernelCsvComplete -eq $True) - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Green" - $VdsVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Red" - $VdsVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPnicCsvCheckBox.Checked -eq "True") - { - $VdsPnicCsvValidationComplete.Forecolor = "Blue" - $VdsPnicCsvValidationComplete.Text = "Processing ....." - VdsPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" - $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete - if ($VdsPnicCsvComplete -eq $True) - { - $VdsPnicCsvValidationComplete.Forecolor = "Green" - $VdsPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPnicCsvValidationComplete.Forecolor = "Red" - $VdsPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($FolderCsvCheckBox.Checked -eq "True") - { - $FolderCsvValidationComplete.Forecolor = "Blue" - $FolderCsvValidationComplete.Text = "Processing ....." - Folder_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" - $FolderCsvComplete = Test-Path $FolderExportFileComplete - if ($FolderCsvComplete -eq $True) - { - $FolderCsvValidationComplete.Forecolor = "Green" - $FolderCsvValidationComplete.Text = "Complete" - } - else - { - $FolderCsvValidationComplete.Forecolor = "Red" - $FolderCsvValidationComplete.Text = "Not Complete" - } - } - if ($RdmCsvCheckBox.Checked -eq "True") - { - $RdmCsvValidationComplete.Forecolor = "Blue" - $RdmCsvValidationComplete.Text = "Processing ....." - Rdm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" - $RdmCsvComplete = Test-Path $RdmExportFileComplete - if ($RdmCsvComplete -eq $True) - { - $RdmCsvValidationComplete.Forecolor = "Green" - $RdmCsvValidationComplete.Text = "Complete" - } - else - { - $RdmCsvValidationComplete.Forecolor = "Red" - $RdmCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsRuleCsvCheckBox.Checked -eq "True") - { - $DrsRuleCsvValidationComplete.Forecolor = "Blue" - $DrsRuleCsvValidationComplete.Text = "Processing ....." - Drs_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" - $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete - if ($DrsRuleCsvComplete -eq $True) - { - $DrsRuleCsvValidationComplete.Forecolor = "Green" - $DrsRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsRuleCsvValidationComplete.Forecolor = "Red" - $DrsRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" - $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." - Drs_Cluster_Group_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete - if ($DrsClusterGroupCsvComplete -eq $True) - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" - $DrsClusterGroupCsvValidationComplete.Text = "Complete" - } - else - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" - $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" - $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." - Drs_VmHost_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete - if ($DrsVmHostRuleCsvComplete -eq $True) - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" - $DrsVmHostRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" - $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($ResourcePoolCsvCheckBox.Checked -eq "True") - { - $ResourcePoolCsvValidationComplete.Forecolor = "Blue" - $ResourcePoolCsvValidationComplete.Text = "Processing ....." - Resource_Pool_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete - if ($ResourcePoolCsvComplete -eq $True) - { - $ResourcePoolCsvValidationComplete.Forecolor = "Green" - $ResourcePoolCsvValidationComplete.Text = "Complete" - } - else - { - $ResourcePoolCsvValidationComplete.Forecolor = "Red" - $ResourcePoolCsvValidationComplete.Text = "Not Complete" - } - } - Disconnect_vCenter - $ConnectButton.Forecolor = [System.Drawing.Color]::Red - $ConnectButton.Text = "Disconnected" - $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" - } -}) -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) -$TabDraw.Controls.Add($DrawCsvInputButton) -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton.Add_Click( -{ - $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text - $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" - $vCenterCsvExists = Test-Path $vCenterExportFile - $TabDraw.Controls.Add($vCenterCsvValidationCheck) - if ($vCenterCsvExists -eq $True) - { - - $vCenterCsvValidationCheck.Forecolor = "Green" - $vCenterCsvValidationCheck.Text = "Present" - } - else - { - $vCenterCsvValidationCheck.Forecolor = "Red" - $vCenterCsvValidationCheck.Text = "Not Present" - } - - $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" - $DatacenterCsvExists = Test-Path $DatacenterExportFile - $TabDraw.Controls.Add($DatacenterCsvValidationCheck) - - if ($DatacenterCsvExists -eq $True) - { - $DatacenterCsvValidationCheck.Forecolor = "Green" - $DatacenterCsvValidationCheck.Text = "Present" - } - else - { - $DatacenterCsvValidationCheck.Forecolor = "Red" - $DatacenterCsvValidationCheck.Text = "Not Present" - } - - $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" - $ClusterCsvExists = Test-Path $ClusterExportFile - $TabDraw.Controls.Add($ClusterCsvValidationCheck) - - if ($ClusterCsvExists -eq $True) - { - $ClusterCsvValidationCheck.Forecolor = "Green" - $ClusterCsvValidationCheck.Text = "Present" - } - else - { - $ClusterCsvValidationCheck.Forecolor = "Red" - $ClusterCsvValidationCheck.Text = "Not Present" - } - - $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" - $VmHostCsvExists = Test-Path $VmHostExportFile - $TabDraw.Controls.Add($VmHostCsvValidationCheck) - - if ($VmHostCsvExists -eq $True) - { - $VmHostCsvValidationCheck.Forecolor = "Green" - $VmHostCsvValidationCheck.Text = "Present" - } - else - { - $VmHostCsvValidationCheck.Forecolor = "Red" - $VmHostCsvValidationCheck.Text = "Not Present" - } - - $VmExportFile = $CsvInputDir + "-VmExport.csv" - $VmCsvExists = Test-Path $VmExportFile - $TabDraw.Controls.Add($VmCsvValidationCheck) - - if ($VmCsvExists -eq $True) - { - $VmCsvValidationCheck.Forecolor = "Green" - $VmCsvValidationCheck.Text = "Present" - } - else - { - $VmCsvValidationCheck.Forecolor = "Red" - $VmCsvValidationCheck.Text = "Not Present" - } - - $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" - $TemplateCsvExists = Test-Path $TemplateExportFile - $TabDraw.Controls.Add($TemplateCsvValidationCheck) - - if ($TemplateCsvExists -eq $True) - { - $TemplateCsvValidationCheck.Forecolor = "Green" - $TemplateCsvValidationCheck.Text = "Present" - } - else - { - $TemplateCsvValidationCheck.Forecolor = "Red" - $TemplateCsvValidationCheck.Text = "Not Present" - } - - $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile - $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) - - if ($DatastoreClusterCsvExists -eq $True) - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Green" - $DatastoreClusterCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Red" - $DatastoreClusterCsvValidationCheck.Text = "Not Present" - } - - $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" - $DatastoreCsvExists = Test-Path $DatastoreExportFile - $TabDraw.Controls.Add($DatastoreCsvValidationCheck) - - if ($DatastoreCsvExists -eq $True) - { - $DatastoreCsvValidationCheck.Forecolor = "Green" - $DatastoreCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreCsvValidationCheck.Forecolor = "Red" - $DatastoreCsvValidationCheck.Text = "Not Present" - } - - $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" - $VsSwitchCsvExists = Test-Path $VsSwitchExportFile - $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) - - if ($VsSwitchCsvExists -eq $True) - { - $VsSwitchCsvValidationCheck.Forecolor = "Green" - $VsSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VsSwitchCsvValidationCheck.Forecolor = "Red" - $VsSwitchCsvValidationCheck.Text = "Not Present" - $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile - $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) - - if ($VssPortGroupCsvExists -eq $True) - { - $VssPortGroupCsvValidationCheck.Forecolor = "Green" - $VssPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VssPortGroupCsvValidationCheck.Forecolor = "Red" - $VssPortGroupCsvValidationCheck.Text = "Not Present" - $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile - $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) - - if ($VssVmkernelCsvExists -eq $True) - { - $VssVmkernelCsvValidationCheck.Forecolor = "Green" - $VssVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VssVmkernelCsvValidationCheck.Forecolor = "Red" - $VssVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" - $VssPnicCsvExists = Test-Path $VssPnicExportFile - $TabDraw.Controls.Add($VssPnicCsvValidationCheck) - - if ($VssPnicCsvExists -eq $True) - { - $VssPnicCsvValidationCheck.Forecolor = "Green" - $VssPnicCsvValidationCheck.Text = "Present" - } - else - { - $VssPnicCsvValidationCheck.Forecolor = "Red" - $VssPnicCsvValidationCheck.Text = "Not Present" - } - - $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" - $VdSwitchCsvExists = Test-Path $VdSwitchExportFile - $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) - - if ($VdSwitchCsvExists -eq $True) - { - $VdSwitchCsvValidationCheck.Forecolor = "Green" - $VdSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VdSwitchCsvValidationCheck.Forecolor = "Red" - $VdSwitchCsvValidationCheck.Text = "Not Present" - $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile - $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) - - if ($VdsPortGroupCsvExists -eq $True) - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Green" - $VdsPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Red" - $VdsPortGroupCsvValidationCheck.Text = "Not Present" - $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile - $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) - - if ($VdsVmkernelCsvExists -eq $True) - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Green" - $VdsVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Red" - $VdsVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" - $VdsPnicCsvExists = Test-Path $VdsPnicExportFile - $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) - - if ($VdsPnicCsvExists -eq $True) - { - $VdsPnicCsvValidationCheck.Forecolor = "Green" - $VdsPnicCsvValidationCheck.Text = "Present" - } - else - { - $VdsPnicCsvValidationCheck.Forecolor = "Red" - $VdsPnicCsvValidationCheck.Text = "Not Present" - } - - $FolderExportFile = $CsvInputDir + "-FolderExport.csv" - $FolderCsvExists = Test-Path $FolderExportFile - $TabDraw.Controls.Add($FolderCsvValidationCheck) - - if ($FolderCsvExists -eq $True) - { - $FolderCsvValidationCheck.Forecolor = "Green" - $FolderCsvValidationCheck.Text = "Present" - } - else - { - $FolderCsvValidationCheck.Forecolor = "Red" - $FolderCsvValidationCheck.Text = "Not Present" - } - - $RdmExportFile = $CsvInputDir + "-RdmExport.csv" - $RdmCsvExists = Test-Path $RdmExportFile - $TabDraw.Controls.Add($RdmCsvValidationCheck) - - if ($RdmCsvExists -eq $True) - { - $RdmCsvValidationCheck.Forecolor = "Green" - $RdmCsvValidationCheck.Text = "Present" - } - else - { - $RdmCsvValidationCheck.Forecolor = "Red" - $RdmCsvValidationCheck.Text = "Not Present" - $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" - $DrsRuleCsvExists = Test-Path $DrsRuleExportFile - $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) - - if ($DrsRuleCsvExists -eq $True) - { - $DrsRuleCsvValidationCheck.Forecolor = "Green" - $DrsRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsRuleCsvValidationCheck.Forecolor = "Red" - $DrsRuleCsvValidationCheck.Text = "Not Present" - $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile - $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) - - if ($DrsClusterGroupCsvExists -eq $True) - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" - $DrsClusterGroupCsvValidationCheck.Text = "Present" - } - else - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" - $DrsClusterGroupCsvValidationCheck.Text = "Not Present" - } - - $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile - $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) - - if ($DrsVmHostRuleCsvExists -eq $True) - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" - $DrsVmHostRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" - $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" - } - - $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile - $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) - - if ($ResourcePoolCsvExists -eq $True) - { - $ResourcePoolCsvValidationCheck.Forecolor = "Green" - $ResourcePoolCsvValidationCheck.Text = "Present" - } - else - { - $ResourcePoolCsvValidationCheck.Forecolor = "Red" - $ResourcePoolCsvValidationCheck.Text = "Not Present" - $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" - } -} ) -$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) -$TabDraw.Controls.Add($CsvValidationButton) -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) -$TabDraw.Controls.Add($VisioOpenOutputButton) -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) -$TabDraw.Controls.Add($DrawUncheckButton) -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) -$TabDraw.Controls.Add($DrawCheckButton) -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; -if ($VM_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Host_Complete.Forecolor = "Blue" - $VM_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Host_Complete) - VM_to_Host - $VM_to_Host_Complete.Forecolor = "Green" - $VM_to_Host_Complete.Text = "Complete" - $TabDraw.Controls.Add($VM_to_Host_Complete) -} -if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Folder_Complete.Forecolor = "Blue" - $VM_to_Folder_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Folder_Complete) - VM_to_Folder - $VM_to_Folder_Complete.Forecolor = "Green" - $VM_to_Folder_Complete.Text = "Complete" -} -if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") -{ - $VMs_with_RDMs_Complete.Forecolor = "Blue" - $VMs_with_RDMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMs_with_RDMs_Complete) - VMs_with_RDMs - $VMs_with_RDMs_Complete.Forecolor = "Green" - $VMs_with_RDMs_Complete.Text = "Complete" -} -if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") -{ - $SRM_Protected_VMs_Complete.Forecolor = "Blue" - $SRM_Protected_VMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) - SRM_Protected_VMs - $SRM_Protected_VMs_Complete.Forecolor = "Green" - $SRM_Protected_VMs_Complete.Text = "Complete" -} -if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Datastore_Complete.Forecolor = "Blue" - $VM_to_Datastore_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Datastore_Complete) - VM_to_Datastore - $VM_to_Datastore_Complete.Forecolor = "Green" - $VM_to_Datastore_Complete.Text = "Complete" -} -if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") -{ - $VM_to_ResourcePool_Complete.Forecolor = "Blue" - $VM_to_ResourcePool_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) - VM_to_ResourcePool - $VM_to_ResourcePool_Complete.Forecolor = "Green" - $VM_to_ResourcePool_Complete.Text = "Complete" -} -if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") -{ - $Datastore_to_Host_Complete.Forecolor = "Blue" - $Datastore_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Datastore_to_Host_Complete) - Datastore_to_Host - $Datastore_to_Host_Complete.Forecolor = "Green" - $Datastore_to_Host_Complete.Text = "Complete" -} -if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") -{ - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" - $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) - PhysicalNIC_to_vSwitch - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" - $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" -} -if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VSS_to_Host_Complete.Forecolor = "Blue" - $VSS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSS_to_Host_Complete) - VSS_to_Host - $VSS_to_Host_Complete.Forecolor = "Green" - $VSS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VSS_Complete.Forecolor = "Blue" - $VMK_to_VSS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VSS_Complete) - VMK_to_VSS - $VMK_to_VSS_Complete.Forecolor = "Green" - $VMK_to_VSS_Complete.Text = "Complete" -} -if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VSSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) - VSSPortGroup_to_VM - $VSSPortGroup_to_VM_Complete.Forecolor = "Green" - $VSSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VDS_to_Host_Complete.Forecolor = "Blue" - $VDS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDS_to_Host_Complete) - VDS_to_Host - $VDS_to_Host_Complete.Forecolor = "Green" - $VDS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VDS_Complete.Forecolor = "Blue" - $VMK_to_VDS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VDS_Complete) - VMK_to_VDS - $VMK_to_VDS_Complete.Forecolor = "Green" - $VMK_to_VDS_Complete.Text = "Complete" -} -if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VDSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) - VDSPortGroup_to_VM - $VDSPortGroup_to_VM_Complete.Forecolor = "Green" - $VDSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") -{ - $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" - $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) - Cluster_to_DRS_Rule - $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" - $Cluster_to_DRS_Rule_Complete.Text = "Complete" -}; -$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) -$TabDraw.Controls.Add($DrawButton) -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton.Add_Click({Open_Final_Visio}) -$TabDraw.Controls.Add($OpenVisioButton) - -#endregion - -#region Event Loop - -function Main{ - [System.Windows.Forms.Application]::EnableVisualStyles() - [System.Windows.Forms.Application]::Run($vDiagram) -} - -#endregion - -#endregion - -#region Event Handlers - -#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect_vCenter_Main -{ - $MainVC = $MainVcenterTextBox.Text - $MainUser = $UserNameTextBox.Text - $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text -} - -function Connect_vCenter -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $User = $UserNameTextBox.Text - $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text -} - -function Disconnect_vCenter -{ - $Disconnect = Disconnect-ViServer * -Confirm:$false -} -#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Find_CaptureCsvFolder -{ - $CaptureCsvBrowseLoop = $True - while ($CaptureCsvBrowseLoop) - { - if ($CaptureCsvBrowse.ShowDialog() -eq "OK") - { - $CaptureCsvBrowseLoop = $False - } - else - { - $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($CaptureCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath -} - -function Check_CaptureCsvFolder -{ - $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $CheckContentDir = $CheckContentPath + "*.csv" - $CheckContent = Test-Path $CheckContentDir - if ($CheckContent -eq "True") - { - $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") - switch ($CheckContents_CaptureCsvFolder) { - 'Yes' - { - del $CheckContentDir - } - - 'No' - { - $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog - $CheckContentCsvBrowse.Description = "Select a directory to copy files to" - $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - $CheckContentCsvBrowse.ShowDialog() - $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath - copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder - del $CheckContentDir - } - } - } -} - -function Find_DrawCsvFolder -{ - $DrawCsvBrowseLoop = $True - while ($DrawCsvBrowseLoop) - { - if ($DrawCsvBrowse.ShowDialog() -eq "OK") - { - $DrawCsvBrowseLoop = $False - } - else - { - $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($DrawCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath -} - -function Find_DrawVisioFolder -{ - $VisioBrowseLoop = $True - while($VisioBrowseLoop) - { - if ($VisioBrowse.ShowDialog() -eq "OK") - { - $VisioBrowseLoop = $False - } - else - { - $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if($VisioBrowseRes -eq "Cancel") - { - return - } - } - } - $global:VisioFolder = $VisioBrowse.SelectedPath -} -#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function vCenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, - @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation - - if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) - { - $null - } - else - { - Disconnect_vCenter - } -} - -function Datacenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort-Object Name | - Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation -} - -function Cluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, - @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, - @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, - @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, - @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, - @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, - @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, - @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, - @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, - @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation -} - -function VmHost_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent - while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent - } - if ($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name } } }, - @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent - while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent - } - if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, - @{ N = "Version" ; E = { $_.Config.Product.Version } }, - @{ N = "Build" ; E = { $_.Config.Product.Build } }, - @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, - @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, - @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, - @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, - @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, - @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, - @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, - @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, - @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, - @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, - @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, - @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation -} - -function Vm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select-Object Name , - @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, - @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, - @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, - @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, - @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, - @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, - @{ N = "OS" ; E = { $_.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.Config.Version } }, - @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, - @{ N = 'Folder' ; E = { $Folder.Name } }, - @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, - @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, - @{ N = "IP" ; E = { $_.Guest.IpAddress } }, - @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, - @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, - @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, - @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation - } -} - -function Template_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - foreach ($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { $VmHost.name } }, - @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, - @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, - @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, - @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, - @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, - @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, - @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, - @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation - } -} - -function DatastoreCluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, - @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, - @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation -} - -function Datastore_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, - @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, - @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, - @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, - @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, - @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, - @{ N = "Accessible" ; E = { $_.State } }, - @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation -} - -function VsSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "Nic" ; E = { $_.Nic } }, - @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, - @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, - @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, - @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, - @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation -} - -function VssPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "VLanId" ; E = { $_.VLanId } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VssVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation - } - } - } -} - -function VssPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation - } - } -} - -function VdSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - foreach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "Vendor" ; E = { $_.Vendor } }, - @{ N = "Version" ; E = { $_.Version } }, - @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, - @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation - } -} - -function VdsPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, - @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, - @{ N = "NumPorts" ; E = { $_.NumPorts } }, - @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, - @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, - @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VdsVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation - - } - } -} - -function VdsPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | - Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch } }, - @{ N = "Portgroup" ; E = { $_.Portgroup } }, - @{ N = "ConnectedEntity" ; E = { $_.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation - } - } -} - -function Folder_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - foreach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -type VM | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation - } -} - -function Rdm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | - Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, - @{ N = "Vm" ; E = { $_.Parent } }, - @{ N = "Label" ; E = { $_.Name } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, - @{ N = "DiskType" ; E = { $_.DiskType } }, - @{ N = "Persistence" ; E = { $_.Persistence } }, - @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, - @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, - @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation -} - -function Drs_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation - } -} - -function Drs_Cluster_Group_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "GroupType" ; E = { $_.GroupType } }, - @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation - } -} - -function Drs_VmHost_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) - { - Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "VMGroup" ; E = { $_.VMGroup } }, - @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, - @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, - @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation - } - } -} - -function Resource_Pool_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) - { - Get-ResourcePool $ResourcePool | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Cluster" ; E = { $Cluster.Name } }, - @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, - @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, - @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, - @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, - @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, - @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, - @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, - @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, - @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, - @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation - } - } -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect-VisioObject($firstObj, $secondObj) -{ - $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) - $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) - $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) -} - -function Add-VisioObjectVC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectCluster($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHost($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectTemplate($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectSRM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDatastore($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHardDisk($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.ScsiCanonicalName - return $shpObj -} - -function Add-VisioObjectFolder($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVsSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVssPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVMK($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsClusterGroup($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDRSVMHostRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectResourcePool($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Create_Visio_Base -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $DocObj = $docsObj.Add("") - $DocObj.SaveAs($Savefile) - $AppVisio.Quit() -} - -function VM_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Host" - $Page = $DocsObj.Pages('VM to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Folder -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Folder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - $FolderImport = Import-Csv $FolderExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Folder" - $Page = $DocsObj.Pages('VM to Folder') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Folder') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Folder Object - $FolderObj = $stnObj.Masters.Item("Folder") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $FolderObject = Add-VisioObjectFolder $FolderObj $Folder - $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' - Connect-VisioObject $DatacenterObject $FolderObject - $y += 1.50 - - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $FolderObject $TemplateObject - $FolderObject = $TemplateObject - } - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $FolderObject $VMObject - $FolderObject = $VMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMs_with_RDMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - # RDM's - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - $RdmImport = Import-Csv $RdmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" - $Page = $DocsObj.Pages('VM w/ RDMs') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM w/ RDMs') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # RDM Object - $RDMObj = $stnObj.Masters.Item("RDM") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ClusterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 3.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatacenterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 2.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function SRM_Protected_VMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "SRM VM" - $Page = $DocsObj.Pages('SRM VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('SRM VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # SRM Protected VM Object - $SRMObj = $stnObj.Masters.Item("SRM Protected Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Datastore -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Datastore" - $Page = $DocsObj.Pages('VM to Datastore') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Datastore') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $ClusterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $ClusterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_ResourcePool -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # ResourcePool - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - $ResourcePoolImport = Import-Csv $ResourcePoolExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" - $Page = $DocsObj.Pages('VM to Resource Pool') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Resource Pool') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Resource Pool Object - $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool - # Name - $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' - # Cluster - $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' - # CpuSharesLevel - $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' - # NumCpuShares - $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' - # CpuReservationMHz - $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' - # CpuExpandableReservation - $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' - # CpuLimitMHz - $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' - # MemSharesLevel - $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' - # NumMemShares - $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' - # MemReservationGB - $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' - # MemExpandableReservation - $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' - # MemLimitGB - $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' - Connect-VisioObject $ClusterObject $ResourcePoolObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ResourcePoolObject $VMObject - $ResourcePoolObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Datastore_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Datastore to Host" - $Page = $DocsObj.Pages('Datastore to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Datastore to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function PhysicalNIC_to_vSwitch -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "PNIC to switch" - $Page = $DocsObj.Pages('PNIC to Switch') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('PNIC to Switch') - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - $y += 1.50 - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSS to Host" - $Page = $DocsObj.Pages('VSS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VSS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VSS" - $Page = $DocsObj.Pages('VMK to VSS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VSS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" - $Page = $DocsObj.Pages('VSSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDS to Host" - $Page = $DocsObj.Pages('VDS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VDS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VDS" - $Page = $DocsObj.Pages('VMK to VDS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VDS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" - $Page = $DocsObj.Pages('VDSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $DatacenterObject $VdSwitchObject - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x = 6.00 - $y += 1.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VPGObject $VMObject - $VPGObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Cluster_to_DRS_Rule -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # DRS Rule - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - $DrsRuleImport = Import-Csv $DrsRuleExportFile - # DRS Cluster Group - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile - # DRS VmHost Rule - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" - $Page = $DocsObj.Pages('Cluster to DRS Rule') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Cluster to DRS Rule') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # DRS Rule - $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") - # DRS Cluster Group - $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") - # DRS Host Rule - $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") - # Microsoft VM Object - $MSObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LXObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - $y += 1.50 - - foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule - # Name - $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' - # VM Affinity - $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' - # DRS Rule Enabled - $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' - # DRS Rule Mandatory - $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' - Connect-VisioObject $ClusterObject $DRSObject - #$ClusterObject = $DRSObject - $y += 1.50 - } - foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule - # Name - $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' - # Enabled - $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' - # Type - $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' - # VMGroup - $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' - # VMHostGroup - $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' - # AffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' - # AntiAffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' - Connect-VisioObject $ClusterObject $DRSVMHostRuleObject - $y += 1.50 - #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject - #$DrsClusterGroupObject = $DRSVMHostRuleObject - - foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) - { - $x += 2.50 - $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup - # Name - $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' - # GroupType - $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' - # Members - $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' - Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject - $DRSVMHostRuleObject = $DrsClusterGroupObject - - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Open_Final_Visio -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.Application - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null -} - -Main - -#endregion \ No newline at end of file From f230a51de2b664f0036cac954343b2ede29c9751 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Mon, 16 Apr 2018 23:19:17 -0400 Subject: [PATCH 09/19] Add files via upload --- vDiagram_2.0.1/vDiagram_2.0.1.ps1 | 17612 ++++++++++++++-------------- 1 file changed, 8806 insertions(+), 8806 deletions(-) diff --git a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 index c13525d..fbb9c51 100644 --- a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 +++ b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 @@ -1,8807 +1,8807 @@ -<# -.SYNOPSIS - vDiagram Visio Drawing Tool - -.DESCRIPTION - vDiagram Visio Drawing Tool - -.NOTES - File Name : vDiagram2.0.1.ps1 - Author : Tony Gonzalez - Author : Jason Hopkins - Based on : vDiagram by Alan Renouf - Version : 2.0.0 - -.USAGE NOTES - Ensure to unblock files before unzipping - Ensure to run as administrator - Required Files: - PowerCLI or PowerShell 5.0 with PowerCLI Modules installed - Active connection to vCenter to capture data - MS Visio - -.CHANGE LOG - - 04/12/2018 - v2.0.1 - Added MAC Addresses to VMs & Templates - Added a check to see if prior CSVs are still present - Added option to copy prior CSVs to new folder - - - 04/11/2018 - v2.0.0 - Presented as a Community Theater Session at South Florida VMUG - Feature enhancement requests collected -#> - -#region ScriptForm Designer - -#region Constructor - -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") -[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") -#endregion - -#region Post-Constructor Custom Code -$MyVer = "2.0.1" -$LastUpdated = "April 12, 2018" -$About = -@" - - vDiagram $MyVer - - Contributors: Tony Gonzalez of RoundTower Technologies LLC - Jason Hopkins of RoundTower Technologies LLC - - Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram - - Created: February 13, 2018 - - Last Updated: $LastUpdated - -"@ -#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" -if (!(Test-Path $TestShapes)) -{ - $CurrentLocation = Get-Location - copy $CurrentLocation\vDiagram.vssx $TestShapes - Write-Host "Copying Shapes File to My Shapes" -} -$shpFile = "\vDiagram.vssx" -#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Set_WindowStyle { -param( - [Parameter()] - [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', - 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', - 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] - $Style = 'SHOW', - [Parameter()] - $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle -) - $WindowStates = @{ - FORCEMINIMIZE = 11; HIDE = 0 - MAXIMIZE = 3; MINIMIZE = 6 - RESTORE = 9; SHOW = 5 - SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 - SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 - SHOWNA = 8; SHOWNOACTIVATE = 4 - SHOWNORMAL = 1 - } - Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) - - $Win32ShowWindowAsync = Add-Type –memberDefinition @” - [DllImport("user32.dll")] - public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); -“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru - - $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null -} -Set_WindowStyle MINIMIZE -#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function About_Config -{ - - $About - - #Add objects for About - $AboutForm = New-Object System.Windows.Forms.Form - $AboutTextBox = New-Object System.Windows.Forms.RichTextBox - - #About Form - $AboutForm.Icon = $Icon - $AboutForm.AutoScroll = $True - $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) - $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutForm.Name = "About" - $AboutForm.StartPosition = 1 - $AboutForm.Text = "About vDiagram $MyVer" - - $AboutTextBox.Anchor = 15 - $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) - $AboutTextBox.BorderStyle = 0 - $AboutTextBox.Font = "Tahoma" - $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) - $AboutTextBox.Name = "AboutTextBox" - $AboutTextBox.ReadOnly = $True - $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) - $AboutTextBox.Text = $About - - $AboutForm.Controls.Add($AboutTextBox) - - $AboutForm.Show() | Out-Null -} -#endregion - -#region Form Creation -#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vDiagram = New-Object System.Windows.Forms.Form -$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) -$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") -$vDiagram.Icon = $Icon -$vDiagram.Text = "vDiagram 2.0" -$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan -#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainMenu = New-Object System.Windows.Forms.MenuStrip -$MainMenu.Location = New-Object System.Drawing.Point(0, 0) -$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) -$MainMenu.TabIndex = 1 -$MainMenu.Text = "MainMenu" -#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) -$FileToolStripMenuItem.Text = "File" -#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) -$ExitToolStripMenuItem.Text = "Exit" -$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) -$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) -#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) -$HelpToolStripMenuItem.Text = "Help" -#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) -$AboutToolStripMenuItem.Text = "About" -$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) -$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) -$AboutToolStripMenuItem.Add_Click({About_Config}) -#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainTab = New-Object System.Windows.Forms.TabControl -$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) -$MainTab.Location = New-Object System.Drawing.Point(10, 30) -$MainTab.Size = New-Object System.Drawing.Size(990, 98) -$MainTab.TabIndex = 0 -$MainTab.Text = "MainTabs" -#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Prerequisites = New-Object System.Windows.Forms.TabPage -$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) -$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) -$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) -$Prerequisites.TabIndex = 0 -$Prerequisites.Text = "Prerequisites" -$Prerequisites.BackColor = [System.Drawing.Color]::LightGray -#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellLabel = New-Object System.Windows.Forms.Label -$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) -$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) -$PowershellLabel.TabIndex = 1 -$PowershellLabel.Text = "Powershell:" -#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellInstalled = New-Object System.Windows.Forms.Label -$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) -$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) -$PowershellInstalled.TabIndex = 2 -$PowershellInstalled.Text = "" -$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleLabel = New-Object System.Windows.Forms.Label -$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) -$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) -$PowerCliModuleLabel.TabIndex = 3 -$PowerCliModuleLabel.Text = "PowerCLI Module:" -#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label -$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) -$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) -$PowerCliModuleInstalled.TabIndex = 4 -$PowerCliModuleInstalled.Text = "" -$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliLabel = New-Object System.Windows.Forms.Label -$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) -$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) -$PowerCliLabel.TabIndex = 5 -$PowerCliLabel.Text = "PowerCLI:" -#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliInstalled = New-Object System.Windows.Forms.Label -$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) -$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) -$PowerCliInstalled.TabIndex = 6 -$PowerCliInstalled.Text = "" -$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioLabel = New-Object System.Windows.Forms.Label -$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) -$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) -$VisioLabel.TabIndex = 7 -$VisioLabel.Text = "Visio:" -#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioInstalled = New-Object System.Windows.Forms.Label -$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) -$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) -$VisioInstalled.TabIndex = 8 -$VisioInstalled.Text = "" -$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray -$Prerequisites.Controls.Add($PowershellLabel) -$Prerequisites.Controls.Add($PowershellInstalled) -$Prerequisites.Controls.Add($PowerCliModuleLabel) -$Prerequisites.Controls.Add($PowerCliModuleInstalled) -$Prerequisites.Controls.Add($PowerCliLabel) -$Prerequisites.Controls.Add($PowerCliInstalled) -$Prerequisites.Controls.Add($VisioLabel) -$Prerequisites.Controls.Add($VisioInstalled) -#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfo = New-Object System.Windows.Forms.TabPage -$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) -$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) -$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) -$vCenterInfo.TabIndex = 0 -$vCenterInfo.Text = "vCenter Info" -$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray -#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterLabel = New-Object System.Windows.Forms.Label -$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) -$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) -$MainVcenterLabel.TabIndex = 1 -$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" -#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox -$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) -$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) -$MainVcenterTextBox.TabIndex = 2 -$MainVcenterTextBox.Text = "" -#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterLabel = New-Object System.Windows.Forms.Label -$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) -$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) -$TargetVcenterLabel.TabIndex = 3 -$TargetVcenterLabel.Text = "Name of target vCenter:" -#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox -$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) -$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) -$TargetVcenterTextBox.TabIndex = 4 -$TargetVcenterTextBox.Text = "" -#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameLabel = New-Object System.Windows.Forms.Label -$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) -$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) -$UserNameLabel.TabIndex = 5 -$UserNameLabel.Text = "vCenter User Name:" -#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameTextBox = New-Object System.Windows.Forms.TextBox -$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) -$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) -$UserNameTextBox.TabIndex = 6 -$UserNameTextBox.Text = "" -#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordLabel = New-Object System.Windows.Forms.Label -$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) -$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) -$PasswordLabel.TabIndex = 7 -$PasswordLabel.Text = "Password:" -#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordTextBox = New-Object System.Windows.Forms.TextBox -$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) -$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) -$PasswordTextBox.TabIndex = 8 -$PasswordTextBox.Text = "" -$PasswordTextBox.UseSystemPasswordChar = $true -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton = New-Object System.Windows.Forms.Button -$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) -$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) -$ConnectButton.TabIndex = 9 -$ConnectButton.Text = "Connect to vCenter" -$ConnectButton.UseVisualStyleBackColor = $true -$vCenterInfo.Controls.Add($MainVcenterLabel) -$vCenterInfo.Controls.Add($MainVcenterTextBox) -$vCenterInfo.Controls.Add($TargetVcenterLabel) -$vCenterInfo.Controls.Add($TargetVcenterTextBox) -$vCenterInfo.Controls.Add($UserNameLabel) -$vCenterInfo.Controls.Add($UserNameTextBox) -$vCenterInfo.Controls.Add($PasswordLabel) -$vCenterInfo.Controls.Add($PasswordTextBox) -$vCenterInfo.Controls.Add($ConnectButton) -$MainTab.Controls.Add($Prerequisites) -$MainTab.Controls.Add($vCenterInfo) -$MainTab.SelectedIndex = 0 -#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SubTab = New-Object System.Windows.Forms.TabControl -$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$SubTab.Location = New-Object System.Drawing.Point(10, 136) -$SubTab.Size = New-Object System.Drawing.Size(990, 512) -$SubTab.TabIndex = 0 -$SubTab.Text = "SubTabs" -#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDirections = New-Object System.Windows.Forms.TabPage -$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDirections.Location = New-Object System.Drawing.Point(4, 22) -$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDirections.Size = New-Object System.Drawing.Size(982, 486) -$TabDirections.TabIndex = 0 -$TabDirections.Text = "Directions" -$TabDirections.UseVisualStyleBackColor = $true -#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesHeading = New-Object System.Windows.Forms.Label -$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) -$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) -$PrerequisitesHeading.TabIndex = 0 -$PrerequisitesHeading.Text = "Prerequisites Tab" -#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesDirections = New-Object System.Windows.Forms.Label -$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) -$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) -$PrerequisitesDirections.TabIndex = 1 -$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." -#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoHeading = New-Object System.Windows.Forms.Label -$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) -$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) -$vCenterInfoHeading.TabIndex = 2 -$vCenterInfoHeading.Text = "vCenter Info Tab" -#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoDirections = New-Object System.Windows.Forms.Label -$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) -$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) -$vCenterInfoDirections.TabIndex = 3 -$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." -#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvHeading = New-Object System.Windows.Forms.Label -$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) -$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) -$CaptureCsvHeading.TabIndex = 4 -$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" -#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureDirections = New-Object System.Windows.Forms.Label -$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) -$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) -$CaptureDirections.TabIndex = 5 -$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." -#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawHeading = New-Object System.Windows.Forms.Label -$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) -$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) -$DrawHeading.TabIndex = 6 -$DrawHeading.Text = "Draw Visio Tab" -#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawDirections = New-Object System.Windows.Forms.Label -$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) -$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) -$DrawDirections.TabIndex = 7 -$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." -$TabDirections.Controls.Add($PrerequisitesHeading) -$TabDirections.Controls.Add($PrerequisitesDirections) -$TabDirections.Controls.Add($vCenterInfoHeading) -$TabDirections.Controls.Add($vCenterInfoDirections) -$TabDirections.Controls.Add($CaptureCsvHeading) -$TabDirections.Controls.Add($CaptureDirections) -$TabDirections.Controls.Add($DrawHeading) -$TabDirections.Controls.Add($DrawDirections) -#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabCapture = New-Object System.Windows.Forms.TabPage -$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabCapture.Location = New-Object System.Drawing.Point(4, 22) -$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) -$TabCapture.Size = New-Object System.Drawing.Size(982, 486) -$TabCapture.TabIndex = 3 -$TabCapture.Text = "Capture CSVs for Visio" -$TabCapture.UseVisualStyleBackColor = $true -#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label -$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) -$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) -$CaptureCsvOutputLabel.TabIndex = 0 -$CaptureCsvOutputLabel.Text = "CSV Output Folder:" -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button -$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) -$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) -$CaptureCsvOutputButton.TabIndex = 0 -$CaptureCsvOutputButton.Text = "Select Output Folder" -$CaptureCsvOutputButton.UseVisualStyleBackColor = $false -$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$vCenterCsvCheckBox.Checked = $true -$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$vCenterCsvCheckBox.TabIndex = 1 -$vCenterCsvCheckBox.Text = "Export vCenter Info" -$vCenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) -$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationComplete.TabIndex = 26 -$vCenterCsvValidationComplete.Text = "" -#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatacenterCsvCheckBox.Checked = $true -$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatacenterCsvCheckBox.TabIndex = 2 -$DatacenterCsvCheckBox.Text = "Export Datacenter Info" -$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) -$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationComplete.TabIndex = 27 -$DatacenterCsvValidationComplete.Text = "" -#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ClusterCsvCheckBox.Checked = $true -$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ClusterCsvCheckBox.TabIndex = 3 -$ClusterCsvCheckBox.Text = "Export Cluster Info" -$ClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) -$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationComplete.TabIndex = 28 -$ClusterCsvValidationComplete.Text = "" -#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmHostCsvCheckBox.Checked = $true -$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmHostCsvCheckBox.TabIndex = 4 -$VmHostCsvCheckBox.Text = "Export VmHost Info" -$VmHostCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) -$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationComplete.TabIndex = 29 -$VmHostCsvValidationComplete.Text = "" -#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmCsvCheckBox.Checked = $true -$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmCsvCheckBox.TabIndex = 5 -$VmCsvCheckBox.Text = "Export Vm Info" -$VmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) -$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationComplete.TabIndex = 30 -$VmCsvValidationComplete.Text = "" -#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$TemplateCsvCheckBox.Checked = $true -$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$TemplateCsvCheckBox.TabIndex = 6 -$TemplateCsvCheckBox.Text = "Export Template Info" -$TemplateCsvCheckBox.UseVisualStyleBackColor = $true -#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label -$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) -$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationComplete.TabIndex = 31 -$TemplateCsvValidationComplete.Text = "" -#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreClusterCsvCheckBox.Checked = $true -$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreClusterCsvCheckBox.TabIndex = 7 -$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" -$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) -$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationComplete.TabIndex = 32 -$DatastoreClusterCsvValidationComplete.Text = "" -#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreCsvCheckBox.Checked = $true -$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreCsvCheckBox.TabIndex = 8 -$DatastoreCsvCheckBox.Text = "Export Datastore Info" -$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) -$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationComplete.TabIndex = 33 -$DatastoreCsvValidationComplete.Text = "" -#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VsSwitchCsvCheckBox.Checked = $true -$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) -$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VsSwitchCsvCheckBox.TabIndex = 9 -$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" -$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) -$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationComplete.TabIndex = 34 -$VsSwitchCsvValidationComplete.Text = "" -#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPortGroupCsvCheckBox.Checked = $true -$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) -$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPortGroupCsvCheckBox.TabIndex = 10 -$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" -$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) -$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationComplete.TabIndex = 35 -$VssPortGroupCsvValidationComplete.Text = "" -#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssVmkernelCsvCheckBox.Checked = $true -$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) -$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssVmkernelCsvCheckBox.TabIndex = 11 -$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" -$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) -$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationComplete.TabIndex = 36 -$VssVmkernelCsvValidationComplete.Text = "" -#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPnicCsvCheckBox.Checked = $true -$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) -$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPnicCsvCheckBox.TabIndex = 12 -$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" -$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) -$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationComplete.TabIndex = 37 -$VssPnicCsvValidationComplete.Text = "" -#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdSwitchCsvCheckBox.Checked = $true -$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) -$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdSwitchCsvCheckBox.TabIndex = 13 -$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" -$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) -$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationComplete.TabIndex = 38 -$VdSwitchCsvValidationComplete.Text = "" -#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPortGroupCsvCheckBox.Checked = $true -$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) -$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPortGroupCsvCheckBox.TabIndex = 14 -$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" -$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) -$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationComplete.TabIndex = 39 -$VdsPortGroupCsvValidationComplete.Text = "" -#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsVmkernelCsvCheckBox.Checked = $true -$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) -$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsVmkernelCsvCheckBox.TabIndex = 15 -$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" -$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) -$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationComplete.TabIndex = 40 -$VdsVmkernelCsvValidationComplete.Text = "" -#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPnicCsvCheckBox.Checked = $true -$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) -$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPnicCsvCheckBox.TabIndex = 16 -$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" -$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) -$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationComplete.TabIndex = 41 -$VdsPnicCsvValidationComplete.Text = "" -#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$FolderCsvCheckBox.Checked = $true -$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) -$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$FolderCsvCheckBox.TabIndex = 17 -$FolderCsvCheckBox.Text = "Export Folder Info" -$FolderCsvCheckBox.UseVisualStyleBackColor = $true -#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label -$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) -$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationComplete.TabIndex = 42 -$FolderCsvValidationComplete.Text = "" -#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$RdmCsvCheckBox.Checked = $true -$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) -$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$RdmCsvCheckBox.TabIndex = 18 -$RdmCsvCheckBox.Text = "Export RDM Info" -$RdmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label -$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) -$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationComplete.TabIndex = 43 -$RdmCsvValidationComplete.Text = "" -#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsRuleCsvCheckBox.Checked = $true -$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) -$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsRuleCsvCheckBox.TabIndex = 19 -$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" -$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) -$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationComplete.TabIndex = 44 -$DrsRuleCsvValidationComplete.Text = "" -#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsClusterGroupCsvCheckBox.Checked = $true -$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) -$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsClusterGroupCsvCheckBox.TabIndex = 20 -$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" -$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) -$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationComplete.TabIndex = 45 -$DrsClusterGroupCsvValidationComplete.Text = "" -#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsVmHostRuleCsvCheckBox.Checked = $true -$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) -$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsVmHostRuleCsvCheckBox.TabIndex = 21 -$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" -$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) -$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 -$DrsVmHostRuleCsvValidationComplete.Text = "" -#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ResourcePoolCsvCheckBox.Checked = $true -$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) -$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ResourcePoolCsvCheckBox.TabIndex = 22 -$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" -$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) -$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationComplete.TabIndex = 47 -$ResourcePoolCsvValidationComplete.Text = "" -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton = New-Object System.Windows.Forms.Button -$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) -$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureUncheckButton.TabIndex = 23 -$CaptureUncheckButton.Text = "Uncheck All" -$CaptureUncheckButton.UseVisualStyleBackColor = $false -$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton = New-Object System.Windows.Forms.Button -$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) -$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureCheckButton.TabIndex = 24 -$CaptureCheckButton.Text = "Check All" -$CaptureCheckButton.UseVisualStyleBackColor = $false -$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton = New-Object System.Windows.Forms.Button -$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) -$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureButton.TabIndex = 25 -$CaptureButton.Text = "Collect CSV Data" -$CaptureButton.UseVisualStyleBackColor = $false -$CaptureButton.BackColor = [System.Drawing.Color]::LightGray -$TabCapture.Controls.Add($CaptureCsvOutputLabel) -$TabCapture.Controls.Add($CaptureCsvOutputButton) -$TabCapture.Controls.Add($vCenterCsvCheckBox) -$TabCapture.Controls.Add($vCenterCsvValidationComplete) -$TabCapture.Controls.Add($DatacenterCsvCheckBox) -$TabCapture.Controls.Add($DatacenterCsvValidationComplete) -$TabCapture.Controls.Add($ClusterCsvCheckBox) -$TabCapture.Controls.Add($ClusterCsvValidationComplete) -$TabCapture.Controls.Add($VmHostCsvCheckBox) -$TabCapture.Controls.Add($VmHostCsvValidationComplete) -$TabCapture.Controls.Add($VmCsvCheckBox) -$TabCapture.Controls.Add($VmCsvValidationComplete) -$TabCapture.Controls.Add($TemplateCsvCheckBox) -$TabCapture.Controls.Add($TemplateCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) -$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreCsvCheckBox) -$TabCapture.Controls.Add($DatastoreCsvValidationComplete) -$TabCapture.Controls.Add($VsSwitchCsvCheckBox) -$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VssPnicCsvCheckBox) -$TabCapture.Controls.Add($VssPnicCsvValidationComplete) -$TabCapture.Controls.Add($VdSwitchCsvCheckBox) -$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VdsPnicCsvCheckBox) -$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) -$TabCapture.Controls.Add($FolderCsvCheckBox) -$TabCapture.Controls.Add($FolderCsvValidationComplete) -$TabCapture.Controls.Add($RdmCsvCheckBox) -$TabCapture.Controls.Add($RdmCsvValidationComplete) -$TabCapture.Controls.Add($DrsRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) -$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) -$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) -$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) -$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) -$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) -$TabCapture.Controls.Add($CaptureUncheckButton) -$TabCapture.Controls.Add($CaptureCheckButton) -$TabCapture.Controls.Add($CaptureButton) -#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDraw = New-Object System.Windows.Forms.TabPage -$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDraw.Location = New-Object System.Drawing.Point(4, 22) -$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDraw.Size = New-Object System.Drawing.Size(982, 486) -$TabDraw.TabIndex = 2 -$TabDraw.Text = "Draw Visio" -$TabDraw.UseVisualStyleBackColor = $true -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton = New-Object System.Windows.Forms.Button -$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) -$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) -$OpenVisioButton.TabIndex = 83 -$OpenVisioButton.Text = "Open Visio Drawing" -$OpenVisioButton.UseVisualStyleBackColor = $false -$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton = New-Object System.Windows.Forms.Button -$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) -$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawCheckButton.TabIndex = 82 -$DrawCheckButton.Text = "Check All" -$DrawCheckButton.UseVisualStyleBackColor = $false -$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton = New-Object System.Windows.Forms.Button -$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawButton.Location = New-Object System.Drawing.Point(448, 450) -$DrawButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawButton.TabIndex = 81 -$DrawButton.Text = "Draw Visio" -$DrawButton.UseVisualStyleBackColor = $false -$DrawButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton = New-Object System.Windows.Forms.Button -$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) -$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawUncheckButton.TabIndex = 80 -$DrawUncheckButton.Text = "Uncheck All" -$DrawUncheckButton.UseVisualStyleBackColor = $false -$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOutputLabel = New-Object System.Windows.Forms.Label -$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) -$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) -$VisioOutputLabel.TabIndex = 46 -$VisioOutputLabel.Text = "Visio Output Folder:" -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton = New-Object System.Windows.Forms.Button -$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) -$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) -$VisioOpenOutputButton.TabIndex = 47 -$VisioOpenOutputButton.Text = "Select Visio Output Folder" -$VisioOpenOutputButton.UseVisualStyleBackColor = $false -$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputLabel = New-Object System.Windows.Forms.Label -$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) -$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) -$DrawCsvInputLabel.TabIndex = 0 -$DrawCsvInputLabel.Text = "CSV Input Folder:" -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton = New-Object System.Windows.Forms.Button -$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) -$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) -$DrawCsvInputButton.TabIndex = 1 -$DrawCsvInputButton.Text = "Select CSV Input Folder" -$DrawCsvInputButton.UseVisualStyleBackColor = $false -$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidation = New-Object System.Windows.Forms.Label -$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$vCenterCsvValidation.TabIndex = 2 -$vCenterCsvValidation.Text = "vCenter CSV File:" -#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) -$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationCheck.TabIndex = 3 -$vCenterCsvValidationCheck.Text = "" -#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidation = New-Object System.Windows.Forms.Label -$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatacenterCsvValidation.TabIndex = 4 -$DatacenterCsvValidation.Text = "Datacenter CSV File:" -#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) -$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationCheck.TabIndex = 5 -$DatacenterCsvValidationCheck.Text = "" -#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidation = New-Object System.Windows.Forms.Label -$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ClusterCsvValidation.TabIndex = 6 -$ClusterCsvValidation.Text = "Cluster CSV File:" -#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) -$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationCheck.TabIndex = 7 -$ClusterCsvValidationCheck.Text = "" -#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidation = New-Object System.Windows.Forms.Label -$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmHostCsvValidation.TabIndex = 8 -$VmHostCsvValidation.Text = "VmHost CSV File:" -#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) -$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationCheck.TabIndex = 9 -$VmHostCsvValidationCheck.Text = "" -#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidation = New-Object System.Windows.Forms.Label -$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmCsvValidation.TabIndex = 10 -$VmCsvValidation.Text = "VM CSV File:" -#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) -$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationCheck.TabIndex = 11 -$VmCsvValidationCheck.Text = "" -#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidation = New-Object System.Windows.Forms.Label -$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$TemplateCsvValidation.TabIndex = 12 -$TemplateCsvValidation.Text = "Template CSV File:" -#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label -$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) -$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationCheck.TabIndex = 13 -$TemplateCsvValidationCheck.Text = "" -#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreClusterCsvValidation.TabIndex = 14 -$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" -#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) -$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationCheck.TabIndex = 15 -$DatastoreClusterCsvValidationCheck.Text = "" -#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreCsvValidation.TabIndex = 16 -$DatastoreCsvValidation.Text = "Datastore CSV File:" -#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) -$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationCheck.TabIndex = 17 -$DatastoreCsvValidationCheck.Text = "" -#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) -$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VsSwitchCsvValidation.TabIndex = 18 -$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" -#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) -$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationCheck.TabIndex = 19 -$VsSwitchCsvValidationCheck.Text = "" -#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) -$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPortGroupCsvValidation.TabIndex = 20 -$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" -#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) -$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationCheck.TabIndex = 21 -$VssPortGroupCsvValidationCheck.Text = "" -#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) -$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssVmkernelCsvValidation.TabIndex = 22 -$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" -#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) -$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationCheck.TabIndex = 23 -$VssVmkernelCsvValidationCheck.Text = "" -#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidation = New-Object System.Windows.Forms.Label -$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) -$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPnicCsvValidation.TabIndex = 24 -$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" -#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) -$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationCheck.TabIndex = 25 -$VssPnicCsvValidationCheck.Text = "" -#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) -$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdSwitchCsvValidation.TabIndex = 26 -$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" -#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) -$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationCheck.TabIndex = 27 -$VdSwitchCsvValidationCheck.Text = "" -#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) -$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPortGroupCsvValidation.TabIndex = 28 -$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" -#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) -$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationCheck.TabIndex = 29 -$VdsPortGroupCsvValidationCheck.Text = "" -#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) -$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsVmkernelCsvValidation.TabIndex = 30 -$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" -#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) -$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationCheck.TabIndex = 31 -$VdsVmkernelCsvValidationCheck.Text = "" -#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) -$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPnicCsvValidation.TabIndex = 32 -$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" -#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) -$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationCheck.TabIndex = 33 -$VdsPnicCsvValidationCheck.Text = "" -#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidation = New-Object System.Windows.Forms.Label -$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) -$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$FolderCsvValidation.TabIndex = 34 -$FolderCsvValidation.Text = "Folder CSV File:" -#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label -$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) -$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationCheck.TabIndex = 35 -$FolderCsvValidationCheck.Text = "" -#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidation = New-Object System.Windows.Forms.Label -$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) -$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$RdmCsvValidation.TabIndex = 36 -$RdmCsvValidation.Text = "RDM CSV File:" -#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label -$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) -$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationCheck.TabIndex = 37 -$RdmCsvValidationCheck.Text = "" -#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) -$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsRuleCsvValidation.TabIndex = 38 -$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" -#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) -$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationCheck.TabIndex = 39 -$DrsRuleCsvValidationCheck.Text = "" -#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) -$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsClusterGroupCsvValidation.TabIndex = 40 -$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" -#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) -$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationCheck.TabIndex = 41 -$DrsClusterGroupCsvValidationCheck.Text = "" -#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) -$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsVmHostRuleCsvValidation.TabIndex = 42 -$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" -#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) -$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 -$DrsVmHostRuleCsvValidationCheck.Text = "" -#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) -$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ResourcePoolCsvValidation.TabIndex = 44 -$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" -#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) -$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationCheck.TabIndex = 45 -$ResourcePoolCsvValidationCheck.Text = "" -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton = New-Object System.Windows.Forms.Button -$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) -$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) -$CsvValidationButton.TabIndex = 2 -$CsvValidationButton.Text = "Check for CSVs" -$CsvValidationButton.UseVisualStyleBackColor = $false -$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Host_DrawCheckBox.Checked = $true -$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) -$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Host_DrawCheckBox.TabIndex = 48 -$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" -$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_Complete = New-Object System.Windows.Forms.Label -$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) -$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Host_Complete.TabIndex = 49 -$VM_to_Host_Complete.Text = "" -#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Folder_DrawCheckBox.Checked = $true -$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) -$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Folder_DrawCheckBox.TabIndex = 50 -$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" -$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label -$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) -$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Folder_Complete.TabIndex = 51 -$VM_to_Folder_Complete.Text = "" -#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMs_with_RDMs_DrawCheckBox.Checked = $true -$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) -$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 -$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" -$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label -$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) -$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMs_with_RDMs_Complete.TabIndex = 53 -$VMs_with_RDMs_Complete.Text = "" -#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$SRM_Protected_VMs_DrawCheckBox.Checked = $true -$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) -$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 -$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" -$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label -$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) -$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$SRM_Protected_VMs_Complete.TabIndex = 55 -$SRM_Protected_VMs_Complete.Text = "" -#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Datastore_DrawCheckBox.Checked = $true -$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) -$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Datastore_DrawCheckBox.TabIndex = 56 -$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" -$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label -$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) -$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Datastore_Complete.TabIndex = 57 -$VM_to_Datastore_Complete.Text = "" -#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_ResourcePool_DrawCheckBox.Checked = $true -$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) -$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 -$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" -$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label -$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) -$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_ResourcePool_Complete.TabIndex = 59 -$VM_to_ResourcePool_Complete.Text = "" -#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Datastore_to_Host_DrawCheckBox.Checked = $true -$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) -$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$Datastore_to_Host_DrawCheckBox.TabIndex = 60 -$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" -$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label -$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) -$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Datastore_to_Host_Complete.TabIndex = 61 -$Datastore_to_Host_Complete.Text = "" -#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true -$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) -$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 -$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" -$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label -$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) -$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) -$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 -$PhysicalNIC_to_vSwitch_Complete.Text = "" -#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSS_to_Host_DrawCheckBox.Checked = $true -$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) -$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSS_to_Host_DrawCheckBox.TabIndex = 64 -$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" -$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) -$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSS_to_Host_Complete.TabIndex = 65 -$VSS_to_Host_Complete.Text = "" -#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VSS_DrawCheckBox.Checked = $true -$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) -$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VSS_DrawCheckBox.TabIndex = 66 -$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" -$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) -$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VSS_Complete.TabIndex = 67 -$VMK_to_VSS_Complete.Text = "" -#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) -$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 -$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" -$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) -$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSSPortGroup_to_VM_Complete.TabIndex = 69 -$VSSPortGroup_to_VM_Complete.Text = "" -#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDS_to_Host_DrawCheckBox.Checked = $true -$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) -$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDS_to_Host_DrawCheckBox.TabIndex = 70 -$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" -$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) -$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDS_to_Host_Complete.TabIndex = 71 -$VDS_to_Host_Complete.Text = "" -#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VDS_DrawCheckBox.Checked = $true -$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) -$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VDS_DrawCheckBox.TabIndex = 72 -$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" -$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) -$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VDS_Complete.TabIndex = 73 -$VMK_to_VDS_Complete.Text = "" -#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) -$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 -$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" -$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) -$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDSPortGroup_to_VM_Complete.TabIndex = 75 -$VDSPortGroup_to_VM_Complete.Text = "" -#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true -$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) -$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 -$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" -$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label -$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) -$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Cluster_to_DRS_Rule_Complete.TabIndex = 77 -$Cluster_to_DRS_Rule_Complete.Text = "" - -$TabDraw.Controls.Add($OpenVisioButton) -$TabDraw.Controls.Add($DrawCheckButton) -$TabDraw.Controls.Add($DrawButton) -$TabDraw.Controls.Add($DrawUncheckButton) -$TabDraw.Controls.Add($VisioOutputLabel) -$TabDraw.Controls.Add($VisioOpenOutputButton) -$TabDraw.Controls.Add($DrawCsvInputLabel) -$TabDraw.Controls.Add($DrawCsvInputButton) -$TabDraw.Controls.Add($vCenterCsvValidation) -$TabDraw.Controls.Add($vCenterCsvValidationCheck) -$TabDraw.Controls.Add($DatacenterCsvValidation) -$TabDraw.Controls.Add($DatacenterCsvValidationCheck) -$TabDraw.Controls.Add($ClusterCsvValidation) -$TabDraw.Controls.Add($ClusterCsvValidationCheck) -$TabDraw.Controls.Add($VmHostCsvValidation) -$TabDraw.Controls.Add($VmHostCsvValidationCheck) -$TabDraw.Controls.Add($VmCsvValidation) -$TabDraw.Controls.Add($VmCsvValidationCheck) -$TabDraw.Controls.Add($TemplateCsvValidation) -$TabDraw.Controls.Add($TemplateCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreClusterCsvValidation) -$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreCsvValidation) -$TabDraw.Controls.Add($DatastoreCsvValidationCheck) -$TabDraw.Controls.Add($VsSwitchCsvValidation) -$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VssPortGroupCsvValidation) -$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VssVmkernelCsvValidation) -$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VssPnicCsvValidation) -$TabDraw.Controls.Add($VssPnicCsvValidationCheck) -$TabDraw.Controls.Add($VdSwitchCsvValidation) -$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VdsPortGroupCsvValidation) -$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VdsVmkernelCsvValidation) -$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VdsPnicCsvValidation) -$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) -$TabDraw.Controls.Add($FolderCsvValidation) -$TabDraw.Controls.Add($FolderCsvValidationCheck) -$TabDraw.Controls.Add($RdmCsvValidation) -$TabDraw.Controls.Add($RdmCsvValidationCheck) -$TabDraw.Controls.Add($DrsRuleCsvValidation) -$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) -$TabDraw.Controls.Add($ResourcePoolCsvValidation) -$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) -$TabDraw.Controls.Add($CsvValidationButton) -$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Host_Complete) -$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Folder_Complete) -$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) -$TabDraw.Controls.Add($VMs_with_RDMs_Complete) -$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) -$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) -$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Datastore_Complete) -$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) -$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($Datastore_to_Host_Complete) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) -$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VSS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VSS_Complete) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VDS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VDS_Complete) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) -$SubTab.Controls.Add($TabDirections) -$SubTab.Controls.Add($TabCapture) -$SubTab.Controls.Add($TabDraw) -$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText -$SubTab.SelectedIndex = 0 -$vDiagram.Controls.Add($MainMenu) -$vDiagram.Controls.Add($MainTab) -$vDiagram.Controls.Add($SubTab) -#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$VisioBrowse.Description = "Select a directory" -$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$DrawCsvBrowse.Description = "Select a directory" -$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$CaptureCsvBrowse.Description = "Select a directory" -$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - -#endregion - -#region Custom Code -#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellCheck = $PSVersionTable.PSVersion -if ($PowershellCheck.Major -ge 4) -{ - $PowershellInstalled.Forecolor = "Green" - $PowershellInstalled.Text = "Installed Version $PowershellCheck" -} -else -{ - $PowershellInstalled.Forecolor = "Red" - $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" -} -#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) -$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) -if ($PowerCliModuleCheck -ne $null) -{ - $PowerCliModuleInstalled.Forecolor = "Green" - $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" -} -else -{ - $PowerCliModuleInstalled.Forecolor = "Red" - $PowerCliModuleInstalled.Text = "Not Installed" -} -#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerClI Installed" -} -elseif ($PowerCliModuleCheck -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerCLI Module Installed" -} -else -{ - $PowerCliInstalled.Forecolor = "Red" - $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" -} -#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) -{ - $VisioInstalled.Forecolor = "Green" - $VisioInstalled.Text = "Installed" -} -else -{ - $VisioInstalled.Forecolor = "Red" - $VisioInstalled.Text = "Visio is Not Installed" -} -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) -$ConnectButton.Add_Click({ Connect_vCenter_Main }) -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } -Check_CaptureCsvFolder } ) -#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton.Add_Click({ - if($CaptureCsvFolder -eq $null) - { - $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" - } - else - { - if ($vCenterCsvCheckBox.Checked -eq "True") - { - $vCenterCsvValidationComplete.Forecolor = "Blue" - $vCenterCsvValidationComplete.Text = "Processing ....." - vCenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" - $vCenterCsvComplete = Test-Path $vCenterExportFileComplete - if ($vCenterCsvComplete -eq $True) - { - $vCenterCsvValidationComplete.Forecolor = "Green" - $vCenterCsvValidationComplete.Text = "Complete" - } - else - { - $vCenterCsvValidationComplete.Forecolor = "Red" - $vCenterCsvValidationComplete.Text = "Not Complete" - } - } - Connect_vCenter - $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager - if ($Connected -eq $null) { Connect_vCenter_Main } - $ConnectButton.Forecolor = [System.Drawing.Color]::Green - $ConnectButton.Text = "Connected to $DefaultViserver" - if ($DatacenterCsvCheckBox.Checked -eq "True") - { - $DatacenterCsvValidationComplete.Forecolor = "Blue" - $DatacenterCsvValidationComplete.Text = "Processing ....." - Datacenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" - $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete - if ($DatacenterCsvComplete -eq $True) - { - $DatacenterCsvValidationComplete.Forecolor = "Green" - $DatacenterCsvValidationComplete.Text = "Complete" - } - else - { - $DatacenterCsvValidationComplete.Forecolor = "Red" - $DatacenterCsvValidationComplete.Text = "Not Complete" - } - } - if ($ClusterCsvCheckBox.Checked -eq "True") - { - $ClusterCsvValidationComplete.Forecolor = "Blue" - $ClusterCsvValidationComplete.Text = "Processing ....." - Cluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" - $ClusterCsvComplete = Test-Path $ClusterExportFileComplete - if ($ClusterCsvComplete -eq $True) - { - $ClusterCsvValidationComplete.Forecolor = "Green" - $ClusterCsvValidationComplete.Text = "Complete" - } - else - { - $ClusterCsvValidationComplete.Forecolor = "Red" - $ClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmHostCsvCheckBox.Checked -eq "True") - { - $VmHostCsvValidationComplete.Forecolor = "Blue" - $VmHostCsvValidationComplete.Text = "Processing ....." - VmHost_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" - $VmHostCsvComplete = Test-Path $VmHostExportFileComplete - if ($VmHostCsvComplete -eq $True) - { - $VmHostCsvValidationComplete.Forecolor = "Green" - $VmHostCsvValidationComplete.Text = "Complete" - } - else - { - $VmHostCsvValidationComplete.Forecolor = "Red" - $VmHostCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmCsvCheckBox.Checked -eq "True") - { - $VmCsvValidationComplete.Forecolor = "Blue" - $VmCsvValidationComplete.Text = "Processing ....." - Vm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" - $VmCsvComplete = Test-Path $VmExportFileComplete - if ($VmCsvComplete -eq $True) - { - $VmCsvValidationComplete.Forecolor = "Green" - $VmCsvValidationComplete.Text = "Complete" - } - else - { - $VmCsvValidationComplete.Forecolor = "Red" - $VmCsvValidationComplete.Text = "Not Complete" - } - } - if ($TemplateCsvCheckBox.Checked -eq "True") - { - $TemplateCsvValidationComplete.Forecolor = "Blue" - $TemplateCsvValidationComplete.Text = "Processing ....." - Template_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" - $TemplateCsvComplete = Test-Path $TemplateExportFileComplete - if ($TemplateCsvComplete -eq $True) - { - $TemplateCsvValidationComplete.Forecolor = "Green" - $TemplateCsvValidationComplete.Text = "Complete" - } - else - { - $TemplateCsvValidationComplete.Forecolor = "Red" - $TemplateCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreClusterCsvCheckBox.Checked -eq "True") - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" - $DatastoreClusterCsvValidationComplete.Text = "Processing ....." - DatastoreCluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete - if ($DatastoreClusterCsvComplete -eq $True) - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Green" - $DatastoreClusterCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Red" - $DatastoreClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreCsvCheckBox.Checked -eq "True") - { - $DatastoreCsvValidationComplete.Forecolor = "Blue" - $DatastoreCsvValidationComplete.Text = "Processing ....." - Datastore_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" - $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete - if ($DatastoreCsvComplete -eq $True) - { - $DatastoreCsvValidationComplete.Forecolor = "Green" - $DatastoreCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreCsvValidationComplete.Forecolor = "Red" - $DatastoreCsvValidationComplete.Text = "Not Complete" - } - } - if ($VsSwitchCsvCheckBox.Checked -eq "True") - { - $VsSwitchCsvValidationComplete.Forecolor = "Blue" - $VsSwitchCsvValidationComplete.Text = "Processing ....." - VsSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" - $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete - if ($vSSwitchCsvComplete -eq $True) - { - $vSSwitchCsvValidationComplete.Forecolor = "Green" - $vSSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $vSSwitchCsvValidationComplete.Forecolor = "Red" - $vSSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPortGroupCsvCheckBox.Checked -eq "True") - { - $VssPortGroupCsvValidationComplete.Forecolor = "Blue" - $VssPortGroupCsvValidationComplete.Text = "Processing ....." - VssPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete - if ($VssPortGroupCsvComplete -eq $True) - { - $VssPortGroupCsvValidationComplete.Forecolor = "Green" - $VssPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VssPortGroupCsvValidationComplete.Forecolor = "Red" - $VssPortGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssVmkernelCsvCheckBox.Checked -eq "True") - { - $VssVmkernelCsvValidationComplete.Forecolor = "Blue" - $VssVmkernelCsvValidationComplete.Text = "Processing ....." - VssVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete - if ($VssVmkernelCsvComplete -eq $True) - { - $VssVmkernelCsvValidationComplete.Forecolor = "Green" - $VssVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VssVmkernelCsvValidationComplete.Forecolor = "Red" - $VssVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPnicCsvCheckBox.Checked -eq "True") - { - $VssPnicCsvValidationComplete.Forecolor = "Blue" - $VssPnicCsvValidationComplete.Text = "Processing ....." - VssPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" - $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete - if ($VssPnicCsvComplete -eq $True) - { - $VssPnicCsvValidationComplete.Forecolor = "Green" - $VssPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VssPnicCsvValidationComplete.Forecolor = "Red" - $VssPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdSwitchCsvCheckBox.Checked -eq "True") - { - $VdSwitchCsvValidationComplete.Forecolor = "Blue" - $VdSwitchCsvValidationComplete.Text = "Processing ....." - VdSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" - $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete - if ($VdSwitchCsvComplete -eq $True) - { - $VdSwitchCsvValidationComplete.Forecolor = "Green" - $VdSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $VdSwitchCsvValidationComplete.Forecolor = "Red" - $VdSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPortGroupCsvCheckBox.Checked -eq "True") - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" - $VdsPortGroupCsvValidationComplete.Text = "Processing ....." - VdsPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete - if ($VdsPortGroupCsvComplete -eq $True) - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Green" - $VdsPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Red" - $VdsPortGroupCsvValidationComplete.Text = "Not Complete" - - } - } - if ($VdsVmkernelCsvCheckBox.Checked -eq "True") - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" - $VdsVmkernelCsvValidationComplete.Text = "Processing ....." - VdsVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete - if ($VdsVmkernelCsvComplete -eq $True) - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Green" - $VdsVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Red" - $VdsVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPnicCsvCheckBox.Checked -eq "True") - { - $VdsPnicCsvValidationComplete.Forecolor = "Blue" - $VdsPnicCsvValidationComplete.Text = "Processing ....." - VdsPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" - $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete - if ($VdsPnicCsvComplete -eq $True) - { - $VdsPnicCsvValidationComplete.Forecolor = "Green" - $VdsPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPnicCsvValidationComplete.Forecolor = "Red" - $VdsPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($FolderCsvCheckBox.Checked -eq "True") - { - $FolderCsvValidationComplete.Forecolor = "Blue" - $FolderCsvValidationComplete.Text = "Processing ....." - Folder_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" - $FolderCsvComplete = Test-Path $FolderExportFileComplete - if ($FolderCsvComplete -eq $True) - { - $FolderCsvValidationComplete.Forecolor = "Green" - $FolderCsvValidationComplete.Text = "Complete" - } - else - { - $FolderCsvValidationComplete.Forecolor = "Red" - $FolderCsvValidationComplete.Text = "Not Complete" - } - } - if ($RdmCsvCheckBox.Checked -eq "True") - { - $RdmCsvValidationComplete.Forecolor = "Blue" - $RdmCsvValidationComplete.Text = "Processing ....." - Rdm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" - $RdmCsvComplete = Test-Path $RdmExportFileComplete - if ($RdmCsvComplete -eq $True) - { - $RdmCsvValidationComplete.Forecolor = "Green" - $RdmCsvValidationComplete.Text = "Complete" - } - else - { - $RdmCsvValidationComplete.Forecolor = "Red" - $RdmCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsRuleCsvCheckBox.Checked -eq "True") - { - $DrsRuleCsvValidationComplete.Forecolor = "Blue" - $DrsRuleCsvValidationComplete.Text = "Processing ....." - Drs_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" - $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete - if ($DrsRuleCsvComplete -eq $True) - { - $DrsRuleCsvValidationComplete.Forecolor = "Green" - $DrsRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsRuleCsvValidationComplete.Forecolor = "Red" - $DrsRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" - $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." - Drs_Cluster_Group_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete - if ($DrsClusterGroupCsvComplete -eq $True) - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" - $DrsClusterGroupCsvValidationComplete.Text = "Complete" - } - else - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" - $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" - $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." - Drs_VmHost_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete - if ($DrsVmHostRuleCsvComplete -eq $True) - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" - $DrsVmHostRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" - $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($ResourcePoolCsvCheckBox.Checked -eq "True") - { - $ResourcePoolCsvValidationComplete.Forecolor = "Blue" - $ResourcePoolCsvValidationComplete.Text = "Processing ....." - Resource_Pool_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete - if ($ResourcePoolCsvComplete -eq $True) - { - $ResourcePoolCsvValidationComplete.Forecolor = "Green" - $ResourcePoolCsvValidationComplete.Text = "Complete" - } - else - { - $ResourcePoolCsvValidationComplete.Forecolor = "Red" - $ResourcePoolCsvValidationComplete.Text = "Not Complete" - } - } - Disconnect_vCenter - $ConnectButton.Forecolor = [System.Drawing.Color]::Red - $ConnectButton.Text = "Disconnected" - $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" - } -}) -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) -$TabDraw.Controls.Add($DrawCsvInputButton) -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton.Add_Click( -{ - $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text - $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" - $vCenterCsvExists = Test-Path $vCenterExportFile - $TabDraw.Controls.Add($vCenterCsvValidationCheck) - if ($vCenterCsvExists -eq $True) - { - - $vCenterCsvValidationCheck.Forecolor = "Green" - $vCenterCsvValidationCheck.Text = "Present" - } - else - { - $vCenterCsvValidationCheck.Forecolor = "Red" - $vCenterCsvValidationCheck.Text = "Not Present" - } - - $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" - $DatacenterCsvExists = Test-Path $DatacenterExportFile - $TabDraw.Controls.Add($DatacenterCsvValidationCheck) - - if ($DatacenterCsvExists -eq $True) - { - $DatacenterCsvValidationCheck.Forecolor = "Green" - $DatacenterCsvValidationCheck.Text = "Present" - } - else - { - $DatacenterCsvValidationCheck.Forecolor = "Red" - $DatacenterCsvValidationCheck.Text = "Not Present" - } - - $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" - $ClusterCsvExists = Test-Path $ClusterExportFile - $TabDraw.Controls.Add($ClusterCsvValidationCheck) - - if ($ClusterCsvExists -eq $True) - { - $ClusterCsvValidationCheck.Forecolor = "Green" - $ClusterCsvValidationCheck.Text = "Present" - } - else - { - $ClusterCsvValidationCheck.Forecolor = "Red" - $ClusterCsvValidationCheck.Text = "Not Present" - } - - $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" - $VmHostCsvExists = Test-Path $VmHostExportFile - $TabDraw.Controls.Add($VmHostCsvValidationCheck) - - if ($VmHostCsvExists -eq $True) - { - $VmHostCsvValidationCheck.Forecolor = "Green" - $VmHostCsvValidationCheck.Text = "Present" - } - else - { - $VmHostCsvValidationCheck.Forecolor = "Red" - $VmHostCsvValidationCheck.Text = "Not Present" - } - - $VmExportFile = $CsvInputDir + "-VmExport.csv" - $VmCsvExists = Test-Path $VmExportFile - $TabDraw.Controls.Add($VmCsvValidationCheck) - - if ($VmCsvExists -eq $True) - { - $VmCsvValidationCheck.Forecolor = "Green" - $VmCsvValidationCheck.Text = "Present" - } - else - { - $VmCsvValidationCheck.Forecolor = "Red" - $VmCsvValidationCheck.Text = "Not Present" - } - - $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" - $TemplateCsvExists = Test-Path $TemplateExportFile - $TabDraw.Controls.Add($TemplateCsvValidationCheck) - - if ($TemplateCsvExists -eq $True) - { - $TemplateCsvValidationCheck.Forecolor = "Green" - $TemplateCsvValidationCheck.Text = "Present" - } - else - { - $TemplateCsvValidationCheck.Forecolor = "Red" - $TemplateCsvValidationCheck.Text = "Not Present" - } - - $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile - $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) - - if ($DatastoreClusterCsvExists -eq $True) - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Green" - $DatastoreClusterCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Red" - $DatastoreClusterCsvValidationCheck.Text = "Not Present" - } - - $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" - $DatastoreCsvExists = Test-Path $DatastoreExportFile - $TabDraw.Controls.Add($DatastoreCsvValidationCheck) - - if ($DatastoreCsvExists -eq $True) - { - $DatastoreCsvValidationCheck.Forecolor = "Green" - $DatastoreCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreCsvValidationCheck.Forecolor = "Red" - $DatastoreCsvValidationCheck.Text = "Not Present" - } - - $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" - $VsSwitchCsvExists = Test-Path $VsSwitchExportFile - $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) - - if ($VsSwitchCsvExists -eq $True) - { - $VsSwitchCsvValidationCheck.Forecolor = "Green" - $VsSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VsSwitchCsvValidationCheck.Forecolor = "Red" - $VsSwitchCsvValidationCheck.Text = "Not Present" - $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile - $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) - - if ($VssPortGroupCsvExists -eq $True) - { - $VssPortGroupCsvValidationCheck.Forecolor = "Green" - $VssPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VssPortGroupCsvValidationCheck.Forecolor = "Red" - $VssPortGroupCsvValidationCheck.Text = "Not Present" - $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile - $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) - - if ($VssVmkernelCsvExists -eq $True) - { - $VssVmkernelCsvValidationCheck.Forecolor = "Green" - $VssVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VssVmkernelCsvValidationCheck.Forecolor = "Red" - $VssVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" - $VssPnicCsvExists = Test-Path $VssPnicExportFile - $TabDraw.Controls.Add($VssPnicCsvValidationCheck) - - if ($VssPnicCsvExists -eq $True) - { - $VssPnicCsvValidationCheck.Forecolor = "Green" - $VssPnicCsvValidationCheck.Text = "Present" - } - else - { - $VssPnicCsvValidationCheck.Forecolor = "Red" - $VssPnicCsvValidationCheck.Text = "Not Present" - } - - $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" - $VdSwitchCsvExists = Test-Path $VdSwitchExportFile - $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) - - if ($VdSwitchCsvExists -eq $True) - { - $VdSwitchCsvValidationCheck.Forecolor = "Green" - $VdSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VdSwitchCsvValidationCheck.Forecolor = "Red" - $VdSwitchCsvValidationCheck.Text = "Not Present" - $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile - $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) - - if ($VdsPortGroupCsvExists -eq $True) - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Green" - $VdsPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Red" - $VdsPortGroupCsvValidationCheck.Text = "Not Present" - $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile - $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) - - if ($VdsVmkernelCsvExists -eq $True) - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Green" - $VdsVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Red" - $VdsVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" - $VdsPnicCsvExists = Test-Path $VdsPnicExportFile - $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) - - if ($VdsPnicCsvExists -eq $True) - { - $VdsPnicCsvValidationCheck.Forecolor = "Green" - $VdsPnicCsvValidationCheck.Text = "Present" - } - else - { - $VdsPnicCsvValidationCheck.Forecolor = "Red" - $VdsPnicCsvValidationCheck.Text = "Not Present" - } - - $FolderExportFile = $CsvInputDir + "-FolderExport.csv" - $FolderCsvExists = Test-Path $FolderExportFile - $TabDraw.Controls.Add($FolderCsvValidationCheck) - - if ($FolderCsvExists -eq $True) - { - $FolderCsvValidationCheck.Forecolor = "Green" - $FolderCsvValidationCheck.Text = "Present" - } - else - { - $FolderCsvValidationCheck.Forecolor = "Red" - $FolderCsvValidationCheck.Text = "Not Present" - } - - $RdmExportFile = $CsvInputDir + "-RdmExport.csv" - $RdmCsvExists = Test-Path $RdmExportFile - $TabDraw.Controls.Add($RdmCsvValidationCheck) - - if ($RdmCsvExists -eq $True) - { - $RdmCsvValidationCheck.Forecolor = "Green" - $RdmCsvValidationCheck.Text = "Present" - } - else - { - $RdmCsvValidationCheck.Forecolor = "Red" - $RdmCsvValidationCheck.Text = "Not Present" - $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" - $DrsRuleCsvExists = Test-Path $DrsRuleExportFile - $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) - - if ($DrsRuleCsvExists -eq $True) - { - $DrsRuleCsvValidationCheck.Forecolor = "Green" - $DrsRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsRuleCsvValidationCheck.Forecolor = "Red" - $DrsRuleCsvValidationCheck.Text = "Not Present" - $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile - $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) - - if ($DrsClusterGroupCsvExists -eq $True) - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" - $DrsClusterGroupCsvValidationCheck.Text = "Present" - } - else - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" - $DrsClusterGroupCsvValidationCheck.Text = "Not Present" - } - - $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile - $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) - - if ($DrsVmHostRuleCsvExists -eq $True) - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" - $DrsVmHostRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" - $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" - } - - $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile - $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) - - if ($ResourcePoolCsvExists -eq $True) - { - $ResourcePoolCsvValidationCheck.Forecolor = "Green" - $ResourcePoolCsvValidationCheck.Text = "Present" - } - else - { - $ResourcePoolCsvValidationCheck.Forecolor = "Red" - $ResourcePoolCsvValidationCheck.Text = "Not Present" - $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" - } -} ) -$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) -$TabDraw.Controls.Add($CsvValidationButton) -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) -$TabDraw.Controls.Add($VisioOpenOutputButton) -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) -$TabDraw.Controls.Add($DrawUncheckButton) -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) -$TabDraw.Controls.Add($DrawCheckButton) -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; -if ($VM_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Host_Complete.Forecolor = "Blue" - $VM_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Host_Complete) - VM_to_Host - $VM_to_Host_Complete.Forecolor = "Green" - $VM_to_Host_Complete.Text = "Complete" - $TabDraw.Controls.Add($VM_to_Host_Complete) -} -if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Folder_Complete.Forecolor = "Blue" - $VM_to_Folder_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Folder_Complete) - VM_to_Folder - $VM_to_Folder_Complete.Forecolor = "Green" - $VM_to_Folder_Complete.Text = "Complete" -} -if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") -{ - $VMs_with_RDMs_Complete.Forecolor = "Blue" - $VMs_with_RDMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMs_with_RDMs_Complete) - VMs_with_RDMs - $VMs_with_RDMs_Complete.Forecolor = "Green" - $VMs_with_RDMs_Complete.Text = "Complete" -} -if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") -{ - $SRM_Protected_VMs_Complete.Forecolor = "Blue" - $SRM_Protected_VMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) - SRM_Protected_VMs - $SRM_Protected_VMs_Complete.Forecolor = "Green" - $SRM_Protected_VMs_Complete.Text = "Complete" -} -if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Datastore_Complete.Forecolor = "Blue" - $VM_to_Datastore_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Datastore_Complete) - VM_to_Datastore - $VM_to_Datastore_Complete.Forecolor = "Green" - $VM_to_Datastore_Complete.Text = "Complete" -} -if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") -{ - $VM_to_ResourcePool_Complete.Forecolor = "Blue" - $VM_to_ResourcePool_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) - VM_to_ResourcePool - $VM_to_ResourcePool_Complete.Forecolor = "Green" - $VM_to_ResourcePool_Complete.Text = "Complete" -} -if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") -{ - $Datastore_to_Host_Complete.Forecolor = "Blue" - $Datastore_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Datastore_to_Host_Complete) - Datastore_to_Host - $Datastore_to_Host_Complete.Forecolor = "Green" - $Datastore_to_Host_Complete.Text = "Complete" -} -if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") -{ - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" - $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) - PhysicalNIC_to_vSwitch - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" - $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" -} -if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VSS_to_Host_Complete.Forecolor = "Blue" - $VSS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSS_to_Host_Complete) - VSS_to_Host - $VSS_to_Host_Complete.Forecolor = "Green" - $VSS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VSS_Complete.Forecolor = "Blue" - $VMK_to_VSS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VSS_Complete) - VMK_to_VSS - $VMK_to_VSS_Complete.Forecolor = "Green" - $VMK_to_VSS_Complete.Text = "Complete" -} -if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VSSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) - VSSPortGroup_to_VM - $VSSPortGroup_to_VM_Complete.Forecolor = "Green" - $VSSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VDS_to_Host_Complete.Forecolor = "Blue" - $VDS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDS_to_Host_Complete) - VDS_to_Host - $VDS_to_Host_Complete.Forecolor = "Green" - $VDS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VDS_Complete.Forecolor = "Blue" - $VMK_to_VDS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VDS_Complete) - VMK_to_VDS - $VMK_to_VDS_Complete.Forecolor = "Green" - $VMK_to_VDS_Complete.Text = "Complete" -} -if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VDSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) - VDSPortGroup_to_VM - $VDSPortGroup_to_VM_Complete.Forecolor = "Green" - $VDSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") -{ - $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" - $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) - Cluster_to_DRS_Rule - $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" - $Cluster_to_DRS_Rule_Complete.Text = "Complete" -}; -$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) -$TabDraw.Controls.Add($DrawButton) -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton.Add_Click({Open_Final_Visio}) -$TabDraw.Controls.Add($OpenVisioButton) - -#endregion - -#region Event Loop - -function Main{ - [System.Windows.Forms.Application]::EnableVisualStyles() - [System.Windows.Forms.Application]::Run($vDiagram) -} - -#endregion - -#endregion - -#region Event Handlers - -#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect_vCenter_Main -{ - $MainVC = $MainVcenterTextBox.Text - $MainUser = $UserNameTextBox.Text - $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text -} - -function Connect_vCenter -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $User = $UserNameTextBox.Text - $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text -} - -function Disconnect_vCenter -{ - $Disconnect = Disconnect-ViServer * -Confirm:$false -} -#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Find_CaptureCsvFolder -{ - $CaptureCsvBrowseLoop = $True - while ($CaptureCsvBrowseLoop) - { - if ($CaptureCsvBrowse.ShowDialog() -eq "OK") - { - $CaptureCsvBrowseLoop = $False - } - else - { - $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($CaptureCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath -} - -function Check_CaptureCsvFolder -{ - $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $CheckContentDir = $CheckContentPath + "*.csv" - $CheckContent = Test-Path $CheckContentDir - if ($CheckContent -eq "True") - { - $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") - switch ($CheckContents_CaptureCsvFolder) { - 'Yes' - { - del $CheckContentDir - } - - 'No' - { - $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog - $CheckContentCsvBrowse.Description = "Select a directory to copy files to" - $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - $CheckContentCsvBrowse.ShowDialog() - $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath - copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder - del $CheckContentDir - } - } - } -} - -function Find_DrawCsvFolder -{ - $DrawCsvBrowseLoop = $True - while ($DrawCsvBrowseLoop) - { - if ($DrawCsvBrowse.ShowDialog() -eq "OK") - { - $DrawCsvBrowseLoop = $False - } - else - { - $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($DrawCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath -} - -function Find_DrawVisioFolder -{ - $VisioBrowseLoop = $True - while($VisioBrowseLoop) - { - if ($VisioBrowse.ShowDialog() -eq "OK") - { - $VisioBrowseLoop = $False - } - else - { - $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if($VisioBrowseRes -eq "Cancel") - { - return - } - } - } - $global:VisioFolder = $VisioBrowse.SelectedPath -} -#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function vCenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, - @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation - - if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) - { - $null - } - else - { - Disconnect_vCenter - } -} - -function Datacenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort-Object Name | - Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation -} - -function Cluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, - @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, - @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, - @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, - @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, - @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, - @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, - @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, - @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, - @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation -} - -function VmHost_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent - while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent - } - if ($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name } } }, - @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent - while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent - } - if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, - @{ N = "Version" ; E = { $_.Config.Product.Version } }, - @{ N = "Build" ; E = { $_.Config.Product.Build } }, - @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, - @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, - @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, - @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, - @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, - @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, - @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, - @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, - @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, - @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, - @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, - @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation -} - -function Vm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select-Object Name , - @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, - @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, - @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, - @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, - @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, - @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, - @{ N = "OS" ; E = { $_.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.Config.Version } }, - @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, - @{ N = 'Folder' ; E = { $Folder.Name } }, - @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, - @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, - @{ N = "IP" ; E = { $_.Guest.IpAddress } }, - @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, - @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, - @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, - @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation - } -} - -function Template_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - foreach ($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { $VmHost.name } }, - @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, - @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, - @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, - @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, - @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, - @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, - @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, - @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation - } -} - -function DatastoreCluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, - @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, - @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation -} - -function Datastore_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, - @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, - @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, - @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, - @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, - @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, - @{ N = "Accessible" ; E = { $_.State } }, - @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation -} - -function VsSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "Nic" ; E = { $_.Nic } }, - @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, - @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, - @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, - @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, - @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation -} - -function VssPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "VLanId" ; E = { $_.VLanId } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VssVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation - } - } - } -} - -function VssPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation - } - } -} - -function VdSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - foreach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "Vendor" ; E = { $_.Vendor } }, - @{ N = "Version" ; E = { $_.Version } }, - @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, - @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation - } -} - -function VdsPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, - @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, - @{ N = "NumPorts" ; E = { $_.NumPorts } }, - @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, - @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, - @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VdsVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation - - } - } -} - -function VdsPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | - Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch } }, - @{ N = "Portgroup" ; E = { $_.Portgroup } }, - @{ N = "ConnectedEntity" ; E = { $_.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation - } - } -} - -function Folder_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - foreach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -type VM | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation - } -} - -function Rdm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | - Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, - @{ N = "Vm" ; E = { $_.Parent } }, - @{ N = "Label" ; E = { $_.Name } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, - @{ N = "DiskType" ; E = { $_.DiskType } }, - @{ N = "Persistence" ; E = { $_.Persistence } }, - @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, - @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, - @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation -} - -function Drs_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation - } -} - -function Drs_Cluster_Group_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "GroupType" ; E = { $_.GroupType } }, - @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation - } -} - -function Drs_VmHost_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) - { - Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "VMGroup" ; E = { $_.VMGroup } }, - @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, - @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, - @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation - } - } -} - -function Resource_Pool_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) - { - Get-ResourcePool $ResourcePool | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Cluster" ; E = { $Cluster.Name } }, - @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, - @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, - @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, - @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, - @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, - @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, - @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, - @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, - @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, - @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation - } - } -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect-VisioObject($firstObj, $secondObj) -{ - $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) - $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) - $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) -} - -function Add-VisioObjectVC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectCluster($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHost($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectTemplate($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectSRM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDatastore($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHardDisk($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.ScsiCanonicalName - return $shpObj -} - -function Add-VisioObjectFolder($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVsSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVssPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVMK($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsClusterGroup($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDRSVMHostRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectResourcePool($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Create_Visio_Base -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $DocObj = $docsObj.Add("") - $DocObj.SaveAs($Savefile) - $AppVisio.Quit() -} - -function VM_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Host" - $Page = $DocsObj.Pages('VM to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Folder -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Folder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - $FolderImport = Import-Csv $FolderExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Folder" - $Page = $DocsObj.Pages('VM to Folder') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Folder') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Folder Object - $FolderObj = $stnObj.Masters.Item("Folder") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $FolderObject = Add-VisioObjectFolder $FolderObj $Folder - $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' - Connect-VisioObject $DatacenterObject $FolderObject - $y += 1.50 - - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $FolderObject $TemplateObject - $FolderObject = $TemplateObject - } - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $FolderObject $VMObject - $FolderObject = $VMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMs_with_RDMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - # RDM's - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - $RdmImport = Import-Csv $RdmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" - $Page = $DocsObj.Pages('VM w/ RDMs') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM w/ RDMs') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # RDM Object - $RDMObj = $stnObj.Masters.Item("RDM") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ClusterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 3.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatacenterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 2.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function SRM_Protected_VMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "SRM VM" - $Page = $DocsObj.Pages('SRM VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('SRM VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # SRM Protected VM Object - $SRMObj = $stnObj.Masters.Item("SRM Protected Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Datastore -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Datastore" - $Page = $DocsObj.Pages('VM to Datastore') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Datastore') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $ClusterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $ClusterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_ResourcePool -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # ResourcePool - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - $ResourcePoolImport = Import-Csv $ResourcePoolExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" - $Page = $DocsObj.Pages('VM to Resource Pool') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Resource Pool') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Resource Pool Object - $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool - # Name - $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' - # Cluster - $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' - # CpuSharesLevel - $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' - # NumCpuShares - $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' - # CpuReservationMHz - $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' - # CpuExpandableReservation - $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' - # CpuLimitMHz - $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' - # MemSharesLevel - $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' - # NumMemShares - $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' - # MemReservationGB - $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' - # MemExpandableReservation - $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' - # MemLimitGB - $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' - Connect-VisioObject $ClusterObject $ResourcePoolObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ResourcePoolObject $VMObject - $ResourcePoolObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Datastore_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Datastore to Host" - $Page = $DocsObj.Pages('Datastore to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Datastore to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function PhysicalNIC_to_vSwitch -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "PNIC to switch" - $Page = $DocsObj.Pages('PNIC to Switch') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('PNIC to Switch') - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - $y += 1.50 - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSS to Host" - $Page = $DocsObj.Pages('VSS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VSS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VSS" - $Page = $DocsObj.Pages('VMK to VSS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VSS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" - $Page = $DocsObj.Pages('VSSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDS to Host" - $Page = $DocsObj.Pages('VDS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VDS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VDS" - $Page = $DocsObj.Pages('VMK to VDS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VDS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" - $Page = $DocsObj.Pages('VDSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $DatacenterObject $VdSwitchObject - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x = 6.00 - $y += 1.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VPGObject $VMObject - $VPGObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Cluster_to_DRS_Rule -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # DRS Rule - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - $DrsRuleImport = Import-Csv $DrsRuleExportFile - # DRS Cluster Group - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile - # DRS VmHost Rule - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" - $Page = $DocsObj.Pages('Cluster to DRS Rule') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Cluster to DRS Rule') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # DRS Rule - $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") - # DRS Cluster Group - $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") - # DRS Host Rule - $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") - # Microsoft VM Object - $MSObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LXObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - $y += 1.50 - - foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule - # Name - $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' - # VM Affinity - $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' - # DRS Rule Enabled - $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' - # DRS Rule Mandatory - $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' - Connect-VisioObject $ClusterObject $DRSObject - #$ClusterObject = $DRSObject - $y += 1.50 - } - foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule - # Name - $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' - # Enabled - $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' - # Type - $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' - # VMGroup - $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' - # VMHostGroup - $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' - # AffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' - # AntiAffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' - Connect-VisioObject $ClusterObject $DRSVMHostRuleObject - $y += 1.50 - #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject - #$DrsClusterGroupObject = $DRSVMHostRuleObject - - foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) - { - $x += 2.50 - $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup - # Name - $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' - # GroupType - $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' - # Members - $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' - Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject - $DRSVMHostRuleObject = $DrsClusterGroupObject - - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Open_Final_Visio -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.Application - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null -} - -Main - +<# +.SYNOPSIS + vDiagram Visio Drawing Tool + +.DESCRIPTION + vDiagram Visio Drawing Tool + +.NOTES + File Name : vDiagram2.0.1.ps1 + Author : Tony Gonzalez + Author : Jason Hopkins + Based on : vDiagram by Alan Renouf + Version : 2.0.0 + +.USAGE NOTES + Ensure to unblock files before unzipping + Ensure to run as administrator + Required Files: + PowerCLI or PowerShell 5.0 with PowerCLI Modules installed + Active connection to vCenter to capture data + MS Visio + +.CHANGE LOG + - 04/12/2018 - v2.0.1 + Added MAC Addresses to VMs & Templates + Added a check to see if prior CSVs are still present + Added option to copy prior CSVs to new folder + + - 04/11/2018 - v2.0.0 + Presented as a Community Theater Session at South Florida VMUG + Feature enhancement requests collected +#> + +#region ScriptForm Designer + +#region Constructor + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") +#endregion + +#region Post-Constructor Custom Code +$MyVer = "2.0.1" +$LastUpdated = "April 12, 2018" +$About = +@" + + vDiagram $MyVer + + Contributors: Tony Gonzalez of RoundTower Technologies LLC + Jason Hopkins of RoundTower Technologies LLC + + Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram + + Created: February 13, 2018 + + Last Updated: $LastUpdated + +"@ +#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" +if (!(Test-Path $TestShapes)) +{ + $CurrentLocation = Get-Location + copy $CurrentLocation\vDiagram.vssx $TestShapes + Write-Host "Copying Shapes File to My Shapes" +} +$shpFile = "\vDiagram.vssx" +#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Set_WindowStyle { +param( + [Parameter()] + [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', + 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', + 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] + $Style = 'SHOW', + [Parameter()] + $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle +) + $WindowStates = @{ + FORCEMINIMIZE = 11; HIDE = 0 + MAXIMIZE = 3; MINIMIZE = 6 + RESTORE = 9; SHOW = 5 + SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 + SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 + SHOWNA = 8; SHOWNOACTIVATE = 4 + SHOWNORMAL = 1 + } + Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) + + $Win32ShowWindowAsync = Add-Type –memberDefinition @” + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); +“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru + + $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null +} +Set_WindowStyle MINIMIZE +#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function About_Config +{ + + $About + + #Add objects for About + $AboutForm = New-Object System.Windows.Forms.Form + $AboutTextBox = New-Object System.Windows.Forms.RichTextBox + + #About Form + $AboutForm.Icon = $Icon + $AboutForm.AutoScroll = $True + $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) + $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutForm.Name = "About" + $AboutForm.StartPosition = 1 + $AboutForm.Text = "About vDiagram $MyVer" + + $AboutTextBox.Anchor = 15 + $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) + $AboutTextBox.BorderStyle = 0 + $AboutTextBox.Font = "Tahoma" + $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) + $AboutTextBox.Name = "AboutTextBox" + $AboutTextBox.ReadOnly = $True + $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) + $AboutTextBox.Text = $About + + $AboutForm.Controls.Add($AboutTextBox) + + $AboutForm.Show() | Out-Null +} +#endregion + +#region Form Creation +#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vDiagram = New-Object System.Windows.Forms.Form +$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) +$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") +$vDiagram.Icon = $Icon +$vDiagram.Text = "vDiagram 2.0" +$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan +#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainMenu = New-Object System.Windows.Forms.MenuStrip +$MainMenu.Location = New-Object System.Drawing.Point(0, 0) +$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) +$MainMenu.TabIndex = 1 +$MainMenu.Text = "MainMenu" +#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) +$FileToolStripMenuItem.Text = "File" +#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) +$ExitToolStripMenuItem.Text = "Exit" +$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) +$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) +#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) +$HelpToolStripMenuItem.Text = "Help" +#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) +$AboutToolStripMenuItem.Text = "About" +$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) +$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) +$AboutToolStripMenuItem.Add_Click({About_Config}) +#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainTab = New-Object System.Windows.Forms.TabControl +$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) +$MainTab.Location = New-Object System.Drawing.Point(10, 30) +$MainTab.Size = New-Object System.Drawing.Size(990, 98) +$MainTab.TabIndex = 0 +$MainTab.Text = "MainTabs" +#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Prerequisites = New-Object System.Windows.Forms.TabPage +$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) +$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) +$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) +$Prerequisites.TabIndex = 0 +$Prerequisites.Text = "Prerequisites" +$Prerequisites.BackColor = [System.Drawing.Color]::LightGray +#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellLabel = New-Object System.Windows.Forms.Label +$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) +$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) +$PowershellLabel.TabIndex = 1 +$PowershellLabel.Text = "Powershell:" +#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellInstalled = New-Object System.Windows.Forms.Label +$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) +$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) +$PowershellInstalled.TabIndex = 2 +$PowershellInstalled.Text = "" +$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleLabel = New-Object System.Windows.Forms.Label +$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) +$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) +$PowerCliModuleLabel.TabIndex = 3 +$PowerCliModuleLabel.Text = "PowerCLI Module:" +#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label +$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) +$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) +$PowerCliModuleInstalled.TabIndex = 4 +$PowerCliModuleInstalled.Text = "" +$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliLabel = New-Object System.Windows.Forms.Label +$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) +$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) +$PowerCliLabel.TabIndex = 5 +$PowerCliLabel.Text = "PowerCLI:" +#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliInstalled = New-Object System.Windows.Forms.Label +$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) +$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) +$PowerCliInstalled.TabIndex = 6 +$PowerCliInstalled.Text = "" +$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioLabel = New-Object System.Windows.Forms.Label +$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) +$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) +$VisioLabel.TabIndex = 7 +$VisioLabel.Text = "Visio:" +#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioInstalled = New-Object System.Windows.Forms.Label +$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) +$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) +$VisioInstalled.TabIndex = 8 +$VisioInstalled.Text = "" +$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray +$Prerequisites.Controls.Add($PowershellLabel) +$Prerequisites.Controls.Add($PowershellInstalled) +$Prerequisites.Controls.Add($PowerCliModuleLabel) +$Prerequisites.Controls.Add($PowerCliModuleInstalled) +$Prerequisites.Controls.Add($PowerCliLabel) +$Prerequisites.Controls.Add($PowerCliInstalled) +$Prerequisites.Controls.Add($VisioLabel) +$Prerequisites.Controls.Add($VisioInstalled) +#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfo = New-Object System.Windows.Forms.TabPage +$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) +$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) +$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) +$vCenterInfo.TabIndex = 0 +$vCenterInfo.Text = "vCenter Info" +$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray +#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterLabel = New-Object System.Windows.Forms.Label +$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) +$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) +$MainVcenterLabel.TabIndex = 1 +$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" +#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox +$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) +$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) +$MainVcenterTextBox.TabIndex = 2 +$MainVcenterTextBox.Text = "" +#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterLabel = New-Object System.Windows.Forms.Label +$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) +$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) +$TargetVcenterLabel.TabIndex = 3 +$TargetVcenterLabel.Text = "Name of target vCenter:" +#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox +$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) +$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) +$TargetVcenterTextBox.TabIndex = 4 +$TargetVcenterTextBox.Text = "" +#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameLabel = New-Object System.Windows.Forms.Label +$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) +$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) +$UserNameLabel.TabIndex = 5 +$UserNameLabel.Text = "vCenter User Name:" +#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameTextBox = New-Object System.Windows.Forms.TextBox +$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) +$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) +$UserNameTextBox.TabIndex = 6 +$UserNameTextBox.Text = "" +#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) +$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) +$PasswordLabel.TabIndex = 7 +$PasswordLabel.Text = "Password:" +#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordTextBox = New-Object System.Windows.Forms.TextBox +$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) +$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) +$PasswordTextBox.TabIndex = 8 +$PasswordTextBox.Text = "" +$PasswordTextBox.UseSystemPasswordChar = $true +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton = New-Object System.Windows.Forms.Button +$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) +$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) +$ConnectButton.TabIndex = 9 +$ConnectButton.Text = "Connect to vCenter" +$ConnectButton.UseVisualStyleBackColor = $true +$vCenterInfo.Controls.Add($MainVcenterLabel) +$vCenterInfo.Controls.Add($MainVcenterTextBox) +$vCenterInfo.Controls.Add($TargetVcenterLabel) +$vCenterInfo.Controls.Add($TargetVcenterTextBox) +$vCenterInfo.Controls.Add($UserNameLabel) +$vCenterInfo.Controls.Add($UserNameTextBox) +$vCenterInfo.Controls.Add($PasswordLabel) +$vCenterInfo.Controls.Add($PasswordTextBox) +$vCenterInfo.Controls.Add($ConnectButton) +$MainTab.Controls.Add($Prerequisites) +$MainTab.Controls.Add($vCenterInfo) +$MainTab.SelectedIndex = 0 +#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SubTab = New-Object System.Windows.Forms.TabControl +$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$SubTab.Location = New-Object System.Drawing.Point(10, 136) +$SubTab.Size = New-Object System.Drawing.Size(990, 512) +$SubTab.TabIndex = 0 +$SubTab.Text = "SubTabs" +#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDirections = New-Object System.Windows.Forms.TabPage +$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDirections.Location = New-Object System.Drawing.Point(4, 22) +$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDirections.Size = New-Object System.Drawing.Size(982, 486) +$TabDirections.TabIndex = 0 +$TabDirections.Text = "Directions" +$TabDirections.UseVisualStyleBackColor = $true +#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesHeading = New-Object System.Windows.Forms.Label +$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) +$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) +$PrerequisitesHeading.TabIndex = 0 +$PrerequisitesHeading.Text = "Prerequisites Tab" +#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesDirections = New-Object System.Windows.Forms.Label +$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) +$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) +$PrerequisitesDirections.TabIndex = 1 +$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." +#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoHeading = New-Object System.Windows.Forms.Label +$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) +$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) +$vCenterInfoHeading.TabIndex = 2 +$vCenterInfoHeading.Text = "vCenter Info Tab" +#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoDirections = New-Object System.Windows.Forms.Label +$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) +$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) +$vCenterInfoDirections.TabIndex = 3 +$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." +#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvHeading = New-Object System.Windows.Forms.Label +$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) +$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) +$CaptureCsvHeading.TabIndex = 4 +$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" +#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureDirections = New-Object System.Windows.Forms.Label +$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) +$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) +$CaptureDirections.TabIndex = 5 +$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." +#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawHeading = New-Object System.Windows.Forms.Label +$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) +$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) +$DrawHeading.TabIndex = 6 +$DrawHeading.Text = "Draw Visio Tab" +#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawDirections = New-Object System.Windows.Forms.Label +$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) +$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) +$DrawDirections.TabIndex = 7 +$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." +$TabDirections.Controls.Add($PrerequisitesHeading) +$TabDirections.Controls.Add($PrerequisitesDirections) +$TabDirections.Controls.Add($vCenterInfoHeading) +$TabDirections.Controls.Add($vCenterInfoDirections) +$TabDirections.Controls.Add($CaptureCsvHeading) +$TabDirections.Controls.Add($CaptureDirections) +$TabDirections.Controls.Add($DrawHeading) +$TabDirections.Controls.Add($DrawDirections) +#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabCapture = New-Object System.Windows.Forms.TabPage +$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabCapture.Location = New-Object System.Drawing.Point(4, 22) +$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) +$TabCapture.Size = New-Object System.Drawing.Size(982, 486) +$TabCapture.TabIndex = 3 +$TabCapture.Text = "Capture CSVs for Visio" +$TabCapture.UseVisualStyleBackColor = $true +#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label +$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) +$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) +$CaptureCsvOutputLabel.TabIndex = 0 +$CaptureCsvOutputLabel.Text = "CSV Output Folder:" +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button +$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) +$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) +$CaptureCsvOutputButton.TabIndex = 0 +$CaptureCsvOutputButton.Text = "Select Output Folder" +$CaptureCsvOutputButton.UseVisualStyleBackColor = $false +$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$vCenterCsvCheckBox.Checked = $true +$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$vCenterCsvCheckBox.TabIndex = 1 +$vCenterCsvCheckBox.Text = "Export vCenter Info" +$vCenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) +$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationComplete.TabIndex = 26 +$vCenterCsvValidationComplete.Text = "" +#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatacenterCsvCheckBox.Checked = $true +$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatacenterCsvCheckBox.TabIndex = 2 +$DatacenterCsvCheckBox.Text = "Export Datacenter Info" +$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) +$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationComplete.TabIndex = 27 +$DatacenterCsvValidationComplete.Text = "" +#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ClusterCsvCheckBox.Checked = $true +$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ClusterCsvCheckBox.TabIndex = 3 +$ClusterCsvCheckBox.Text = "Export Cluster Info" +$ClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) +$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationComplete.TabIndex = 28 +$ClusterCsvValidationComplete.Text = "" +#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmHostCsvCheckBox.Checked = $true +$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmHostCsvCheckBox.TabIndex = 4 +$VmHostCsvCheckBox.Text = "Export VmHost Info" +$VmHostCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) +$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationComplete.TabIndex = 29 +$VmHostCsvValidationComplete.Text = "" +#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmCsvCheckBox.Checked = $true +$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmCsvCheckBox.TabIndex = 5 +$VmCsvCheckBox.Text = "Export Vm Info" +$VmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) +$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationComplete.TabIndex = 30 +$VmCsvValidationComplete.Text = "" +#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$TemplateCsvCheckBox.Checked = $true +$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$TemplateCsvCheckBox.TabIndex = 6 +$TemplateCsvCheckBox.Text = "Export Template Info" +$TemplateCsvCheckBox.UseVisualStyleBackColor = $true +#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label +$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) +$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationComplete.TabIndex = 31 +$TemplateCsvValidationComplete.Text = "" +#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreClusterCsvCheckBox.Checked = $true +$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreClusterCsvCheckBox.TabIndex = 7 +$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" +$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) +$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationComplete.TabIndex = 32 +$DatastoreClusterCsvValidationComplete.Text = "" +#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreCsvCheckBox.Checked = $true +$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreCsvCheckBox.TabIndex = 8 +$DatastoreCsvCheckBox.Text = "Export Datastore Info" +$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) +$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationComplete.TabIndex = 33 +$DatastoreCsvValidationComplete.Text = "" +#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VsSwitchCsvCheckBox.Checked = $true +$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) +$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VsSwitchCsvCheckBox.TabIndex = 9 +$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" +$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) +$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationComplete.TabIndex = 34 +$VsSwitchCsvValidationComplete.Text = "" +#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPortGroupCsvCheckBox.Checked = $true +$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) +$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPortGroupCsvCheckBox.TabIndex = 10 +$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" +$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) +$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationComplete.TabIndex = 35 +$VssPortGroupCsvValidationComplete.Text = "" +#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssVmkernelCsvCheckBox.Checked = $true +$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) +$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssVmkernelCsvCheckBox.TabIndex = 11 +$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" +$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) +$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationComplete.TabIndex = 36 +$VssVmkernelCsvValidationComplete.Text = "" +#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPnicCsvCheckBox.Checked = $true +$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) +$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPnicCsvCheckBox.TabIndex = 12 +$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" +$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) +$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationComplete.TabIndex = 37 +$VssPnicCsvValidationComplete.Text = "" +#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdSwitchCsvCheckBox.Checked = $true +$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) +$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdSwitchCsvCheckBox.TabIndex = 13 +$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" +$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) +$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationComplete.TabIndex = 38 +$VdSwitchCsvValidationComplete.Text = "" +#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPortGroupCsvCheckBox.Checked = $true +$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) +$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPortGroupCsvCheckBox.TabIndex = 14 +$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" +$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) +$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationComplete.TabIndex = 39 +$VdsPortGroupCsvValidationComplete.Text = "" +#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsVmkernelCsvCheckBox.Checked = $true +$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) +$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsVmkernelCsvCheckBox.TabIndex = 15 +$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" +$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) +$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationComplete.TabIndex = 40 +$VdsVmkernelCsvValidationComplete.Text = "" +#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPnicCsvCheckBox.Checked = $true +$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) +$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPnicCsvCheckBox.TabIndex = 16 +$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" +$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) +$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationComplete.TabIndex = 41 +$VdsPnicCsvValidationComplete.Text = "" +#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$FolderCsvCheckBox.Checked = $true +$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) +$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$FolderCsvCheckBox.TabIndex = 17 +$FolderCsvCheckBox.Text = "Export Folder Info" +$FolderCsvCheckBox.UseVisualStyleBackColor = $true +#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label +$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) +$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationComplete.TabIndex = 42 +$FolderCsvValidationComplete.Text = "" +#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$RdmCsvCheckBox.Checked = $true +$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) +$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$RdmCsvCheckBox.TabIndex = 18 +$RdmCsvCheckBox.Text = "Export RDM Info" +$RdmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label +$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) +$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationComplete.TabIndex = 43 +$RdmCsvValidationComplete.Text = "" +#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsRuleCsvCheckBox.Checked = $true +$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) +$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsRuleCsvCheckBox.TabIndex = 19 +$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" +$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) +$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationComplete.TabIndex = 44 +$DrsRuleCsvValidationComplete.Text = "" +#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsClusterGroupCsvCheckBox.Checked = $true +$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) +$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsClusterGroupCsvCheckBox.TabIndex = 20 +$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" +$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) +$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationComplete.TabIndex = 45 +$DrsClusterGroupCsvValidationComplete.Text = "" +#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsVmHostRuleCsvCheckBox.Checked = $true +$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) +$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsVmHostRuleCsvCheckBox.TabIndex = 21 +$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" +$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) +$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 +$DrsVmHostRuleCsvValidationComplete.Text = "" +#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ResourcePoolCsvCheckBox.Checked = $true +$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) +$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ResourcePoolCsvCheckBox.TabIndex = 22 +$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" +$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) +$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationComplete.TabIndex = 47 +$ResourcePoolCsvValidationComplete.Text = "" +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton = New-Object System.Windows.Forms.Button +$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) +$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureUncheckButton.TabIndex = 23 +$CaptureUncheckButton.Text = "Uncheck All" +$CaptureUncheckButton.UseVisualStyleBackColor = $false +$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton = New-Object System.Windows.Forms.Button +$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) +$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureCheckButton.TabIndex = 24 +$CaptureCheckButton.Text = "Check All" +$CaptureCheckButton.UseVisualStyleBackColor = $false +$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton = New-Object System.Windows.Forms.Button +$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) +$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureButton.TabIndex = 25 +$CaptureButton.Text = "Collect CSV Data" +$CaptureButton.UseVisualStyleBackColor = $false +$CaptureButton.BackColor = [System.Drawing.Color]::LightGray +$TabCapture.Controls.Add($CaptureCsvOutputLabel) +$TabCapture.Controls.Add($CaptureCsvOutputButton) +$TabCapture.Controls.Add($vCenterCsvCheckBox) +$TabCapture.Controls.Add($vCenterCsvValidationComplete) +$TabCapture.Controls.Add($DatacenterCsvCheckBox) +$TabCapture.Controls.Add($DatacenterCsvValidationComplete) +$TabCapture.Controls.Add($ClusterCsvCheckBox) +$TabCapture.Controls.Add($ClusterCsvValidationComplete) +$TabCapture.Controls.Add($VmHostCsvCheckBox) +$TabCapture.Controls.Add($VmHostCsvValidationComplete) +$TabCapture.Controls.Add($VmCsvCheckBox) +$TabCapture.Controls.Add($VmCsvValidationComplete) +$TabCapture.Controls.Add($TemplateCsvCheckBox) +$TabCapture.Controls.Add($TemplateCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) +$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreCsvCheckBox) +$TabCapture.Controls.Add($DatastoreCsvValidationComplete) +$TabCapture.Controls.Add($VsSwitchCsvCheckBox) +$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VssPnicCsvCheckBox) +$TabCapture.Controls.Add($VssPnicCsvValidationComplete) +$TabCapture.Controls.Add($VdSwitchCsvCheckBox) +$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VdsPnicCsvCheckBox) +$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) +$TabCapture.Controls.Add($FolderCsvCheckBox) +$TabCapture.Controls.Add($FolderCsvValidationComplete) +$TabCapture.Controls.Add($RdmCsvCheckBox) +$TabCapture.Controls.Add($RdmCsvValidationComplete) +$TabCapture.Controls.Add($DrsRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) +$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) +$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) +$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) +$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) +$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) +$TabCapture.Controls.Add($CaptureUncheckButton) +$TabCapture.Controls.Add($CaptureCheckButton) +$TabCapture.Controls.Add($CaptureButton) +#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDraw = New-Object System.Windows.Forms.TabPage +$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDraw.Location = New-Object System.Drawing.Point(4, 22) +$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDraw.Size = New-Object System.Drawing.Size(982, 486) +$TabDraw.TabIndex = 2 +$TabDraw.Text = "Draw Visio" +$TabDraw.UseVisualStyleBackColor = $true +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton = New-Object System.Windows.Forms.Button +$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) +$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) +$OpenVisioButton.TabIndex = 83 +$OpenVisioButton.Text = "Open Visio Drawing" +$OpenVisioButton.UseVisualStyleBackColor = $false +$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton = New-Object System.Windows.Forms.Button +$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) +$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawCheckButton.TabIndex = 82 +$DrawCheckButton.Text = "Check All" +$DrawCheckButton.UseVisualStyleBackColor = $false +$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton = New-Object System.Windows.Forms.Button +$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawButton.Location = New-Object System.Drawing.Point(448, 450) +$DrawButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawButton.TabIndex = 81 +$DrawButton.Text = "Draw Visio" +$DrawButton.UseVisualStyleBackColor = $false +$DrawButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton = New-Object System.Windows.Forms.Button +$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) +$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawUncheckButton.TabIndex = 80 +$DrawUncheckButton.Text = "Uncheck All" +$DrawUncheckButton.UseVisualStyleBackColor = $false +$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOutputLabel = New-Object System.Windows.Forms.Label +$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) +$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) +$VisioOutputLabel.TabIndex = 46 +$VisioOutputLabel.Text = "Visio Output Folder:" +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton = New-Object System.Windows.Forms.Button +$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) +$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) +$VisioOpenOutputButton.TabIndex = 47 +$VisioOpenOutputButton.Text = "Select Visio Output Folder" +$VisioOpenOutputButton.UseVisualStyleBackColor = $false +$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputLabel = New-Object System.Windows.Forms.Label +$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) +$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) +$DrawCsvInputLabel.TabIndex = 0 +$DrawCsvInputLabel.Text = "CSV Input Folder:" +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton = New-Object System.Windows.Forms.Button +$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) +$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) +$DrawCsvInputButton.TabIndex = 1 +$DrawCsvInputButton.Text = "Select CSV Input Folder" +$DrawCsvInputButton.UseVisualStyleBackColor = $false +$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidation = New-Object System.Windows.Forms.Label +$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$vCenterCsvValidation.TabIndex = 2 +$vCenterCsvValidation.Text = "vCenter CSV File:" +#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) +$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationCheck.TabIndex = 3 +$vCenterCsvValidationCheck.Text = "" +#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidation = New-Object System.Windows.Forms.Label +$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatacenterCsvValidation.TabIndex = 4 +$DatacenterCsvValidation.Text = "Datacenter CSV File:" +#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) +$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationCheck.TabIndex = 5 +$DatacenterCsvValidationCheck.Text = "" +#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidation = New-Object System.Windows.Forms.Label +$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ClusterCsvValidation.TabIndex = 6 +$ClusterCsvValidation.Text = "Cluster CSV File:" +#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) +$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationCheck.TabIndex = 7 +$ClusterCsvValidationCheck.Text = "" +#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidation = New-Object System.Windows.Forms.Label +$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmHostCsvValidation.TabIndex = 8 +$VmHostCsvValidation.Text = "VmHost CSV File:" +#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) +$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationCheck.TabIndex = 9 +$VmHostCsvValidationCheck.Text = "" +#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidation = New-Object System.Windows.Forms.Label +$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmCsvValidation.TabIndex = 10 +$VmCsvValidation.Text = "VM CSV File:" +#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) +$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationCheck.TabIndex = 11 +$VmCsvValidationCheck.Text = "" +#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidation = New-Object System.Windows.Forms.Label +$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$TemplateCsvValidation.TabIndex = 12 +$TemplateCsvValidation.Text = "Template CSV File:" +#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label +$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) +$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationCheck.TabIndex = 13 +$TemplateCsvValidationCheck.Text = "" +#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreClusterCsvValidation.TabIndex = 14 +$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" +#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) +$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationCheck.TabIndex = 15 +$DatastoreClusterCsvValidationCheck.Text = "" +#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreCsvValidation.TabIndex = 16 +$DatastoreCsvValidation.Text = "Datastore CSV File:" +#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) +$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationCheck.TabIndex = 17 +$DatastoreCsvValidationCheck.Text = "" +#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) +$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VsSwitchCsvValidation.TabIndex = 18 +$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" +#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) +$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationCheck.TabIndex = 19 +$VsSwitchCsvValidationCheck.Text = "" +#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) +$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPortGroupCsvValidation.TabIndex = 20 +$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" +#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) +$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationCheck.TabIndex = 21 +$VssPortGroupCsvValidationCheck.Text = "" +#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) +$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssVmkernelCsvValidation.TabIndex = 22 +$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" +#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) +$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationCheck.TabIndex = 23 +$VssVmkernelCsvValidationCheck.Text = "" +#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidation = New-Object System.Windows.Forms.Label +$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) +$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPnicCsvValidation.TabIndex = 24 +$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" +#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) +$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationCheck.TabIndex = 25 +$VssPnicCsvValidationCheck.Text = "" +#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) +$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdSwitchCsvValidation.TabIndex = 26 +$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" +#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) +$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationCheck.TabIndex = 27 +$VdSwitchCsvValidationCheck.Text = "" +#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) +$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPortGroupCsvValidation.TabIndex = 28 +$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" +#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) +$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationCheck.TabIndex = 29 +$VdsPortGroupCsvValidationCheck.Text = "" +#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) +$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsVmkernelCsvValidation.TabIndex = 30 +$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" +#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) +$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationCheck.TabIndex = 31 +$VdsVmkernelCsvValidationCheck.Text = "" +#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) +$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPnicCsvValidation.TabIndex = 32 +$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" +#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) +$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationCheck.TabIndex = 33 +$VdsPnicCsvValidationCheck.Text = "" +#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidation = New-Object System.Windows.Forms.Label +$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) +$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$FolderCsvValidation.TabIndex = 34 +$FolderCsvValidation.Text = "Folder CSV File:" +#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label +$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) +$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationCheck.TabIndex = 35 +$FolderCsvValidationCheck.Text = "" +#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidation = New-Object System.Windows.Forms.Label +$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) +$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$RdmCsvValidation.TabIndex = 36 +$RdmCsvValidation.Text = "RDM CSV File:" +#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label +$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) +$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationCheck.TabIndex = 37 +$RdmCsvValidationCheck.Text = "" +#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) +$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsRuleCsvValidation.TabIndex = 38 +$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" +#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) +$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationCheck.TabIndex = 39 +$DrsRuleCsvValidationCheck.Text = "" +#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) +$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsClusterGroupCsvValidation.TabIndex = 40 +$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" +#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) +$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationCheck.TabIndex = 41 +$DrsClusterGroupCsvValidationCheck.Text = "" +#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) +$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsVmHostRuleCsvValidation.TabIndex = 42 +$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" +#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) +$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 +$DrsVmHostRuleCsvValidationCheck.Text = "" +#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) +$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ResourcePoolCsvValidation.TabIndex = 44 +$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" +#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) +$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationCheck.TabIndex = 45 +$ResourcePoolCsvValidationCheck.Text = "" +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton = New-Object System.Windows.Forms.Button +$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) +$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) +$CsvValidationButton.TabIndex = 2 +$CsvValidationButton.Text = "Check for CSVs" +$CsvValidationButton.UseVisualStyleBackColor = $false +$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Host_DrawCheckBox.Checked = $true +$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) +$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Host_DrawCheckBox.TabIndex = 48 +$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" +$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_Complete = New-Object System.Windows.Forms.Label +$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) +$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Host_Complete.TabIndex = 49 +$VM_to_Host_Complete.Text = "" +#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Folder_DrawCheckBox.Checked = $true +$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) +$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Folder_DrawCheckBox.TabIndex = 50 +$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" +$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label +$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) +$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Folder_Complete.TabIndex = 51 +$VM_to_Folder_Complete.Text = "" +#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMs_with_RDMs_DrawCheckBox.Checked = $true +$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) +$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 +$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" +$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label +$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) +$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMs_with_RDMs_Complete.TabIndex = 53 +$VMs_with_RDMs_Complete.Text = "" +#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$SRM_Protected_VMs_DrawCheckBox.Checked = $true +$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) +$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 +$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" +$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label +$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) +$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$SRM_Protected_VMs_Complete.TabIndex = 55 +$SRM_Protected_VMs_Complete.Text = "" +#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Datastore_DrawCheckBox.Checked = $true +$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) +$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Datastore_DrawCheckBox.TabIndex = 56 +$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" +$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label +$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) +$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Datastore_Complete.TabIndex = 57 +$VM_to_Datastore_Complete.Text = "" +#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_ResourcePool_DrawCheckBox.Checked = $true +$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) +$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 +$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" +$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label +$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) +$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_ResourcePool_Complete.TabIndex = 59 +$VM_to_ResourcePool_Complete.Text = "" +#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Datastore_to_Host_DrawCheckBox.Checked = $true +$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) +$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$Datastore_to_Host_DrawCheckBox.TabIndex = 60 +$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" +$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label +$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) +$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Datastore_to_Host_Complete.TabIndex = 61 +$Datastore_to_Host_Complete.Text = "" +#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true +$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) +$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 +$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" +$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label +$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) +$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) +$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 +$PhysicalNIC_to_vSwitch_Complete.Text = "" +#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSS_to_Host_DrawCheckBox.Checked = $true +$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) +$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSS_to_Host_DrawCheckBox.TabIndex = 64 +$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" +$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) +$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSS_to_Host_Complete.TabIndex = 65 +$VSS_to_Host_Complete.Text = "" +#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VSS_DrawCheckBox.Checked = $true +$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) +$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VSS_DrawCheckBox.TabIndex = 66 +$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" +$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) +$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VSS_Complete.TabIndex = 67 +$VMK_to_VSS_Complete.Text = "" +#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) +$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 +$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" +$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) +$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSSPortGroup_to_VM_Complete.TabIndex = 69 +$VSSPortGroup_to_VM_Complete.Text = "" +#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDS_to_Host_DrawCheckBox.Checked = $true +$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) +$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDS_to_Host_DrawCheckBox.TabIndex = 70 +$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" +$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) +$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDS_to_Host_Complete.TabIndex = 71 +$VDS_to_Host_Complete.Text = "" +#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VDS_DrawCheckBox.Checked = $true +$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) +$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VDS_DrawCheckBox.TabIndex = 72 +$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" +$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) +$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VDS_Complete.TabIndex = 73 +$VMK_to_VDS_Complete.Text = "" +#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) +$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 +$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" +$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) +$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDSPortGroup_to_VM_Complete.TabIndex = 75 +$VDSPortGroup_to_VM_Complete.Text = "" +#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true +$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) +$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 +$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" +$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label +$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) +$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Cluster_to_DRS_Rule_Complete.TabIndex = 77 +$Cluster_to_DRS_Rule_Complete.Text = "" + +$TabDraw.Controls.Add($OpenVisioButton) +$TabDraw.Controls.Add($DrawCheckButton) +$TabDraw.Controls.Add($DrawButton) +$TabDraw.Controls.Add($DrawUncheckButton) +$TabDraw.Controls.Add($VisioOutputLabel) +$TabDraw.Controls.Add($VisioOpenOutputButton) +$TabDraw.Controls.Add($DrawCsvInputLabel) +$TabDraw.Controls.Add($DrawCsvInputButton) +$TabDraw.Controls.Add($vCenterCsvValidation) +$TabDraw.Controls.Add($vCenterCsvValidationCheck) +$TabDraw.Controls.Add($DatacenterCsvValidation) +$TabDraw.Controls.Add($DatacenterCsvValidationCheck) +$TabDraw.Controls.Add($ClusterCsvValidation) +$TabDraw.Controls.Add($ClusterCsvValidationCheck) +$TabDraw.Controls.Add($VmHostCsvValidation) +$TabDraw.Controls.Add($VmHostCsvValidationCheck) +$TabDraw.Controls.Add($VmCsvValidation) +$TabDraw.Controls.Add($VmCsvValidationCheck) +$TabDraw.Controls.Add($TemplateCsvValidation) +$TabDraw.Controls.Add($TemplateCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreClusterCsvValidation) +$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreCsvValidation) +$TabDraw.Controls.Add($DatastoreCsvValidationCheck) +$TabDraw.Controls.Add($VsSwitchCsvValidation) +$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VssPortGroupCsvValidation) +$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VssVmkernelCsvValidation) +$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VssPnicCsvValidation) +$TabDraw.Controls.Add($VssPnicCsvValidationCheck) +$TabDraw.Controls.Add($VdSwitchCsvValidation) +$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VdsPortGroupCsvValidation) +$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VdsVmkernelCsvValidation) +$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VdsPnicCsvValidation) +$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) +$TabDraw.Controls.Add($FolderCsvValidation) +$TabDraw.Controls.Add($FolderCsvValidationCheck) +$TabDraw.Controls.Add($RdmCsvValidation) +$TabDraw.Controls.Add($RdmCsvValidationCheck) +$TabDraw.Controls.Add($DrsRuleCsvValidation) +$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) +$TabDraw.Controls.Add($ResourcePoolCsvValidation) +$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) +$TabDraw.Controls.Add($CsvValidationButton) +$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Host_Complete) +$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Folder_Complete) +$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) +$TabDraw.Controls.Add($VMs_with_RDMs_Complete) +$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) +$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) +$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Datastore_Complete) +$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) +$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($Datastore_to_Host_Complete) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) +$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VSS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VSS_Complete) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VDS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VDS_Complete) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) +$SubTab.Controls.Add($TabDirections) +$SubTab.Controls.Add($TabCapture) +$SubTab.Controls.Add($TabDraw) +$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText +$SubTab.SelectedIndex = 0 +$vDiagram.Controls.Add($MainMenu) +$vDiagram.Controls.Add($MainTab) +$vDiagram.Controls.Add($SubTab) +#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$VisioBrowse.Description = "Select a directory" +$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$DrawCsvBrowse.Description = "Select a directory" +$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$CaptureCsvBrowse.Description = "Select a directory" +$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + +#endregion + +#region Custom Code +#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellCheck = $PSVersionTable.PSVersion +if ($PowershellCheck.Major -ge 4) +{ + $PowershellInstalled.Forecolor = "Green" + $PowershellInstalled.Text = "Installed Version $PowershellCheck" +} +else +{ + $PowershellInstalled.Forecolor = "Red" + $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" +} +#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) +$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) +if ($PowerCliModuleCheck -ne $null) +{ + $PowerCliModuleInstalled.Forecolor = "Green" + $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" +} +else +{ + $PowerCliModuleInstalled.Forecolor = "Red" + $PowerCliModuleInstalled.Text = "Not Installed" +} +#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerClI Installed" +} +elseif ($PowerCliModuleCheck -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerCLI Module Installed" +} +else +{ + $PowerCliInstalled.Forecolor = "Red" + $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" +} +#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) +{ + $VisioInstalled.Forecolor = "Green" + $VisioInstalled.Text = "Installed" +} +else +{ + $VisioInstalled.Forecolor = "Red" + $VisioInstalled.Text = "Visio is Not Installed" +} +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) +$ConnectButton.Add_Click({ Connect_vCenter_Main }) +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } +Check_CaptureCsvFolder } ) +#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton.Add_Click({ + if($CaptureCsvFolder -eq $null) + { + $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" + } + else + { + if ($vCenterCsvCheckBox.Checked -eq "True") + { + $vCenterCsvValidationComplete.Forecolor = "Blue" + $vCenterCsvValidationComplete.Text = "Processing ....." + vCenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" + $vCenterCsvComplete = Test-Path $vCenterExportFileComplete + if ($vCenterCsvComplete -eq $True) + { + $vCenterCsvValidationComplete.Forecolor = "Green" + $vCenterCsvValidationComplete.Text = "Complete" + } + else + { + $vCenterCsvValidationComplete.Forecolor = "Red" + $vCenterCsvValidationComplete.Text = "Not Complete" + } + } + Connect_vCenter + $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager + if ($Connected -eq $null) { Connect_vCenter_Main } + $ConnectButton.Forecolor = [System.Drawing.Color]::Green + $ConnectButton.Text = "Connected to $DefaultViserver" + if ($DatacenterCsvCheckBox.Checked -eq "True") + { + $DatacenterCsvValidationComplete.Forecolor = "Blue" + $DatacenterCsvValidationComplete.Text = "Processing ....." + Datacenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" + $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete + if ($DatacenterCsvComplete -eq $True) + { + $DatacenterCsvValidationComplete.Forecolor = "Green" + $DatacenterCsvValidationComplete.Text = "Complete" + } + else + { + $DatacenterCsvValidationComplete.Forecolor = "Red" + $DatacenterCsvValidationComplete.Text = "Not Complete" + } + } + if ($ClusterCsvCheckBox.Checked -eq "True") + { + $ClusterCsvValidationComplete.Forecolor = "Blue" + $ClusterCsvValidationComplete.Text = "Processing ....." + Cluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" + $ClusterCsvComplete = Test-Path $ClusterExportFileComplete + if ($ClusterCsvComplete -eq $True) + { + $ClusterCsvValidationComplete.Forecolor = "Green" + $ClusterCsvValidationComplete.Text = "Complete" + } + else + { + $ClusterCsvValidationComplete.Forecolor = "Red" + $ClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmHostCsvCheckBox.Checked -eq "True") + { + $VmHostCsvValidationComplete.Forecolor = "Blue" + $VmHostCsvValidationComplete.Text = "Processing ....." + VmHost_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" + $VmHostCsvComplete = Test-Path $VmHostExportFileComplete + if ($VmHostCsvComplete -eq $True) + { + $VmHostCsvValidationComplete.Forecolor = "Green" + $VmHostCsvValidationComplete.Text = "Complete" + } + else + { + $VmHostCsvValidationComplete.Forecolor = "Red" + $VmHostCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmCsvCheckBox.Checked -eq "True") + { + $VmCsvValidationComplete.Forecolor = "Blue" + $VmCsvValidationComplete.Text = "Processing ....." + Vm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" + $VmCsvComplete = Test-Path $VmExportFileComplete + if ($VmCsvComplete -eq $True) + { + $VmCsvValidationComplete.Forecolor = "Green" + $VmCsvValidationComplete.Text = "Complete" + } + else + { + $VmCsvValidationComplete.Forecolor = "Red" + $VmCsvValidationComplete.Text = "Not Complete" + } + } + if ($TemplateCsvCheckBox.Checked -eq "True") + { + $TemplateCsvValidationComplete.Forecolor = "Blue" + $TemplateCsvValidationComplete.Text = "Processing ....." + Template_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" + $TemplateCsvComplete = Test-Path $TemplateExportFileComplete + if ($TemplateCsvComplete -eq $True) + { + $TemplateCsvValidationComplete.Forecolor = "Green" + $TemplateCsvValidationComplete.Text = "Complete" + } + else + { + $TemplateCsvValidationComplete.Forecolor = "Red" + $TemplateCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreClusterCsvCheckBox.Checked -eq "True") + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" + $DatastoreClusterCsvValidationComplete.Text = "Processing ....." + DatastoreCluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete + if ($DatastoreClusterCsvComplete -eq $True) + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Green" + $DatastoreClusterCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Red" + $DatastoreClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreCsvCheckBox.Checked -eq "True") + { + $DatastoreCsvValidationComplete.Forecolor = "Blue" + $DatastoreCsvValidationComplete.Text = "Processing ....." + Datastore_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" + $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete + if ($DatastoreCsvComplete -eq $True) + { + $DatastoreCsvValidationComplete.Forecolor = "Green" + $DatastoreCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreCsvValidationComplete.Forecolor = "Red" + $DatastoreCsvValidationComplete.Text = "Not Complete" + } + } + if ($VsSwitchCsvCheckBox.Checked -eq "True") + { + $VsSwitchCsvValidationComplete.Forecolor = "Blue" + $VsSwitchCsvValidationComplete.Text = "Processing ....." + VsSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" + $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete + if ($vSSwitchCsvComplete -eq $True) + { + $vSSwitchCsvValidationComplete.Forecolor = "Green" + $vSSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $vSSwitchCsvValidationComplete.Forecolor = "Red" + $vSSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPortGroupCsvCheckBox.Checked -eq "True") + { + $VssPortGroupCsvValidationComplete.Forecolor = "Blue" + $VssPortGroupCsvValidationComplete.Text = "Processing ....." + VssPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete + if ($VssPortGroupCsvComplete -eq $True) + { + $VssPortGroupCsvValidationComplete.Forecolor = "Green" + $VssPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VssPortGroupCsvValidationComplete.Forecolor = "Red" + $VssPortGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssVmkernelCsvCheckBox.Checked -eq "True") + { + $VssVmkernelCsvValidationComplete.Forecolor = "Blue" + $VssVmkernelCsvValidationComplete.Text = "Processing ....." + VssVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete + if ($VssVmkernelCsvComplete -eq $True) + { + $VssVmkernelCsvValidationComplete.Forecolor = "Green" + $VssVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VssVmkernelCsvValidationComplete.Forecolor = "Red" + $VssVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPnicCsvCheckBox.Checked -eq "True") + { + $VssPnicCsvValidationComplete.Forecolor = "Blue" + $VssPnicCsvValidationComplete.Text = "Processing ....." + VssPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" + $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete + if ($VssPnicCsvComplete -eq $True) + { + $VssPnicCsvValidationComplete.Forecolor = "Green" + $VssPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VssPnicCsvValidationComplete.Forecolor = "Red" + $VssPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdSwitchCsvCheckBox.Checked -eq "True") + { + $VdSwitchCsvValidationComplete.Forecolor = "Blue" + $VdSwitchCsvValidationComplete.Text = "Processing ....." + VdSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" + $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete + if ($VdSwitchCsvComplete -eq $True) + { + $VdSwitchCsvValidationComplete.Forecolor = "Green" + $VdSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $VdSwitchCsvValidationComplete.Forecolor = "Red" + $VdSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPortGroupCsvCheckBox.Checked -eq "True") + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" + $VdsPortGroupCsvValidationComplete.Text = "Processing ....." + VdsPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete + if ($VdsPortGroupCsvComplete -eq $True) + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Green" + $VdsPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Red" + $VdsPortGroupCsvValidationComplete.Text = "Not Complete" + + } + } + if ($VdsVmkernelCsvCheckBox.Checked -eq "True") + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" + $VdsVmkernelCsvValidationComplete.Text = "Processing ....." + VdsVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete + if ($VdsVmkernelCsvComplete -eq $True) + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Green" + $VdsVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Red" + $VdsVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPnicCsvCheckBox.Checked -eq "True") + { + $VdsPnicCsvValidationComplete.Forecolor = "Blue" + $VdsPnicCsvValidationComplete.Text = "Processing ....." + VdsPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" + $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete + if ($VdsPnicCsvComplete -eq $True) + { + $VdsPnicCsvValidationComplete.Forecolor = "Green" + $VdsPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPnicCsvValidationComplete.Forecolor = "Red" + $VdsPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($FolderCsvCheckBox.Checked -eq "True") + { + $FolderCsvValidationComplete.Forecolor = "Blue" + $FolderCsvValidationComplete.Text = "Processing ....." + Folder_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" + $FolderCsvComplete = Test-Path $FolderExportFileComplete + if ($FolderCsvComplete -eq $True) + { + $FolderCsvValidationComplete.Forecolor = "Green" + $FolderCsvValidationComplete.Text = "Complete" + } + else + { + $FolderCsvValidationComplete.Forecolor = "Red" + $FolderCsvValidationComplete.Text = "Not Complete" + } + } + if ($RdmCsvCheckBox.Checked -eq "True") + { + $RdmCsvValidationComplete.Forecolor = "Blue" + $RdmCsvValidationComplete.Text = "Processing ....." + Rdm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" + $RdmCsvComplete = Test-Path $RdmExportFileComplete + if ($RdmCsvComplete -eq $True) + { + $RdmCsvValidationComplete.Forecolor = "Green" + $RdmCsvValidationComplete.Text = "Complete" + } + else + { + $RdmCsvValidationComplete.Forecolor = "Red" + $RdmCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsRuleCsvCheckBox.Checked -eq "True") + { + $DrsRuleCsvValidationComplete.Forecolor = "Blue" + $DrsRuleCsvValidationComplete.Text = "Processing ....." + Drs_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" + $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete + if ($DrsRuleCsvComplete -eq $True) + { + $DrsRuleCsvValidationComplete.Forecolor = "Green" + $DrsRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsRuleCsvValidationComplete.Forecolor = "Red" + $DrsRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" + $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." + Drs_Cluster_Group_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete + if ($DrsClusterGroupCsvComplete -eq $True) + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" + $DrsClusterGroupCsvValidationComplete.Text = "Complete" + } + else + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" + $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" + $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." + Drs_VmHost_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete + if ($DrsVmHostRuleCsvComplete -eq $True) + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" + $DrsVmHostRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" + $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($ResourcePoolCsvCheckBox.Checked -eq "True") + { + $ResourcePoolCsvValidationComplete.Forecolor = "Blue" + $ResourcePoolCsvValidationComplete.Text = "Processing ....." + Resource_Pool_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete + if ($ResourcePoolCsvComplete -eq $True) + { + $ResourcePoolCsvValidationComplete.Forecolor = "Green" + $ResourcePoolCsvValidationComplete.Text = "Complete" + } + else + { + $ResourcePoolCsvValidationComplete.Forecolor = "Red" + $ResourcePoolCsvValidationComplete.Text = "Not Complete" + } + } + Disconnect_vCenter + $ConnectButton.Forecolor = [System.Drawing.Color]::Red + $ConnectButton.Text = "Disconnected" + $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" + } +}) +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) +$TabDraw.Controls.Add($DrawCsvInputButton) +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton.Add_Click( +{ + $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text + $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" + $vCenterCsvExists = Test-Path $vCenterExportFile + $TabDraw.Controls.Add($vCenterCsvValidationCheck) + if ($vCenterCsvExists -eq $True) + { + + $vCenterCsvValidationCheck.Forecolor = "Green" + $vCenterCsvValidationCheck.Text = "Present" + } + else + { + $vCenterCsvValidationCheck.Forecolor = "Red" + $vCenterCsvValidationCheck.Text = "Not Present" + } + + $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" + $DatacenterCsvExists = Test-Path $DatacenterExportFile + $TabDraw.Controls.Add($DatacenterCsvValidationCheck) + + if ($DatacenterCsvExists -eq $True) + { + $DatacenterCsvValidationCheck.Forecolor = "Green" + $DatacenterCsvValidationCheck.Text = "Present" + } + else + { + $DatacenterCsvValidationCheck.Forecolor = "Red" + $DatacenterCsvValidationCheck.Text = "Not Present" + } + + $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" + $ClusterCsvExists = Test-Path $ClusterExportFile + $TabDraw.Controls.Add($ClusterCsvValidationCheck) + + if ($ClusterCsvExists -eq $True) + { + $ClusterCsvValidationCheck.Forecolor = "Green" + $ClusterCsvValidationCheck.Text = "Present" + } + else + { + $ClusterCsvValidationCheck.Forecolor = "Red" + $ClusterCsvValidationCheck.Text = "Not Present" + } + + $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" + $VmHostCsvExists = Test-Path $VmHostExportFile + $TabDraw.Controls.Add($VmHostCsvValidationCheck) + + if ($VmHostCsvExists -eq $True) + { + $VmHostCsvValidationCheck.Forecolor = "Green" + $VmHostCsvValidationCheck.Text = "Present" + } + else + { + $VmHostCsvValidationCheck.Forecolor = "Red" + $VmHostCsvValidationCheck.Text = "Not Present" + } + + $VmExportFile = $CsvInputDir + "-VmExport.csv" + $VmCsvExists = Test-Path $VmExportFile + $TabDraw.Controls.Add($VmCsvValidationCheck) + + if ($VmCsvExists -eq $True) + { + $VmCsvValidationCheck.Forecolor = "Green" + $VmCsvValidationCheck.Text = "Present" + } + else + { + $VmCsvValidationCheck.Forecolor = "Red" + $VmCsvValidationCheck.Text = "Not Present" + } + + $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" + $TemplateCsvExists = Test-Path $TemplateExportFile + $TabDraw.Controls.Add($TemplateCsvValidationCheck) + + if ($TemplateCsvExists -eq $True) + { + $TemplateCsvValidationCheck.Forecolor = "Green" + $TemplateCsvValidationCheck.Text = "Present" + } + else + { + $TemplateCsvValidationCheck.Forecolor = "Red" + $TemplateCsvValidationCheck.Text = "Not Present" + } + + $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile + $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) + + if ($DatastoreClusterCsvExists -eq $True) + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Green" + $DatastoreClusterCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Red" + $DatastoreClusterCsvValidationCheck.Text = "Not Present" + } + + $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" + $DatastoreCsvExists = Test-Path $DatastoreExportFile + $TabDraw.Controls.Add($DatastoreCsvValidationCheck) + + if ($DatastoreCsvExists -eq $True) + { + $DatastoreCsvValidationCheck.Forecolor = "Green" + $DatastoreCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreCsvValidationCheck.Forecolor = "Red" + $DatastoreCsvValidationCheck.Text = "Not Present" + } + + $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" + $VsSwitchCsvExists = Test-Path $VsSwitchExportFile + $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) + + if ($VsSwitchCsvExists -eq $True) + { + $VsSwitchCsvValidationCheck.Forecolor = "Green" + $VsSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VsSwitchCsvValidationCheck.Forecolor = "Red" + $VsSwitchCsvValidationCheck.Text = "Not Present" + $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile + $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) + + if ($VssPortGroupCsvExists -eq $True) + { + $VssPortGroupCsvValidationCheck.Forecolor = "Green" + $VssPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VssPortGroupCsvValidationCheck.Forecolor = "Red" + $VssPortGroupCsvValidationCheck.Text = "Not Present" + $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile + $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) + + if ($VssVmkernelCsvExists -eq $True) + { + $VssVmkernelCsvValidationCheck.Forecolor = "Green" + $VssVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VssVmkernelCsvValidationCheck.Forecolor = "Red" + $VssVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" + $VssPnicCsvExists = Test-Path $VssPnicExportFile + $TabDraw.Controls.Add($VssPnicCsvValidationCheck) + + if ($VssPnicCsvExists -eq $True) + { + $VssPnicCsvValidationCheck.Forecolor = "Green" + $VssPnicCsvValidationCheck.Text = "Present" + } + else + { + $VssPnicCsvValidationCheck.Forecolor = "Red" + $VssPnicCsvValidationCheck.Text = "Not Present" + } + + $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" + $VdSwitchCsvExists = Test-Path $VdSwitchExportFile + $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) + + if ($VdSwitchCsvExists -eq $True) + { + $VdSwitchCsvValidationCheck.Forecolor = "Green" + $VdSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VdSwitchCsvValidationCheck.Forecolor = "Red" + $VdSwitchCsvValidationCheck.Text = "Not Present" + $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile + $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) + + if ($VdsPortGroupCsvExists -eq $True) + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Green" + $VdsPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Red" + $VdsPortGroupCsvValidationCheck.Text = "Not Present" + $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile + $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) + + if ($VdsVmkernelCsvExists -eq $True) + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Green" + $VdsVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Red" + $VdsVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" + $VdsPnicCsvExists = Test-Path $VdsPnicExportFile + $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) + + if ($VdsPnicCsvExists -eq $True) + { + $VdsPnicCsvValidationCheck.Forecolor = "Green" + $VdsPnicCsvValidationCheck.Text = "Present" + } + else + { + $VdsPnicCsvValidationCheck.Forecolor = "Red" + $VdsPnicCsvValidationCheck.Text = "Not Present" + } + + $FolderExportFile = $CsvInputDir + "-FolderExport.csv" + $FolderCsvExists = Test-Path $FolderExportFile + $TabDraw.Controls.Add($FolderCsvValidationCheck) + + if ($FolderCsvExists -eq $True) + { + $FolderCsvValidationCheck.Forecolor = "Green" + $FolderCsvValidationCheck.Text = "Present" + } + else + { + $FolderCsvValidationCheck.Forecolor = "Red" + $FolderCsvValidationCheck.Text = "Not Present" + } + + $RdmExportFile = $CsvInputDir + "-RdmExport.csv" + $RdmCsvExists = Test-Path $RdmExportFile + $TabDraw.Controls.Add($RdmCsvValidationCheck) + + if ($RdmCsvExists -eq $True) + { + $RdmCsvValidationCheck.Forecolor = "Green" + $RdmCsvValidationCheck.Text = "Present" + } + else + { + $RdmCsvValidationCheck.Forecolor = "Red" + $RdmCsvValidationCheck.Text = "Not Present" + $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" + $DrsRuleCsvExists = Test-Path $DrsRuleExportFile + $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) + + if ($DrsRuleCsvExists -eq $True) + { + $DrsRuleCsvValidationCheck.Forecolor = "Green" + $DrsRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsRuleCsvValidationCheck.Forecolor = "Red" + $DrsRuleCsvValidationCheck.Text = "Not Present" + $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile + $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) + + if ($DrsClusterGroupCsvExists -eq $True) + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" + $DrsClusterGroupCsvValidationCheck.Text = "Present" + } + else + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" + $DrsClusterGroupCsvValidationCheck.Text = "Not Present" + } + + $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile + $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) + + if ($DrsVmHostRuleCsvExists -eq $True) + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" + $DrsVmHostRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" + $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" + } + + $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile + $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) + + if ($ResourcePoolCsvExists -eq $True) + { + $ResourcePoolCsvValidationCheck.Forecolor = "Green" + $ResourcePoolCsvValidationCheck.Text = "Present" + } + else + { + $ResourcePoolCsvValidationCheck.Forecolor = "Red" + $ResourcePoolCsvValidationCheck.Text = "Not Present" + $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" + } +} ) +$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) +$TabDraw.Controls.Add($CsvValidationButton) +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) +$TabDraw.Controls.Add($VisioOpenOutputButton) +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) +$TabDraw.Controls.Add($DrawUncheckButton) +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) +$TabDraw.Controls.Add($DrawCheckButton) +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; +if ($VM_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Host_Complete.Forecolor = "Blue" + $VM_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Host_Complete) + VM_to_Host + $VM_to_Host_Complete.Forecolor = "Green" + $VM_to_Host_Complete.Text = "Complete" + $TabDraw.Controls.Add($VM_to_Host_Complete) +} +if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Folder_Complete.Forecolor = "Blue" + $VM_to_Folder_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Folder_Complete) + VM_to_Folder + $VM_to_Folder_Complete.Forecolor = "Green" + $VM_to_Folder_Complete.Text = "Complete" +} +if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") +{ + $VMs_with_RDMs_Complete.Forecolor = "Blue" + $VMs_with_RDMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMs_with_RDMs_Complete) + VMs_with_RDMs + $VMs_with_RDMs_Complete.Forecolor = "Green" + $VMs_with_RDMs_Complete.Text = "Complete" +} +if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") +{ + $SRM_Protected_VMs_Complete.Forecolor = "Blue" + $SRM_Protected_VMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) + SRM_Protected_VMs + $SRM_Protected_VMs_Complete.Forecolor = "Green" + $SRM_Protected_VMs_Complete.Text = "Complete" +} +if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Datastore_Complete.Forecolor = "Blue" + $VM_to_Datastore_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Datastore_Complete) + VM_to_Datastore + $VM_to_Datastore_Complete.Forecolor = "Green" + $VM_to_Datastore_Complete.Text = "Complete" +} +if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") +{ + $VM_to_ResourcePool_Complete.Forecolor = "Blue" + $VM_to_ResourcePool_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) + VM_to_ResourcePool + $VM_to_ResourcePool_Complete.Forecolor = "Green" + $VM_to_ResourcePool_Complete.Text = "Complete" +} +if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") +{ + $Datastore_to_Host_Complete.Forecolor = "Blue" + $Datastore_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Datastore_to_Host_Complete) + Datastore_to_Host + $Datastore_to_Host_Complete.Forecolor = "Green" + $Datastore_to_Host_Complete.Text = "Complete" +} +if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") +{ + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" + $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) + PhysicalNIC_to_vSwitch + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" + $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" +} +if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VSS_to_Host_Complete.Forecolor = "Blue" + $VSS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSS_to_Host_Complete) + VSS_to_Host + $VSS_to_Host_Complete.Forecolor = "Green" + $VSS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VSS_Complete.Forecolor = "Blue" + $VMK_to_VSS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VSS_Complete) + VMK_to_VSS + $VMK_to_VSS_Complete.Forecolor = "Green" + $VMK_to_VSS_Complete.Text = "Complete" +} +if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VSSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) + VSSPortGroup_to_VM + $VSSPortGroup_to_VM_Complete.Forecolor = "Green" + $VSSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VDS_to_Host_Complete.Forecolor = "Blue" + $VDS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDS_to_Host_Complete) + VDS_to_Host + $VDS_to_Host_Complete.Forecolor = "Green" + $VDS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VDS_Complete.Forecolor = "Blue" + $VMK_to_VDS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VDS_Complete) + VMK_to_VDS + $VMK_to_VDS_Complete.Forecolor = "Green" + $VMK_to_VDS_Complete.Text = "Complete" +} +if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VDSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) + VDSPortGroup_to_VM + $VDSPortGroup_to_VM_Complete.Forecolor = "Green" + $VDSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") +{ + $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" + $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) + Cluster_to_DRS_Rule + $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" + $Cluster_to_DRS_Rule_Complete.Text = "Complete" +}; +$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) +$TabDraw.Controls.Add($DrawButton) +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton.Add_Click({Open_Final_Visio}) +$TabDraw.Controls.Add($OpenVisioButton) + +#endregion + +#region Event Loop + +function Main{ + [System.Windows.Forms.Application]::EnableVisualStyles() + [System.Windows.Forms.Application]::Run($vDiagram) +} + +#endregion + +#endregion + +#region Event Handlers + +#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect_vCenter_Main +{ + $MainVC = $MainVcenterTextBox.Text + $MainUser = $UserNameTextBox.Text + $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text +} + +function Connect_vCenter +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $User = $UserNameTextBox.Text + $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text +} + +function Disconnect_vCenter +{ + $Disconnect = Disconnect-ViServer * -Confirm:$false +} +#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Find_CaptureCsvFolder +{ + $CaptureCsvBrowseLoop = $True + while ($CaptureCsvBrowseLoop) + { + if ($CaptureCsvBrowse.ShowDialog() -eq "OK") + { + $CaptureCsvBrowseLoop = $False + } + else + { + $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($CaptureCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath +} + +function Check_CaptureCsvFolder +{ + $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $CheckContentDir = $CheckContentPath + "*.csv" + $CheckContent = Test-Path $CheckContentDir + if ($CheckContent -eq "True") + { + $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") + switch ($CheckContents_CaptureCsvFolder) { + 'Yes' + { + del $CheckContentDir + } + + 'No' + { + $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog + $CheckContentCsvBrowse.Description = "Select a directory to copy files to" + $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + $CheckContentCsvBrowse.ShowDialog() + $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath + copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder + del $CheckContentDir + } + } + } +} + +function Find_DrawCsvFolder +{ + $DrawCsvBrowseLoop = $True + while ($DrawCsvBrowseLoop) + { + if ($DrawCsvBrowse.ShowDialog() -eq "OK") + { + $DrawCsvBrowseLoop = $False + } + else + { + $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($DrawCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath +} + +function Find_DrawVisioFolder +{ + $VisioBrowseLoop = $True + while($VisioBrowseLoop) + { + if ($VisioBrowse.ShowDialog() -eq "OK") + { + $VisioBrowseLoop = $False + } + else + { + $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if($VisioBrowseRes -eq "Cancel") + { + return + } + } + } + $global:VisioFolder = $VisioBrowse.SelectedPath +} +#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function vCenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, + @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation + + if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) + { + $null + } + else + { + Disconnect_vCenter + } +} + +function Datacenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort-Object Name | + Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation +} + +function Cluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, + @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, + @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, + @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, + @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, + @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, + @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, + @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, + @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, + @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation +} + +function VmHost_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent + while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent + } + if ($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name } } }, + @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent + while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent + } + if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, + @{ N = "Version" ; E = { $_.Config.Product.Version } }, + @{ N = "Build" ; E = { $_.Config.Product.Build } }, + @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, + @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, + @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, + @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, + @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, + @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, + @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, + @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, + @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, + @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, + @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, + @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation +} + +function Vm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select-Object Name , + @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, + @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, + @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, + @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, + @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, + @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, + @{ N = "OS" ; E = { $_.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.Config.Version } }, + @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, + @{ N = 'Folder' ; E = { $Folder.Name } }, + @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, + @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, + @{ N = "IP" ; E = { $_.Guest.IpAddress } }, + @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, + @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, + @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, + @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation + } +} + +function Template_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + foreach ($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { $VmHost.name } }, + @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, + @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, + @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, + @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, + @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, + @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, + @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, + @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation + } +} + +function DatastoreCluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, + @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, + @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation +} + +function Datastore_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, + @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, + @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, + @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, + @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, + @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, + @{ N = "Accessible" ; E = { $_.State } }, + @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation +} + +function VsSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "Nic" ; E = { $_.Nic } }, + @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, + @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, + @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, + @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, + @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation +} + +function VssPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "VLanId" ; E = { $_.VLanId } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VssVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation + } + } + } +} + +function VssPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation + } + } +} + +function VdSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + foreach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "Vendor" ; E = { $_.Vendor } }, + @{ N = "Version" ; E = { $_.Version } }, + @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, + @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation + } +} + +function VdsPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, + @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, + @{ N = "NumPorts" ; E = { $_.NumPorts } }, + @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, + @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, + @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VdsVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation + + } + } +} + +function VdsPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | + Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch } }, + @{ N = "Portgroup" ; E = { $_.Portgroup } }, + @{ N = "ConnectedEntity" ; E = { $_.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation + } + } +} + +function Folder_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + foreach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -type VM | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation + } +} + +function Rdm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | + Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, + @{ N = "Vm" ; E = { $_.Parent } }, + @{ N = "Label" ; E = { $_.Name } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, + @{ N = "DiskType" ; E = { $_.DiskType } }, + @{ N = "Persistence" ; E = { $_.Persistence } }, + @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, + @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, + @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation +} + +function Drs_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation + } +} + +function Drs_Cluster_Group_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "GroupType" ; E = { $_.GroupType } }, + @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation + } +} + +function Drs_VmHost_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) + { + Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "VMGroup" ; E = { $_.VMGroup } }, + @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, + @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, + @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation + } + } +} + +function Resource_Pool_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) + { + Get-ResourcePool $ResourcePool | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Cluster" ; E = { $Cluster.Name } }, + @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, + @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, + @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, + @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, + @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, + @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, + @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, + @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, + @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, + @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation + } + } +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect-VisioObject($firstObj, $secondObj) +{ + $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) + $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) + $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) +} + +function Add-VisioObjectVC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectCluster($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHost($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectTemplate($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectSRM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDatastore($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHardDisk($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.ScsiCanonicalName + return $shpObj +} + +function Add-VisioObjectFolder($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVsSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVssPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVMK($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsClusterGroup($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDRSVMHostRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectResourcePool($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Create_Visio_Base +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $DocObj = $docsObj.Add("") + $DocObj.SaveAs($Savefile) + $AppVisio.Quit() +} + +function VM_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Host" + $Page = $DocsObj.Pages('VM to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Folder +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Folder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + $FolderImport = Import-Csv $FolderExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Folder" + $Page = $DocsObj.Pages('VM to Folder') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Folder') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Folder Object + $FolderObj = $stnObj.Masters.Item("Folder") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $FolderObject = Add-VisioObjectFolder $FolderObj $Folder + $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' + Connect-VisioObject $DatacenterObject $FolderObject + $y += 1.50 + + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $FolderObject $TemplateObject + $FolderObject = $TemplateObject + } + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $FolderObject $VMObject + $FolderObject = $VMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMs_with_RDMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + # RDM's + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + $RdmImport = Import-Csv $RdmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" + $Page = $DocsObj.Pages('VM w/ RDMs') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM w/ RDMs') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # RDM Object + $RDMObj = $stnObj.Masters.Item("RDM") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ClusterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 3.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatacenterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 2.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function SRM_Protected_VMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "SRM VM" + $Page = $DocsObj.Pages('SRM VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('SRM VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # SRM Protected VM Object + $SRMObj = $stnObj.Masters.Item("SRM Protected Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Datastore +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Datastore" + $Page = $DocsObj.Pages('VM to Datastore') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Datastore') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $ClusterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $ClusterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_ResourcePool +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # ResourcePool + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + $ResourcePoolImport = Import-Csv $ResourcePoolExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" + $Page = $DocsObj.Pages('VM to Resource Pool') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Resource Pool') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Resource Pool Object + $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool + # Name + $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' + # Cluster + $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' + # CpuSharesLevel + $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' + # NumCpuShares + $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' + # CpuReservationMHz + $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' + # CpuExpandableReservation + $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' + # CpuLimitMHz + $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' + # MemSharesLevel + $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' + # NumMemShares + $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' + # MemReservationGB + $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' + # MemExpandableReservation + $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' + # MemLimitGB + $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' + Connect-VisioObject $ClusterObject $ResourcePoolObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ResourcePoolObject $VMObject + $ResourcePoolObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Datastore_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Datastore to Host" + $Page = $DocsObj.Pages('Datastore to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Datastore to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function PhysicalNIC_to_vSwitch +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "PNIC to switch" + $Page = $DocsObj.Pages('PNIC to Switch') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('PNIC to Switch') + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + $y += 1.50 + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSS to Host" + $Page = $DocsObj.Pages('VSS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VSS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VSS" + $Page = $DocsObj.Pages('VMK to VSS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VSS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" + $Page = $DocsObj.Pages('VSSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDS to Host" + $Page = $DocsObj.Pages('VDS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VDS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VDS" + $Page = $DocsObj.Pages('VMK to VDS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VDS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" + $Page = $DocsObj.Pages('VDSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $DatacenterObject $VdSwitchObject + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x = 6.00 + $y += 1.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VPGObject $VMObject + $VPGObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Cluster_to_DRS_Rule +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # DRS Rule + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + $DrsRuleImport = Import-Csv $DrsRuleExportFile + # DRS Cluster Group + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile + # DRS VmHost Rule + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" + $Page = $DocsObj.Pages('Cluster to DRS Rule') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Cluster to DRS Rule') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # DRS Rule + $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") + # DRS Cluster Group + $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") + # DRS Host Rule + $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") + # Microsoft VM Object + $MSObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LXObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + $y += 1.50 + + foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule + # Name + $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' + # VM Affinity + $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' + # DRS Rule Enabled + $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' + # DRS Rule Mandatory + $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' + Connect-VisioObject $ClusterObject $DRSObject + #$ClusterObject = $DRSObject + $y += 1.50 + } + foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule + # Name + $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' + # Enabled + $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' + # Type + $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' + # VMGroup + $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' + # VMHostGroup + $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' + # AffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' + # AntiAffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' + Connect-VisioObject $ClusterObject $DRSVMHostRuleObject + $y += 1.50 + #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject + #$DrsClusterGroupObject = $DRSVMHostRuleObject + + foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) + { + $x += 2.50 + $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup + # Name + $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' + # GroupType + $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' + # Members + $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' + Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject + $DRSVMHostRuleObject = $DrsClusterGroupObject + + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Open_Final_Visio +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.Application + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null +} + +Main + #endregion \ No newline at end of file From 4336df0106523d96441745a94032c205bfeae7cd Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Mon, 16 Apr 2018 23:19:54 -0400 Subject: [PATCH 10/19] Delete vDiagram_2.0.1.ps1 --- vDiagram_2.0.1/vDiagram_2.0.1.ps1 | 8807 ----------------------------- 1 file changed, 8807 deletions(-) delete mode 100644 vDiagram_2.0.1/vDiagram_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 deleted file mode 100644 index fbb9c51..0000000 --- a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 +++ /dev/null @@ -1,8807 +0,0 @@ -<# -.SYNOPSIS - vDiagram Visio Drawing Tool - -.DESCRIPTION - vDiagram Visio Drawing Tool - -.NOTES - File Name : vDiagram2.0.1.ps1 - Author : Tony Gonzalez - Author : Jason Hopkins - Based on : vDiagram by Alan Renouf - Version : 2.0.0 - -.USAGE NOTES - Ensure to unblock files before unzipping - Ensure to run as administrator - Required Files: - PowerCLI or PowerShell 5.0 with PowerCLI Modules installed - Active connection to vCenter to capture data - MS Visio - -.CHANGE LOG - - 04/12/2018 - v2.0.1 - Added MAC Addresses to VMs & Templates - Added a check to see if prior CSVs are still present - Added option to copy prior CSVs to new folder - - - 04/11/2018 - v2.0.0 - Presented as a Community Theater Session at South Florida VMUG - Feature enhancement requests collected -#> - -#region ScriptForm Designer - -#region Constructor - -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") -[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") -#endregion - -#region Post-Constructor Custom Code -$MyVer = "2.0.1" -$LastUpdated = "April 12, 2018" -$About = -@" - - vDiagram $MyVer - - Contributors: Tony Gonzalez of RoundTower Technologies LLC - Jason Hopkins of RoundTower Technologies LLC - - Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram - - Created: February 13, 2018 - - Last Updated: $LastUpdated - -"@ -#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" -if (!(Test-Path $TestShapes)) -{ - $CurrentLocation = Get-Location - copy $CurrentLocation\vDiagram.vssx $TestShapes - Write-Host "Copying Shapes File to My Shapes" -} -$shpFile = "\vDiagram.vssx" -#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Set_WindowStyle { -param( - [Parameter()] - [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', - 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', - 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] - $Style = 'SHOW', - [Parameter()] - $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle -) - $WindowStates = @{ - FORCEMINIMIZE = 11; HIDE = 0 - MAXIMIZE = 3; MINIMIZE = 6 - RESTORE = 9; SHOW = 5 - SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 - SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 - SHOWNA = 8; SHOWNOACTIVATE = 4 - SHOWNORMAL = 1 - } - Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) - - $Win32ShowWindowAsync = Add-Type –memberDefinition @” - [DllImport("user32.dll")] - public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); -“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru - - $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null -} -Set_WindowStyle MINIMIZE -#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function About_Config -{ - - $About - - #Add objects for About - $AboutForm = New-Object System.Windows.Forms.Form - $AboutTextBox = New-Object System.Windows.Forms.RichTextBox - - #About Form - $AboutForm.Icon = $Icon - $AboutForm.AutoScroll = $True - $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) - $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutForm.Name = "About" - $AboutForm.StartPosition = 1 - $AboutForm.Text = "About vDiagram $MyVer" - - $AboutTextBox.Anchor = 15 - $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) - $AboutTextBox.BorderStyle = 0 - $AboutTextBox.Font = "Tahoma" - $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) - $AboutTextBox.Name = "AboutTextBox" - $AboutTextBox.ReadOnly = $True - $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) - $AboutTextBox.Text = $About - - $AboutForm.Controls.Add($AboutTextBox) - - $AboutForm.Show() | Out-Null -} -#endregion - -#region Form Creation -#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vDiagram = New-Object System.Windows.Forms.Form -$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) -$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") -$vDiagram.Icon = $Icon -$vDiagram.Text = "vDiagram 2.0" -$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan -#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainMenu = New-Object System.Windows.Forms.MenuStrip -$MainMenu.Location = New-Object System.Drawing.Point(0, 0) -$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) -$MainMenu.TabIndex = 1 -$MainMenu.Text = "MainMenu" -#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) -$FileToolStripMenuItem.Text = "File" -#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) -$ExitToolStripMenuItem.Text = "Exit" -$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) -$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) -#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) -$HelpToolStripMenuItem.Text = "Help" -#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) -$AboutToolStripMenuItem.Text = "About" -$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) -$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) -$AboutToolStripMenuItem.Add_Click({About_Config}) -#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainTab = New-Object System.Windows.Forms.TabControl -$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) -$MainTab.Location = New-Object System.Drawing.Point(10, 30) -$MainTab.Size = New-Object System.Drawing.Size(990, 98) -$MainTab.TabIndex = 0 -$MainTab.Text = "MainTabs" -#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Prerequisites = New-Object System.Windows.Forms.TabPage -$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) -$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) -$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) -$Prerequisites.TabIndex = 0 -$Prerequisites.Text = "Prerequisites" -$Prerequisites.BackColor = [System.Drawing.Color]::LightGray -#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellLabel = New-Object System.Windows.Forms.Label -$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) -$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) -$PowershellLabel.TabIndex = 1 -$PowershellLabel.Text = "Powershell:" -#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellInstalled = New-Object System.Windows.Forms.Label -$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) -$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) -$PowershellInstalled.TabIndex = 2 -$PowershellInstalled.Text = "" -$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleLabel = New-Object System.Windows.Forms.Label -$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) -$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) -$PowerCliModuleLabel.TabIndex = 3 -$PowerCliModuleLabel.Text = "PowerCLI Module:" -#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label -$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) -$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) -$PowerCliModuleInstalled.TabIndex = 4 -$PowerCliModuleInstalled.Text = "" -$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliLabel = New-Object System.Windows.Forms.Label -$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) -$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) -$PowerCliLabel.TabIndex = 5 -$PowerCliLabel.Text = "PowerCLI:" -#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliInstalled = New-Object System.Windows.Forms.Label -$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) -$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) -$PowerCliInstalled.TabIndex = 6 -$PowerCliInstalled.Text = "" -$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioLabel = New-Object System.Windows.Forms.Label -$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) -$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) -$VisioLabel.TabIndex = 7 -$VisioLabel.Text = "Visio:" -#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioInstalled = New-Object System.Windows.Forms.Label -$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) -$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) -$VisioInstalled.TabIndex = 8 -$VisioInstalled.Text = "" -$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray -$Prerequisites.Controls.Add($PowershellLabel) -$Prerequisites.Controls.Add($PowershellInstalled) -$Prerequisites.Controls.Add($PowerCliModuleLabel) -$Prerequisites.Controls.Add($PowerCliModuleInstalled) -$Prerequisites.Controls.Add($PowerCliLabel) -$Prerequisites.Controls.Add($PowerCliInstalled) -$Prerequisites.Controls.Add($VisioLabel) -$Prerequisites.Controls.Add($VisioInstalled) -#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfo = New-Object System.Windows.Forms.TabPage -$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) -$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) -$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) -$vCenterInfo.TabIndex = 0 -$vCenterInfo.Text = "vCenter Info" -$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray -#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterLabel = New-Object System.Windows.Forms.Label -$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) -$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) -$MainVcenterLabel.TabIndex = 1 -$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" -#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox -$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) -$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) -$MainVcenterTextBox.TabIndex = 2 -$MainVcenterTextBox.Text = "" -#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterLabel = New-Object System.Windows.Forms.Label -$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) -$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) -$TargetVcenterLabel.TabIndex = 3 -$TargetVcenterLabel.Text = "Name of target vCenter:" -#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox -$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) -$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) -$TargetVcenterTextBox.TabIndex = 4 -$TargetVcenterTextBox.Text = "" -#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameLabel = New-Object System.Windows.Forms.Label -$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) -$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) -$UserNameLabel.TabIndex = 5 -$UserNameLabel.Text = "vCenter User Name:" -#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameTextBox = New-Object System.Windows.Forms.TextBox -$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) -$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) -$UserNameTextBox.TabIndex = 6 -$UserNameTextBox.Text = "" -#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordLabel = New-Object System.Windows.Forms.Label -$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) -$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) -$PasswordLabel.TabIndex = 7 -$PasswordLabel.Text = "Password:" -#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordTextBox = New-Object System.Windows.Forms.TextBox -$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) -$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) -$PasswordTextBox.TabIndex = 8 -$PasswordTextBox.Text = "" -$PasswordTextBox.UseSystemPasswordChar = $true -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton = New-Object System.Windows.Forms.Button -$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) -$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) -$ConnectButton.TabIndex = 9 -$ConnectButton.Text = "Connect to vCenter" -$ConnectButton.UseVisualStyleBackColor = $true -$vCenterInfo.Controls.Add($MainVcenterLabel) -$vCenterInfo.Controls.Add($MainVcenterTextBox) -$vCenterInfo.Controls.Add($TargetVcenterLabel) -$vCenterInfo.Controls.Add($TargetVcenterTextBox) -$vCenterInfo.Controls.Add($UserNameLabel) -$vCenterInfo.Controls.Add($UserNameTextBox) -$vCenterInfo.Controls.Add($PasswordLabel) -$vCenterInfo.Controls.Add($PasswordTextBox) -$vCenterInfo.Controls.Add($ConnectButton) -$MainTab.Controls.Add($Prerequisites) -$MainTab.Controls.Add($vCenterInfo) -$MainTab.SelectedIndex = 0 -#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SubTab = New-Object System.Windows.Forms.TabControl -$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$SubTab.Location = New-Object System.Drawing.Point(10, 136) -$SubTab.Size = New-Object System.Drawing.Size(990, 512) -$SubTab.TabIndex = 0 -$SubTab.Text = "SubTabs" -#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDirections = New-Object System.Windows.Forms.TabPage -$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDirections.Location = New-Object System.Drawing.Point(4, 22) -$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDirections.Size = New-Object System.Drawing.Size(982, 486) -$TabDirections.TabIndex = 0 -$TabDirections.Text = "Directions" -$TabDirections.UseVisualStyleBackColor = $true -#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesHeading = New-Object System.Windows.Forms.Label -$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) -$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) -$PrerequisitesHeading.TabIndex = 0 -$PrerequisitesHeading.Text = "Prerequisites Tab" -#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesDirections = New-Object System.Windows.Forms.Label -$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) -$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) -$PrerequisitesDirections.TabIndex = 1 -$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." -#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoHeading = New-Object System.Windows.Forms.Label -$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) -$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) -$vCenterInfoHeading.TabIndex = 2 -$vCenterInfoHeading.Text = "vCenter Info Tab" -#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoDirections = New-Object System.Windows.Forms.Label -$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) -$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) -$vCenterInfoDirections.TabIndex = 3 -$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." -#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvHeading = New-Object System.Windows.Forms.Label -$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) -$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) -$CaptureCsvHeading.TabIndex = 4 -$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" -#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureDirections = New-Object System.Windows.Forms.Label -$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) -$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) -$CaptureDirections.TabIndex = 5 -$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." -#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawHeading = New-Object System.Windows.Forms.Label -$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) -$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) -$DrawHeading.TabIndex = 6 -$DrawHeading.Text = "Draw Visio Tab" -#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawDirections = New-Object System.Windows.Forms.Label -$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) -$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) -$DrawDirections.TabIndex = 7 -$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." -$TabDirections.Controls.Add($PrerequisitesHeading) -$TabDirections.Controls.Add($PrerequisitesDirections) -$TabDirections.Controls.Add($vCenterInfoHeading) -$TabDirections.Controls.Add($vCenterInfoDirections) -$TabDirections.Controls.Add($CaptureCsvHeading) -$TabDirections.Controls.Add($CaptureDirections) -$TabDirections.Controls.Add($DrawHeading) -$TabDirections.Controls.Add($DrawDirections) -#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabCapture = New-Object System.Windows.Forms.TabPage -$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabCapture.Location = New-Object System.Drawing.Point(4, 22) -$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) -$TabCapture.Size = New-Object System.Drawing.Size(982, 486) -$TabCapture.TabIndex = 3 -$TabCapture.Text = "Capture CSVs for Visio" -$TabCapture.UseVisualStyleBackColor = $true -#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label -$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) -$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) -$CaptureCsvOutputLabel.TabIndex = 0 -$CaptureCsvOutputLabel.Text = "CSV Output Folder:" -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button -$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) -$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) -$CaptureCsvOutputButton.TabIndex = 0 -$CaptureCsvOutputButton.Text = "Select Output Folder" -$CaptureCsvOutputButton.UseVisualStyleBackColor = $false -$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$vCenterCsvCheckBox.Checked = $true -$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$vCenterCsvCheckBox.TabIndex = 1 -$vCenterCsvCheckBox.Text = "Export vCenter Info" -$vCenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) -$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationComplete.TabIndex = 26 -$vCenterCsvValidationComplete.Text = "" -#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatacenterCsvCheckBox.Checked = $true -$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatacenterCsvCheckBox.TabIndex = 2 -$DatacenterCsvCheckBox.Text = "Export Datacenter Info" -$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) -$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationComplete.TabIndex = 27 -$DatacenterCsvValidationComplete.Text = "" -#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ClusterCsvCheckBox.Checked = $true -$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ClusterCsvCheckBox.TabIndex = 3 -$ClusterCsvCheckBox.Text = "Export Cluster Info" -$ClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) -$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationComplete.TabIndex = 28 -$ClusterCsvValidationComplete.Text = "" -#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmHostCsvCheckBox.Checked = $true -$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmHostCsvCheckBox.TabIndex = 4 -$VmHostCsvCheckBox.Text = "Export VmHost Info" -$VmHostCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) -$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationComplete.TabIndex = 29 -$VmHostCsvValidationComplete.Text = "" -#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmCsvCheckBox.Checked = $true -$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmCsvCheckBox.TabIndex = 5 -$VmCsvCheckBox.Text = "Export Vm Info" -$VmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) -$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationComplete.TabIndex = 30 -$VmCsvValidationComplete.Text = "" -#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$TemplateCsvCheckBox.Checked = $true -$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$TemplateCsvCheckBox.TabIndex = 6 -$TemplateCsvCheckBox.Text = "Export Template Info" -$TemplateCsvCheckBox.UseVisualStyleBackColor = $true -#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label -$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) -$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationComplete.TabIndex = 31 -$TemplateCsvValidationComplete.Text = "" -#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreClusterCsvCheckBox.Checked = $true -$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreClusterCsvCheckBox.TabIndex = 7 -$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" -$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) -$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationComplete.TabIndex = 32 -$DatastoreClusterCsvValidationComplete.Text = "" -#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreCsvCheckBox.Checked = $true -$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreCsvCheckBox.TabIndex = 8 -$DatastoreCsvCheckBox.Text = "Export Datastore Info" -$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) -$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationComplete.TabIndex = 33 -$DatastoreCsvValidationComplete.Text = "" -#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VsSwitchCsvCheckBox.Checked = $true -$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) -$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VsSwitchCsvCheckBox.TabIndex = 9 -$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" -$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) -$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationComplete.TabIndex = 34 -$VsSwitchCsvValidationComplete.Text = "" -#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPortGroupCsvCheckBox.Checked = $true -$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) -$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPortGroupCsvCheckBox.TabIndex = 10 -$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" -$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) -$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationComplete.TabIndex = 35 -$VssPortGroupCsvValidationComplete.Text = "" -#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssVmkernelCsvCheckBox.Checked = $true -$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) -$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssVmkernelCsvCheckBox.TabIndex = 11 -$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" -$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) -$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationComplete.TabIndex = 36 -$VssVmkernelCsvValidationComplete.Text = "" -#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPnicCsvCheckBox.Checked = $true -$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) -$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPnicCsvCheckBox.TabIndex = 12 -$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" -$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) -$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationComplete.TabIndex = 37 -$VssPnicCsvValidationComplete.Text = "" -#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdSwitchCsvCheckBox.Checked = $true -$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) -$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdSwitchCsvCheckBox.TabIndex = 13 -$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" -$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) -$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationComplete.TabIndex = 38 -$VdSwitchCsvValidationComplete.Text = "" -#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPortGroupCsvCheckBox.Checked = $true -$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) -$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPortGroupCsvCheckBox.TabIndex = 14 -$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" -$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) -$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationComplete.TabIndex = 39 -$VdsPortGroupCsvValidationComplete.Text = "" -#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsVmkernelCsvCheckBox.Checked = $true -$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) -$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsVmkernelCsvCheckBox.TabIndex = 15 -$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" -$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) -$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationComplete.TabIndex = 40 -$VdsVmkernelCsvValidationComplete.Text = "" -#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPnicCsvCheckBox.Checked = $true -$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) -$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPnicCsvCheckBox.TabIndex = 16 -$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" -$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) -$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationComplete.TabIndex = 41 -$VdsPnicCsvValidationComplete.Text = "" -#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$FolderCsvCheckBox.Checked = $true -$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) -$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$FolderCsvCheckBox.TabIndex = 17 -$FolderCsvCheckBox.Text = "Export Folder Info" -$FolderCsvCheckBox.UseVisualStyleBackColor = $true -#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label -$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) -$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationComplete.TabIndex = 42 -$FolderCsvValidationComplete.Text = "" -#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$RdmCsvCheckBox.Checked = $true -$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) -$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$RdmCsvCheckBox.TabIndex = 18 -$RdmCsvCheckBox.Text = "Export RDM Info" -$RdmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label -$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) -$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationComplete.TabIndex = 43 -$RdmCsvValidationComplete.Text = "" -#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsRuleCsvCheckBox.Checked = $true -$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) -$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsRuleCsvCheckBox.TabIndex = 19 -$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" -$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) -$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationComplete.TabIndex = 44 -$DrsRuleCsvValidationComplete.Text = "" -#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsClusterGroupCsvCheckBox.Checked = $true -$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) -$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsClusterGroupCsvCheckBox.TabIndex = 20 -$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" -$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) -$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationComplete.TabIndex = 45 -$DrsClusterGroupCsvValidationComplete.Text = "" -#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsVmHostRuleCsvCheckBox.Checked = $true -$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) -$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsVmHostRuleCsvCheckBox.TabIndex = 21 -$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" -$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) -$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 -$DrsVmHostRuleCsvValidationComplete.Text = "" -#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ResourcePoolCsvCheckBox.Checked = $true -$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) -$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ResourcePoolCsvCheckBox.TabIndex = 22 -$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" -$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) -$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationComplete.TabIndex = 47 -$ResourcePoolCsvValidationComplete.Text = "" -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton = New-Object System.Windows.Forms.Button -$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) -$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureUncheckButton.TabIndex = 23 -$CaptureUncheckButton.Text = "Uncheck All" -$CaptureUncheckButton.UseVisualStyleBackColor = $false -$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton = New-Object System.Windows.Forms.Button -$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) -$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureCheckButton.TabIndex = 24 -$CaptureCheckButton.Text = "Check All" -$CaptureCheckButton.UseVisualStyleBackColor = $false -$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton = New-Object System.Windows.Forms.Button -$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) -$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureButton.TabIndex = 25 -$CaptureButton.Text = "Collect CSV Data" -$CaptureButton.UseVisualStyleBackColor = $false -$CaptureButton.BackColor = [System.Drawing.Color]::LightGray -$TabCapture.Controls.Add($CaptureCsvOutputLabel) -$TabCapture.Controls.Add($CaptureCsvOutputButton) -$TabCapture.Controls.Add($vCenterCsvCheckBox) -$TabCapture.Controls.Add($vCenterCsvValidationComplete) -$TabCapture.Controls.Add($DatacenterCsvCheckBox) -$TabCapture.Controls.Add($DatacenterCsvValidationComplete) -$TabCapture.Controls.Add($ClusterCsvCheckBox) -$TabCapture.Controls.Add($ClusterCsvValidationComplete) -$TabCapture.Controls.Add($VmHostCsvCheckBox) -$TabCapture.Controls.Add($VmHostCsvValidationComplete) -$TabCapture.Controls.Add($VmCsvCheckBox) -$TabCapture.Controls.Add($VmCsvValidationComplete) -$TabCapture.Controls.Add($TemplateCsvCheckBox) -$TabCapture.Controls.Add($TemplateCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) -$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreCsvCheckBox) -$TabCapture.Controls.Add($DatastoreCsvValidationComplete) -$TabCapture.Controls.Add($VsSwitchCsvCheckBox) -$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VssPnicCsvCheckBox) -$TabCapture.Controls.Add($VssPnicCsvValidationComplete) -$TabCapture.Controls.Add($VdSwitchCsvCheckBox) -$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VdsPnicCsvCheckBox) -$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) -$TabCapture.Controls.Add($FolderCsvCheckBox) -$TabCapture.Controls.Add($FolderCsvValidationComplete) -$TabCapture.Controls.Add($RdmCsvCheckBox) -$TabCapture.Controls.Add($RdmCsvValidationComplete) -$TabCapture.Controls.Add($DrsRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) -$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) -$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) -$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) -$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) -$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) -$TabCapture.Controls.Add($CaptureUncheckButton) -$TabCapture.Controls.Add($CaptureCheckButton) -$TabCapture.Controls.Add($CaptureButton) -#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDraw = New-Object System.Windows.Forms.TabPage -$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDraw.Location = New-Object System.Drawing.Point(4, 22) -$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDraw.Size = New-Object System.Drawing.Size(982, 486) -$TabDraw.TabIndex = 2 -$TabDraw.Text = "Draw Visio" -$TabDraw.UseVisualStyleBackColor = $true -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton = New-Object System.Windows.Forms.Button -$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) -$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) -$OpenVisioButton.TabIndex = 83 -$OpenVisioButton.Text = "Open Visio Drawing" -$OpenVisioButton.UseVisualStyleBackColor = $false -$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton = New-Object System.Windows.Forms.Button -$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) -$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawCheckButton.TabIndex = 82 -$DrawCheckButton.Text = "Check All" -$DrawCheckButton.UseVisualStyleBackColor = $false -$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton = New-Object System.Windows.Forms.Button -$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawButton.Location = New-Object System.Drawing.Point(448, 450) -$DrawButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawButton.TabIndex = 81 -$DrawButton.Text = "Draw Visio" -$DrawButton.UseVisualStyleBackColor = $false -$DrawButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton = New-Object System.Windows.Forms.Button -$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) -$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawUncheckButton.TabIndex = 80 -$DrawUncheckButton.Text = "Uncheck All" -$DrawUncheckButton.UseVisualStyleBackColor = $false -$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOutputLabel = New-Object System.Windows.Forms.Label -$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) -$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) -$VisioOutputLabel.TabIndex = 46 -$VisioOutputLabel.Text = "Visio Output Folder:" -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton = New-Object System.Windows.Forms.Button -$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) -$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) -$VisioOpenOutputButton.TabIndex = 47 -$VisioOpenOutputButton.Text = "Select Visio Output Folder" -$VisioOpenOutputButton.UseVisualStyleBackColor = $false -$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputLabel = New-Object System.Windows.Forms.Label -$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) -$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) -$DrawCsvInputLabel.TabIndex = 0 -$DrawCsvInputLabel.Text = "CSV Input Folder:" -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton = New-Object System.Windows.Forms.Button -$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) -$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) -$DrawCsvInputButton.TabIndex = 1 -$DrawCsvInputButton.Text = "Select CSV Input Folder" -$DrawCsvInputButton.UseVisualStyleBackColor = $false -$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidation = New-Object System.Windows.Forms.Label -$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$vCenterCsvValidation.TabIndex = 2 -$vCenterCsvValidation.Text = "vCenter CSV File:" -#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) -$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationCheck.TabIndex = 3 -$vCenterCsvValidationCheck.Text = "" -#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidation = New-Object System.Windows.Forms.Label -$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatacenterCsvValidation.TabIndex = 4 -$DatacenterCsvValidation.Text = "Datacenter CSV File:" -#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) -$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationCheck.TabIndex = 5 -$DatacenterCsvValidationCheck.Text = "" -#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidation = New-Object System.Windows.Forms.Label -$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ClusterCsvValidation.TabIndex = 6 -$ClusterCsvValidation.Text = "Cluster CSV File:" -#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) -$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationCheck.TabIndex = 7 -$ClusterCsvValidationCheck.Text = "" -#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidation = New-Object System.Windows.Forms.Label -$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmHostCsvValidation.TabIndex = 8 -$VmHostCsvValidation.Text = "VmHost CSV File:" -#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) -$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationCheck.TabIndex = 9 -$VmHostCsvValidationCheck.Text = "" -#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidation = New-Object System.Windows.Forms.Label -$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmCsvValidation.TabIndex = 10 -$VmCsvValidation.Text = "VM CSV File:" -#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) -$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationCheck.TabIndex = 11 -$VmCsvValidationCheck.Text = "" -#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidation = New-Object System.Windows.Forms.Label -$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$TemplateCsvValidation.TabIndex = 12 -$TemplateCsvValidation.Text = "Template CSV File:" -#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label -$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) -$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationCheck.TabIndex = 13 -$TemplateCsvValidationCheck.Text = "" -#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreClusterCsvValidation.TabIndex = 14 -$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" -#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) -$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationCheck.TabIndex = 15 -$DatastoreClusterCsvValidationCheck.Text = "" -#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreCsvValidation.TabIndex = 16 -$DatastoreCsvValidation.Text = "Datastore CSV File:" -#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) -$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationCheck.TabIndex = 17 -$DatastoreCsvValidationCheck.Text = "" -#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) -$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VsSwitchCsvValidation.TabIndex = 18 -$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" -#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) -$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationCheck.TabIndex = 19 -$VsSwitchCsvValidationCheck.Text = "" -#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) -$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPortGroupCsvValidation.TabIndex = 20 -$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" -#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) -$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationCheck.TabIndex = 21 -$VssPortGroupCsvValidationCheck.Text = "" -#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) -$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssVmkernelCsvValidation.TabIndex = 22 -$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" -#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) -$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationCheck.TabIndex = 23 -$VssVmkernelCsvValidationCheck.Text = "" -#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidation = New-Object System.Windows.Forms.Label -$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) -$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPnicCsvValidation.TabIndex = 24 -$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" -#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) -$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationCheck.TabIndex = 25 -$VssPnicCsvValidationCheck.Text = "" -#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) -$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdSwitchCsvValidation.TabIndex = 26 -$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" -#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) -$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationCheck.TabIndex = 27 -$VdSwitchCsvValidationCheck.Text = "" -#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) -$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPortGroupCsvValidation.TabIndex = 28 -$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" -#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) -$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationCheck.TabIndex = 29 -$VdsPortGroupCsvValidationCheck.Text = "" -#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) -$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsVmkernelCsvValidation.TabIndex = 30 -$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" -#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) -$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationCheck.TabIndex = 31 -$VdsVmkernelCsvValidationCheck.Text = "" -#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) -$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPnicCsvValidation.TabIndex = 32 -$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" -#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) -$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationCheck.TabIndex = 33 -$VdsPnicCsvValidationCheck.Text = "" -#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidation = New-Object System.Windows.Forms.Label -$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) -$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$FolderCsvValidation.TabIndex = 34 -$FolderCsvValidation.Text = "Folder CSV File:" -#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label -$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) -$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationCheck.TabIndex = 35 -$FolderCsvValidationCheck.Text = "" -#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidation = New-Object System.Windows.Forms.Label -$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) -$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$RdmCsvValidation.TabIndex = 36 -$RdmCsvValidation.Text = "RDM CSV File:" -#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label -$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) -$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationCheck.TabIndex = 37 -$RdmCsvValidationCheck.Text = "" -#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) -$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsRuleCsvValidation.TabIndex = 38 -$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" -#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) -$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationCheck.TabIndex = 39 -$DrsRuleCsvValidationCheck.Text = "" -#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) -$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsClusterGroupCsvValidation.TabIndex = 40 -$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" -#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) -$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationCheck.TabIndex = 41 -$DrsClusterGroupCsvValidationCheck.Text = "" -#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) -$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsVmHostRuleCsvValidation.TabIndex = 42 -$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" -#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) -$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 -$DrsVmHostRuleCsvValidationCheck.Text = "" -#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) -$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ResourcePoolCsvValidation.TabIndex = 44 -$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" -#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) -$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationCheck.TabIndex = 45 -$ResourcePoolCsvValidationCheck.Text = "" -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton = New-Object System.Windows.Forms.Button -$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) -$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) -$CsvValidationButton.TabIndex = 2 -$CsvValidationButton.Text = "Check for CSVs" -$CsvValidationButton.UseVisualStyleBackColor = $false -$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Host_DrawCheckBox.Checked = $true -$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) -$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Host_DrawCheckBox.TabIndex = 48 -$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" -$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_Complete = New-Object System.Windows.Forms.Label -$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) -$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Host_Complete.TabIndex = 49 -$VM_to_Host_Complete.Text = "" -#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Folder_DrawCheckBox.Checked = $true -$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) -$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Folder_DrawCheckBox.TabIndex = 50 -$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" -$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label -$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) -$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Folder_Complete.TabIndex = 51 -$VM_to_Folder_Complete.Text = "" -#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMs_with_RDMs_DrawCheckBox.Checked = $true -$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) -$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 -$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" -$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label -$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) -$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMs_with_RDMs_Complete.TabIndex = 53 -$VMs_with_RDMs_Complete.Text = "" -#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$SRM_Protected_VMs_DrawCheckBox.Checked = $true -$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) -$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 -$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" -$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label -$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) -$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$SRM_Protected_VMs_Complete.TabIndex = 55 -$SRM_Protected_VMs_Complete.Text = "" -#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Datastore_DrawCheckBox.Checked = $true -$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) -$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Datastore_DrawCheckBox.TabIndex = 56 -$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" -$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label -$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) -$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Datastore_Complete.TabIndex = 57 -$VM_to_Datastore_Complete.Text = "" -#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_ResourcePool_DrawCheckBox.Checked = $true -$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) -$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 -$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" -$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label -$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) -$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_ResourcePool_Complete.TabIndex = 59 -$VM_to_ResourcePool_Complete.Text = "" -#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Datastore_to_Host_DrawCheckBox.Checked = $true -$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) -$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$Datastore_to_Host_DrawCheckBox.TabIndex = 60 -$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" -$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label -$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) -$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Datastore_to_Host_Complete.TabIndex = 61 -$Datastore_to_Host_Complete.Text = "" -#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true -$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) -$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 -$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" -$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label -$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) -$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) -$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 -$PhysicalNIC_to_vSwitch_Complete.Text = "" -#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSS_to_Host_DrawCheckBox.Checked = $true -$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) -$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSS_to_Host_DrawCheckBox.TabIndex = 64 -$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" -$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) -$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSS_to_Host_Complete.TabIndex = 65 -$VSS_to_Host_Complete.Text = "" -#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VSS_DrawCheckBox.Checked = $true -$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) -$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VSS_DrawCheckBox.TabIndex = 66 -$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" -$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) -$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VSS_Complete.TabIndex = 67 -$VMK_to_VSS_Complete.Text = "" -#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) -$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 -$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" -$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) -$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSSPortGroup_to_VM_Complete.TabIndex = 69 -$VSSPortGroup_to_VM_Complete.Text = "" -#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDS_to_Host_DrawCheckBox.Checked = $true -$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) -$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDS_to_Host_DrawCheckBox.TabIndex = 70 -$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" -$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) -$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDS_to_Host_Complete.TabIndex = 71 -$VDS_to_Host_Complete.Text = "" -#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VDS_DrawCheckBox.Checked = $true -$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) -$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VDS_DrawCheckBox.TabIndex = 72 -$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" -$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) -$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VDS_Complete.TabIndex = 73 -$VMK_to_VDS_Complete.Text = "" -#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) -$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 -$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" -$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) -$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDSPortGroup_to_VM_Complete.TabIndex = 75 -$VDSPortGroup_to_VM_Complete.Text = "" -#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true -$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) -$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 -$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" -$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label -$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) -$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Cluster_to_DRS_Rule_Complete.TabIndex = 77 -$Cluster_to_DRS_Rule_Complete.Text = "" - -$TabDraw.Controls.Add($OpenVisioButton) -$TabDraw.Controls.Add($DrawCheckButton) -$TabDraw.Controls.Add($DrawButton) -$TabDraw.Controls.Add($DrawUncheckButton) -$TabDraw.Controls.Add($VisioOutputLabel) -$TabDraw.Controls.Add($VisioOpenOutputButton) -$TabDraw.Controls.Add($DrawCsvInputLabel) -$TabDraw.Controls.Add($DrawCsvInputButton) -$TabDraw.Controls.Add($vCenterCsvValidation) -$TabDraw.Controls.Add($vCenterCsvValidationCheck) -$TabDraw.Controls.Add($DatacenterCsvValidation) -$TabDraw.Controls.Add($DatacenterCsvValidationCheck) -$TabDraw.Controls.Add($ClusterCsvValidation) -$TabDraw.Controls.Add($ClusterCsvValidationCheck) -$TabDraw.Controls.Add($VmHostCsvValidation) -$TabDraw.Controls.Add($VmHostCsvValidationCheck) -$TabDraw.Controls.Add($VmCsvValidation) -$TabDraw.Controls.Add($VmCsvValidationCheck) -$TabDraw.Controls.Add($TemplateCsvValidation) -$TabDraw.Controls.Add($TemplateCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreClusterCsvValidation) -$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreCsvValidation) -$TabDraw.Controls.Add($DatastoreCsvValidationCheck) -$TabDraw.Controls.Add($VsSwitchCsvValidation) -$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VssPortGroupCsvValidation) -$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VssVmkernelCsvValidation) -$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VssPnicCsvValidation) -$TabDraw.Controls.Add($VssPnicCsvValidationCheck) -$TabDraw.Controls.Add($VdSwitchCsvValidation) -$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VdsPortGroupCsvValidation) -$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VdsVmkernelCsvValidation) -$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VdsPnicCsvValidation) -$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) -$TabDraw.Controls.Add($FolderCsvValidation) -$TabDraw.Controls.Add($FolderCsvValidationCheck) -$TabDraw.Controls.Add($RdmCsvValidation) -$TabDraw.Controls.Add($RdmCsvValidationCheck) -$TabDraw.Controls.Add($DrsRuleCsvValidation) -$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) -$TabDraw.Controls.Add($ResourcePoolCsvValidation) -$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) -$TabDraw.Controls.Add($CsvValidationButton) -$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Host_Complete) -$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Folder_Complete) -$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) -$TabDraw.Controls.Add($VMs_with_RDMs_Complete) -$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) -$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) -$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Datastore_Complete) -$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) -$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($Datastore_to_Host_Complete) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) -$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VSS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VSS_Complete) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VDS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VDS_Complete) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) -$SubTab.Controls.Add($TabDirections) -$SubTab.Controls.Add($TabCapture) -$SubTab.Controls.Add($TabDraw) -$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText -$SubTab.SelectedIndex = 0 -$vDiagram.Controls.Add($MainMenu) -$vDiagram.Controls.Add($MainTab) -$vDiagram.Controls.Add($SubTab) -#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$VisioBrowse.Description = "Select a directory" -$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$DrawCsvBrowse.Description = "Select a directory" -$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$CaptureCsvBrowse.Description = "Select a directory" -$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - -#endregion - -#region Custom Code -#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellCheck = $PSVersionTable.PSVersion -if ($PowershellCheck.Major -ge 4) -{ - $PowershellInstalled.Forecolor = "Green" - $PowershellInstalled.Text = "Installed Version $PowershellCheck" -} -else -{ - $PowershellInstalled.Forecolor = "Red" - $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" -} -#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) -$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) -if ($PowerCliModuleCheck -ne $null) -{ - $PowerCliModuleInstalled.Forecolor = "Green" - $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" -} -else -{ - $PowerCliModuleInstalled.Forecolor = "Red" - $PowerCliModuleInstalled.Text = "Not Installed" -} -#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerClI Installed" -} -elseif ($PowerCliModuleCheck -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerCLI Module Installed" -} -else -{ - $PowerCliInstalled.Forecolor = "Red" - $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" -} -#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) -{ - $VisioInstalled.Forecolor = "Green" - $VisioInstalled.Text = "Installed" -} -else -{ - $VisioInstalled.Forecolor = "Red" - $VisioInstalled.Text = "Visio is Not Installed" -} -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) -$ConnectButton.Add_Click({ Connect_vCenter_Main }) -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } -Check_CaptureCsvFolder } ) -#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton.Add_Click({ - if($CaptureCsvFolder -eq $null) - { - $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" - } - else - { - if ($vCenterCsvCheckBox.Checked -eq "True") - { - $vCenterCsvValidationComplete.Forecolor = "Blue" - $vCenterCsvValidationComplete.Text = "Processing ....." - vCenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" - $vCenterCsvComplete = Test-Path $vCenterExportFileComplete - if ($vCenterCsvComplete -eq $True) - { - $vCenterCsvValidationComplete.Forecolor = "Green" - $vCenterCsvValidationComplete.Text = "Complete" - } - else - { - $vCenterCsvValidationComplete.Forecolor = "Red" - $vCenterCsvValidationComplete.Text = "Not Complete" - } - } - Connect_vCenter - $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager - if ($Connected -eq $null) { Connect_vCenter_Main } - $ConnectButton.Forecolor = [System.Drawing.Color]::Green - $ConnectButton.Text = "Connected to $DefaultViserver" - if ($DatacenterCsvCheckBox.Checked -eq "True") - { - $DatacenterCsvValidationComplete.Forecolor = "Blue" - $DatacenterCsvValidationComplete.Text = "Processing ....." - Datacenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" - $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete - if ($DatacenterCsvComplete -eq $True) - { - $DatacenterCsvValidationComplete.Forecolor = "Green" - $DatacenterCsvValidationComplete.Text = "Complete" - } - else - { - $DatacenterCsvValidationComplete.Forecolor = "Red" - $DatacenterCsvValidationComplete.Text = "Not Complete" - } - } - if ($ClusterCsvCheckBox.Checked -eq "True") - { - $ClusterCsvValidationComplete.Forecolor = "Blue" - $ClusterCsvValidationComplete.Text = "Processing ....." - Cluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" - $ClusterCsvComplete = Test-Path $ClusterExportFileComplete - if ($ClusterCsvComplete -eq $True) - { - $ClusterCsvValidationComplete.Forecolor = "Green" - $ClusterCsvValidationComplete.Text = "Complete" - } - else - { - $ClusterCsvValidationComplete.Forecolor = "Red" - $ClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmHostCsvCheckBox.Checked -eq "True") - { - $VmHostCsvValidationComplete.Forecolor = "Blue" - $VmHostCsvValidationComplete.Text = "Processing ....." - VmHost_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" - $VmHostCsvComplete = Test-Path $VmHostExportFileComplete - if ($VmHostCsvComplete -eq $True) - { - $VmHostCsvValidationComplete.Forecolor = "Green" - $VmHostCsvValidationComplete.Text = "Complete" - } - else - { - $VmHostCsvValidationComplete.Forecolor = "Red" - $VmHostCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmCsvCheckBox.Checked -eq "True") - { - $VmCsvValidationComplete.Forecolor = "Blue" - $VmCsvValidationComplete.Text = "Processing ....." - Vm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" - $VmCsvComplete = Test-Path $VmExportFileComplete - if ($VmCsvComplete -eq $True) - { - $VmCsvValidationComplete.Forecolor = "Green" - $VmCsvValidationComplete.Text = "Complete" - } - else - { - $VmCsvValidationComplete.Forecolor = "Red" - $VmCsvValidationComplete.Text = "Not Complete" - } - } - if ($TemplateCsvCheckBox.Checked -eq "True") - { - $TemplateCsvValidationComplete.Forecolor = "Blue" - $TemplateCsvValidationComplete.Text = "Processing ....." - Template_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" - $TemplateCsvComplete = Test-Path $TemplateExportFileComplete - if ($TemplateCsvComplete -eq $True) - { - $TemplateCsvValidationComplete.Forecolor = "Green" - $TemplateCsvValidationComplete.Text = "Complete" - } - else - { - $TemplateCsvValidationComplete.Forecolor = "Red" - $TemplateCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreClusterCsvCheckBox.Checked -eq "True") - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" - $DatastoreClusterCsvValidationComplete.Text = "Processing ....." - DatastoreCluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete - if ($DatastoreClusterCsvComplete -eq $True) - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Green" - $DatastoreClusterCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Red" - $DatastoreClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreCsvCheckBox.Checked -eq "True") - { - $DatastoreCsvValidationComplete.Forecolor = "Blue" - $DatastoreCsvValidationComplete.Text = "Processing ....." - Datastore_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" - $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete - if ($DatastoreCsvComplete -eq $True) - { - $DatastoreCsvValidationComplete.Forecolor = "Green" - $DatastoreCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreCsvValidationComplete.Forecolor = "Red" - $DatastoreCsvValidationComplete.Text = "Not Complete" - } - } - if ($VsSwitchCsvCheckBox.Checked -eq "True") - { - $VsSwitchCsvValidationComplete.Forecolor = "Blue" - $VsSwitchCsvValidationComplete.Text = "Processing ....." - VsSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" - $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete - if ($vSSwitchCsvComplete -eq $True) - { - $vSSwitchCsvValidationComplete.Forecolor = "Green" - $vSSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $vSSwitchCsvValidationComplete.Forecolor = "Red" - $vSSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPortGroupCsvCheckBox.Checked -eq "True") - { - $VssPortGroupCsvValidationComplete.Forecolor = "Blue" - $VssPortGroupCsvValidationComplete.Text = "Processing ....." - VssPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete - if ($VssPortGroupCsvComplete -eq $True) - { - $VssPortGroupCsvValidationComplete.Forecolor = "Green" - $VssPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VssPortGroupCsvValidationComplete.Forecolor = "Red" - $VssPortGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssVmkernelCsvCheckBox.Checked -eq "True") - { - $VssVmkernelCsvValidationComplete.Forecolor = "Blue" - $VssVmkernelCsvValidationComplete.Text = "Processing ....." - VssVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete - if ($VssVmkernelCsvComplete -eq $True) - { - $VssVmkernelCsvValidationComplete.Forecolor = "Green" - $VssVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VssVmkernelCsvValidationComplete.Forecolor = "Red" - $VssVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPnicCsvCheckBox.Checked -eq "True") - { - $VssPnicCsvValidationComplete.Forecolor = "Blue" - $VssPnicCsvValidationComplete.Text = "Processing ....." - VssPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" - $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete - if ($VssPnicCsvComplete -eq $True) - { - $VssPnicCsvValidationComplete.Forecolor = "Green" - $VssPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VssPnicCsvValidationComplete.Forecolor = "Red" - $VssPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdSwitchCsvCheckBox.Checked -eq "True") - { - $VdSwitchCsvValidationComplete.Forecolor = "Blue" - $VdSwitchCsvValidationComplete.Text = "Processing ....." - VdSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" - $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete - if ($VdSwitchCsvComplete -eq $True) - { - $VdSwitchCsvValidationComplete.Forecolor = "Green" - $VdSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $VdSwitchCsvValidationComplete.Forecolor = "Red" - $VdSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPortGroupCsvCheckBox.Checked -eq "True") - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" - $VdsPortGroupCsvValidationComplete.Text = "Processing ....." - VdsPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete - if ($VdsPortGroupCsvComplete -eq $True) - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Green" - $VdsPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Red" - $VdsPortGroupCsvValidationComplete.Text = "Not Complete" - - } - } - if ($VdsVmkernelCsvCheckBox.Checked -eq "True") - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" - $VdsVmkernelCsvValidationComplete.Text = "Processing ....." - VdsVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete - if ($VdsVmkernelCsvComplete -eq $True) - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Green" - $VdsVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Red" - $VdsVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPnicCsvCheckBox.Checked -eq "True") - { - $VdsPnicCsvValidationComplete.Forecolor = "Blue" - $VdsPnicCsvValidationComplete.Text = "Processing ....." - VdsPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" - $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete - if ($VdsPnicCsvComplete -eq $True) - { - $VdsPnicCsvValidationComplete.Forecolor = "Green" - $VdsPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPnicCsvValidationComplete.Forecolor = "Red" - $VdsPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($FolderCsvCheckBox.Checked -eq "True") - { - $FolderCsvValidationComplete.Forecolor = "Blue" - $FolderCsvValidationComplete.Text = "Processing ....." - Folder_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" - $FolderCsvComplete = Test-Path $FolderExportFileComplete - if ($FolderCsvComplete -eq $True) - { - $FolderCsvValidationComplete.Forecolor = "Green" - $FolderCsvValidationComplete.Text = "Complete" - } - else - { - $FolderCsvValidationComplete.Forecolor = "Red" - $FolderCsvValidationComplete.Text = "Not Complete" - } - } - if ($RdmCsvCheckBox.Checked -eq "True") - { - $RdmCsvValidationComplete.Forecolor = "Blue" - $RdmCsvValidationComplete.Text = "Processing ....." - Rdm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" - $RdmCsvComplete = Test-Path $RdmExportFileComplete - if ($RdmCsvComplete -eq $True) - { - $RdmCsvValidationComplete.Forecolor = "Green" - $RdmCsvValidationComplete.Text = "Complete" - } - else - { - $RdmCsvValidationComplete.Forecolor = "Red" - $RdmCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsRuleCsvCheckBox.Checked -eq "True") - { - $DrsRuleCsvValidationComplete.Forecolor = "Blue" - $DrsRuleCsvValidationComplete.Text = "Processing ....." - Drs_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" - $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete - if ($DrsRuleCsvComplete -eq $True) - { - $DrsRuleCsvValidationComplete.Forecolor = "Green" - $DrsRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsRuleCsvValidationComplete.Forecolor = "Red" - $DrsRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" - $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." - Drs_Cluster_Group_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete - if ($DrsClusterGroupCsvComplete -eq $True) - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" - $DrsClusterGroupCsvValidationComplete.Text = "Complete" - } - else - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" - $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" - $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." - Drs_VmHost_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete - if ($DrsVmHostRuleCsvComplete -eq $True) - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" - $DrsVmHostRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" - $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($ResourcePoolCsvCheckBox.Checked -eq "True") - { - $ResourcePoolCsvValidationComplete.Forecolor = "Blue" - $ResourcePoolCsvValidationComplete.Text = "Processing ....." - Resource_Pool_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete - if ($ResourcePoolCsvComplete -eq $True) - { - $ResourcePoolCsvValidationComplete.Forecolor = "Green" - $ResourcePoolCsvValidationComplete.Text = "Complete" - } - else - { - $ResourcePoolCsvValidationComplete.Forecolor = "Red" - $ResourcePoolCsvValidationComplete.Text = "Not Complete" - } - } - Disconnect_vCenter - $ConnectButton.Forecolor = [System.Drawing.Color]::Red - $ConnectButton.Text = "Disconnected" - $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" - } -}) -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) -$TabDraw.Controls.Add($DrawCsvInputButton) -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton.Add_Click( -{ - $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text - $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" - $vCenterCsvExists = Test-Path $vCenterExportFile - $TabDraw.Controls.Add($vCenterCsvValidationCheck) - if ($vCenterCsvExists -eq $True) - { - - $vCenterCsvValidationCheck.Forecolor = "Green" - $vCenterCsvValidationCheck.Text = "Present" - } - else - { - $vCenterCsvValidationCheck.Forecolor = "Red" - $vCenterCsvValidationCheck.Text = "Not Present" - } - - $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" - $DatacenterCsvExists = Test-Path $DatacenterExportFile - $TabDraw.Controls.Add($DatacenterCsvValidationCheck) - - if ($DatacenterCsvExists -eq $True) - { - $DatacenterCsvValidationCheck.Forecolor = "Green" - $DatacenterCsvValidationCheck.Text = "Present" - } - else - { - $DatacenterCsvValidationCheck.Forecolor = "Red" - $DatacenterCsvValidationCheck.Text = "Not Present" - } - - $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" - $ClusterCsvExists = Test-Path $ClusterExportFile - $TabDraw.Controls.Add($ClusterCsvValidationCheck) - - if ($ClusterCsvExists -eq $True) - { - $ClusterCsvValidationCheck.Forecolor = "Green" - $ClusterCsvValidationCheck.Text = "Present" - } - else - { - $ClusterCsvValidationCheck.Forecolor = "Red" - $ClusterCsvValidationCheck.Text = "Not Present" - } - - $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" - $VmHostCsvExists = Test-Path $VmHostExportFile - $TabDraw.Controls.Add($VmHostCsvValidationCheck) - - if ($VmHostCsvExists -eq $True) - { - $VmHostCsvValidationCheck.Forecolor = "Green" - $VmHostCsvValidationCheck.Text = "Present" - } - else - { - $VmHostCsvValidationCheck.Forecolor = "Red" - $VmHostCsvValidationCheck.Text = "Not Present" - } - - $VmExportFile = $CsvInputDir + "-VmExport.csv" - $VmCsvExists = Test-Path $VmExportFile - $TabDraw.Controls.Add($VmCsvValidationCheck) - - if ($VmCsvExists -eq $True) - { - $VmCsvValidationCheck.Forecolor = "Green" - $VmCsvValidationCheck.Text = "Present" - } - else - { - $VmCsvValidationCheck.Forecolor = "Red" - $VmCsvValidationCheck.Text = "Not Present" - } - - $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" - $TemplateCsvExists = Test-Path $TemplateExportFile - $TabDraw.Controls.Add($TemplateCsvValidationCheck) - - if ($TemplateCsvExists -eq $True) - { - $TemplateCsvValidationCheck.Forecolor = "Green" - $TemplateCsvValidationCheck.Text = "Present" - } - else - { - $TemplateCsvValidationCheck.Forecolor = "Red" - $TemplateCsvValidationCheck.Text = "Not Present" - } - - $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile - $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) - - if ($DatastoreClusterCsvExists -eq $True) - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Green" - $DatastoreClusterCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Red" - $DatastoreClusterCsvValidationCheck.Text = "Not Present" - } - - $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" - $DatastoreCsvExists = Test-Path $DatastoreExportFile - $TabDraw.Controls.Add($DatastoreCsvValidationCheck) - - if ($DatastoreCsvExists -eq $True) - { - $DatastoreCsvValidationCheck.Forecolor = "Green" - $DatastoreCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreCsvValidationCheck.Forecolor = "Red" - $DatastoreCsvValidationCheck.Text = "Not Present" - } - - $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" - $VsSwitchCsvExists = Test-Path $VsSwitchExportFile - $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) - - if ($VsSwitchCsvExists -eq $True) - { - $VsSwitchCsvValidationCheck.Forecolor = "Green" - $VsSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VsSwitchCsvValidationCheck.Forecolor = "Red" - $VsSwitchCsvValidationCheck.Text = "Not Present" - $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile - $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) - - if ($VssPortGroupCsvExists -eq $True) - { - $VssPortGroupCsvValidationCheck.Forecolor = "Green" - $VssPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VssPortGroupCsvValidationCheck.Forecolor = "Red" - $VssPortGroupCsvValidationCheck.Text = "Not Present" - $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile - $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) - - if ($VssVmkernelCsvExists -eq $True) - { - $VssVmkernelCsvValidationCheck.Forecolor = "Green" - $VssVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VssVmkernelCsvValidationCheck.Forecolor = "Red" - $VssVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" - $VssPnicCsvExists = Test-Path $VssPnicExportFile - $TabDraw.Controls.Add($VssPnicCsvValidationCheck) - - if ($VssPnicCsvExists -eq $True) - { - $VssPnicCsvValidationCheck.Forecolor = "Green" - $VssPnicCsvValidationCheck.Text = "Present" - } - else - { - $VssPnicCsvValidationCheck.Forecolor = "Red" - $VssPnicCsvValidationCheck.Text = "Not Present" - } - - $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" - $VdSwitchCsvExists = Test-Path $VdSwitchExportFile - $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) - - if ($VdSwitchCsvExists -eq $True) - { - $VdSwitchCsvValidationCheck.Forecolor = "Green" - $VdSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VdSwitchCsvValidationCheck.Forecolor = "Red" - $VdSwitchCsvValidationCheck.Text = "Not Present" - $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile - $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) - - if ($VdsPortGroupCsvExists -eq $True) - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Green" - $VdsPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Red" - $VdsPortGroupCsvValidationCheck.Text = "Not Present" - $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile - $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) - - if ($VdsVmkernelCsvExists -eq $True) - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Green" - $VdsVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Red" - $VdsVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" - $VdsPnicCsvExists = Test-Path $VdsPnicExportFile - $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) - - if ($VdsPnicCsvExists -eq $True) - { - $VdsPnicCsvValidationCheck.Forecolor = "Green" - $VdsPnicCsvValidationCheck.Text = "Present" - } - else - { - $VdsPnicCsvValidationCheck.Forecolor = "Red" - $VdsPnicCsvValidationCheck.Text = "Not Present" - } - - $FolderExportFile = $CsvInputDir + "-FolderExport.csv" - $FolderCsvExists = Test-Path $FolderExportFile - $TabDraw.Controls.Add($FolderCsvValidationCheck) - - if ($FolderCsvExists -eq $True) - { - $FolderCsvValidationCheck.Forecolor = "Green" - $FolderCsvValidationCheck.Text = "Present" - } - else - { - $FolderCsvValidationCheck.Forecolor = "Red" - $FolderCsvValidationCheck.Text = "Not Present" - } - - $RdmExportFile = $CsvInputDir + "-RdmExport.csv" - $RdmCsvExists = Test-Path $RdmExportFile - $TabDraw.Controls.Add($RdmCsvValidationCheck) - - if ($RdmCsvExists -eq $True) - { - $RdmCsvValidationCheck.Forecolor = "Green" - $RdmCsvValidationCheck.Text = "Present" - } - else - { - $RdmCsvValidationCheck.Forecolor = "Red" - $RdmCsvValidationCheck.Text = "Not Present" - $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" - $DrsRuleCsvExists = Test-Path $DrsRuleExportFile - $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) - - if ($DrsRuleCsvExists -eq $True) - { - $DrsRuleCsvValidationCheck.Forecolor = "Green" - $DrsRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsRuleCsvValidationCheck.Forecolor = "Red" - $DrsRuleCsvValidationCheck.Text = "Not Present" - $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile - $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) - - if ($DrsClusterGroupCsvExists -eq $True) - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" - $DrsClusterGroupCsvValidationCheck.Text = "Present" - } - else - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" - $DrsClusterGroupCsvValidationCheck.Text = "Not Present" - } - - $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile - $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) - - if ($DrsVmHostRuleCsvExists -eq $True) - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" - $DrsVmHostRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" - $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" - } - - $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile - $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) - - if ($ResourcePoolCsvExists -eq $True) - { - $ResourcePoolCsvValidationCheck.Forecolor = "Green" - $ResourcePoolCsvValidationCheck.Text = "Present" - } - else - { - $ResourcePoolCsvValidationCheck.Forecolor = "Red" - $ResourcePoolCsvValidationCheck.Text = "Not Present" - $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" - } -} ) -$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) -$TabDraw.Controls.Add($CsvValidationButton) -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) -$TabDraw.Controls.Add($VisioOpenOutputButton) -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) -$TabDraw.Controls.Add($DrawUncheckButton) -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) -$TabDraw.Controls.Add($DrawCheckButton) -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; -if ($VM_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Host_Complete.Forecolor = "Blue" - $VM_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Host_Complete) - VM_to_Host - $VM_to_Host_Complete.Forecolor = "Green" - $VM_to_Host_Complete.Text = "Complete" - $TabDraw.Controls.Add($VM_to_Host_Complete) -} -if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Folder_Complete.Forecolor = "Blue" - $VM_to_Folder_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Folder_Complete) - VM_to_Folder - $VM_to_Folder_Complete.Forecolor = "Green" - $VM_to_Folder_Complete.Text = "Complete" -} -if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") -{ - $VMs_with_RDMs_Complete.Forecolor = "Blue" - $VMs_with_RDMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMs_with_RDMs_Complete) - VMs_with_RDMs - $VMs_with_RDMs_Complete.Forecolor = "Green" - $VMs_with_RDMs_Complete.Text = "Complete" -} -if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") -{ - $SRM_Protected_VMs_Complete.Forecolor = "Blue" - $SRM_Protected_VMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) - SRM_Protected_VMs - $SRM_Protected_VMs_Complete.Forecolor = "Green" - $SRM_Protected_VMs_Complete.Text = "Complete" -} -if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Datastore_Complete.Forecolor = "Blue" - $VM_to_Datastore_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Datastore_Complete) - VM_to_Datastore - $VM_to_Datastore_Complete.Forecolor = "Green" - $VM_to_Datastore_Complete.Text = "Complete" -} -if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") -{ - $VM_to_ResourcePool_Complete.Forecolor = "Blue" - $VM_to_ResourcePool_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) - VM_to_ResourcePool - $VM_to_ResourcePool_Complete.Forecolor = "Green" - $VM_to_ResourcePool_Complete.Text = "Complete" -} -if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") -{ - $Datastore_to_Host_Complete.Forecolor = "Blue" - $Datastore_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Datastore_to_Host_Complete) - Datastore_to_Host - $Datastore_to_Host_Complete.Forecolor = "Green" - $Datastore_to_Host_Complete.Text = "Complete" -} -if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") -{ - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" - $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) - PhysicalNIC_to_vSwitch - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" - $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" -} -if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VSS_to_Host_Complete.Forecolor = "Blue" - $VSS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSS_to_Host_Complete) - VSS_to_Host - $VSS_to_Host_Complete.Forecolor = "Green" - $VSS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VSS_Complete.Forecolor = "Blue" - $VMK_to_VSS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VSS_Complete) - VMK_to_VSS - $VMK_to_VSS_Complete.Forecolor = "Green" - $VMK_to_VSS_Complete.Text = "Complete" -} -if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VSSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) - VSSPortGroup_to_VM - $VSSPortGroup_to_VM_Complete.Forecolor = "Green" - $VSSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VDS_to_Host_Complete.Forecolor = "Blue" - $VDS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDS_to_Host_Complete) - VDS_to_Host - $VDS_to_Host_Complete.Forecolor = "Green" - $VDS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VDS_Complete.Forecolor = "Blue" - $VMK_to_VDS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VDS_Complete) - VMK_to_VDS - $VMK_to_VDS_Complete.Forecolor = "Green" - $VMK_to_VDS_Complete.Text = "Complete" -} -if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VDSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) - VDSPortGroup_to_VM - $VDSPortGroup_to_VM_Complete.Forecolor = "Green" - $VDSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") -{ - $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" - $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) - Cluster_to_DRS_Rule - $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" - $Cluster_to_DRS_Rule_Complete.Text = "Complete" -}; -$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) -$TabDraw.Controls.Add($DrawButton) -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton.Add_Click({Open_Final_Visio}) -$TabDraw.Controls.Add($OpenVisioButton) - -#endregion - -#region Event Loop - -function Main{ - [System.Windows.Forms.Application]::EnableVisualStyles() - [System.Windows.Forms.Application]::Run($vDiagram) -} - -#endregion - -#endregion - -#region Event Handlers - -#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect_vCenter_Main -{ - $MainVC = $MainVcenterTextBox.Text - $MainUser = $UserNameTextBox.Text - $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text -} - -function Connect_vCenter -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $User = $UserNameTextBox.Text - $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text -} - -function Disconnect_vCenter -{ - $Disconnect = Disconnect-ViServer * -Confirm:$false -} -#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Find_CaptureCsvFolder -{ - $CaptureCsvBrowseLoop = $True - while ($CaptureCsvBrowseLoop) - { - if ($CaptureCsvBrowse.ShowDialog() -eq "OK") - { - $CaptureCsvBrowseLoop = $False - } - else - { - $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($CaptureCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath -} - -function Check_CaptureCsvFolder -{ - $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $CheckContentDir = $CheckContentPath + "*.csv" - $CheckContent = Test-Path $CheckContentDir - if ($CheckContent -eq "True") - { - $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") - switch ($CheckContents_CaptureCsvFolder) { - 'Yes' - { - del $CheckContentDir - } - - 'No' - { - $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog - $CheckContentCsvBrowse.Description = "Select a directory to copy files to" - $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - $CheckContentCsvBrowse.ShowDialog() - $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath - copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder - del $CheckContentDir - } - } - } -} - -function Find_DrawCsvFolder -{ - $DrawCsvBrowseLoop = $True - while ($DrawCsvBrowseLoop) - { - if ($DrawCsvBrowse.ShowDialog() -eq "OK") - { - $DrawCsvBrowseLoop = $False - } - else - { - $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($DrawCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath -} - -function Find_DrawVisioFolder -{ - $VisioBrowseLoop = $True - while($VisioBrowseLoop) - { - if ($VisioBrowse.ShowDialog() -eq "OK") - { - $VisioBrowseLoop = $False - } - else - { - $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if($VisioBrowseRes -eq "Cancel") - { - return - } - } - } - $global:VisioFolder = $VisioBrowse.SelectedPath -} -#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function vCenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, - @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation - - if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) - { - $null - } - else - { - Disconnect_vCenter - } -} - -function Datacenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort-Object Name | - Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation -} - -function Cluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, - @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, - @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, - @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, - @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, - @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, - @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, - @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, - @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, - @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation -} - -function VmHost_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent - while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent - } - if ($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name } } }, - @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent - while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent - } - if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, - @{ N = "Version" ; E = { $_.Config.Product.Version } }, - @{ N = "Build" ; E = { $_.Config.Product.Build } }, - @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, - @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, - @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, - @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, - @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, - @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, - @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, - @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, - @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, - @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, - @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, - @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation -} - -function Vm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select-Object Name , - @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, - @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, - @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, - @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, - @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, - @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, - @{ N = "OS" ; E = { $_.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.Config.Version } }, - @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, - @{ N = 'Folder' ; E = { $Folder.Name } }, - @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, - @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, - @{ N = "IP" ; E = { $_.Guest.IpAddress } }, - @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, - @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, - @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, - @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation - } -} - -function Template_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - foreach ($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { $VmHost.name } }, - @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, - @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, - @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, - @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, - @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, - @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, - @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, - @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation - } -} - -function DatastoreCluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, - @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, - @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation -} - -function Datastore_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, - @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, - @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, - @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, - @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, - @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, - @{ N = "Accessible" ; E = { $_.State } }, - @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation -} - -function VsSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "Nic" ; E = { $_.Nic } }, - @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, - @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, - @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, - @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, - @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation -} - -function VssPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "VLanId" ; E = { $_.VLanId } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VssVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation - } - } - } -} - -function VssPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation - } - } -} - -function VdSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - foreach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "Vendor" ; E = { $_.Vendor } }, - @{ N = "Version" ; E = { $_.Version } }, - @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, - @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation - } -} - -function VdsPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, - @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, - @{ N = "NumPorts" ; E = { $_.NumPorts } }, - @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, - @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, - @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VdsVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation - - } - } -} - -function VdsPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | - Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch } }, - @{ N = "Portgroup" ; E = { $_.Portgroup } }, - @{ N = "ConnectedEntity" ; E = { $_.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation - } - } -} - -function Folder_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - foreach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -type VM | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation - } -} - -function Rdm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | - Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, - @{ N = "Vm" ; E = { $_.Parent } }, - @{ N = "Label" ; E = { $_.Name } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, - @{ N = "DiskType" ; E = { $_.DiskType } }, - @{ N = "Persistence" ; E = { $_.Persistence } }, - @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, - @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, - @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation -} - -function Drs_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation - } -} - -function Drs_Cluster_Group_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "GroupType" ; E = { $_.GroupType } }, - @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation - } -} - -function Drs_VmHost_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) - { - Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "VMGroup" ; E = { $_.VMGroup } }, - @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, - @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, - @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation - } - } -} - -function Resource_Pool_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) - { - Get-ResourcePool $ResourcePool | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Cluster" ; E = { $Cluster.Name } }, - @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, - @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, - @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, - @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, - @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, - @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, - @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, - @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, - @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, - @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation - } - } -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect-VisioObject($firstObj, $secondObj) -{ - $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) - $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) - $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) -} - -function Add-VisioObjectVC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectCluster($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHost($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectTemplate($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectSRM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDatastore($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHardDisk($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.ScsiCanonicalName - return $shpObj -} - -function Add-VisioObjectFolder($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVsSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVssPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVMK($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsClusterGroup($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDRSVMHostRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectResourcePool($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Create_Visio_Base -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $DocObj = $docsObj.Add("") - $DocObj.SaveAs($Savefile) - $AppVisio.Quit() -} - -function VM_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Host" - $Page = $DocsObj.Pages('VM to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Folder -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Folder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - $FolderImport = Import-Csv $FolderExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Folder" - $Page = $DocsObj.Pages('VM to Folder') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Folder') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Folder Object - $FolderObj = $stnObj.Masters.Item("Folder") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $FolderObject = Add-VisioObjectFolder $FolderObj $Folder - $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' - Connect-VisioObject $DatacenterObject $FolderObject - $y += 1.50 - - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $FolderObject $TemplateObject - $FolderObject = $TemplateObject - } - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $FolderObject $VMObject - $FolderObject = $VMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMs_with_RDMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - # RDM's - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - $RdmImport = Import-Csv $RdmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" - $Page = $DocsObj.Pages('VM w/ RDMs') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM w/ RDMs') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # RDM Object - $RDMObj = $stnObj.Masters.Item("RDM") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ClusterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 3.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatacenterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 2.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function SRM_Protected_VMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "SRM VM" - $Page = $DocsObj.Pages('SRM VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('SRM VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # SRM Protected VM Object - $SRMObj = $stnObj.Masters.Item("SRM Protected Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Datastore -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Datastore" - $Page = $DocsObj.Pages('VM to Datastore') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Datastore') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $ClusterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $ClusterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_ResourcePool -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # ResourcePool - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - $ResourcePoolImport = Import-Csv $ResourcePoolExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" - $Page = $DocsObj.Pages('VM to Resource Pool') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Resource Pool') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Resource Pool Object - $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool - # Name - $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' - # Cluster - $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' - # CpuSharesLevel - $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' - # NumCpuShares - $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' - # CpuReservationMHz - $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' - # CpuExpandableReservation - $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' - # CpuLimitMHz - $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' - # MemSharesLevel - $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' - # NumMemShares - $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' - # MemReservationGB - $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' - # MemExpandableReservation - $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' - # MemLimitGB - $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' - Connect-VisioObject $ClusterObject $ResourcePoolObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ResourcePoolObject $VMObject - $ResourcePoolObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Datastore_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Datastore to Host" - $Page = $DocsObj.Pages('Datastore to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Datastore to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function PhysicalNIC_to_vSwitch -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "PNIC to switch" - $Page = $DocsObj.Pages('PNIC to Switch') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('PNIC to Switch') - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - $y += 1.50 - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSS to Host" - $Page = $DocsObj.Pages('VSS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VSS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VSS" - $Page = $DocsObj.Pages('VMK to VSS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VSS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" - $Page = $DocsObj.Pages('VSSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDS to Host" - $Page = $DocsObj.Pages('VDS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VDS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VDS" - $Page = $DocsObj.Pages('VMK to VDS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VDS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" - $Page = $DocsObj.Pages('VDSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $DatacenterObject $VdSwitchObject - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x = 6.00 - $y += 1.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VPGObject $VMObject - $VPGObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Cluster_to_DRS_Rule -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # DRS Rule - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - $DrsRuleImport = Import-Csv $DrsRuleExportFile - # DRS Cluster Group - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile - # DRS VmHost Rule - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" - $Page = $DocsObj.Pages('Cluster to DRS Rule') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Cluster to DRS Rule') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # DRS Rule - $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") - # DRS Cluster Group - $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") - # DRS Host Rule - $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") - # Microsoft VM Object - $MSObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LXObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - $y += 1.50 - - foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule - # Name - $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' - # VM Affinity - $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' - # DRS Rule Enabled - $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' - # DRS Rule Mandatory - $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' - Connect-VisioObject $ClusterObject $DRSObject - #$ClusterObject = $DRSObject - $y += 1.50 - } - foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule - # Name - $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' - # Enabled - $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' - # Type - $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' - # VMGroup - $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' - # VMHostGroup - $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' - # AffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' - # AntiAffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' - Connect-VisioObject $ClusterObject $DRSVMHostRuleObject - $y += 1.50 - #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject - #$DrsClusterGroupObject = $DRSVMHostRuleObject - - foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) - { - $x += 2.50 - $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup - # Name - $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' - # GroupType - $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' - # Members - $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' - Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject - $DRSVMHostRuleObject = $DrsClusterGroupObject - - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Open_Final_Visio -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.Application - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null -} - -Main - -#endregion \ No newline at end of file From ed9d3a60d34079058f6ada81e1b42452a2df0451 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Mon, 16 Apr 2018 23:20:21 -0400 Subject: [PATCH 11/19] vDiagram 2.0.1 GUI --- .../vDiagram_Scheduled_Task_2.0.1.ps1 | 1184 ++++++++--------- 1 file changed, 592 insertions(+), 592 deletions(-) diff --git a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 index 13421ae..751c2de 100644 --- a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 +++ b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 @@ -1,593 +1,593 @@ -$Date = (Get-Date -format "yyyy_MM_dd") -$7zip = "C:\Program Files\7-Zip\7z.exe" - -# Variables -$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." -$vCenterShortName = "Replace with vCenter name." -$CsvDir = "C:\vDiagram\Capture" -$SMTPserver = "SMTP Server" -$Mailfrom = "outbound@email.com" -$Mailto = "you@email.com" -$Subject = "vDiagram 2.0 Files" -$ReportFile = "C:\vDiagram\Zip" -$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" -$AttachmentFile = $ZipFile -$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" - - -#region Functions -#region PsCreds -#region Export-PSCredential -Function Export-PSCredential { - param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) - - # Look at the object type of the $Credential parameter to determine how to handle it - switch ( $Credential.GetType().Name ) { - # It is a credential, so continue - PSCredential { continue } - # It is a string, so use that as the username and prompt for the password - String { $Credential = Get-Credential -credential $Credential } - # In all other caess, throw an error and exit - default { Throw "You must specify a credential object to export to disk." } - } - - # Create temporary object to be serialized to disk - $export = "" | Select-Object Username, EncryptedPassword - - # Give object a type name which can be identified later - #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) - - $export.Username = $Credential.Username - - # Encrypt SecureString password using Data Protection API - # Only the current user account can decrypt this cipher - $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString - - # Export using the Export-Clixml cmdlet - $export | Export-Clixml $Path - Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine - - # Return FileInfo object referring to saved credentials - Get-Item $Path -} -Export-PSCredential -#endregion Export-PSCredential - -#region Import-PSCredential -Function Import-PSCredential { - param ( $Path = "credentials.xml" ) - - # Import credential file - $import = Import-Clixml $Path - - # Test for valid import - if ( !$import.UserName -or !$import.EncryptedPassword ) { - Throw "Input is not a valid ExportedPSCredential object, exiting." - } - $Username = $import.Username - - # Decrypt the password and store as a SecureString object for safekeeping - $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString - - # Build the new credential object - $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass - Write-Output $Credential -} -#endregion Import-PSCredential - -#endregion PsCreds - -#region vCenterFunctions -#region Connect_vCenter_Main -Function Connect_vCenter_Main -{ - $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter_Main - -#region Connect_vCenter -Function Connect_vCenter -{ - $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter - -#region Disconnect_vCenter -Function Disconnect_vCenter -{ - Disconnect-ViServer * -Confirm:$False -} -#endregion Disconnect_vCenter -#endregion vCenterFunctions - -#region CsvExportFunctions -#region vCenter_Export -Function vCenter_Export -{ - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, - @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, - @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo - Disconnect_vCenter -} -#endregion vCenter_Export - -#region Datacenter_Export -Function Datacenter_Export -{ - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo -} -#endregion Datacenter_Export - -#region Cluster_Export -Function Cluster_Export -{ - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, - @{N="HAEnabled";E={$_.HAEnabled}}, - @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, - @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, - @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, - @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, - @{N="DrsEnabled";E={$_.DrsEnabled}}, - @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, - @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, - @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo -} -#endregion Cluster_Export - -#region VmHost_Export -Function VmHost_Export -{ - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={ - $Datacenter = Get-View -Id $_.Parent -Property Name,Parent - While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent - } - If($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name}}}, - @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent - While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent - } - If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, - @{N="Version";E={$_.Config.Product.Version}}, - @{N="Build";E={$_.Config.Product.Build}}, - @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, - @{N="Model";E={$_.Summary.Hardware.Model}}, - @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, - @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, - @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, - @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, - @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, - @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, - @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, - @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, - @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, - @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo -} -#endregion VmHost_Export - -#region Vm_Export -Function Vm_Export -{ - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select Name, - @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, - @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, - @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, - @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, - @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, - @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, - @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, - @{N="OS";E={$_.Config.GuestFullName}}, - @{N="Version";E={$_.Config.Version}}, - @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, - @{N='Folder';E={$Folder.Name}}, - @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, - @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, - @{N="IP";E={$_.Guest.IpAddress}}, - @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, - @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, - @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, - @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo - } -} -#endregion Vm_Export - -#region Template_Export -Function Template_Export -{ - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - ForEach($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$VmHost | Get-Datacenter}}, - @{N="Cluster";E={$VmHost | Get-Cluster}}, - @{N="VmHost";E={$VmHost.name}}, - @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, - @{N="Folder";E={Get-Folder -Id $_.FolderId}}, - @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, - @{N="Version";E={$_.ExtensionData.Config.Version}}, - @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, - @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, - @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, - @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, - @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo - } -} -#endregion Template_Export - -#region DatastoreCluster_Export -Function DatastoreCluster_Export -{ - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, - @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, - @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, - @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, - @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo -} -#endregion DatastoreCluster_Export - -#region Datastore_Export -Function Datastore_Export -{ - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, - @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, - @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, - @{N="Type";E={$_.Type}}, - @{N="FileSystemVersion";E={$_.FileSystemVersion}}, - @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, - @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, - @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, - @{N="Accessible";E={$_.State}}, - @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo -} -#endregion Datastore_Export - -#region VsSwitch_Export -Function VsSwitch_Export -{ - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="Nic";E={$_.Nic}}, - @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, - @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, - @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, - @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, - @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, - @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, - @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, - @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, - @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo -} -#endregion VsSwitch_Export - -#region VssPort_Export -Function VssPort_Export -{ - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="VLanId";E={$_.VLanId}}, - @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPort_Export - -#region VssVmk_Export -Function VssVmk_Export -{ - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo - } - } - } -} -#endregion VssVmk_Export - -#region VssPnic_Export -Function VssPnic_Export -{ - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPnic_Export - -#region VdSwitch_Export -Function VdSwitch_Export -{ - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - ForEach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="Vendor";E={$_.Vendor}}, - @{N="Version";E={$_.Version}}, - @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, - @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo - } -} -#endregion VdSwitch_Export - -#region VdsPort_Export -Function VdsPort_Export -{ - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}}, - @{N="VdSwitch";E={$_.VdSwitch}}, - @{N="NumPorts";E={$_.NumPorts}}, - @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, - @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, - @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, - @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, - @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, - @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPort_Export - -#region VdsVmk_Export -Function VdsVmk_Export -{ - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo - - } - } -} -#endregion VdsVmk_Export - -#region VdsPnic_Export -Function VdsPnic_Export -{ - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch}}, - @{N="Portgroup";E={$_.Portgroup}}, - @{N="ConnectedEntity";E={$_.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPnic_Export - -#region Folder_Export -Function Folder_Export -{ - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - ForEach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo - } -} -#endregion Folder_Export - -#region Rdm_Export -Function Rdm_Export -{ - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, - @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, - @{N="Vm";E={$_.Parent}}, - @{N="Label";E={$_.Name}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, - @{N="DiskType";E={$_.DiskType}}, - @{N="Persistence";E={$_.Persistence}}, - @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, - @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, - @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo -} -#endregion Rdm_Export - -#region Drs_Rule_Export -Function Drs_Rule_Export -{ - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Type";E={$_.Type}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Rule_Export - -#region Drs_Cluster_Group_Export -Function Drs_Cluster_Group_Export -{ - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="GroupType";E={$_.GroupType}}, - @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Cluster_Group_Export - -#region Drs_VmHost_Rule_Export -Function Drs_VmHost_Rule_Export -{ - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) - { - Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Type";E={$_.Type}}, - @{N="VMGroup";E={$_.VMGroup}}, - @{N="VMHostGroup";E={$_.VMHostGroup}}, - @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, - @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo - } - } -} -#endregion Drs_VmHost_Rule_Export - -#region Resource_Pool_Export -Function Resource_Pool_Export -{ - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) - { - Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Cluster";E={$Cluster.Name}}, - @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, - @{N="NumCpuShares";E={$_.NumCpuShares}}, - @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, - @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, - @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, - @{N="MemSharesLevel";E={$_.MemSharesLevel}}, - @{N="NumMemShares";E={$_.NumMemShares}}, - @{N="MemReservationGB";E={$_.MemReservationGB}}, - @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, - @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo - } - } -} -#endregion Resource_Pool_Export - -#endregion CsvExportFunctions - -#endregion Functions - -Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter - -#Zip Files -cd $CsvDir -dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } - -#Send E-mail -Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile - -#Clear CSV Folder -cd $CsvDir +$Date = (Get-Date -format "yyyy_MM_dd") +$7zip = "C:\Program Files\7-Zip\7z.exe" + +# Variables +$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." +$vCenterShortName = "Replace with vCenter name." +$CsvDir = "C:\vDiagram\Capture" +$SMTPserver = "SMTP Server" +$Mailfrom = "outbound@email.com" +$Mailto = "you@email.com" +$Subject = "vDiagram 2.0 Files" +$ReportFile = "C:\vDiagram\Zip" +$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" +$AttachmentFile = $ZipFile +$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" + + +#region Functions +#region PsCreds +#region Export-PSCredential +Function Export-PSCredential { + param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) + + # Look at the object type of the $Credential parameter to determine how to handle it + switch ( $Credential.GetType().Name ) { + # It is a credential, so continue + PSCredential { continue } + # It is a string, so use that as the username and prompt for the password + String { $Credential = Get-Credential -credential $Credential } + # In all other caess, throw an error and exit + default { Throw "You must specify a credential object to export to disk." } + } + + # Create temporary object to be serialized to disk + $export = "" | Select-Object Username, EncryptedPassword + + # Give object a type name which can be identified later + #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) + + $export.Username = $Credential.Username + + # Encrypt SecureString password using Data Protection API + # Only the current user account can decrypt this cipher + $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString + + # Export using the Export-Clixml cmdlet + $export | Export-Clixml $Path + Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine + + # Return FileInfo object referring to saved credentials + Get-Item $Path +} +Export-PSCredential +#endregion Export-PSCredential + +#region Import-PSCredential +Function Import-PSCredential { + param ( $Path = "credentials.xml" ) + + # Import credential file + $import = Import-Clixml $Path + + # Test for valid import + if ( !$import.UserName -or !$import.EncryptedPassword ) { + Throw "Input is not a valid ExportedPSCredential object, exiting." + } + $Username = $import.Username + + # Decrypt the password and store as a SecureString object for safekeeping + $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString + + # Build the new credential object + $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass + Write-Output $Credential +} +#endregion Import-PSCredential + +#endregion PsCreds + +#region vCenterFunctions +#region Connect_vCenter_Main +Function Connect_vCenter_Main +{ + $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter_Main + +#region Connect_vCenter +Function Connect_vCenter +{ + $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter + +#region Disconnect_vCenter +Function Disconnect_vCenter +{ + Disconnect-ViServer * -Confirm:$False +} +#endregion Disconnect_vCenter +#endregion vCenterFunctions + +#region CsvExportFunctions +#region vCenter_Export +Function vCenter_Export +{ + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, + @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, + @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo + Disconnect_vCenter +} +#endregion vCenter_Export + +#region Datacenter_Export +Function Datacenter_Export +{ + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo +} +#endregion Datacenter_Export + +#region Cluster_Export +Function Cluster_Export +{ + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, + @{N="HAEnabled";E={$_.HAEnabled}}, + @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, + @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, + @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, + @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, + @{N="DrsEnabled";E={$_.DrsEnabled}}, + @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, + @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, + @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo +} +#endregion Cluster_Export + +#region VmHost_Export +Function VmHost_Export +{ + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={ + $Datacenter = Get-View -Id $_.Parent -Property Name,Parent + While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent + } + If($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name}}}, + @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent + While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent + } + If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, + @{N="Version";E={$_.Config.Product.Version}}, + @{N="Build";E={$_.Config.Product.Build}}, + @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, + @{N="Model";E={$_.Summary.Hardware.Model}}, + @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, + @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, + @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, + @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, + @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, + @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, + @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, + @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, + @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, + @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo +} +#endregion VmHost_Export + +#region Vm_Export +Function Vm_Export +{ + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select Name, + @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, + @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, + @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, + @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, + @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, + @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, + @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, + @{N="OS";E={$_.Config.GuestFullName}}, + @{N="Version";E={$_.Config.Version}}, + @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, + @{N='Folder';E={$Folder.Name}}, + @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, + @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, + @{N="IP";E={$_.Guest.IpAddress}}, + @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, + @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, + @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, + @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo + } +} +#endregion Vm_Export + +#region Template_Export +Function Template_Export +{ + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + ForEach($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$VmHost | Get-Datacenter}}, + @{N="Cluster";E={$VmHost | Get-Cluster}}, + @{N="VmHost";E={$VmHost.name}}, + @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, + @{N="Folder";E={Get-Folder -Id $_.FolderId}}, + @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, + @{N="Version";E={$_.ExtensionData.Config.Version}}, + @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, + @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, + @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, + @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, + @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo + } +} +#endregion Template_Export + +#region DatastoreCluster_Export +Function DatastoreCluster_Export +{ + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, + @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, + @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, + @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, + @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo +} +#endregion DatastoreCluster_Export + +#region Datastore_Export +Function Datastore_Export +{ + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, + @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, + @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, + @{N="Type";E={$_.Type}}, + @{N="FileSystemVersion";E={$_.FileSystemVersion}}, + @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, + @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, + @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, + @{N="Accessible";E={$_.State}}, + @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo +} +#endregion Datastore_Export + +#region VsSwitch_Export +Function VsSwitch_Export +{ + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="Nic";E={$_.Nic}}, + @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, + @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, + @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, + @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, + @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, + @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, + @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, + @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, + @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo +} +#endregion VsSwitch_Export + +#region VssPort_Export +Function VssPort_Export +{ + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="VLanId";E={$_.VLanId}}, + @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPort_Export + +#region VssVmk_Export +Function VssVmk_Export +{ + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo + } + } + } +} +#endregion VssVmk_Export + +#region VssPnic_Export +Function VssPnic_Export +{ + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPnic_Export + +#region VdSwitch_Export +Function VdSwitch_Export +{ + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + ForEach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="Vendor";E={$_.Vendor}}, + @{N="Version";E={$_.Version}}, + @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, + @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo + } +} +#endregion VdSwitch_Export + +#region VdsPort_Export +Function VdsPort_Export +{ + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}}, + @{N="VdSwitch";E={$_.VdSwitch}}, + @{N="NumPorts";E={$_.NumPorts}}, + @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, + @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, + @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, + @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, + @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, + @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPort_Export + +#region VdsVmk_Export +Function VdsVmk_Export +{ + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo + + } + } +} +#endregion VdsVmk_Export + +#region VdsPnic_Export +Function VdsPnic_Export +{ + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch}}, + @{N="Portgroup";E={$_.Portgroup}}, + @{N="ConnectedEntity";E={$_.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPnic_Export + +#region Folder_Export +Function Folder_Export +{ + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + ForEach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo + } +} +#endregion Folder_Export + +#region Rdm_Export +Function Rdm_Export +{ + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, + @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, + @{N="Vm";E={$_.Parent}}, + @{N="Label";E={$_.Name}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, + @{N="DiskType";E={$_.DiskType}}, + @{N="Persistence";E={$_.Persistence}}, + @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, + @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, + @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo +} +#endregion Rdm_Export + +#region Drs_Rule_Export +Function Drs_Rule_Export +{ + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Type";E={$_.Type}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Rule_Export + +#region Drs_Cluster_Group_Export +Function Drs_Cluster_Group_Export +{ + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="GroupType";E={$_.GroupType}}, + @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Cluster_Group_Export + +#region Drs_VmHost_Rule_Export +Function Drs_VmHost_Rule_Export +{ + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) + { + Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Type";E={$_.Type}}, + @{N="VMGroup";E={$_.VMGroup}}, + @{N="VMHostGroup";E={$_.VMHostGroup}}, + @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, + @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo + } + } +} +#endregion Drs_VmHost_Rule_Export + +#region Resource_Pool_Export +Function Resource_Pool_Export +{ + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) + { + Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Cluster";E={$Cluster.Name}}, + @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, + @{N="NumCpuShares";E={$_.NumCpuShares}}, + @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, + @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, + @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, + @{N="MemSharesLevel";E={$_.MemSharesLevel}}, + @{N="NumMemShares";E={$_.NumMemShares}}, + @{N="MemReservationGB";E={$_.MemReservationGB}}, + @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, + @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo + } + } +} +#endregion Resource_Pool_Export + +#endregion CsvExportFunctions + +#endregion Functions + +Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter + +#Zip Files +cd $CsvDir +dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } + +#Send E-mail +Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile + +#Clear CSV Folder +cd $CsvDir del *.csv \ No newline at end of file From c7a9bbdb4b217df41ff92cbe050e799589c34cb8 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Mon, 16 Apr 2018 23:21:06 -0400 Subject: [PATCH 12/19] Delete vDiagram_Scheduled_Task_2.0.1.ps1 --- .../vDiagram_Scheduled_Task_2.0.1.ps1 | 593 ------------------ 1 file changed, 593 deletions(-) delete mode 100644 vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 deleted file mode 100644 index 751c2de..0000000 --- a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 +++ /dev/null @@ -1,593 +0,0 @@ -$Date = (Get-Date -format "yyyy_MM_dd") -$7zip = "C:\Program Files\7-Zip\7z.exe" - -# Variables -$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." -$vCenterShortName = "Replace with vCenter name." -$CsvDir = "C:\vDiagram\Capture" -$SMTPserver = "SMTP Server" -$Mailfrom = "outbound@email.com" -$Mailto = "you@email.com" -$Subject = "vDiagram 2.0 Files" -$ReportFile = "C:\vDiagram\Zip" -$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" -$AttachmentFile = $ZipFile -$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" - - -#region Functions -#region PsCreds -#region Export-PSCredential -Function Export-PSCredential { - param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) - - # Look at the object type of the $Credential parameter to determine how to handle it - switch ( $Credential.GetType().Name ) { - # It is a credential, so continue - PSCredential { continue } - # It is a string, so use that as the username and prompt for the password - String { $Credential = Get-Credential -credential $Credential } - # In all other caess, throw an error and exit - default { Throw "You must specify a credential object to export to disk." } - } - - # Create temporary object to be serialized to disk - $export = "" | Select-Object Username, EncryptedPassword - - # Give object a type name which can be identified later - #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) - - $export.Username = $Credential.Username - - # Encrypt SecureString password using Data Protection API - # Only the current user account can decrypt this cipher - $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString - - # Export using the Export-Clixml cmdlet - $export | Export-Clixml $Path - Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine - - # Return FileInfo object referring to saved credentials - Get-Item $Path -} -Export-PSCredential -#endregion Export-PSCredential - -#region Import-PSCredential -Function Import-PSCredential { - param ( $Path = "credentials.xml" ) - - # Import credential file - $import = Import-Clixml $Path - - # Test for valid import - if ( !$import.UserName -or !$import.EncryptedPassword ) { - Throw "Input is not a valid ExportedPSCredential object, exiting." - } - $Username = $import.Username - - # Decrypt the password and store as a SecureString object for safekeeping - $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString - - # Build the new credential object - $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass - Write-Output $Credential -} -#endregion Import-PSCredential - -#endregion PsCreds - -#region vCenterFunctions -#region Connect_vCenter_Main -Function Connect_vCenter_Main -{ - $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter_Main - -#region Connect_vCenter -Function Connect_vCenter -{ - $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter - -#region Disconnect_vCenter -Function Disconnect_vCenter -{ - Disconnect-ViServer * -Confirm:$False -} -#endregion Disconnect_vCenter -#endregion vCenterFunctions - -#region CsvExportFunctions -#region vCenter_Export -Function vCenter_Export -{ - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, - @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, - @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo - Disconnect_vCenter -} -#endregion vCenter_Export - -#region Datacenter_Export -Function Datacenter_Export -{ - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo -} -#endregion Datacenter_Export - -#region Cluster_Export -Function Cluster_Export -{ - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, - @{N="HAEnabled";E={$_.HAEnabled}}, - @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, - @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, - @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, - @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, - @{N="DrsEnabled";E={$_.DrsEnabled}}, - @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, - @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, - @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo -} -#endregion Cluster_Export - -#region VmHost_Export -Function VmHost_Export -{ - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={ - $Datacenter = Get-View -Id $_.Parent -Property Name,Parent - While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent - } - If($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name}}}, - @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent - While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent - } - If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, - @{N="Version";E={$_.Config.Product.Version}}, - @{N="Build";E={$_.Config.Product.Build}}, - @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, - @{N="Model";E={$_.Summary.Hardware.Model}}, - @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, - @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, - @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, - @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, - @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, - @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, - @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, - @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, - @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, - @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo -} -#endregion VmHost_Export - -#region Vm_Export -Function Vm_Export -{ - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select Name, - @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, - @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, - @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, - @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, - @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, - @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, - @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, - @{N="OS";E={$_.Config.GuestFullName}}, - @{N="Version";E={$_.Config.Version}}, - @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, - @{N='Folder';E={$Folder.Name}}, - @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, - @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, - @{N="IP";E={$_.Guest.IpAddress}}, - @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, - @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, - @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, - @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo - } -} -#endregion Vm_Export - -#region Template_Export -Function Template_Export -{ - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - ForEach($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$VmHost | Get-Datacenter}}, - @{N="Cluster";E={$VmHost | Get-Cluster}}, - @{N="VmHost";E={$VmHost.name}}, - @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, - @{N="Folder";E={Get-Folder -Id $_.FolderId}}, - @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, - @{N="Version";E={$_.ExtensionData.Config.Version}}, - @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, - @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, - @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, - @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, - @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo - } -} -#endregion Template_Export - -#region DatastoreCluster_Export -Function DatastoreCluster_Export -{ - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, - @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, - @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, - @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, - @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo -} -#endregion DatastoreCluster_Export - -#region Datastore_Export -Function Datastore_Export -{ - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, - @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, - @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, - @{N="Type";E={$_.Type}}, - @{N="FileSystemVersion";E={$_.FileSystemVersion}}, - @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, - @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, - @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, - @{N="Accessible";E={$_.State}}, - @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo -} -#endregion Datastore_Export - -#region VsSwitch_Export -Function VsSwitch_Export -{ - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="Nic";E={$_.Nic}}, - @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, - @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, - @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, - @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, - @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, - @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, - @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, - @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, - @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo -} -#endregion VsSwitch_Export - -#region VssPort_Export -Function VssPort_Export -{ - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="VLanId";E={$_.VLanId}}, - @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPort_Export - -#region VssVmk_Export -Function VssVmk_Export -{ - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo - } - } - } -} -#endregion VssVmk_Export - -#region VssPnic_Export -Function VssPnic_Export -{ - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPnic_Export - -#region VdSwitch_Export -Function VdSwitch_Export -{ - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - ForEach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="Vendor";E={$_.Vendor}}, - @{N="Version";E={$_.Version}}, - @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, - @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo - } -} -#endregion VdSwitch_Export - -#region VdsPort_Export -Function VdsPort_Export -{ - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}}, - @{N="VdSwitch";E={$_.VdSwitch}}, - @{N="NumPorts";E={$_.NumPorts}}, - @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, - @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, - @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, - @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, - @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, - @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPort_Export - -#region VdsVmk_Export -Function VdsVmk_Export -{ - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo - - } - } -} -#endregion VdsVmk_Export - -#region VdsPnic_Export -Function VdsPnic_Export -{ - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch}}, - @{N="Portgroup";E={$_.Portgroup}}, - @{N="ConnectedEntity";E={$_.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPnic_Export - -#region Folder_Export -Function Folder_Export -{ - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - ForEach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo - } -} -#endregion Folder_Export - -#region Rdm_Export -Function Rdm_Export -{ - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, - @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, - @{N="Vm";E={$_.Parent}}, - @{N="Label";E={$_.Name}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, - @{N="DiskType";E={$_.DiskType}}, - @{N="Persistence";E={$_.Persistence}}, - @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, - @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, - @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo -} -#endregion Rdm_Export - -#region Drs_Rule_Export -Function Drs_Rule_Export -{ - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Type";E={$_.Type}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Rule_Export - -#region Drs_Cluster_Group_Export -Function Drs_Cluster_Group_Export -{ - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="GroupType";E={$_.GroupType}}, - @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Cluster_Group_Export - -#region Drs_VmHost_Rule_Export -Function Drs_VmHost_Rule_Export -{ - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) - { - Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Type";E={$_.Type}}, - @{N="VMGroup";E={$_.VMGroup}}, - @{N="VMHostGroup";E={$_.VMHostGroup}}, - @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, - @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo - } - } -} -#endregion Drs_VmHost_Rule_Export - -#region Resource_Pool_Export -Function Resource_Pool_Export -{ - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) - { - Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Cluster";E={$Cluster.Name}}, - @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, - @{N="NumCpuShares";E={$_.NumCpuShares}}, - @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, - @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, - @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, - @{N="MemSharesLevel";E={$_.MemSharesLevel}}, - @{N="NumMemShares";E={$_.NumMemShares}}, - @{N="MemReservationGB";E={$_.MemReservationGB}}, - @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, - @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo - } - } -} -#endregion Resource_Pool_Export - -#endregion CsvExportFunctions - -#endregion Functions - -Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter - -#Zip Files -cd $CsvDir -dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } - -#Send E-mail -Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile - -#Clear CSV Folder -cd $CsvDir -del *.csv \ No newline at end of file From de1b805a3ec2d27c359425da5ef17e5d052d0ad3 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Mon, 16 Apr 2018 23:21:40 -0400 Subject: [PATCH 13/19] vDiagram Scheduled Task --- .../vDiagram_Scheduled_Task_2.0.1.ps1 | 593 ++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100644 vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 new file mode 100644 index 0000000..751c2de --- /dev/null +++ b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 @@ -0,0 +1,593 @@ +$Date = (Get-Date -format "yyyy_MM_dd") +$7zip = "C:\Program Files\7-Zip\7z.exe" + +# Variables +$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." +$vCenterShortName = "Replace with vCenter name." +$CsvDir = "C:\vDiagram\Capture" +$SMTPserver = "SMTP Server" +$Mailfrom = "outbound@email.com" +$Mailto = "you@email.com" +$Subject = "vDiagram 2.0 Files" +$ReportFile = "C:\vDiagram\Zip" +$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" +$AttachmentFile = $ZipFile +$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" + + +#region Functions +#region PsCreds +#region Export-PSCredential +Function Export-PSCredential { + param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) + + # Look at the object type of the $Credential parameter to determine how to handle it + switch ( $Credential.GetType().Name ) { + # It is a credential, so continue + PSCredential { continue } + # It is a string, so use that as the username and prompt for the password + String { $Credential = Get-Credential -credential $Credential } + # In all other caess, throw an error and exit + default { Throw "You must specify a credential object to export to disk." } + } + + # Create temporary object to be serialized to disk + $export = "" | Select-Object Username, EncryptedPassword + + # Give object a type name which can be identified later + #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) + + $export.Username = $Credential.Username + + # Encrypt SecureString password using Data Protection API + # Only the current user account can decrypt this cipher + $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString + + # Export using the Export-Clixml cmdlet + $export | Export-Clixml $Path + Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine + + # Return FileInfo object referring to saved credentials + Get-Item $Path +} +Export-PSCredential +#endregion Export-PSCredential + +#region Import-PSCredential +Function Import-PSCredential { + param ( $Path = "credentials.xml" ) + + # Import credential file + $import = Import-Clixml $Path + + # Test for valid import + if ( !$import.UserName -or !$import.EncryptedPassword ) { + Throw "Input is not a valid ExportedPSCredential object, exiting." + } + $Username = $import.Username + + # Decrypt the password and store as a SecureString object for safekeeping + $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString + + # Build the new credential object + $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass + Write-Output $Credential +} +#endregion Import-PSCredential + +#endregion PsCreds + +#region vCenterFunctions +#region Connect_vCenter_Main +Function Connect_vCenter_Main +{ + $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter_Main + +#region Connect_vCenter +Function Connect_vCenter +{ + $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter + +#region Disconnect_vCenter +Function Disconnect_vCenter +{ + Disconnect-ViServer * -Confirm:$False +} +#endregion Disconnect_vCenter +#endregion vCenterFunctions + +#region CsvExportFunctions +#region vCenter_Export +Function vCenter_Export +{ + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, + @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, + @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo + Disconnect_vCenter +} +#endregion vCenter_Export + +#region Datacenter_Export +Function Datacenter_Export +{ + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo +} +#endregion Datacenter_Export + +#region Cluster_Export +Function Cluster_Export +{ + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, + @{N="HAEnabled";E={$_.HAEnabled}}, + @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, + @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, + @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, + @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, + @{N="DrsEnabled";E={$_.DrsEnabled}}, + @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, + @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, + @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo +} +#endregion Cluster_Export + +#region VmHost_Export +Function VmHost_Export +{ + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={ + $Datacenter = Get-View -Id $_.Parent -Property Name,Parent + While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent + } + If($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name}}}, + @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent + While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent + } + If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, + @{N="Version";E={$_.Config.Product.Version}}, + @{N="Build";E={$_.Config.Product.Build}}, + @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, + @{N="Model";E={$_.Summary.Hardware.Model}}, + @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, + @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, + @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, + @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, + @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, + @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, + @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, + @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, + @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, + @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo +} +#endregion VmHost_Export + +#region Vm_Export +Function Vm_Export +{ + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select Name, + @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, + @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, + @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, + @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, + @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, + @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, + @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, + @{N="OS";E={$_.Config.GuestFullName}}, + @{N="Version";E={$_.Config.Version}}, + @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, + @{N='Folder';E={$Folder.Name}}, + @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, + @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, + @{N="IP";E={$_.Guest.IpAddress}}, + @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, + @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, + @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, + @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo + } +} +#endregion Vm_Export + +#region Template_Export +Function Template_Export +{ + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + ForEach($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$VmHost | Get-Datacenter}}, + @{N="Cluster";E={$VmHost | Get-Cluster}}, + @{N="VmHost";E={$VmHost.name}}, + @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, + @{N="Folder";E={Get-Folder -Id $_.FolderId}}, + @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, + @{N="Version";E={$_.ExtensionData.Config.Version}}, + @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, + @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, + @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, + @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, + @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo + } +} +#endregion Template_Export + +#region DatastoreCluster_Export +Function DatastoreCluster_Export +{ + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, + @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, + @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, + @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, + @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo +} +#endregion DatastoreCluster_Export + +#region Datastore_Export +Function Datastore_Export +{ + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, + @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, + @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, + @{N="Type";E={$_.Type}}, + @{N="FileSystemVersion";E={$_.FileSystemVersion}}, + @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, + @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, + @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, + @{N="Accessible";E={$_.State}}, + @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo +} +#endregion Datastore_Export + +#region VsSwitch_Export +Function VsSwitch_Export +{ + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="Nic";E={$_.Nic}}, + @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, + @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, + @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, + @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, + @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, + @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, + @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, + @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, + @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo +} +#endregion VsSwitch_Export + +#region VssPort_Export +Function VssPort_Export +{ + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="VLanId";E={$_.VLanId}}, + @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPort_Export + +#region VssVmk_Export +Function VssVmk_Export +{ + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo + } + } + } +} +#endregion VssVmk_Export + +#region VssPnic_Export +Function VssPnic_Export +{ + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPnic_Export + +#region VdSwitch_Export +Function VdSwitch_Export +{ + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + ForEach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="Vendor";E={$_.Vendor}}, + @{N="Version";E={$_.Version}}, + @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, + @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo + } +} +#endregion VdSwitch_Export + +#region VdsPort_Export +Function VdsPort_Export +{ + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}}, + @{N="VdSwitch";E={$_.VdSwitch}}, + @{N="NumPorts";E={$_.NumPorts}}, + @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, + @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, + @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, + @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, + @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, + @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPort_Export + +#region VdsVmk_Export +Function VdsVmk_Export +{ + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo + + } + } +} +#endregion VdsVmk_Export + +#region VdsPnic_Export +Function VdsPnic_Export +{ + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch}}, + @{N="Portgroup";E={$_.Portgroup}}, + @{N="ConnectedEntity";E={$_.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPnic_Export + +#region Folder_Export +Function Folder_Export +{ + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + ForEach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo + } +} +#endregion Folder_Export + +#region Rdm_Export +Function Rdm_Export +{ + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, + @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, + @{N="Vm";E={$_.Parent}}, + @{N="Label";E={$_.Name}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, + @{N="DiskType";E={$_.DiskType}}, + @{N="Persistence";E={$_.Persistence}}, + @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, + @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, + @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo +} +#endregion Rdm_Export + +#region Drs_Rule_Export +Function Drs_Rule_Export +{ + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Type";E={$_.Type}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Rule_Export + +#region Drs_Cluster_Group_Export +Function Drs_Cluster_Group_Export +{ + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="GroupType";E={$_.GroupType}}, + @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Cluster_Group_Export + +#region Drs_VmHost_Rule_Export +Function Drs_VmHost_Rule_Export +{ + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) + { + Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Type";E={$_.Type}}, + @{N="VMGroup";E={$_.VMGroup}}, + @{N="VMHostGroup";E={$_.VMHostGroup}}, + @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, + @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo + } + } +} +#endregion Drs_VmHost_Rule_Export + +#region Resource_Pool_Export +Function Resource_Pool_Export +{ + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) + { + Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Cluster";E={$Cluster.Name}}, + @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, + @{N="NumCpuShares";E={$_.NumCpuShares}}, + @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, + @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, + @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, + @{N="MemSharesLevel";E={$_.MemSharesLevel}}, + @{N="NumMemShares";E={$_.NumMemShares}}, + @{N="MemReservationGB";E={$_.MemReservationGB}}, + @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, + @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo + } + } +} +#endregion Resource_Pool_Export + +#endregion CsvExportFunctions + +#endregion Functions + +Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter + +#Zip Files +cd $CsvDir +dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } + +#Send E-mail +Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile + +#Clear CSV Folder +cd $CsvDir +del *.csv \ No newline at end of file From a0fab39f38974136ae897d258d4ebd60b806882b Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Mon, 16 Apr 2018 23:22:09 -0400 Subject: [PATCH 14/19] Delete vDiagram_Scheduled_Task_2.0.1.ps1 --- .../vDiagram_Scheduled_Task_2.0.1.ps1 | 593 ------------------ 1 file changed, 593 deletions(-) delete mode 100644 vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 deleted file mode 100644 index 751c2de..0000000 --- a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 +++ /dev/null @@ -1,593 +0,0 @@ -$Date = (Get-Date -format "yyyy_MM_dd") -$7zip = "C:\Program Files\7-Zip\7z.exe" - -# Variables -$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." -$vCenterShortName = "Replace with vCenter name." -$CsvDir = "C:\vDiagram\Capture" -$SMTPserver = "SMTP Server" -$Mailfrom = "outbound@email.com" -$Mailto = "you@email.com" -$Subject = "vDiagram 2.0 Files" -$ReportFile = "C:\vDiagram\Zip" -$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" -$AttachmentFile = $ZipFile -$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" - - -#region Functions -#region PsCreds -#region Export-PSCredential -Function Export-PSCredential { - param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) - - # Look at the object type of the $Credential parameter to determine how to handle it - switch ( $Credential.GetType().Name ) { - # It is a credential, so continue - PSCredential { continue } - # It is a string, so use that as the username and prompt for the password - String { $Credential = Get-Credential -credential $Credential } - # In all other caess, throw an error and exit - default { Throw "You must specify a credential object to export to disk." } - } - - # Create temporary object to be serialized to disk - $export = "" | Select-Object Username, EncryptedPassword - - # Give object a type name which can be identified later - #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) - - $export.Username = $Credential.Username - - # Encrypt SecureString password using Data Protection API - # Only the current user account can decrypt this cipher - $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString - - # Export using the Export-Clixml cmdlet - $export | Export-Clixml $Path - Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine - - # Return FileInfo object referring to saved credentials - Get-Item $Path -} -Export-PSCredential -#endregion Export-PSCredential - -#region Import-PSCredential -Function Import-PSCredential { - param ( $Path = "credentials.xml" ) - - # Import credential file - $import = Import-Clixml $Path - - # Test for valid import - if ( !$import.UserName -or !$import.EncryptedPassword ) { - Throw "Input is not a valid ExportedPSCredential object, exiting." - } - $Username = $import.Username - - # Decrypt the password and store as a SecureString object for safekeeping - $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString - - # Build the new credential object - $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass - Write-Output $Credential -} -#endregion Import-PSCredential - -#endregion PsCreds - -#region vCenterFunctions -#region Connect_vCenter_Main -Function Connect_vCenter_Main -{ - $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter_Main - -#region Connect_vCenter -Function Connect_vCenter -{ - $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter - -#region Disconnect_vCenter -Function Disconnect_vCenter -{ - Disconnect-ViServer * -Confirm:$False -} -#endregion Disconnect_vCenter -#endregion vCenterFunctions - -#region CsvExportFunctions -#region vCenter_Export -Function vCenter_Export -{ - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, - @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, - @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo - Disconnect_vCenter -} -#endregion vCenter_Export - -#region Datacenter_Export -Function Datacenter_Export -{ - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo -} -#endregion Datacenter_Export - -#region Cluster_Export -Function Cluster_Export -{ - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, - @{N="HAEnabled";E={$_.HAEnabled}}, - @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, - @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, - @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, - @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, - @{N="DrsEnabled";E={$_.DrsEnabled}}, - @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, - @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, - @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo -} -#endregion Cluster_Export - -#region VmHost_Export -Function VmHost_Export -{ - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={ - $Datacenter = Get-View -Id $_.Parent -Property Name,Parent - While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent - } - If($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name}}}, - @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent - While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent - } - If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, - @{N="Version";E={$_.Config.Product.Version}}, - @{N="Build";E={$_.Config.Product.Build}}, - @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, - @{N="Model";E={$_.Summary.Hardware.Model}}, - @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, - @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, - @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, - @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, - @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, - @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, - @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, - @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, - @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, - @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo -} -#endregion VmHost_Export - -#region Vm_Export -Function Vm_Export -{ - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select Name, - @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, - @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, - @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, - @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, - @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, - @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, - @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, - @{N="OS";E={$_.Config.GuestFullName}}, - @{N="Version";E={$_.Config.Version}}, - @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, - @{N='Folder';E={$Folder.Name}}, - @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, - @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, - @{N="IP";E={$_.Guest.IpAddress}}, - @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, - @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, - @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, - @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo - } -} -#endregion Vm_Export - -#region Template_Export -Function Template_Export -{ - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - ForEach($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$VmHost | Get-Datacenter}}, - @{N="Cluster";E={$VmHost | Get-Cluster}}, - @{N="VmHost";E={$VmHost.name}}, - @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, - @{N="Folder";E={Get-Folder -Id $_.FolderId}}, - @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, - @{N="Version";E={$_.ExtensionData.Config.Version}}, - @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, - @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, - @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, - @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, - @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo - } -} -#endregion Template_Export - -#region DatastoreCluster_Export -Function DatastoreCluster_Export -{ - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, - @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, - @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, - @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, - @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo -} -#endregion DatastoreCluster_Export - -#region Datastore_Export -Function Datastore_Export -{ - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, - @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, - @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, - @{N="Type";E={$_.Type}}, - @{N="FileSystemVersion";E={$_.FileSystemVersion}}, - @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, - @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, - @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, - @{N="Accessible";E={$_.State}}, - @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo -} -#endregion Datastore_Export - -#region VsSwitch_Export -Function VsSwitch_Export -{ - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="Nic";E={$_.Nic}}, - @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, - @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, - @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, - @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, - @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, - @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, - @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, - @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, - @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo -} -#endregion VsSwitch_Export - -#region VssPort_Export -Function VssPort_Export -{ - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="VLanId";E={$_.VLanId}}, - @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPort_Export - -#region VssVmk_Export -Function VssVmk_Export -{ - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo - } - } - } -} -#endregion VssVmk_Export - -#region VssPnic_Export -Function VssPnic_Export -{ - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPnic_Export - -#region VdSwitch_Export -Function VdSwitch_Export -{ - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - ForEach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="Vendor";E={$_.Vendor}}, - @{N="Version";E={$_.Version}}, - @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, - @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo - } -} -#endregion VdSwitch_Export - -#region VdsPort_Export -Function VdsPort_Export -{ - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}}, - @{N="VdSwitch";E={$_.VdSwitch}}, - @{N="NumPorts";E={$_.NumPorts}}, - @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, - @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, - @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, - @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, - @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, - @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPort_Export - -#region VdsVmk_Export -Function VdsVmk_Export -{ - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo - - } - } -} -#endregion VdsVmk_Export - -#region VdsPnic_Export -Function VdsPnic_Export -{ - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch}}, - @{N="Portgroup";E={$_.Portgroup}}, - @{N="ConnectedEntity";E={$_.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPnic_Export - -#region Folder_Export -Function Folder_Export -{ - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - ForEach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo - } -} -#endregion Folder_Export - -#region Rdm_Export -Function Rdm_Export -{ - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, - @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, - @{N="Vm";E={$_.Parent}}, - @{N="Label";E={$_.Name}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, - @{N="DiskType";E={$_.DiskType}}, - @{N="Persistence";E={$_.Persistence}}, - @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, - @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, - @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo -} -#endregion Rdm_Export - -#region Drs_Rule_Export -Function Drs_Rule_Export -{ - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Type";E={$_.Type}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Rule_Export - -#region Drs_Cluster_Group_Export -Function Drs_Cluster_Group_Export -{ - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="GroupType";E={$_.GroupType}}, - @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Cluster_Group_Export - -#region Drs_VmHost_Rule_Export -Function Drs_VmHost_Rule_Export -{ - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) - { - Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Type";E={$_.Type}}, - @{N="VMGroup";E={$_.VMGroup}}, - @{N="VMHostGroup";E={$_.VMHostGroup}}, - @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, - @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo - } - } -} -#endregion Drs_VmHost_Rule_Export - -#region Resource_Pool_Export -Function Resource_Pool_Export -{ - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) - { - Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Cluster";E={$Cluster.Name}}, - @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, - @{N="NumCpuShares";E={$_.NumCpuShares}}, - @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, - @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, - @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, - @{N="MemSharesLevel";E={$_.MemSharesLevel}}, - @{N="NumMemShares";E={$_.NumMemShares}}, - @{N="MemReservationGB";E={$_.MemReservationGB}}, - @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, - @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo - } - } -} -#endregion Resource_Pool_Export - -#endregion CsvExportFunctions - -#endregion Functions - -Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter - -#Zip Files -cd $CsvDir -dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } - -#Send E-mail -Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile - -#Clear CSV Folder -cd $CsvDir -del *.csv \ No newline at end of file From 0ff54424526cad203cadb6863b483380850a8173 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Mon, 16 Apr 2018 23:22:41 -0400 Subject: [PATCH 15/19] vDiagram 2.0.1 - Scheduled Task --- .../vDiagram_Scheduled_Task_2.0.1.ps1 | 593 ++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100644 vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 new file mode 100644 index 0000000..751c2de --- /dev/null +++ b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 @@ -0,0 +1,593 @@ +$Date = (Get-Date -format "yyyy_MM_dd") +$7zip = "C:\Program Files\7-Zip\7z.exe" + +# Variables +$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." +$vCenterShortName = "Replace with vCenter name." +$CsvDir = "C:\vDiagram\Capture" +$SMTPserver = "SMTP Server" +$Mailfrom = "outbound@email.com" +$Mailto = "you@email.com" +$Subject = "vDiagram 2.0 Files" +$ReportFile = "C:\vDiagram\Zip" +$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" +$AttachmentFile = $ZipFile +$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" + + +#region Functions +#region PsCreds +#region Export-PSCredential +Function Export-PSCredential { + param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) + + # Look at the object type of the $Credential parameter to determine how to handle it + switch ( $Credential.GetType().Name ) { + # It is a credential, so continue + PSCredential { continue } + # It is a string, so use that as the username and prompt for the password + String { $Credential = Get-Credential -credential $Credential } + # In all other caess, throw an error and exit + default { Throw "You must specify a credential object to export to disk." } + } + + # Create temporary object to be serialized to disk + $export = "" | Select-Object Username, EncryptedPassword + + # Give object a type name which can be identified later + #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) + + $export.Username = $Credential.Username + + # Encrypt SecureString password using Data Protection API + # Only the current user account can decrypt this cipher + $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString + + # Export using the Export-Clixml cmdlet + $export | Export-Clixml $Path + Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine + + # Return FileInfo object referring to saved credentials + Get-Item $Path +} +Export-PSCredential +#endregion Export-PSCredential + +#region Import-PSCredential +Function Import-PSCredential { + param ( $Path = "credentials.xml" ) + + # Import credential file + $import = Import-Clixml $Path + + # Test for valid import + if ( !$import.UserName -or !$import.EncryptedPassword ) { + Throw "Input is not a valid ExportedPSCredential object, exiting." + } + $Username = $import.Username + + # Decrypt the password and store as a SecureString object for safekeeping + $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString + + # Build the new credential object + $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass + Write-Output $Credential +} +#endregion Import-PSCredential + +#endregion PsCreds + +#region vCenterFunctions +#region Connect_vCenter_Main +Function Connect_vCenter_Main +{ + $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter_Main + +#region Connect_vCenter +Function Connect_vCenter +{ + $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter + +#region Disconnect_vCenter +Function Disconnect_vCenter +{ + Disconnect-ViServer * -Confirm:$False +} +#endregion Disconnect_vCenter +#endregion vCenterFunctions + +#region CsvExportFunctions +#region vCenter_Export +Function vCenter_Export +{ + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, + @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, + @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo + Disconnect_vCenter +} +#endregion vCenter_Export + +#region Datacenter_Export +Function Datacenter_Export +{ + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo +} +#endregion Datacenter_Export + +#region Cluster_Export +Function Cluster_Export +{ + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, + @{N="HAEnabled";E={$_.HAEnabled}}, + @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, + @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, + @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, + @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, + @{N="DrsEnabled";E={$_.DrsEnabled}}, + @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, + @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, + @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo +} +#endregion Cluster_Export + +#region VmHost_Export +Function VmHost_Export +{ + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={ + $Datacenter = Get-View -Id $_.Parent -Property Name,Parent + While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent + } + If($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name}}}, + @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent + While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent + } + If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, + @{N="Version";E={$_.Config.Product.Version}}, + @{N="Build";E={$_.Config.Product.Build}}, + @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, + @{N="Model";E={$_.Summary.Hardware.Model}}, + @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, + @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, + @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, + @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, + @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, + @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, + @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, + @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, + @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, + @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo +} +#endregion VmHost_Export + +#region Vm_Export +Function Vm_Export +{ + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select Name, + @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, + @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, + @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, + @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, + @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, + @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, + @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, + @{N="OS";E={$_.Config.GuestFullName}}, + @{N="Version";E={$_.Config.Version}}, + @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, + @{N='Folder';E={$Folder.Name}}, + @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, + @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, + @{N="IP";E={$_.Guest.IpAddress}}, + @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, + @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, + @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, + @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo + } +} +#endregion Vm_Export + +#region Template_Export +Function Template_Export +{ + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + ForEach($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$VmHost | Get-Datacenter}}, + @{N="Cluster";E={$VmHost | Get-Cluster}}, + @{N="VmHost";E={$VmHost.name}}, + @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, + @{N="Folder";E={Get-Folder -Id $_.FolderId}}, + @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, + @{N="Version";E={$_.ExtensionData.Config.Version}}, + @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, + @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, + @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, + @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, + @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo + } +} +#endregion Template_Export + +#region DatastoreCluster_Export +Function DatastoreCluster_Export +{ + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, + @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, + @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, + @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, + @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo +} +#endregion DatastoreCluster_Export + +#region Datastore_Export +Function Datastore_Export +{ + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, + @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, + @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, + @{N="Type";E={$_.Type}}, + @{N="FileSystemVersion";E={$_.FileSystemVersion}}, + @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, + @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, + @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, + @{N="Accessible";E={$_.State}}, + @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo +} +#endregion Datastore_Export + +#region VsSwitch_Export +Function VsSwitch_Export +{ + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="Nic";E={$_.Nic}}, + @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, + @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, + @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, + @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, + @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, + @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, + @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, + @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, + @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo +} +#endregion VsSwitch_Export + +#region VssPort_Export +Function VssPort_Export +{ + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="VLanId";E={$_.VLanId}}, + @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPort_Export + +#region VssVmk_Export +Function VssVmk_Export +{ + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo + } + } + } +} +#endregion VssVmk_Export + +#region VssPnic_Export +Function VssPnic_Export +{ + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPnic_Export + +#region VdSwitch_Export +Function VdSwitch_Export +{ + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + ForEach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="Vendor";E={$_.Vendor}}, + @{N="Version";E={$_.Version}}, + @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, + @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo + } +} +#endregion VdSwitch_Export + +#region VdsPort_Export +Function VdsPort_Export +{ + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}}, + @{N="VdSwitch";E={$_.VdSwitch}}, + @{N="NumPorts";E={$_.NumPorts}}, + @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, + @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, + @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, + @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, + @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, + @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPort_Export + +#region VdsVmk_Export +Function VdsVmk_Export +{ + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo + + } + } +} +#endregion VdsVmk_Export + +#region VdsPnic_Export +Function VdsPnic_Export +{ + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch}}, + @{N="Portgroup";E={$_.Portgroup}}, + @{N="ConnectedEntity";E={$_.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPnic_Export + +#region Folder_Export +Function Folder_Export +{ + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + ForEach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo + } +} +#endregion Folder_Export + +#region Rdm_Export +Function Rdm_Export +{ + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, + @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, + @{N="Vm";E={$_.Parent}}, + @{N="Label";E={$_.Name}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, + @{N="DiskType";E={$_.DiskType}}, + @{N="Persistence";E={$_.Persistence}}, + @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, + @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, + @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo +} +#endregion Rdm_Export + +#region Drs_Rule_Export +Function Drs_Rule_Export +{ + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Type";E={$_.Type}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Rule_Export + +#region Drs_Cluster_Group_Export +Function Drs_Cluster_Group_Export +{ + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="GroupType";E={$_.GroupType}}, + @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Cluster_Group_Export + +#region Drs_VmHost_Rule_Export +Function Drs_VmHost_Rule_Export +{ + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) + { + Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Type";E={$_.Type}}, + @{N="VMGroup";E={$_.VMGroup}}, + @{N="VMHostGroup";E={$_.VMHostGroup}}, + @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, + @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo + } + } +} +#endregion Drs_VmHost_Rule_Export + +#region Resource_Pool_Export +Function Resource_Pool_Export +{ + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) + { + Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Cluster";E={$Cluster.Name}}, + @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, + @{N="NumCpuShares";E={$_.NumCpuShares}}, + @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, + @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, + @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, + @{N="MemSharesLevel";E={$_.MemSharesLevel}}, + @{N="NumMemShares";E={$_.NumMemShares}}, + @{N="MemReservationGB";E={$_.MemReservationGB}}, + @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, + @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo + } + } +} +#endregion Resource_Pool_Export + +#endregion CsvExportFunctions + +#endregion Functions + +Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter + +#Zip Files +cd $CsvDir +dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } + +#Send E-mail +Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile + +#Clear CSV Folder +cd $CsvDir +del *.csv \ No newline at end of file From 0967e32961ee6b04195c73c094d3adc1121d49ec Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Mon, 16 Apr 2018 23:23:09 -0400 Subject: [PATCH 16/19] vDiagram 2.0.1 - GUI --- vDiagram_2.0.1/vDiagram_2.0.1.ps1 | 5664 +++++++++++++++++++++++++++++ 1 file changed, 5664 insertions(+) create mode 100644 vDiagram_2.0.1/vDiagram_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 new file mode 100644 index 0000000..5e57b51 --- /dev/null +++ b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 @@ -0,0 +1,5664 @@ +<# +.SYNOPSIS + vDiagram Visio Drawing Tool + +.DESCRIPTION + vDiagram Visio Drawing Tool + +.NOTES + File Name : vDiagram2.0.1.ps1 + Author : Tony Gonzalez + Author : Jason Hopkins + Based on : vDiagram by Alan Renouf + Version : 2.0.1 + +.USAGE NOTES + Ensure to unblock files before unzipping + Ensure to run as administrator + Required Files: + PowerCLI or PowerShell 5.0 with PowerCLI Modules installed + Active connection to vCenter to capture data + MS Visio + +.CHANGE LOG + - 04/12/2018 - v2.0.1 + Added MAC Addresses to VMs & Templates + Added a check to see if prior CSVs are still present + Added option to copy prior CSVs to new folder + Consolidate the object plaement into functions for ease of management + + - 04/11/2018 - v2.0.0 + Presented as a Community Theater Session at South Florida VMUG + Feature enhancement requests collected +#> + +#region ScriptForm Designer + +#region Constructor + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") +#endregion + +#region Post-Constructor Custom Code +$DateTime = (Get-Date -format "yyyy_MM_dd-HH_MM") +$MyVer = "2.0.1" +$LastUpdated = "April 12, 2018" +$About = +@" + + vDiagram $MyVer + + Contributors: Tony Gonzalez of RoundTower Technologies LLC + Jason Hopkins of RoundTower Technologies LLC + + Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram + + Created: February 13, 2018 + + Last Updated: $LastUpdated + +"@ +#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" +if (!(Test-Path $TestShapes)) +{ + $CurrentLocation = Get-Location + copy $CurrentLocation\vDiagram.vssx $TestShapes + Write-Host "Copying Shapes File to My Shapes" +} +$shpFile = "\vDiagram.vssx" +#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Set_WindowStyle { +param( + [Parameter()] + [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', + 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', + 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] + $Style = 'SHOW', + [Parameter()] + $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle +) + $WindowStates = @{ + FORCEMINIMIZE = 11; HIDE = 0 + MAXIMIZE = 3; MINIMIZE = 6 + RESTORE = 9; SHOW = 5 + SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 + SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 + SHOWNA = 8; SHOWNOACTIVATE = 4 + SHOWNORMAL = 1 + } + Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) + + $Win32ShowWindowAsync = Add-Type –memberDefinition @” + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); +“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru + + $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null +} +Set_WindowStyle MINIMIZE +#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function About_Config +{ + + $About + + #Add objects for About + $AboutForm = New-Object System.Windows.Forms.Form + $AboutTextBox = New-Object System.Windows.Forms.RichTextBox + + #About Form + $AboutForm.Icon = $Icon + $AboutForm.AutoScroll = $True + $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) + $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutForm.Name = "About" + $AboutForm.StartPosition = 1 + $AboutForm.Text = "About vDiagram $MyVer" + + $AboutTextBox.Anchor = 15 + $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) + $AboutTextBox.BorderStyle = 0 + $AboutTextBox.Font = "Tahoma" + $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) + $AboutTextBox.Name = "AboutTextBox" + $AboutTextBox.ReadOnly = $True + $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) + $AboutTextBox.Text = $About + + $AboutForm.Controls.Add($AboutTextBox) + + $AboutForm.Show() | Out-Null +} +#endregion + +#region Form Creation +#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vDiagram = New-Object System.Windows.Forms.Form +$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) +$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") +$vDiagram.Icon = $Icon +$vDiagram.Text = "vDiagram 2.0" +$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan +#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainMenu = New-Object System.Windows.Forms.MenuStrip +$MainMenu.Location = New-Object System.Drawing.Point(0, 0) +$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) +$MainMenu.TabIndex = 1 +$MainMenu.Text = "MainMenu" +#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) +$FileToolStripMenuItem.Text = "File" +#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) +$ExitToolStripMenuItem.Text = "Exit" +$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) +$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) +#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) +$HelpToolStripMenuItem.Text = "Help" +#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) +$AboutToolStripMenuItem.Text = "About" +$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) +$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) +$AboutToolStripMenuItem.Add_Click({About_Config}) +#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainTab = New-Object System.Windows.Forms.TabControl +$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) +$MainTab.Location = New-Object System.Drawing.Point(10, 30) +$MainTab.Size = New-Object System.Drawing.Size(990, 98) +$MainTab.TabIndex = 0 +$MainTab.Text = "MainTabs" +#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Prerequisites = New-Object System.Windows.Forms.TabPage +$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) +$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) +$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) +$Prerequisites.TabIndex = 0 +$Prerequisites.Text = "Prerequisites" +$Prerequisites.BackColor = [System.Drawing.Color]::LightGray +#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellLabel = New-Object System.Windows.Forms.Label +$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) +$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) +$PowershellLabel.TabIndex = 1 +$PowershellLabel.Text = "Powershell:" +#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellInstalled = New-Object System.Windows.Forms.Label +$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) +$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) +$PowershellInstalled.TabIndex = 2 +$PowershellInstalled.Text = "" +$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleLabel = New-Object System.Windows.Forms.Label +$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) +$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) +$PowerCliModuleLabel.TabIndex = 3 +$PowerCliModuleLabel.Text = "PowerCLI Module:" +#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label +$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) +$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) +$PowerCliModuleInstalled.TabIndex = 4 +$PowerCliModuleInstalled.Text = "" +$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliLabel = New-Object System.Windows.Forms.Label +$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) +$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) +$PowerCliLabel.TabIndex = 5 +$PowerCliLabel.Text = "PowerCLI:" +#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliInstalled = New-Object System.Windows.Forms.Label +$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) +$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) +$PowerCliInstalled.TabIndex = 6 +$PowerCliInstalled.Text = "" +$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioLabel = New-Object System.Windows.Forms.Label +$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) +$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) +$VisioLabel.TabIndex = 7 +$VisioLabel.Text = "Visio:" +#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioInstalled = New-Object System.Windows.Forms.Label +$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) +$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) +$VisioInstalled.TabIndex = 8 +$VisioInstalled.Text = "" +$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray +$Prerequisites.Controls.Add($PowershellLabel) +$Prerequisites.Controls.Add($PowershellInstalled) +$Prerequisites.Controls.Add($PowerCliModuleLabel) +$Prerequisites.Controls.Add($PowerCliModuleInstalled) +$Prerequisites.Controls.Add($PowerCliLabel) +$Prerequisites.Controls.Add($PowerCliInstalled) +$Prerequisites.Controls.Add($VisioLabel) +$Prerequisites.Controls.Add($VisioInstalled) +#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfo = New-Object System.Windows.Forms.TabPage +$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) +$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) +$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) +$vCenterInfo.TabIndex = 0 +$vCenterInfo.Text = "vCenter Info" +$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray +#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterLabel = New-Object System.Windows.Forms.Label +$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) +$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) +$MainVcenterLabel.TabIndex = 1 +$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" +#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox +$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) +$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) +$MainVcenterTextBox.TabIndex = 2 +$MainVcenterTextBox.Text = "" +#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterLabel = New-Object System.Windows.Forms.Label +$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) +$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) +$TargetVcenterLabel.TabIndex = 3 +$TargetVcenterLabel.Text = "Name of target vCenter:" +#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox +$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) +$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) +$TargetVcenterTextBox.TabIndex = 4 +$TargetVcenterTextBox.Text = "" +#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameLabel = New-Object System.Windows.Forms.Label +$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) +$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) +$UserNameLabel.TabIndex = 5 +$UserNameLabel.Text = "vCenter User Name:" +#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameTextBox = New-Object System.Windows.Forms.TextBox +$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) +$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) +$UserNameTextBox.TabIndex = 6 +$UserNameTextBox.Text = "" +#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) +$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) +$PasswordLabel.TabIndex = 7 +$PasswordLabel.Text = "Password:" +#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordTextBox = New-Object System.Windows.Forms.TextBox +$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) +$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) +$PasswordTextBox.TabIndex = 8 +$PasswordTextBox.Text = "" +$PasswordTextBox.UseSystemPasswordChar = $true +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton = New-Object System.Windows.Forms.Button +$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) +$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) +$ConnectButton.TabIndex = 9 +$ConnectButton.Text = "Connect to vCenter" +$ConnectButton.UseVisualStyleBackColor = $true +$vCenterInfo.Controls.Add($MainVcenterLabel) +$vCenterInfo.Controls.Add($MainVcenterTextBox) +$vCenterInfo.Controls.Add($TargetVcenterLabel) +$vCenterInfo.Controls.Add($TargetVcenterTextBox) +$vCenterInfo.Controls.Add($UserNameLabel) +$vCenterInfo.Controls.Add($UserNameTextBox) +$vCenterInfo.Controls.Add($PasswordLabel) +$vCenterInfo.Controls.Add($PasswordTextBox) +$vCenterInfo.Controls.Add($ConnectButton) +$MainTab.Controls.Add($Prerequisites) +$MainTab.Controls.Add($vCenterInfo) +$MainTab.SelectedIndex = 0 +#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SubTab = New-Object System.Windows.Forms.TabControl +$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$SubTab.Location = New-Object System.Drawing.Point(10, 136) +$SubTab.Size = New-Object System.Drawing.Size(990, 512) +$SubTab.TabIndex = 0 +$SubTab.Text = "SubTabs" +#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDirections = New-Object System.Windows.Forms.TabPage +$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDirections.Location = New-Object System.Drawing.Point(4, 22) +$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDirections.Size = New-Object System.Drawing.Size(982, 486) +$TabDirections.TabIndex = 0 +$TabDirections.Text = "Directions" +$TabDirections.UseVisualStyleBackColor = $true +#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesHeading = New-Object System.Windows.Forms.Label +$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) +$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) +$PrerequisitesHeading.TabIndex = 0 +$PrerequisitesHeading.Text = "Prerequisites Tab" +#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesDirections = New-Object System.Windows.Forms.Label +$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) +$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) +$PrerequisitesDirections.TabIndex = 1 +$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." +#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoHeading = New-Object System.Windows.Forms.Label +$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) +$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) +$vCenterInfoHeading.TabIndex = 2 +$vCenterInfoHeading.Text = "vCenter Info Tab" +#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoDirections = New-Object System.Windows.Forms.Label +$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) +$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) +$vCenterInfoDirections.TabIndex = 3 +$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." +#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvHeading = New-Object System.Windows.Forms.Label +$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) +$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) +$CaptureCsvHeading.TabIndex = 4 +$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" +#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureDirections = New-Object System.Windows.Forms.Label +$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) +$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) +$CaptureDirections.TabIndex = 5 +$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." +#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawHeading = New-Object System.Windows.Forms.Label +$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) +$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) +$DrawHeading.TabIndex = 6 +$DrawHeading.Text = "Draw Visio Tab" +#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawDirections = New-Object System.Windows.Forms.Label +$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) +$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) +$DrawDirections.TabIndex = 7 +$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." +$TabDirections.Controls.Add($PrerequisitesHeading) +$TabDirections.Controls.Add($PrerequisitesDirections) +$TabDirections.Controls.Add($vCenterInfoHeading) +$TabDirections.Controls.Add($vCenterInfoDirections) +$TabDirections.Controls.Add($CaptureCsvHeading) +$TabDirections.Controls.Add($CaptureDirections) +$TabDirections.Controls.Add($DrawHeading) +$TabDirections.Controls.Add($DrawDirections) +#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabCapture = New-Object System.Windows.Forms.TabPage +$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabCapture.Location = New-Object System.Drawing.Point(4, 22) +$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) +$TabCapture.Size = New-Object System.Drawing.Size(982, 486) +$TabCapture.TabIndex = 3 +$TabCapture.Text = "Capture CSVs for Visio" +$TabCapture.UseVisualStyleBackColor = $true +#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label +$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) +$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) +$CaptureCsvOutputLabel.TabIndex = 0 +$CaptureCsvOutputLabel.Text = "CSV Output Folder:" +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button +$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) +$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) +$CaptureCsvOutputButton.TabIndex = 0 +$CaptureCsvOutputButton.Text = "Select Output Folder" +$CaptureCsvOutputButton.UseVisualStyleBackColor = $false +$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$vCenterCsvCheckBox.Checked = $true +$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$vCenterCsvCheckBox.TabIndex = 1 +$vCenterCsvCheckBox.Text = "Export vCenter Info" +$vCenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) +$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationComplete.TabIndex = 26 +$vCenterCsvValidationComplete.Text = "" +#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatacenterCsvCheckBox.Checked = $true +$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatacenterCsvCheckBox.TabIndex = 2 +$DatacenterCsvCheckBox.Text = "Export Datacenter Info" +$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) +$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationComplete.TabIndex = 27 +$DatacenterCsvValidationComplete.Text = "" +#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ClusterCsvCheckBox.Checked = $true +$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ClusterCsvCheckBox.TabIndex = 3 +$ClusterCsvCheckBox.Text = "Export Cluster Info" +$ClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) +$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationComplete.TabIndex = 28 +$ClusterCsvValidationComplete.Text = "" +#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmHostCsvCheckBox.Checked = $true +$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmHostCsvCheckBox.TabIndex = 4 +$VmHostCsvCheckBox.Text = "Export VmHost Info" +$VmHostCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) +$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationComplete.TabIndex = 29 +$VmHostCsvValidationComplete.Text = "" +#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmCsvCheckBox.Checked = $true +$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmCsvCheckBox.TabIndex = 5 +$VmCsvCheckBox.Text = "Export Vm Info" +$VmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) +$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationComplete.TabIndex = 30 +$VmCsvValidationComplete.Text = "" +#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$TemplateCsvCheckBox.Checked = $true +$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$TemplateCsvCheckBox.TabIndex = 6 +$TemplateCsvCheckBox.Text = "Export Template Info" +$TemplateCsvCheckBox.UseVisualStyleBackColor = $true +#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label +$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) +$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationComplete.TabIndex = 31 +$TemplateCsvValidationComplete.Text = "" +#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreClusterCsvCheckBox.Checked = $true +$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreClusterCsvCheckBox.TabIndex = 7 +$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" +$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) +$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationComplete.TabIndex = 32 +$DatastoreClusterCsvValidationComplete.Text = "" +#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreCsvCheckBox.Checked = $true +$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreCsvCheckBox.TabIndex = 8 +$DatastoreCsvCheckBox.Text = "Export Datastore Info" +$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) +$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationComplete.TabIndex = 33 +$DatastoreCsvValidationComplete.Text = "" +#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VsSwitchCsvCheckBox.Checked = $true +$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) +$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VsSwitchCsvCheckBox.TabIndex = 9 +$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" +$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) +$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationComplete.TabIndex = 34 +$VsSwitchCsvValidationComplete.Text = "" +#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPortGroupCsvCheckBox.Checked = $true +$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) +$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPortGroupCsvCheckBox.TabIndex = 10 +$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" +$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) +$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationComplete.TabIndex = 35 +$VssPortGroupCsvValidationComplete.Text = "" +#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssVmkernelCsvCheckBox.Checked = $true +$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) +$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssVmkernelCsvCheckBox.TabIndex = 11 +$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" +$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) +$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationComplete.TabIndex = 36 +$VssVmkernelCsvValidationComplete.Text = "" +#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPnicCsvCheckBox.Checked = $true +$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) +$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPnicCsvCheckBox.TabIndex = 12 +$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" +$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) +$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationComplete.TabIndex = 37 +$VssPnicCsvValidationComplete.Text = "" +#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdSwitchCsvCheckBox.Checked = $true +$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) +$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdSwitchCsvCheckBox.TabIndex = 13 +$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" +$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) +$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationComplete.TabIndex = 38 +$VdSwitchCsvValidationComplete.Text = "" +#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPortGroupCsvCheckBox.Checked = $true +$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) +$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPortGroupCsvCheckBox.TabIndex = 14 +$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" +$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) +$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationComplete.TabIndex = 39 +$VdsPortGroupCsvValidationComplete.Text = "" +#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsVmkernelCsvCheckBox.Checked = $true +$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) +$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsVmkernelCsvCheckBox.TabIndex = 15 +$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" +$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) +$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationComplete.TabIndex = 40 +$VdsVmkernelCsvValidationComplete.Text = "" +#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPnicCsvCheckBox.Checked = $true +$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) +$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPnicCsvCheckBox.TabIndex = 16 +$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" +$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) +$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationComplete.TabIndex = 41 +$VdsPnicCsvValidationComplete.Text = "" +#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$FolderCsvCheckBox.Checked = $true +$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) +$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$FolderCsvCheckBox.TabIndex = 17 +$FolderCsvCheckBox.Text = "Export Folder Info" +$FolderCsvCheckBox.UseVisualStyleBackColor = $true +#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label +$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) +$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationComplete.TabIndex = 42 +$FolderCsvValidationComplete.Text = "" +#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$RdmCsvCheckBox.Checked = $true +$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) +$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$RdmCsvCheckBox.TabIndex = 18 +$RdmCsvCheckBox.Text = "Export RDM Info" +$RdmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label +$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) +$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationComplete.TabIndex = 43 +$RdmCsvValidationComplete.Text = "" +#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsRuleCsvCheckBox.Checked = $true +$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) +$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsRuleCsvCheckBox.TabIndex = 19 +$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" +$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) +$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationComplete.TabIndex = 44 +$DrsRuleCsvValidationComplete.Text = "" +#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsClusterGroupCsvCheckBox.Checked = $true +$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) +$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsClusterGroupCsvCheckBox.TabIndex = 20 +$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" +$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) +$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationComplete.TabIndex = 45 +$DrsClusterGroupCsvValidationComplete.Text = "" +#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsVmHostRuleCsvCheckBox.Checked = $true +$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) +$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsVmHostRuleCsvCheckBox.TabIndex = 21 +$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" +$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) +$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 +$DrsVmHostRuleCsvValidationComplete.Text = "" +#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ResourcePoolCsvCheckBox.Checked = $true +$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) +$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ResourcePoolCsvCheckBox.TabIndex = 22 +$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" +$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) +$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationComplete.TabIndex = 47 +$ResourcePoolCsvValidationComplete.Text = "" +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton = New-Object System.Windows.Forms.Button +$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) +$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureUncheckButton.TabIndex = 23 +$CaptureUncheckButton.Text = "Uncheck All" +$CaptureUncheckButton.UseVisualStyleBackColor = $false +$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton = New-Object System.Windows.Forms.Button +$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) +$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureCheckButton.TabIndex = 24 +$CaptureCheckButton.Text = "Check All" +$CaptureCheckButton.UseVisualStyleBackColor = $false +$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton = New-Object System.Windows.Forms.Button +$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) +$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureButton.TabIndex = 25 +$CaptureButton.Text = "Collect CSV Data" +$CaptureButton.UseVisualStyleBackColor = $false +$CaptureButton.BackColor = [System.Drawing.Color]::LightGray +$TabCapture.Controls.Add($CaptureCsvOutputLabel) +$TabCapture.Controls.Add($CaptureCsvOutputButton) +$TabCapture.Controls.Add($vCenterCsvCheckBox) +$TabCapture.Controls.Add($vCenterCsvValidationComplete) +$TabCapture.Controls.Add($DatacenterCsvCheckBox) +$TabCapture.Controls.Add($DatacenterCsvValidationComplete) +$TabCapture.Controls.Add($ClusterCsvCheckBox) +$TabCapture.Controls.Add($ClusterCsvValidationComplete) +$TabCapture.Controls.Add($VmHostCsvCheckBox) +$TabCapture.Controls.Add($VmHostCsvValidationComplete) +$TabCapture.Controls.Add($VmCsvCheckBox) +$TabCapture.Controls.Add($VmCsvValidationComplete) +$TabCapture.Controls.Add($TemplateCsvCheckBox) +$TabCapture.Controls.Add($TemplateCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) +$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreCsvCheckBox) +$TabCapture.Controls.Add($DatastoreCsvValidationComplete) +$TabCapture.Controls.Add($VsSwitchCsvCheckBox) +$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VssPnicCsvCheckBox) +$TabCapture.Controls.Add($VssPnicCsvValidationComplete) +$TabCapture.Controls.Add($VdSwitchCsvCheckBox) +$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VdsPnicCsvCheckBox) +$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) +$TabCapture.Controls.Add($FolderCsvCheckBox) +$TabCapture.Controls.Add($FolderCsvValidationComplete) +$TabCapture.Controls.Add($RdmCsvCheckBox) +$TabCapture.Controls.Add($RdmCsvValidationComplete) +$TabCapture.Controls.Add($DrsRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) +$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) +$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) +$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) +$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) +$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) +$TabCapture.Controls.Add($CaptureUncheckButton) +$TabCapture.Controls.Add($CaptureCheckButton) +$TabCapture.Controls.Add($CaptureButton) +#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDraw = New-Object System.Windows.Forms.TabPage +$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDraw.Location = New-Object System.Drawing.Point(4, 22) +$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDraw.Size = New-Object System.Drawing.Size(982, 486) +$TabDraw.TabIndex = 2 +$TabDraw.Text = "Draw Visio" +$TabDraw.UseVisualStyleBackColor = $true +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton = New-Object System.Windows.Forms.Button +$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) +$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) +$OpenVisioButton.TabIndex = 83 +$OpenVisioButton.Text = "Open Visio Drawing" +$OpenVisioButton.UseVisualStyleBackColor = $false +$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton = New-Object System.Windows.Forms.Button +$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) +$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawCheckButton.TabIndex = 82 +$DrawCheckButton.Text = "Check All" +$DrawCheckButton.UseVisualStyleBackColor = $false +$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton = New-Object System.Windows.Forms.Button +$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawButton.Location = New-Object System.Drawing.Point(448, 450) +$DrawButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawButton.TabIndex = 81 +$DrawButton.Text = "Draw Visio" +$DrawButton.UseVisualStyleBackColor = $false +$DrawButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton = New-Object System.Windows.Forms.Button +$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) +$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawUncheckButton.TabIndex = 80 +$DrawUncheckButton.Text = "Uncheck All" +$DrawUncheckButton.UseVisualStyleBackColor = $false +$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOutputLabel = New-Object System.Windows.Forms.Label +$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) +$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) +$VisioOutputLabel.TabIndex = 46 +$VisioOutputLabel.Text = "Visio Output Folder:" +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton = New-Object System.Windows.Forms.Button +$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) +$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) +$VisioOpenOutputButton.TabIndex = 47 +$VisioOpenOutputButton.Text = "Select Visio Output Folder" +$VisioOpenOutputButton.UseVisualStyleBackColor = $false +$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputLabel = New-Object System.Windows.Forms.Label +$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) +$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) +$DrawCsvInputLabel.TabIndex = 0 +$DrawCsvInputLabel.Text = "CSV Input Folder:" +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton = New-Object System.Windows.Forms.Button +$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) +$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) +$DrawCsvInputButton.TabIndex = 1 +$DrawCsvInputButton.Text = "Select CSV Input Folder" +$DrawCsvInputButton.UseVisualStyleBackColor = $false +$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidation = New-Object System.Windows.Forms.Label +$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$vCenterCsvValidation.TabIndex = 2 +$vCenterCsvValidation.Text = "vCenter CSV File:" +#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) +$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationCheck.TabIndex = 3 +$vCenterCsvValidationCheck.Text = "" +#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidation = New-Object System.Windows.Forms.Label +$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatacenterCsvValidation.TabIndex = 4 +$DatacenterCsvValidation.Text = "Datacenter CSV File:" +#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) +$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationCheck.TabIndex = 5 +$DatacenterCsvValidationCheck.Text = "" +#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidation = New-Object System.Windows.Forms.Label +$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ClusterCsvValidation.TabIndex = 6 +$ClusterCsvValidation.Text = "Cluster CSV File:" +#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) +$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationCheck.TabIndex = 7 +$ClusterCsvValidationCheck.Text = "" +#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidation = New-Object System.Windows.Forms.Label +$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmHostCsvValidation.TabIndex = 8 +$VmHostCsvValidation.Text = "VmHost CSV File:" +#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) +$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationCheck.TabIndex = 9 +$VmHostCsvValidationCheck.Text = "" +#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidation = New-Object System.Windows.Forms.Label +$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmCsvValidation.TabIndex = 10 +$VmCsvValidation.Text = "VM CSV File:" +#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) +$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationCheck.TabIndex = 11 +$VmCsvValidationCheck.Text = "" +#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidation = New-Object System.Windows.Forms.Label +$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$TemplateCsvValidation.TabIndex = 12 +$TemplateCsvValidation.Text = "Template CSV File:" +#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label +$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) +$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationCheck.TabIndex = 13 +$TemplateCsvValidationCheck.Text = "" +#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreClusterCsvValidation.TabIndex = 14 +$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" +#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) +$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationCheck.TabIndex = 15 +$DatastoreClusterCsvValidationCheck.Text = "" +#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreCsvValidation.TabIndex = 16 +$DatastoreCsvValidation.Text = "Datastore CSV File:" +#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) +$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationCheck.TabIndex = 17 +$DatastoreCsvValidationCheck.Text = "" +#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) +$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VsSwitchCsvValidation.TabIndex = 18 +$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" +#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) +$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationCheck.TabIndex = 19 +$VsSwitchCsvValidationCheck.Text = "" +#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) +$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPortGroupCsvValidation.TabIndex = 20 +$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" +#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) +$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationCheck.TabIndex = 21 +$VssPortGroupCsvValidationCheck.Text = "" +#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) +$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssVmkernelCsvValidation.TabIndex = 22 +$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" +#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) +$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationCheck.TabIndex = 23 +$VssVmkernelCsvValidationCheck.Text = "" +#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidation = New-Object System.Windows.Forms.Label +$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) +$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPnicCsvValidation.TabIndex = 24 +$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" +#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) +$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationCheck.TabIndex = 25 +$VssPnicCsvValidationCheck.Text = "" +#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) +$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdSwitchCsvValidation.TabIndex = 26 +$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" +#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) +$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationCheck.TabIndex = 27 +$VdSwitchCsvValidationCheck.Text = "" +#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) +$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPortGroupCsvValidation.TabIndex = 28 +$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" +#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) +$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationCheck.TabIndex = 29 +$VdsPortGroupCsvValidationCheck.Text = "" +#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) +$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsVmkernelCsvValidation.TabIndex = 30 +$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" +#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) +$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationCheck.TabIndex = 31 +$VdsVmkernelCsvValidationCheck.Text = "" +#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) +$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPnicCsvValidation.TabIndex = 32 +$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" +#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) +$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationCheck.TabIndex = 33 +$VdsPnicCsvValidationCheck.Text = "" +#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidation = New-Object System.Windows.Forms.Label +$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) +$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$FolderCsvValidation.TabIndex = 34 +$FolderCsvValidation.Text = "Folder CSV File:" +#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label +$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) +$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationCheck.TabIndex = 35 +$FolderCsvValidationCheck.Text = "" +#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidation = New-Object System.Windows.Forms.Label +$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) +$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$RdmCsvValidation.TabIndex = 36 +$RdmCsvValidation.Text = "RDM CSV File:" +#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label +$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) +$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationCheck.TabIndex = 37 +$RdmCsvValidationCheck.Text = "" +#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) +$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsRuleCsvValidation.TabIndex = 38 +$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" +#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) +$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationCheck.TabIndex = 39 +$DrsRuleCsvValidationCheck.Text = "" +#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) +$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsClusterGroupCsvValidation.TabIndex = 40 +$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" +#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) +$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationCheck.TabIndex = 41 +$DrsClusterGroupCsvValidationCheck.Text = "" +#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) +$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsVmHostRuleCsvValidation.TabIndex = 42 +$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" +#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) +$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 +$DrsVmHostRuleCsvValidationCheck.Text = "" +#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) +$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ResourcePoolCsvValidation.TabIndex = 44 +$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" +#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) +$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationCheck.TabIndex = 45 +$ResourcePoolCsvValidationCheck.Text = "" +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton = New-Object System.Windows.Forms.Button +$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) +$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) +$CsvValidationButton.TabIndex = 2 +$CsvValidationButton.Text = "Check for CSVs" +$CsvValidationButton.UseVisualStyleBackColor = $false +$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Host_DrawCheckBox.Checked = $true +$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) +$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Host_DrawCheckBox.TabIndex = 48 +$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" +$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_Complete = New-Object System.Windows.Forms.Label +$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) +$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Host_Complete.TabIndex = 49 +$VM_to_Host_Complete.Text = "" +#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Folder_DrawCheckBox.Checked = $true +$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) +$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Folder_DrawCheckBox.TabIndex = 50 +$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" +$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label +$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) +$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Folder_Complete.TabIndex = 51 +$VM_to_Folder_Complete.Text = "" +#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMs_with_RDMs_DrawCheckBox.Checked = $true +$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) +$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 +$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" +$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label +$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) +$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMs_with_RDMs_Complete.TabIndex = 53 +$VMs_with_RDMs_Complete.Text = "" +#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$SRM_Protected_VMs_DrawCheckBox.Checked = $true +$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) +$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 +$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" +$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label +$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) +$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$SRM_Protected_VMs_Complete.TabIndex = 55 +$SRM_Protected_VMs_Complete.Text = "" +#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Datastore_DrawCheckBox.Checked = $true +$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) +$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Datastore_DrawCheckBox.TabIndex = 56 +$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" +$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label +$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) +$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Datastore_Complete.TabIndex = 57 +$VM_to_Datastore_Complete.Text = "" +#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_ResourcePool_DrawCheckBox.Checked = $true +$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) +$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 +$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" +$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label +$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) +$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_ResourcePool_Complete.TabIndex = 59 +$VM_to_ResourcePool_Complete.Text = "" +#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Datastore_to_Host_DrawCheckBox.Checked = $true +$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) +$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$Datastore_to_Host_DrawCheckBox.TabIndex = 60 +$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" +$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label +$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) +$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Datastore_to_Host_Complete.TabIndex = 61 +$Datastore_to_Host_Complete.Text = "" +#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true +$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) +$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 +$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" +$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label +$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) +$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) +$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 +$PhysicalNIC_to_vSwitch_Complete.Text = "" +#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSS_to_Host_DrawCheckBox.Checked = $true +$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) +$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSS_to_Host_DrawCheckBox.TabIndex = 64 +$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" +$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) +$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSS_to_Host_Complete.TabIndex = 65 +$VSS_to_Host_Complete.Text = "" +#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VSS_DrawCheckBox.Checked = $true +$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) +$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VSS_DrawCheckBox.TabIndex = 66 +$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" +$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) +$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VSS_Complete.TabIndex = 67 +$VMK_to_VSS_Complete.Text = "" +#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) +$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 +$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" +$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) +$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSSPortGroup_to_VM_Complete.TabIndex = 69 +$VSSPortGroup_to_VM_Complete.Text = "" +#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDS_to_Host_DrawCheckBox.Checked = $true +$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) +$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDS_to_Host_DrawCheckBox.TabIndex = 70 +$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" +$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) +$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDS_to_Host_Complete.TabIndex = 71 +$VDS_to_Host_Complete.Text = "" +#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VDS_DrawCheckBox.Checked = $true +$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) +$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VDS_DrawCheckBox.TabIndex = 72 +$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" +$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) +$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VDS_Complete.TabIndex = 73 +$VMK_to_VDS_Complete.Text = "" +#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) +$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 +$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" +$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) +$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDSPortGroup_to_VM_Complete.TabIndex = 75 +$VDSPortGroup_to_VM_Complete.Text = "" +#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true +$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) +$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 +$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" +$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label +$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) +$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Cluster_to_DRS_Rule_Complete.TabIndex = 77 +$Cluster_to_DRS_Rule_Complete.Text = "" + +$TabDraw.Controls.Add($OpenVisioButton) +$TabDraw.Controls.Add($DrawCheckButton) +$TabDraw.Controls.Add($DrawButton) +$TabDraw.Controls.Add($DrawUncheckButton) +$TabDraw.Controls.Add($VisioOutputLabel) +$TabDraw.Controls.Add($VisioOpenOutputButton) +$TabDraw.Controls.Add($DrawCsvInputLabel) +$TabDraw.Controls.Add($DrawCsvInputButton) +$TabDraw.Controls.Add($vCenterCsvValidation) +$TabDraw.Controls.Add($vCenterCsvValidationCheck) +$TabDraw.Controls.Add($DatacenterCsvValidation) +$TabDraw.Controls.Add($DatacenterCsvValidationCheck) +$TabDraw.Controls.Add($ClusterCsvValidation) +$TabDraw.Controls.Add($ClusterCsvValidationCheck) +$TabDraw.Controls.Add($VmHostCsvValidation) +$TabDraw.Controls.Add($VmHostCsvValidationCheck) +$TabDraw.Controls.Add($VmCsvValidation) +$TabDraw.Controls.Add($VmCsvValidationCheck) +$TabDraw.Controls.Add($TemplateCsvValidation) +$TabDraw.Controls.Add($TemplateCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreClusterCsvValidation) +$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreCsvValidation) +$TabDraw.Controls.Add($DatastoreCsvValidationCheck) +$TabDraw.Controls.Add($VsSwitchCsvValidation) +$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VssPortGroupCsvValidation) +$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VssVmkernelCsvValidation) +$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VssPnicCsvValidation) +$TabDraw.Controls.Add($VssPnicCsvValidationCheck) +$TabDraw.Controls.Add($VdSwitchCsvValidation) +$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VdsPortGroupCsvValidation) +$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VdsVmkernelCsvValidation) +$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VdsPnicCsvValidation) +$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) +$TabDraw.Controls.Add($FolderCsvValidation) +$TabDraw.Controls.Add($FolderCsvValidationCheck) +$TabDraw.Controls.Add($RdmCsvValidation) +$TabDraw.Controls.Add($RdmCsvValidationCheck) +$TabDraw.Controls.Add($DrsRuleCsvValidation) +$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) +$TabDraw.Controls.Add($ResourcePoolCsvValidation) +$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) +$TabDraw.Controls.Add($CsvValidationButton) +$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Host_Complete) +$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Folder_Complete) +$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) +$TabDraw.Controls.Add($VMs_with_RDMs_Complete) +$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) +$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) +$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Datastore_Complete) +$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) +$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($Datastore_to_Host_Complete) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) +$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VSS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VSS_Complete) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VDS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VDS_Complete) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) +$SubTab.Controls.Add($TabDirections) +$SubTab.Controls.Add($TabCapture) +$SubTab.Controls.Add($TabDraw) +$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText +$SubTab.SelectedIndex = 0 +$vDiagram.Controls.Add($MainMenu) +$vDiagram.Controls.Add($MainTab) +$vDiagram.Controls.Add($SubTab) +#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$VisioBrowse.Description = "Select a directory" +$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$DrawCsvBrowse.Description = "Select a directory" +$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$CaptureCsvBrowse.Description = "Select a directory" +$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + +#endregion + +#region Custom Code +#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellCheck = $PSVersionTable.PSVersion +if ($PowershellCheck.Major -ge 4) +{ + $PowershellInstalled.Forecolor = "Green" + $PowershellInstalled.Text = "Installed Version $PowershellCheck" +} +else +{ + $PowershellInstalled.Forecolor = "Red" + $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" +} +#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) +$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) +if ($PowerCliModuleCheck -ne $null) +{ + $PowerCliModuleInstalled.Forecolor = "Green" + $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" +} +else +{ + $PowerCliModuleInstalled.Forecolor = "Red" + $PowerCliModuleInstalled.Text = "Not Installed" +} +#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerClI Installed" +} +elseif ($PowerCliModuleCheck -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerCLI Module Installed" +} +else +{ + $PowerCliInstalled.Forecolor = "Red" + $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" +} +#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) +{ + $VisioInstalled.Forecolor = "Green" + $VisioInstalled.Text = "Installed" +} +else +{ + $VisioInstalled.Forecolor = "Red" + $VisioInstalled.Text = "Visio is Not Installed" +} +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) +$ConnectButton.Add_Click({ Connect_vCenter_Main }) +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } +Check_CaptureCsvFolder } ) +#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton.Add_Click({ + if($CaptureCsvFolder -eq $null) + { + $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" + } + else + { + if ($vCenterCsvCheckBox.Checked -eq "True") + { + $vCenterCsvValidationComplete.Forecolor = "Blue" + $vCenterCsvValidationComplete.Text = "Processing ....." + vCenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" + $vCenterCsvComplete = Test-Path $vCenterExportFileComplete + if ($vCenterCsvComplete -eq $True) + { + $vCenterCsvValidationComplete.Forecolor = "Green" + $vCenterCsvValidationComplete.Text = "Complete" + } + else + { + $vCenterCsvValidationComplete.Forecolor = "Red" + $vCenterCsvValidationComplete.Text = "Not Complete" + } + } + Connect_vCenter + $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager + if ($Connected -eq $null) { Connect_vCenter_Main } + $ConnectButton.Forecolor = [System.Drawing.Color]::Green + $ConnectButton.Text = "Connected to $DefaultViserver" + if ($DatacenterCsvCheckBox.Checked -eq "True") + { + $DatacenterCsvValidationComplete.Forecolor = "Blue" + $DatacenterCsvValidationComplete.Text = "Processing ....." + Datacenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" + $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete + if ($DatacenterCsvComplete -eq $True) + { + $DatacenterCsvValidationComplete.Forecolor = "Green" + $DatacenterCsvValidationComplete.Text = "Complete" + } + else + { + $DatacenterCsvValidationComplete.Forecolor = "Red" + $DatacenterCsvValidationComplete.Text = "Not Complete" + } + } + if ($ClusterCsvCheckBox.Checked -eq "True") + { + $ClusterCsvValidationComplete.Forecolor = "Blue" + $ClusterCsvValidationComplete.Text = "Processing ....." + Cluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" + $ClusterCsvComplete = Test-Path $ClusterExportFileComplete + if ($ClusterCsvComplete -eq $True) + { + $ClusterCsvValidationComplete.Forecolor = "Green" + $ClusterCsvValidationComplete.Text = "Complete" + } + else + { + $ClusterCsvValidationComplete.Forecolor = "Red" + $ClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmHostCsvCheckBox.Checked -eq "True") + { + $VmHostCsvValidationComplete.Forecolor = "Blue" + $VmHostCsvValidationComplete.Text = "Processing ....." + VmHost_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" + $VmHostCsvComplete = Test-Path $VmHostExportFileComplete + if ($VmHostCsvComplete -eq $True) + { + $VmHostCsvValidationComplete.Forecolor = "Green" + $VmHostCsvValidationComplete.Text = "Complete" + } + else + { + $VmHostCsvValidationComplete.Forecolor = "Red" + $VmHostCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmCsvCheckBox.Checked -eq "True") + { + $VmCsvValidationComplete.Forecolor = "Blue" + $VmCsvValidationComplete.Text = "Processing ....." + Vm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" + $VmCsvComplete = Test-Path $VmExportFileComplete + if ($VmCsvComplete -eq $True) + { + $VmCsvValidationComplete.Forecolor = "Green" + $VmCsvValidationComplete.Text = "Complete" + } + else + { + $VmCsvValidationComplete.Forecolor = "Red" + $VmCsvValidationComplete.Text = "Not Complete" + } + } + if ($TemplateCsvCheckBox.Checked -eq "True") + { + $TemplateCsvValidationComplete.Forecolor = "Blue" + $TemplateCsvValidationComplete.Text = "Processing ....." + Template_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" + $TemplateCsvComplete = Test-Path $TemplateExportFileComplete + if ($TemplateCsvComplete -eq $True) + { + $TemplateCsvValidationComplete.Forecolor = "Green" + $TemplateCsvValidationComplete.Text = "Complete" + } + else + { + $TemplateCsvValidationComplete.Forecolor = "Red" + $TemplateCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreClusterCsvCheckBox.Checked -eq "True") + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" + $DatastoreClusterCsvValidationComplete.Text = "Processing ....." + DatastoreCluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete + if ($DatastoreClusterCsvComplete -eq $True) + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Green" + $DatastoreClusterCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Red" + $DatastoreClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreCsvCheckBox.Checked -eq "True") + { + $DatastoreCsvValidationComplete.Forecolor = "Blue" + $DatastoreCsvValidationComplete.Text = "Processing ....." + Datastore_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" + $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete + if ($DatastoreCsvComplete -eq $True) + { + $DatastoreCsvValidationComplete.Forecolor = "Green" + $DatastoreCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreCsvValidationComplete.Forecolor = "Red" + $DatastoreCsvValidationComplete.Text = "Not Complete" + } + } + if ($VsSwitchCsvCheckBox.Checked -eq "True") + { + $VsSwitchCsvValidationComplete.Forecolor = "Blue" + $VsSwitchCsvValidationComplete.Text = "Processing ....." + VsSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" + $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete + if ($vSSwitchCsvComplete -eq $True) + { + $vSSwitchCsvValidationComplete.Forecolor = "Green" + $vSSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $vSSwitchCsvValidationComplete.Forecolor = "Red" + $vSSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPortGroupCsvCheckBox.Checked -eq "True") + { + $VssPortGroupCsvValidationComplete.Forecolor = "Blue" + $VssPortGroupCsvValidationComplete.Text = "Processing ....." + VssPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete + if ($VssPortGroupCsvComplete -eq $True) + { + $VssPortGroupCsvValidationComplete.Forecolor = "Green" + $VssPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VssPortGroupCsvValidationComplete.Forecolor = "Red" + $VssPortGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssVmkernelCsvCheckBox.Checked -eq "True") + { + $VssVmkernelCsvValidationComplete.Forecolor = "Blue" + $VssVmkernelCsvValidationComplete.Text = "Processing ....." + VssVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete + if ($VssVmkernelCsvComplete -eq $True) + { + $VssVmkernelCsvValidationComplete.Forecolor = "Green" + $VssVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VssVmkernelCsvValidationComplete.Forecolor = "Red" + $VssVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPnicCsvCheckBox.Checked -eq "True") + { + $VssPnicCsvValidationComplete.Forecolor = "Blue" + $VssPnicCsvValidationComplete.Text = "Processing ....." + VssPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" + $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete + if ($VssPnicCsvComplete -eq $True) + { + $VssPnicCsvValidationComplete.Forecolor = "Green" + $VssPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VssPnicCsvValidationComplete.Forecolor = "Red" + $VssPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdSwitchCsvCheckBox.Checked -eq "True") + { + $VdSwitchCsvValidationComplete.Forecolor = "Blue" + $VdSwitchCsvValidationComplete.Text = "Processing ....." + VdSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" + $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete + if ($VdSwitchCsvComplete -eq $True) + { + $VdSwitchCsvValidationComplete.Forecolor = "Green" + $VdSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $VdSwitchCsvValidationComplete.Forecolor = "Red" + $VdSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPortGroupCsvCheckBox.Checked -eq "True") + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" + $VdsPortGroupCsvValidationComplete.Text = "Processing ....." + VdsPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete + if ($VdsPortGroupCsvComplete -eq $True) + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Green" + $VdsPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Red" + $VdsPortGroupCsvValidationComplete.Text = "Not Complete" + + } + } + if ($VdsVmkernelCsvCheckBox.Checked -eq "True") + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" + $VdsVmkernelCsvValidationComplete.Text = "Processing ....." + VdsVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete + if ($VdsVmkernelCsvComplete -eq $True) + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Green" + $VdsVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Red" + $VdsVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPnicCsvCheckBox.Checked -eq "True") + { + $VdsPnicCsvValidationComplete.Forecolor = "Blue" + $VdsPnicCsvValidationComplete.Text = "Processing ....." + VdsPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" + $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete + if ($VdsPnicCsvComplete -eq $True) + { + $VdsPnicCsvValidationComplete.Forecolor = "Green" + $VdsPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPnicCsvValidationComplete.Forecolor = "Red" + $VdsPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($FolderCsvCheckBox.Checked -eq "True") + { + $FolderCsvValidationComplete.Forecolor = "Blue" + $FolderCsvValidationComplete.Text = "Processing ....." + Folder_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" + $FolderCsvComplete = Test-Path $FolderExportFileComplete + if ($FolderCsvComplete -eq $True) + { + $FolderCsvValidationComplete.Forecolor = "Green" + $FolderCsvValidationComplete.Text = "Complete" + } + else + { + $FolderCsvValidationComplete.Forecolor = "Red" + $FolderCsvValidationComplete.Text = "Not Complete" + } + } + if ($RdmCsvCheckBox.Checked -eq "True") + { + $RdmCsvValidationComplete.Forecolor = "Blue" + $RdmCsvValidationComplete.Text = "Processing ....." + Rdm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" + $RdmCsvComplete = Test-Path $RdmExportFileComplete + if ($RdmCsvComplete -eq $True) + { + $RdmCsvValidationComplete.Forecolor = "Green" + $RdmCsvValidationComplete.Text = "Complete" + } + else + { + $RdmCsvValidationComplete.Forecolor = "Red" + $RdmCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsRuleCsvCheckBox.Checked -eq "True") + { + $DrsRuleCsvValidationComplete.Forecolor = "Blue" + $DrsRuleCsvValidationComplete.Text = "Processing ....." + Drs_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" + $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete + if ($DrsRuleCsvComplete -eq $True) + { + $DrsRuleCsvValidationComplete.Forecolor = "Green" + $DrsRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsRuleCsvValidationComplete.Forecolor = "Red" + $DrsRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" + $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." + Drs_Cluster_Group_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete + if ($DrsClusterGroupCsvComplete -eq $True) + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" + $DrsClusterGroupCsvValidationComplete.Text = "Complete" + } + else + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" + $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" + $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." + Drs_VmHost_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete + if ($DrsVmHostRuleCsvComplete -eq $True) + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" + $DrsVmHostRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" + $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($ResourcePoolCsvCheckBox.Checked -eq "True") + { + $ResourcePoolCsvValidationComplete.Forecolor = "Blue" + $ResourcePoolCsvValidationComplete.Text = "Processing ....." + Resource_Pool_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete + if ($ResourcePoolCsvComplete -eq $True) + { + $ResourcePoolCsvValidationComplete.Forecolor = "Green" + $ResourcePoolCsvValidationComplete.Text = "Complete" + } + else + { + $ResourcePoolCsvValidationComplete.Forecolor = "Red" + $ResourcePoolCsvValidationComplete.Text = "Not Complete" + } + } + Disconnect_vCenter + $ConnectButton.Forecolor = [System.Drawing.Color]::Red + $ConnectButton.Text = "Disconnected" + $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" + } +}) +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) +$TabDraw.Controls.Add($DrawCsvInputButton) +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton.Add_Click( +{ + $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text + $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" + $vCenterCsvExists = Test-Path $vCenterExportFile + $TabDraw.Controls.Add($vCenterCsvValidationCheck) + if ($vCenterCsvExists -eq $True) + { + + $vCenterCsvValidationCheck.Forecolor = "Green" + $vCenterCsvValidationCheck.Text = "Present" + } + else + { + $vCenterCsvValidationCheck.Forecolor = "Red" + $vCenterCsvValidationCheck.Text = "Not Present" + } + + $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" + $DatacenterCsvExists = Test-Path $DatacenterExportFile + $TabDraw.Controls.Add($DatacenterCsvValidationCheck) + + if ($DatacenterCsvExists -eq $True) + { + $DatacenterCsvValidationCheck.Forecolor = "Green" + $DatacenterCsvValidationCheck.Text = "Present" + } + else + { + $DatacenterCsvValidationCheck.Forecolor = "Red" + $DatacenterCsvValidationCheck.Text = "Not Present" + } + + $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" + $ClusterCsvExists = Test-Path $ClusterExportFile + $TabDraw.Controls.Add($ClusterCsvValidationCheck) + + if ($ClusterCsvExists -eq $True) + { + $ClusterCsvValidationCheck.Forecolor = "Green" + $ClusterCsvValidationCheck.Text = "Present" + } + else + { + $ClusterCsvValidationCheck.Forecolor = "Red" + $ClusterCsvValidationCheck.Text = "Not Present" + } + + $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" + $VmHostCsvExists = Test-Path $VmHostExportFile + $TabDraw.Controls.Add($VmHostCsvValidationCheck) + + if ($VmHostCsvExists -eq $True) + { + $VmHostCsvValidationCheck.Forecolor = "Green" + $VmHostCsvValidationCheck.Text = "Present" + } + else + { + $VmHostCsvValidationCheck.Forecolor = "Red" + $VmHostCsvValidationCheck.Text = "Not Present" + } + + $VmExportFile = $CsvInputDir + "-VmExport.csv" + $VmCsvExists = Test-Path $VmExportFile + $TabDraw.Controls.Add($VmCsvValidationCheck) + + if ($VmCsvExists -eq $True) + { + $VmCsvValidationCheck.Forecolor = "Green" + $VmCsvValidationCheck.Text = "Present" + } + else + { + $VmCsvValidationCheck.Forecolor = "Red" + $VmCsvValidationCheck.Text = "Not Present" + } + + $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" + $TemplateCsvExists = Test-Path $TemplateExportFile + $TabDraw.Controls.Add($TemplateCsvValidationCheck) + + if ($TemplateCsvExists -eq $True) + { + $TemplateCsvValidationCheck.Forecolor = "Green" + $TemplateCsvValidationCheck.Text = "Present" + } + else + { + $TemplateCsvValidationCheck.Forecolor = "Red" + $TemplateCsvValidationCheck.Text = "Not Present" + } + + $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile + $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) + + if ($DatastoreClusterCsvExists -eq $True) + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Green" + $DatastoreClusterCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Red" + $DatastoreClusterCsvValidationCheck.Text = "Not Present" + } + + $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" + $DatastoreCsvExists = Test-Path $DatastoreExportFile + $TabDraw.Controls.Add($DatastoreCsvValidationCheck) + + if ($DatastoreCsvExists -eq $True) + { + $DatastoreCsvValidationCheck.Forecolor = "Green" + $DatastoreCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreCsvValidationCheck.Forecolor = "Red" + $DatastoreCsvValidationCheck.Text = "Not Present" + } + + $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" + $VsSwitchCsvExists = Test-Path $VsSwitchExportFile + $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) + + if ($VsSwitchCsvExists -eq $True) + { + $VsSwitchCsvValidationCheck.Forecolor = "Green" + $VsSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VsSwitchCsvValidationCheck.Forecolor = "Red" + $VsSwitchCsvValidationCheck.Text = "Not Present" + $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile + $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) + + if ($VssPortGroupCsvExists -eq $True) + { + $VssPortGroupCsvValidationCheck.Forecolor = "Green" + $VssPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VssPortGroupCsvValidationCheck.Forecolor = "Red" + $VssPortGroupCsvValidationCheck.Text = "Not Present" + $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile + $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) + + if ($VssVmkernelCsvExists -eq $True) + { + $VssVmkernelCsvValidationCheck.Forecolor = "Green" + $VssVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VssVmkernelCsvValidationCheck.Forecolor = "Red" + $VssVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" + $VssPnicCsvExists = Test-Path $VssPnicExportFile + $TabDraw.Controls.Add($VssPnicCsvValidationCheck) + + if ($VssPnicCsvExists -eq $True) + { + $VssPnicCsvValidationCheck.Forecolor = "Green" + $VssPnicCsvValidationCheck.Text = "Present" + } + else + { + $VssPnicCsvValidationCheck.Forecolor = "Red" + $VssPnicCsvValidationCheck.Text = "Not Present" + } + + $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" + $VdSwitchCsvExists = Test-Path $VdSwitchExportFile + $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) + + if ($VdSwitchCsvExists -eq $True) + { + $VdSwitchCsvValidationCheck.Forecolor = "Green" + $VdSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VdSwitchCsvValidationCheck.Forecolor = "Red" + $VdSwitchCsvValidationCheck.Text = "Not Present" + $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile + $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) + + if ($VdsPortGroupCsvExists -eq $True) + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Green" + $VdsPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Red" + $VdsPortGroupCsvValidationCheck.Text = "Not Present" + $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile + $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) + + if ($VdsVmkernelCsvExists -eq $True) + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Green" + $VdsVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Red" + $VdsVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" + $VdsPnicCsvExists = Test-Path $VdsPnicExportFile + $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) + + if ($VdsPnicCsvExists -eq $True) + { + $VdsPnicCsvValidationCheck.Forecolor = "Green" + $VdsPnicCsvValidationCheck.Text = "Present" + } + else + { + $VdsPnicCsvValidationCheck.Forecolor = "Red" + $VdsPnicCsvValidationCheck.Text = "Not Present" + } + + $FolderExportFile = $CsvInputDir + "-FolderExport.csv" + $FolderCsvExists = Test-Path $FolderExportFile + $TabDraw.Controls.Add($FolderCsvValidationCheck) + + if ($FolderCsvExists -eq $True) + { + $FolderCsvValidationCheck.Forecolor = "Green" + $FolderCsvValidationCheck.Text = "Present" + } + else + { + $FolderCsvValidationCheck.Forecolor = "Red" + $FolderCsvValidationCheck.Text = "Not Present" + } + + $RdmExportFile = $CsvInputDir + "-RdmExport.csv" + $RdmCsvExists = Test-Path $RdmExportFile + $TabDraw.Controls.Add($RdmCsvValidationCheck) + + if ($RdmCsvExists -eq $True) + { + $RdmCsvValidationCheck.Forecolor = "Green" + $RdmCsvValidationCheck.Text = "Present" + } + else + { + $RdmCsvValidationCheck.Forecolor = "Red" + $RdmCsvValidationCheck.Text = "Not Present" + $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" + $DrsRuleCsvExists = Test-Path $DrsRuleExportFile + $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) + + if ($DrsRuleCsvExists -eq $True) + { + $DrsRuleCsvValidationCheck.Forecolor = "Green" + $DrsRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsRuleCsvValidationCheck.Forecolor = "Red" + $DrsRuleCsvValidationCheck.Text = "Not Present" + $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile + $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) + + if ($DrsClusterGroupCsvExists -eq $True) + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" + $DrsClusterGroupCsvValidationCheck.Text = "Present" + } + else + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" + $DrsClusterGroupCsvValidationCheck.Text = "Not Present" + } + + $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile + $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) + + if ($DrsVmHostRuleCsvExists -eq $True) + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" + $DrsVmHostRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" + $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" + } + + $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile + $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) + + if ($ResourcePoolCsvExists -eq $True) + { + $ResourcePoolCsvValidationCheck.Forecolor = "Green" + $ResourcePoolCsvValidationCheck.Text = "Present" + } + else + { + $ResourcePoolCsvValidationCheck.Forecolor = "Red" + $ResourcePoolCsvValidationCheck.Text = "Not Present" + $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" + } +} ) +$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) +$TabDraw.Controls.Add($CsvValidationButton) +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) +$TabDraw.Controls.Add($VisioOpenOutputButton) +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) +$TabDraw.Controls.Add($DrawUncheckButton) +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) +$TabDraw.Controls.Add($DrawCheckButton) +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; +if ($VM_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Host_Complete.Forecolor = "Blue" + $VM_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Host_Complete) + VM_to_Host + $VM_to_Host_Complete.Forecolor = "Green" + $VM_to_Host_Complete.Text = "Complete" + $TabDraw.Controls.Add($VM_to_Host_Complete) +} +if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Folder_Complete.Forecolor = "Blue" + $VM_to_Folder_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Folder_Complete) + VM_to_Folder + $VM_to_Folder_Complete.Forecolor = "Green" + $VM_to_Folder_Complete.Text = "Complete" +} +if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") +{ + $VMs_with_RDMs_Complete.Forecolor = "Blue" + $VMs_with_RDMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMs_with_RDMs_Complete) + VMs_with_RDMs + $VMs_with_RDMs_Complete.Forecolor = "Green" + $VMs_with_RDMs_Complete.Text = "Complete" +} +if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") +{ + $SRM_Protected_VMs_Complete.Forecolor = "Blue" + $SRM_Protected_VMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) + SRM_Protected_VMs + $SRM_Protected_VMs_Complete.Forecolor = "Green" + $SRM_Protected_VMs_Complete.Text = "Complete" +} +if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Datastore_Complete.Forecolor = "Blue" + $VM_to_Datastore_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Datastore_Complete) + VM_to_Datastore + $VM_to_Datastore_Complete.Forecolor = "Green" + $VM_to_Datastore_Complete.Text = "Complete" +} +if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") +{ + $VM_to_ResourcePool_Complete.Forecolor = "Blue" + $VM_to_ResourcePool_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) + VM_to_ResourcePool + $VM_to_ResourcePool_Complete.Forecolor = "Green" + $VM_to_ResourcePool_Complete.Text = "Complete" +} +if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") +{ + $Datastore_to_Host_Complete.Forecolor = "Blue" + $Datastore_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Datastore_to_Host_Complete) + Datastore_to_Host + $Datastore_to_Host_Complete.Forecolor = "Green" + $Datastore_to_Host_Complete.Text = "Complete" +} +if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") +{ + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" + $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) + PhysicalNIC_to_vSwitch + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" + $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" +} +if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VSS_to_Host_Complete.Forecolor = "Blue" + $VSS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSS_to_Host_Complete) + VSS_to_Host + $VSS_to_Host_Complete.Forecolor = "Green" + $VSS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VSS_Complete.Forecolor = "Blue" + $VMK_to_VSS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VSS_Complete) + VMK_to_VSS + $VMK_to_VSS_Complete.Forecolor = "Green" + $VMK_to_VSS_Complete.Text = "Complete" +} +if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VSSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) + VSSPortGroup_to_VM + $VSSPortGroup_to_VM_Complete.Forecolor = "Green" + $VSSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VDS_to_Host_Complete.Forecolor = "Blue" + $VDS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDS_to_Host_Complete) + VDS_to_Host + $VDS_to_Host_Complete.Forecolor = "Green" + $VDS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VDS_Complete.Forecolor = "Blue" + $VMK_to_VDS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VDS_Complete) + VMK_to_VDS + $VMK_to_VDS_Complete.Forecolor = "Green" + $VMK_to_VDS_Complete.Text = "Complete" +} +if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VDSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) + VDSPortGroup_to_VM + $VDSPortGroup_to_VM_Complete.Forecolor = "Green" + $VDSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") +{ + $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" + $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) + Cluster_to_DRS_Rule + $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" + $Cluster_to_DRS_Rule_Complete.Text = "Complete" +}; +$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) +$TabDraw.Controls.Add($DrawButton) +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton.Add_Click({Open_Final_Visio}) +$TabDraw.Controls.Add($OpenVisioButton) + +#endregion + +#region Event Loop + +function Main{ + [System.Windows.Forms.Application]::EnableVisualStyles() + [System.Windows.Forms.Application]::Run($vDiagram) +} + +#endregion + +#endregion + +#region Event Handlers + +#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect_vCenter_Main +{ + $MainVC = $MainVcenterTextBox.Text + $MainUser = $UserNameTextBox.Text + $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text +} + +function Connect_vCenter +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $User = $UserNameTextBox.Text + $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text +} + +function Disconnect_vCenter +{ + $Disconnect = Disconnect-ViServer * -Confirm:$false +} + +#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Find_CaptureCsvFolder +{ + $CaptureCsvBrowseLoop = $True + while ($CaptureCsvBrowseLoop) + { + if ($CaptureCsvBrowse.ShowDialog() -eq "OK") + { + $CaptureCsvBrowseLoop = $False + } + else + { + $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($CaptureCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath +} + +function Check_CaptureCsvFolder +{ + $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $CheckContentDir = $CheckContentPath + "*.csv" + $CheckContent = Test-Path $CheckContentDir + if ($CheckContent -eq "True") + { + $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") + switch ($CheckContents_CaptureCsvFolder) { + 'Yes' + { + del $CheckContentDir + } + + 'No' + { + $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog + $CheckContentCsvBrowse.Description = "Select a directory to copy files to" + $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + $CheckContentCsvBrowse.ShowDialog() + $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath + copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder + del $CheckContentDir + } + } + } +} + +function Find_DrawCsvFolder +{ + $DrawCsvBrowseLoop = $True + while ($DrawCsvBrowseLoop) + { + if ($DrawCsvBrowse.ShowDialog() -eq "OK") + { + $DrawCsvBrowseLoop = $False + } + else + { + $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($DrawCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath +} + +function Find_DrawVisioFolder +{ + $VisioBrowseLoop = $True + while($VisioBrowseLoop) + { + if ($VisioBrowse.ShowDialog() -eq "OK") + { + $VisioBrowseLoop = $False + } + else + { + $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if($VisioBrowseRes -eq "Cancel") + { + return + } + } + } + $global:VisioFolder = $VisioBrowse.SelectedPath +} + +#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function vCenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, + @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation + + if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) + { + $null + } + else + { + Disconnect_vCenter + } +} + +function Datacenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort-Object Name | + Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation +} + +function Cluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, + @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, + @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, + @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, + @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, + @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, + @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, + @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, + @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, + @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation +} + +function VmHost_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent + while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent + } + if ($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name } } }, + @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent + while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent + } + if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, + @{ N = "Version" ; E = { $_.Config.Product.Version } }, + @{ N = "Build" ; E = { $_.Config.Product.Build } }, + @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, + @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, + @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, + @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, + @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, + @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, + @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, + @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, + @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, + @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, + @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, + @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation +} + +function Vm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select-Object Name , + @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, + @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, + @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, + @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, + @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, + @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, + @{ N = "OS" ; E = { $_.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.Config.Version } }, + @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, + @{ N = 'Folder' ; E = { $Folder.Name } }, + @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, + @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, + @{ N = "IP" ; E = { $_.Guest.IpAddress } }, + @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, + @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, + @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, + @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation + } +} + +function Template_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + foreach ($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { $VmHost.name } }, + @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, + @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, + @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, + @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, + @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, + @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, + @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, + @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation + } +} + +function DatastoreCluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, + @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, + @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation +} + +function Datastore_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, + @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, + @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, + @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, + @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, + @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, + @{ N = "Accessible" ; E = { $_.State } }, + @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation +} + +function VsSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "Nic" ; E = { $_.Nic } }, + @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, + @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, + @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, + @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, + @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation +} + +function VssPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "VLanId" ; E = { $_.VLanId } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VssVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation + } + } + } +} + +function VssPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation + } + } +} + +function VdSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + foreach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "Vendor" ; E = { $_.Vendor } }, + @{ N = "Version" ; E = { $_.Version } }, + @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, + @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation + } +} + +function VdsPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, + @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, + @{ N = "NumPorts" ; E = { $_.NumPorts } }, + @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, + @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, + @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VdsVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation + + } + } +} + +function VdsPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | + Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch } }, + @{ N = "Portgroup" ; E = { $_.Portgroup } }, + @{ N = "ConnectedEntity" ; E = { $_.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation + } + } +} + +function Folder_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + foreach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -type VM | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation + } +} + +function Rdm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | + Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, + @{ N = "Vm" ; E = { $_.Parent } }, + @{ N = "Label" ; E = { $_.Name } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, + @{ N = "DiskType" ; E = { $_.DiskType } }, + @{ N = "Persistence" ; E = { $_.Persistence } }, + @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, + @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, + @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation +} + +function Drs_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation + } +} + +function Drs_Cluster_Group_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "GroupType" ; E = { $_.GroupType } }, + @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation + } +} + +function Drs_VmHost_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) + { + Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "VMGroup" ; E = { $_.VMGroup } }, + @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, + @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, + @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation + } + } +} + +function Resource_Pool_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) + { + Get-ResourcePool $ResourcePool | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Cluster" ; E = { $Cluster.Name } }, + @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, + @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, + @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, + @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, + @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, + @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, + @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, + @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, + @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, + @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation + } + } +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect-VisioObject($firstObj, $secondObj) +{ + $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) + $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) + $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) +} + +function Add-VisioObjectVC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectCluster($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHost($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectTemplate($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectSRM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDatastore($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHardDisk($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.ScsiCanonicalName + return $shpObj +} + +function Add-VisioObjectFolder($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVsSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVssPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVMK($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsClusterGroup($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDRSVMHostRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectResourcePool($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +#~~< Visio Draw Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Draw_vCenter +{ + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' +} + +function Draw_Datacenter +{ + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' +} + +function Draw_Cluster +{ + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' +} + +function Draw_VmHost +{ + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' +} + +function Draw_VM +{ + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' +} + +function Draw_Template +{ + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' +} + +function Draw_Folder +{ + #Name + $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' +} + +function Draw_RDM +{ + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' +} + +function Draw_SRM +{ + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' +} + +function Draw_DatastoreCluster +{ + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' +} + +function Draw_Datastore +{ + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' +} + +function Draw_ResourcePool +{ + # Name + $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' + # Cluster + $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' + # CpuSharesLevel + $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' + # NumCpuShares + $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' + # CpuReservationMHz + $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' + # CpuExpandableReservation + $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' + # CpuLimitMHz + $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' + # MemSharesLevel + $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' + # NumMemShares + $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' + # MemReservationGB + $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' + # MemExpandableReservation + $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' + # MemLimitGB + $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' +} + +function Draw_VsSwitch +{ + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' +} + +function Draw_VssPnic +{ + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' +} + +function Draw_VssPort +{ + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' +} + +function Draw_VssVmk +{ + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' +} + +function Draw_VdSwitch +{ + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' +} + +function Draw_VdsPnic +{ + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' +} + +function Draw_VdsPort +{ + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' +} + +function Draw_VdsVmk +{ + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' +} + +function Draw_DrsRule +{ + # Name + $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' + # VM Affinity + $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' + # DRS Rule Enabled + $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' + # DRS Rule Mandatory + $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' +} + +function Draw_DrsVmHostRule +{ + # Name + $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' + # Enabled + $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' + # Type + $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' + # VMGroup + $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' + # VMHostGroup + $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' + # AffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' + # AntiAffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' +} + +function Draw_DrsClusterGroup +{ + # Name + $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' + # GroupType + $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' + # Members + $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' +} + +function CSV_In_Out +{ + # vCenter + $global:vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $global:vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $global:DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $global:DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $global:ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $global:ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $global:VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $global:VmHostImport = Import-Csv $VmHostExportFile + # Vm + $global:VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $global:VmImport = Import-Csv $VmExportFile + #Template + $global:TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $global:TemplateImport = Import-Csv $TemplateExportFile + # Folder + $global:FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + $global:FolderImport = Import-Csv $FolderExportFile + # Datastore Cluster + $global:DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $global:DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $global:DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $global:DatastoreImport = Import-Csv $DatastoreExportFile + # RDM's + $global:RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + $global:RdmImport = Import-Csv $RdmExportFile + # ResourcePool + $global:ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + $global:ResourcePoolImport = Import-Csv $ResourcePoolExportFile + # Vss Switch + $global:VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $global:VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $global:VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $global:VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $global:VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $global:VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $global:VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $global:VssPnicImport = Import-Csv $VssPnicExportFile + # Vds Switch + $global:VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $global:VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $global:VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $global:VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $global:VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $global:VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $global:VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $global:VdsPnicImport = Import-Csv $VdsPnicExportFile + # DRS Rule + $global:DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + $global:DrsRuleImport = Import-Csv $DrsRuleExportFile + # DRS Cluster Group + $global:DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + $global:DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile + # DRS VmHost Rule + $global:DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + $global:DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile +} + +function Visio_Shapes +{ + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $global:VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $global:DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $global:ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $global:HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $global:MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $global:LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $global:OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $global:TemplateObj = $stnObj.Masters.Item("Template") + # Folder Object + $global:FolderObj = $stnObj.Masters.Item("Folder") + # RDM Object + $global:RDMObj = $stnObj.Masters.Item("RDM") + # SRM Protected VM Object + $global:SRMObj = $stnObj.Masters.Item("SRM Protected Server") + # Datastore Cluster Object + $global:DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $global:DatastoreObj = $stnObj.Masters.Item("Datastore") + # Resource Pool Object + $global:ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") + # VSS Object + $global:VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $global:VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $global:VssNicObj = $stnObj.Masters.Item("VSS NIC") + # VDS Object + $global:VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $global:VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $global:VdsNicObj = $stnObj.Masters.Item("VDS NIC") + # VMK NIC Object + $global:VmkNicObj = $stnObj.Masters.Item("VMKernel") + # DRS Rule + $global:DRSRuleObj = $stnObj.Masters.Item("DRS Rule") + # DRS Cluster Group + $global:DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") + # DRS Host Rule + $global:DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") +} + +#~~< Visio Pages Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Create_Visio_Base +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $DocObj = $docsObj.Add("") + $DocObj.SaveAs($Savefile) + $AppVisio.Quit() +} + +function VM_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Host" + $Page = $DocsObj.Pages('VM to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Folder +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Folder" + $Page = $DocsObj.Pages('VM to Folder') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Folder') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $FolderObject = Add-VisioObjectFolder $FolderObj $Folder + Draw_Folder + Connect-VisioObject $DatacenterObject $FolderObject + $y += 1.50 + + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $FolderObject $TemplateObject + $FolderObject = $TemplateObject + } + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $FolderObject $VMObject + $FolderObject = $VMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMs_with_RDMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" + $Page = $DocsObj.Pages('VM w/ RDMs') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM w/ RDMs') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $ClusterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 3.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + Draw_RDM + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $DatacenterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 2.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + Draw_RDM + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function SRM_Protected_VMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "SRM VM" + $Page = $DocsObj.Pages('SRM VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('SRM VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + Draw_SRM + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + Draw_SRM + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Datastore +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Datastore" + $Page = $DocsObj.Pages('VM to Datastore') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Datastore') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + Draw_DatastoreCluster + Connect-VisioObject $ClusterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $ClusterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + Draw_DatastoreCluster + Connect-VisioObject $DatacenterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatacenterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_ResourcePool +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" + $Page = $DocsObj.Pages('VM to Resource Pool') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Resource Pool') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool + Draw_ResourcePool + Connect-VisioObject $ClusterObject $ResourcePoolObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $ResourcePoolObject $VMObject + $ResourcePoolObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Datastore_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Datastore to Host" + $Page = $DocsObj.Pages('Datastore to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Datastore to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function PhysicalNIC_to_vSwitch +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "PNIC to switch" + $Page = $DocsObj.Pages('PNIC to Switch') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('PNIC to Switch') + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VSSObject + $y += 1.50 + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + Draw_VssPnic + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + Draw_VdsPnic + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VSSObject + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + Draw_VssPnic + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + Draw_VdsPnic + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSS to Host" + $Page = $DocsObj.Pages('VSS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VSS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VSS" + $Page = $DocsObj.Pages('VMK to VSS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VSS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + Draw_VssVmk + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + Draw_VssVmk + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" + $Page = $DocsObj.Pages('VSSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDS to Host" + $Page = $DocsObj.Pages('VDS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VDS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VDS" + $Page = $DocsObj.Pages('VMK to VDS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VDS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + Draw_VdsVmk + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + Draw_VdsVmk + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" + $Page = $DocsObj.Pages('VDSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $DatacenterObject $VdSwitchObject + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x = 6.00 + $y += 1.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VPGObject $VMObject + $VPGObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Cluster_to_DRS_Rule +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" + $Page = $DocsObj.Pages('Cluster to DRS Rule') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Cluster to DRS Rule') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + $y += 1.50 + + foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule + Draw_DrsRule + Connect-VisioObject $ClusterObject $DRSObject + $y += 1.50 + } + foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule + Draw_DrsVmHostRule + Connect-VisioObject $ClusterObject $DRSVMHostRuleObject + $y += 1.50 + + foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) + { + $x += 2.50 + $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup + Draw_DrsClusterGroup + Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject + $DRSVMHostRuleObject = $DrsClusterGroupObject + + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Open_Final_Visio +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.Application + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null +} + +Main + +#endregion \ No newline at end of file From db833b8f718df772b61a1493859f721e0168ce2c Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Sun, 6 May 2018 18:52:59 -0400 Subject: [PATCH 17/19] Delete vDiagram_2.0.1.ps1 --- vDiagram_2.0.1/vDiagram_2.0.1.ps1 | 5664 ----------------------------- 1 file changed, 5664 deletions(-) delete mode 100644 vDiagram_2.0.1/vDiagram_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 deleted file mode 100644 index 5e57b51..0000000 --- a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 +++ /dev/null @@ -1,5664 +0,0 @@ -<# -.SYNOPSIS - vDiagram Visio Drawing Tool - -.DESCRIPTION - vDiagram Visio Drawing Tool - -.NOTES - File Name : vDiagram2.0.1.ps1 - Author : Tony Gonzalez - Author : Jason Hopkins - Based on : vDiagram by Alan Renouf - Version : 2.0.1 - -.USAGE NOTES - Ensure to unblock files before unzipping - Ensure to run as administrator - Required Files: - PowerCLI or PowerShell 5.0 with PowerCLI Modules installed - Active connection to vCenter to capture data - MS Visio - -.CHANGE LOG - - 04/12/2018 - v2.0.1 - Added MAC Addresses to VMs & Templates - Added a check to see if prior CSVs are still present - Added option to copy prior CSVs to new folder - Consolidate the object plaement into functions for ease of management - - - 04/11/2018 - v2.0.0 - Presented as a Community Theater Session at South Florida VMUG - Feature enhancement requests collected -#> - -#region ScriptForm Designer - -#region Constructor - -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") -[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") -#endregion - -#region Post-Constructor Custom Code -$DateTime = (Get-Date -format "yyyy_MM_dd-HH_MM") -$MyVer = "2.0.1" -$LastUpdated = "April 12, 2018" -$About = -@" - - vDiagram $MyVer - - Contributors: Tony Gonzalez of RoundTower Technologies LLC - Jason Hopkins of RoundTower Technologies LLC - - Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram - - Created: February 13, 2018 - - Last Updated: $LastUpdated - -"@ -#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" -if (!(Test-Path $TestShapes)) -{ - $CurrentLocation = Get-Location - copy $CurrentLocation\vDiagram.vssx $TestShapes - Write-Host "Copying Shapes File to My Shapes" -} -$shpFile = "\vDiagram.vssx" -#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Set_WindowStyle { -param( - [Parameter()] - [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', - 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', - 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] - $Style = 'SHOW', - [Parameter()] - $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle -) - $WindowStates = @{ - FORCEMINIMIZE = 11; HIDE = 0 - MAXIMIZE = 3; MINIMIZE = 6 - RESTORE = 9; SHOW = 5 - SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 - SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 - SHOWNA = 8; SHOWNOACTIVATE = 4 - SHOWNORMAL = 1 - } - Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) - - $Win32ShowWindowAsync = Add-Type –memberDefinition @” - [DllImport("user32.dll")] - public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); -“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru - - $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null -} -Set_WindowStyle MINIMIZE -#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function About_Config -{ - - $About - - #Add objects for About - $AboutForm = New-Object System.Windows.Forms.Form - $AboutTextBox = New-Object System.Windows.Forms.RichTextBox - - #About Form - $AboutForm.Icon = $Icon - $AboutForm.AutoScroll = $True - $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) - $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutForm.Name = "About" - $AboutForm.StartPosition = 1 - $AboutForm.Text = "About vDiagram $MyVer" - - $AboutTextBox.Anchor = 15 - $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) - $AboutTextBox.BorderStyle = 0 - $AboutTextBox.Font = "Tahoma" - $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) - $AboutTextBox.Name = "AboutTextBox" - $AboutTextBox.ReadOnly = $True - $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) - $AboutTextBox.Text = $About - - $AboutForm.Controls.Add($AboutTextBox) - - $AboutForm.Show() | Out-Null -} -#endregion - -#region Form Creation -#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vDiagram = New-Object System.Windows.Forms.Form -$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) -$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") -$vDiagram.Icon = $Icon -$vDiagram.Text = "vDiagram 2.0" -$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan -#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainMenu = New-Object System.Windows.Forms.MenuStrip -$MainMenu.Location = New-Object System.Drawing.Point(0, 0) -$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) -$MainMenu.TabIndex = 1 -$MainMenu.Text = "MainMenu" -#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) -$FileToolStripMenuItem.Text = "File" -#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) -$ExitToolStripMenuItem.Text = "Exit" -$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) -$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) -#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) -$HelpToolStripMenuItem.Text = "Help" -#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) -$AboutToolStripMenuItem.Text = "About" -$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) -$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) -$AboutToolStripMenuItem.Add_Click({About_Config}) -#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainTab = New-Object System.Windows.Forms.TabControl -$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) -$MainTab.Location = New-Object System.Drawing.Point(10, 30) -$MainTab.Size = New-Object System.Drawing.Size(990, 98) -$MainTab.TabIndex = 0 -$MainTab.Text = "MainTabs" -#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Prerequisites = New-Object System.Windows.Forms.TabPage -$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) -$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) -$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) -$Prerequisites.TabIndex = 0 -$Prerequisites.Text = "Prerequisites" -$Prerequisites.BackColor = [System.Drawing.Color]::LightGray -#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellLabel = New-Object System.Windows.Forms.Label -$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) -$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) -$PowershellLabel.TabIndex = 1 -$PowershellLabel.Text = "Powershell:" -#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellInstalled = New-Object System.Windows.Forms.Label -$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) -$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) -$PowershellInstalled.TabIndex = 2 -$PowershellInstalled.Text = "" -$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleLabel = New-Object System.Windows.Forms.Label -$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) -$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) -$PowerCliModuleLabel.TabIndex = 3 -$PowerCliModuleLabel.Text = "PowerCLI Module:" -#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label -$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) -$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) -$PowerCliModuleInstalled.TabIndex = 4 -$PowerCliModuleInstalled.Text = "" -$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliLabel = New-Object System.Windows.Forms.Label -$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) -$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) -$PowerCliLabel.TabIndex = 5 -$PowerCliLabel.Text = "PowerCLI:" -#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliInstalled = New-Object System.Windows.Forms.Label -$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) -$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) -$PowerCliInstalled.TabIndex = 6 -$PowerCliInstalled.Text = "" -$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioLabel = New-Object System.Windows.Forms.Label -$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) -$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) -$VisioLabel.TabIndex = 7 -$VisioLabel.Text = "Visio:" -#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioInstalled = New-Object System.Windows.Forms.Label -$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) -$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) -$VisioInstalled.TabIndex = 8 -$VisioInstalled.Text = "" -$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray -$Prerequisites.Controls.Add($PowershellLabel) -$Prerequisites.Controls.Add($PowershellInstalled) -$Prerequisites.Controls.Add($PowerCliModuleLabel) -$Prerequisites.Controls.Add($PowerCliModuleInstalled) -$Prerequisites.Controls.Add($PowerCliLabel) -$Prerequisites.Controls.Add($PowerCliInstalled) -$Prerequisites.Controls.Add($VisioLabel) -$Prerequisites.Controls.Add($VisioInstalled) -#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfo = New-Object System.Windows.Forms.TabPage -$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) -$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) -$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) -$vCenterInfo.TabIndex = 0 -$vCenterInfo.Text = "vCenter Info" -$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray -#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterLabel = New-Object System.Windows.Forms.Label -$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) -$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) -$MainVcenterLabel.TabIndex = 1 -$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" -#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox -$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) -$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) -$MainVcenterTextBox.TabIndex = 2 -$MainVcenterTextBox.Text = "" -#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterLabel = New-Object System.Windows.Forms.Label -$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) -$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) -$TargetVcenterLabel.TabIndex = 3 -$TargetVcenterLabel.Text = "Name of target vCenter:" -#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox -$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) -$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) -$TargetVcenterTextBox.TabIndex = 4 -$TargetVcenterTextBox.Text = "" -#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameLabel = New-Object System.Windows.Forms.Label -$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) -$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) -$UserNameLabel.TabIndex = 5 -$UserNameLabel.Text = "vCenter User Name:" -#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameTextBox = New-Object System.Windows.Forms.TextBox -$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) -$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) -$UserNameTextBox.TabIndex = 6 -$UserNameTextBox.Text = "" -#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordLabel = New-Object System.Windows.Forms.Label -$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) -$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) -$PasswordLabel.TabIndex = 7 -$PasswordLabel.Text = "Password:" -#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordTextBox = New-Object System.Windows.Forms.TextBox -$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) -$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) -$PasswordTextBox.TabIndex = 8 -$PasswordTextBox.Text = "" -$PasswordTextBox.UseSystemPasswordChar = $true -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton = New-Object System.Windows.Forms.Button -$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) -$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) -$ConnectButton.TabIndex = 9 -$ConnectButton.Text = "Connect to vCenter" -$ConnectButton.UseVisualStyleBackColor = $true -$vCenterInfo.Controls.Add($MainVcenterLabel) -$vCenterInfo.Controls.Add($MainVcenterTextBox) -$vCenterInfo.Controls.Add($TargetVcenterLabel) -$vCenterInfo.Controls.Add($TargetVcenterTextBox) -$vCenterInfo.Controls.Add($UserNameLabel) -$vCenterInfo.Controls.Add($UserNameTextBox) -$vCenterInfo.Controls.Add($PasswordLabel) -$vCenterInfo.Controls.Add($PasswordTextBox) -$vCenterInfo.Controls.Add($ConnectButton) -$MainTab.Controls.Add($Prerequisites) -$MainTab.Controls.Add($vCenterInfo) -$MainTab.SelectedIndex = 0 -#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SubTab = New-Object System.Windows.Forms.TabControl -$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$SubTab.Location = New-Object System.Drawing.Point(10, 136) -$SubTab.Size = New-Object System.Drawing.Size(990, 512) -$SubTab.TabIndex = 0 -$SubTab.Text = "SubTabs" -#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDirections = New-Object System.Windows.Forms.TabPage -$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDirections.Location = New-Object System.Drawing.Point(4, 22) -$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDirections.Size = New-Object System.Drawing.Size(982, 486) -$TabDirections.TabIndex = 0 -$TabDirections.Text = "Directions" -$TabDirections.UseVisualStyleBackColor = $true -#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesHeading = New-Object System.Windows.Forms.Label -$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) -$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) -$PrerequisitesHeading.TabIndex = 0 -$PrerequisitesHeading.Text = "Prerequisites Tab" -#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesDirections = New-Object System.Windows.Forms.Label -$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) -$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) -$PrerequisitesDirections.TabIndex = 1 -$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." -#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoHeading = New-Object System.Windows.Forms.Label -$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) -$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) -$vCenterInfoHeading.TabIndex = 2 -$vCenterInfoHeading.Text = "vCenter Info Tab" -#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoDirections = New-Object System.Windows.Forms.Label -$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) -$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) -$vCenterInfoDirections.TabIndex = 3 -$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." -#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvHeading = New-Object System.Windows.Forms.Label -$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) -$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) -$CaptureCsvHeading.TabIndex = 4 -$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" -#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureDirections = New-Object System.Windows.Forms.Label -$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) -$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) -$CaptureDirections.TabIndex = 5 -$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." -#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawHeading = New-Object System.Windows.Forms.Label -$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) -$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) -$DrawHeading.TabIndex = 6 -$DrawHeading.Text = "Draw Visio Tab" -#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawDirections = New-Object System.Windows.Forms.Label -$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) -$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) -$DrawDirections.TabIndex = 7 -$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." -$TabDirections.Controls.Add($PrerequisitesHeading) -$TabDirections.Controls.Add($PrerequisitesDirections) -$TabDirections.Controls.Add($vCenterInfoHeading) -$TabDirections.Controls.Add($vCenterInfoDirections) -$TabDirections.Controls.Add($CaptureCsvHeading) -$TabDirections.Controls.Add($CaptureDirections) -$TabDirections.Controls.Add($DrawHeading) -$TabDirections.Controls.Add($DrawDirections) -#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabCapture = New-Object System.Windows.Forms.TabPage -$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabCapture.Location = New-Object System.Drawing.Point(4, 22) -$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) -$TabCapture.Size = New-Object System.Drawing.Size(982, 486) -$TabCapture.TabIndex = 3 -$TabCapture.Text = "Capture CSVs for Visio" -$TabCapture.UseVisualStyleBackColor = $true -#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label -$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) -$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) -$CaptureCsvOutputLabel.TabIndex = 0 -$CaptureCsvOutputLabel.Text = "CSV Output Folder:" -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button -$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) -$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) -$CaptureCsvOutputButton.TabIndex = 0 -$CaptureCsvOutputButton.Text = "Select Output Folder" -$CaptureCsvOutputButton.UseVisualStyleBackColor = $false -$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$vCenterCsvCheckBox.Checked = $true -$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$vCenterCsvCheckBox.TabIndex = 1 -$vCenterCsvCheckBox.Text = "Export vCenter Info" -$vCenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) -$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationComplete.TabIndex = 26 -$vCenterCsvValidationComplete.Text = "" -#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatacenterCsvCheckBox.Checked = $true -$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatacenterCsvCheckBox.TabIndex = 2 -$DatacenterCsvCheckBox.Text = "Export Datacenter Info" -$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) -$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationComplete.TabIndex = 27 -$DatacenterCsvValidationComplete.Text = "" -#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ClusterCsvCheckBox.Checked = $true -$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ClusterCsvCheckBox.TabIndex = 3 -$ClusterCsvCheckBox.Text = "Export Cluster Info" -$ClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) -$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationComplete.TabIndex = 28 -$ClusterCsvValidationComplete.Text = "" -#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmHostCsvCheckBox.Checked = $true -$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmHostCsvCheckBox.TabIndex = 4 -$VmHostCsvCheckBox.Text = "Export VmHost Info" -$VmHostCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) -$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationComplete.TabIndex = 29 -$VmHostCsvValidationComplete.Text = "" -#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmCsvCheckBox.Checked = $true -$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmCsvCheckBox.TabIndex = 5 -$VmCsvCheckBox.Text = "Export Vm Info" -$VmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) -$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationComplete.TabIndex = 30 -$VmCsvValidationComplete.Text = "" -#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$TemplateCsvCheckBox.Checked = $true -$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$TemplateCsvCheckBox.TabIndex = 6 -$TemplateCsvCheckBox.Text = "Export Template Info" -$TemplateCsvCheckBox.UseVisualStyleBackColor = $true -#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label -$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) -$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationComplete.TabIndex = 31 -$TemplateCsvValidationComplete.Text = "" -#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreClusterCsvCheckBox.Checked = $true -$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreClusterCsvCheckBox.TabIndex = 7 -$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" -$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) -$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationComplete.TabIndex = 32 -$DatastoreClusterCsvValidationComplete.Text = "" -#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreCsvCheckBox.Checked = $true -$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreCsvCheckBox.TabIndex = 8 -$DatastoreCsvCheckBox.Text = "Export Datastore Info" -$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) -$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationComplete.TabIndex = 33 -$DatastoreCsvValidationComplete.Text = "" -#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VsSwitchCsvCheckBox.Checked = $true -$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) -$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VsSwitchCsvCheckBox.TabIndex = 9 -$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" -$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) -$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationComplete.TabIndex = 34 -$VsSwitchCsvValidationComplete.Text = "" -#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPortGroupCsvCheckBox.Checked = $true -$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) -$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPortGroupCsvCheckBox.TabIndex = 10 -$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" -$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) -$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationComplete.TabIndex = 35 -$VssPortGroupCsvValidationComplete.Text = "" -#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssVmkernelCsvCheckBox.Checked = $true -$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) -$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssVmkernelCsvCheckBox.TabIndex = 11 -$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" -$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) -$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationComplete.TabIndex = 36 -$VssVmkernelCsvValidationComplete.Text = "" -#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPnicCsvCheckBox.Checked = $true -$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) -$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPnicCsvCheckBox.TabIndex = 12 -$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" -$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) -$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationComplete.TabIndex = 37 -$VssPnicCsvValidationComplete.Text = "" -#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdSwitchCsvCheckBox.Checked = $true -$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) -$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdSwitchCsvCheckBox.TabIndex = 13 -$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" -$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) -$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationComplete.TabIndex = 38 -$VdSwitchCsvValidationComplete.Text = "" -#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPortGroupCsvCheckBox.Checked = $true -$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) -$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPortGroupCsvCheckBox.TabIndex = 14 -$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" -$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) -$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationComplete.TabIndex = 39 -$VdsPortGroupCsvValidationComplete.Text = "" -#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsVmkernelCsvCheckBox.Checked = $true -$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) -$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsVmkernelCsvCheckBox.TabIndex = 15 -$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" -$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) -$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationComplete.TabIndex = 40 -$VdsVmkernelCsvValidationComplete.Text = "" -#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPnicCsvCheckBox.Checked = $true -$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) -$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPnicCsvCheckBox.TabIndex = 16 -$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" -$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) -$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationComplete.TabIndex = 41 -$VdsPnicCsvValidationComplete.Text = "" -#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$FolderCsvCheckBox.Checked = $true -$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) -$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$FolderCsvCheckBox.TabIndex = 17 -$FolderCsvCheckBox.Text = "Export Folder Info" -$FolderCsvCheckBox.UseVisualStyleBackColor = $true -#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label -$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) -$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationComplete.TabIndex = 42 -$FolderCsvValidationComplete.Text = "" -#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$RdmCsvCheckBox.Checked = $true -$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) -$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$RdmCsvCheckBox.TabIndex = 18 -$RdmCsvCheckBox.Text = "Export RDM Info" -$RdmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label -$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) -$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationComplete.TabIndex = 43 -$RdmCsvValidationComplete.Text = "" -#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsRuleCsvCheckBox.Checked = $true -$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) -$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsRuleCsvCheckBox.TabIndex = 19 -$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" -$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) -$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationComplete.TabIndex = 44 -$DrsRuleCsvValidationComplete.Text = "" -#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsClusterGroupCsvCheckBox.Checked = $true -$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) -$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsClusterGroupCsvCheckBox.TabIndex = 20 -$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" -$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) -$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationComplete.TabIndex = 45 -$DrsClusterGroupCsvValidationComplete.Text = "" -#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsVmHostRuleCsvCheckBox.Checked = $true -$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) -$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsVmHostRuleCsvCheckBox.TabIndex = 21 -$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" -$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) -$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 -$DrsVmHostRuleCsvValidationComplete.Text = "" -#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ResourcePoolCsvCheckBox.Checked = $true -$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) -$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ResourcePoolCsvCheckBox.TabIndex = 22 -$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" -$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) -$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationComplete.TabIndex = 47 -$ResourcePoolCsvValidationComplete.Text = "" -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton = New-Object System.Windows.Forms.Button -$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) -$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureUncheckButton.TabIndex = 23 -$CaptureUncheckButton.Text = "Uncheck All" -$CaptureUncheckButton.UseVisualStyleBackColor = $false -$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton = New-Object System.Windows.Forms.Button -$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) -$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureCheckButton.TabIndex = 24 -$CaptureCheckButton.Text = "Check All" -$CaptureCheckButton.UseVisualStyleBackColor = $false -$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton = New-Object System.Windows.Forms.Button -$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) -$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureButton.TabIndex = 25 -$CaptureButton.Text = "Collect CSV Data" -$CaptureButton.UseVisualStyleBackColor = $false -$CaptureButton.BackColor = [System.Drawing.Color]::LightGray -$TabCapture.Controls.Add($CaptureCsvOutputLabel) -$TabCapture.Controls.Add($CaptureCsvOutputButton) -$TabCapture.Controls.Add($vCenterCsvCheckBox) -$TabCapture.Controls.Add($vCenterCsvValidationComplete) -$TabCapture.Controls.Add($DatacenterCsvCheckBox) -$TabCapture.Controls.Add($DatacenterCsvValidationComplete) -$TabCapture.Controls.Add($ClusterCsvCheckBox) -$TabCapture.Controls.Add($ClusterCsvValidationComplete) -$TabCapture.Controls.Add($VmHostCsvCheckBox) -$TabCapture.Controls.Add($VmHostCsvValidationComplete) -$TabCapture.Controls.Add($VmCsvCheckBox) -$TabCapture.Controls.Add($VmCsvValidationComplete) -$TabCapture.Controls.Add($TemplateCsvCheckBox) -$TabCapture.Controls.Add($TemplateCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) -$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreCsvCheckBox) -$TabCapture.Controls.Add($DatastoreCsvValidationComplete) -$TabCapture.Controls.Add($VsSwitchCsvCheckBox) -$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VssPnicCsvCheckBox) -$TabCapture.Controls.Add($VssPnicCsvValidationComplete) -$TabCapture.Controls.Add($VdSwitchCsvCheckBox) -$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VdsPnicCsvCheckBox) -$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) -$TabCapture.Controls.Add($FolderCsvCheckBox) -$TabCapture.Controls.Add($FolderCsvValidationComplete) -$TabCapture.Controls.Add($RdmCsvCheckBox) -$TabCapture.Controls.Add($RdmCsvValidationComplete) -$TabCapture.Controls.Add($DrsRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) -$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) -$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) -$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) -$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) -$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) -$TabCapture.Controls.Add($CaptureUncheckButton) -$TabCapture.Controls.Add($CaptureCheckButton) -$TabCapture.Controls.Add($CaptureButton) -#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDraw = New-Object System.Windows.Forms.TabPage -$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDraw.Location = New-Object System.Drawing.Point(4, 22) -$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDraw.Size = New-Object System.Drawing.Size(982, 486) -$TabDraw.TabIndex = 2 -$TabDraw.Text = "Draw Visio" -$TabDraw.UseVisualStyleBackColor = $true -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton = New-Object System.Windows.Forms.Button -$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) -$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) -$OpenVisioButton.TabIndex = 83 -$OpenVisioButton.Text = "Open Visio Drawing" -$OpenVisioButton.UseVisualStyleBackColor = $false -$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton = New-Object System.Windows.Forms.Button -$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) -$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawCheckButton.TabIndex = 82 -$DrawCheckButton.Text = "Check All" -$DrawCheckButton.UseVisualStyleBackColor = $false -$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton = New-Object System.Windows.Forms.Button -$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawButton.Location = New-Object System.Drawing.Point(448, 450) -$DrawButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawButton.TabIndex = 81 -$DrawButton.Text = "Draw Visio" -$DrawButton.UseVisualStyleBackColor = $false -$DrawButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton = New-Object System.Windows.Forms.Button -$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) -$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawUncheckButton.TabIndex = 80 -$DrawUncheckButton.Text = "Uncheck All" -$DrawUncheckButton.UseVisualStyleBackColor = $false -$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOutputLabel = New-Object System.Windows.Forms.Label -$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) -$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) -$VisioOutputLabel.TabIndex = 46 -$VisioOutputLabel.Text = "Visio Output Folder:" -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton = New-Object System.Windows.Forms.Button -$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) -$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) -$VisioOpenOutputButton.TabIndex = 47 -$VisioOpenOutputButton.Text = "Select Visio Output Folder" -$VisioOpenOutputButton.UseVisualStyleBackColor = $false -$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputLabel = New-Object System.Windows.Forms.Label -$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) -$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) -$DrawCsvInputLabel.TabIndex = 0 -$DrawCsvInputLabel.Text = "CSV Input Folder:" -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton = New-Object System.Windows.Forms.Button -$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) -$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) -$DrawCsvInputButton.TabIndex = 1 -$DrawCsvInputButton.Text = "Select CSV Input Folder" -$DrawCsvInputButton.UseVisualStyleBackColor = $false -$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidation = New-Object System.Windows.Forms.Label -$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$vCenterCsvValidation.TabIndex = 2 -$vCenterCsvValidation.Text = "vCenter CSV File:" -#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) -$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationCheck.TabIndex = 3 -$vCenterCsvValidationCheck.Text = "" -#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidation = New-Object System.Windows.Forms.Label -$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatacenterCsvValidation.TabIndex = 4 -$DatacenterCsvValidation.Text = "Datacenter CSV File:" -#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) -$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationCheck.TabIndex = 5 -$DatacenterCsvValidationCheck.Text = "" -#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidation = New-Object System.Windows.Forms.Label -$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ClusterCsvValidation.TabIndex = 6 -$ClusterCsvValidation.Text = "Cluster CSV File:" -#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) -$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationCheck.TabIndex = 7 -$ClusterCsvValidationCheck.Text = "" -#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidation = New-Object System.Windows.Forms.Label -$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmHostCsvValidation.TabIndex = 8 -$VmHostCsvValidation.Text = "VmHost CSV File:" -#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) -$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationCheck.TabIndex = 9 -$VmHostCsvValidationCheck.Text = "" -#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidation = New-Object System.Windows.Forms.Label -$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmCsvValidation.TabIndex = 10 -$VmCsvValidation.Text = "VM CSV File:" -#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) -$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationCheck.TabIndex = 11 -$VmCsvValidationCheck.Text = "" -#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidation = New-Object System.Windows.Forms.Label -$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$TemplateCsvValidation.TabIndex = 12 -$TemplateCsvValidation.Text = "Template CSV File:" -#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label -$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) -$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationCheck.TabIndex = 13 -$TemplateCsvValidationCheck.Text = "" -#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreClusterCsvValidation.TabIndex = 14 -$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" -#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) -$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationCheck.TabIndex = 15 -$DatastoreClusterCsvValidationCheck.Text = "" -#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreCsvValidation.TabIndex = 16 -$DatastoreCsvValidation.Text = "Datastore CSV File:" -#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) -$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationCheck.TabIndex = 17 -$DatastoreCsvValidationCheck.Text = "" -#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) -$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VsSwitchCsvValidation.TabIndex = 18 -$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" -#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) -$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationCheck.TabIndex = 19 -$VsSwitchCsvValidationCheck.Text = "" -#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) -$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPortGroupCsvValidation.TabIndex = 20 -$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" -#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) -$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationCheck.TabIndex = 21 -$VssPortGroupCsvValidationCheck.Text = "" -#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) -$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssVmkernelCsvValidation.TabIndex = 22 -$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" -#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) -$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationCheck.TabIndex = 23 -$VssVmkernelCsvValidationCheck.Text = "" -#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidation = New-Object System.Windows.Forms.Label -$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) -$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPnicCsvValidation.TabIndex = 24 -$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" -#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) -$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationCheck.TabIndex = 25 -$VssPnicCsvValidationCheck.Text = "" -#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) -$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdSwitchCsvValidation.TabIndex = 26 -$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" -#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) -$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationCheck.TabIndex = 27 -$VdSwitchCsvValidationCheck.Text = "" -#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) -$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPortGroupCsvValidation.TabIndex = 28 -$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" -#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) -$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationCheck.TabIndex = 29 -$VdsPortGroupCsvValidationCheck.Text = "" -#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) -$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsVmkernelCsvValidation.TabIndex = 30 -$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" -#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) -$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationCheck.TabIndex = 31 -$VdsVmkernelCsvValidationCheck.Text = "" -#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) -$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPnicCsvValidation.TabIndex = 32 -$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" -#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) -$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationCheck.TabIndex = 33 -$VdsPnicCsvValidationCheck.Text = "" -#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidation = New-Object System.Windows.Forms.Label -$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) -$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$FolderCsvValidation.TabIndex = 34 -$FolderCsvValidation.Text = "Folder CSV File:" -#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label -$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) -$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationCheck.TabIndex = 35 -$FolderCsvValidationCheck.Text = "" -#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidation = New-Object System.Windows.Forms.Label -$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) -$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$RdmCsvValidation.TabIndex = 36 -$RdmCsvValidation.Text = "RDM CSV File:" -#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label -$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) -$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationCheck.TabIndex = 37 -$RdmCsvValidationCheck.Text = "" -#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) -$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsRuleCsvValidation.TabIndex = 38 -$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" -#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) -$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationCheck.TabIndex = 39 -$DrsRuleCsvValidationCheck.Text = "" -#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) -$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsClusterGroupCsvValidation.TabIndex = 40 -$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" -#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) -$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationCheck.TabIndex = 41 -$DrsClusterGroupCsvValidationCheck.Text = "" -#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) -$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsVmHostRuleCsvValidation.TabIndex = 42 -$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" -#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) -$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 -$DrsVmHostRuleCsvValidationCheck.Text = "" -#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) -$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ResourcePoolCsvValidation.TabIndex = 44 -$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" -#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) -$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationCheck.TabIndex = 45 -$ResourcePoolCsvValidationCheck.Text = "" -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton = New-Object System.Windows.Forms.Button -$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) -$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) -$CsvValidationButton.TabIndex = 2 -$CsvValidationButton.Text = "Check for CSVs" -$CsvValidationButton.UseVisualStyleBackColor = $false -$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Host_DrawCheckBox.Checked = $true -$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) -$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Host_DrawCheckBox.TabIndex = 48 -$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" -$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_Complete = New-Object System.Windows.Forms.Label -$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) -$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Host_Complete.TabIndex = 49 -$VM_to_Host_Complete.Text = "" -#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Folder_DrawCheckBox.Checked = $true -$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) -$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Folder_DrawCheckBox.TabIndex = 50 -$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" -$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label -$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) -$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Folder_Complete.TabIndex = 51 -$VM_to_Folder_Complete.Text = "" -#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMs_with_RDMs_DrawCheckBox.Checked = $true -$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) -$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 -$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" -$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label -$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) -$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMs_with_RDMs_Complete.TabIndex = 53 -$VMs_with_RDMs_Complete.Text = "" -#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$SRM_Protected_VMs_DrawCheckBox.Checked = $true -$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) -$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 -$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" -$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label -$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) -$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$SRM_Protected_VMs_Complete.TabIndex = 55 -$SRM_Protected_VMs_Complete.Text = "" -#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Datastore_DrawCheckBox.Checked = $true -$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) -$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Datastore_DrawCheckBox.TabIndex = 56 -$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" -$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label -$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) -$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Datastore_Complete.TabIndex = 57 -$VM_to_Datastore_Complete.Text = "" -#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_ResourcePool_DrawCheckBox.Checked = $true -$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) -$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 -$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" -$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label -$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) -$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_ResourcePool_Complete.TabIndex = 59 -$VM_to_ResourcePool_Complete.Text = "" -#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Datastore_to_Host_DrawCheckBox.Checked = $true -$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) -$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$Datastore_to_Host_DrawCheckBox.TabIndex = 60 -$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" -$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label -$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) -$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Datastore_to_Host_Complete.TabIndex = 61 -$Datastore_to_Host_Complete.Text = "" -#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true -$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) -$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 -$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" -$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label -$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) -$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) -$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 -$PhysicalNIC_to_vSwitch_Complete.Text = "" -#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSS_to_Host_DrawCheckBox.Checked = $true -$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) -$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSS_to_Host_DrawCheckBox.TabIndex = 64 -$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" -$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) -$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSS_to_Host_Complete.TabIndex = 65 -$VSS_to_Host_Complete.Text = "" -#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VSS_DrawCheckBox.Checked = $true -$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) -$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VSS_DrawCheckBox.TabIndex = 66 -$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" -$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) -$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VSS_Complete.TabIndex = 67 -$VMK_to_VSS_Complete.Text = "" -#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) -$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 -$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" -$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) -$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSSPortGroup_to_VM_Complete.TabIndex = 69 -$VSSPortGroup_to_VM_Complete.Text = "" -#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDS_to_Host_DrawCheckBox.Checked = $true -$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) -$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDS_to_Host_DrawCheckBox.TabIndex = 70 -$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" -$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) -$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDS_to_Host_Complete.TabIndex = 71 -$VDS_to_Host_Complete.Text = "" -#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VDS_DrawCheckBox.Checked = $true -$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) -$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VDS_DrawCheckBox.TabIndex = 72 -$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" -$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) -$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VDS_Complete.TabIndex = 73 -$VMK_to_VDS_Complete.Text = "" -#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) -$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 -$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" -$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) -$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDSPortGroup_to_VM_Complete.TabIndex = 75 -$VDSPortGroup_to_VM_Complete.Text = "" -#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true -$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) -$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 -$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" -$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label -$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) -$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Cluster_to_DRS_Rule_Complete.TabIndex = 77 -$Cluster_to_DRS_Rule_Complete.Text = "" - -$TabDraw.Controls.Add($OpenVisioButton) -$TabDraw.Controls.Add($DrawCheckButton) -$TabDraw.Controls.Add($DrawButton) -$TabDraw.Controls.Add($DrawUncheckButton) -$TabDraw.Controls.Add($VisioOutputLabel) -$TabDraw.Controls.Add($VisioOpenOutputButton) -$TabDraw.Controls.Add($DrawCsvInputLabel) -$TabDraw.Controls.Add($DrawCsvInputButton) -$TabDraw.Controls.Add($vCenterCsvValidation) -$TabDraw.Controls.Add($vCenterCsvValidationCheck) -$TabDraw.Controls.Add($DatacenterCsvValidation) -$TabDraw.Controls.Add($DatacenterCsvValidationCheck) -$TabDraw.Controls.Add($ClusterCsvValidation) -$TabDraw.Controls.Add($ClusterCsvValidationCheck) -$TabDraw.Controls.Add($VmHostCsvValidation) -$TabDraw.Controls.Add($VmHostCsvValidationCheck) -$TabDraw.Controls.Add($VmCsvValidation) -$TabDraw.Controls.Add($VmCsvValidationCheck) -$TabDraw.Controls.Add($TemplateCsvValidation) -$TabDraw.Controls.Add($TemplateCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreClusterCsvValidation) -$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreCsvValidation) -$TabDraw.Controls.Add($DatastoreCsvValidationCheck) -$TabDraw.Controls.Add($VsSwitchCsvValidation) -$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VssPortGroupCsvValidation) -$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VssVmkernelCsvValidation) -$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VssPnicCsvValidation) -$TabDraw.Controls.Add($VssPnicCsvValidationCheck) -$TabDraw.Controls.Add($VdSwitchCsvValidation) -$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VdsPortGroupCsvValidation) -$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VdsVmkernelCsvValidation) -$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VdsPnicCsvValidation) -$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) -$TabDraw.Controls.Add($FolderCsvValidation) -$TabDraw.Controls.Add($FolderCsvValidationCheck) -$TabDraw.Controls.Add($RdmCsvValidation) -$TabDraw.Controls.Add($RdmCsvValidationCheck) -$TabDraw.Controls.Add($DrsRuleCsvValidation) -$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) -$TabDraw.Controls.Add($ResourcePoolCsvValidation) -$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) -$TabDraw.Controls.Add($CsvValidationButton) -$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Host_Complete) -$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Folder_Complete) -$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) -$TabDraw.Controls.Add($VMs_with_RDMs_Complete) -$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) -$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) -$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Datastore_Complete) -$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) -$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($Datastore_to_Host_Complete) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) -$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VSS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VSS_Complete) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VDS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VDS_Complete) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) -$SubTab.Controls.Add($TabDirections) -$SubTab.Controls.Add($TabCapture) -$SubTab.Controls.Add($TabDraw) -$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText -$SubTab.SelectedIndex = 0 -$vDiagram.Controls.Add($MainMenu) -$vDiagram.Controls.Add($MainTab) -$vDiagram.Controls.Add($SubTab) -#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$VisioBrowse.Description = "Select a directory" -$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$DrawCsvBrowse.Description = "Select a directory" -$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$CaptureCsvBrowse.Description = "Select a directory" -$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - -#endregion - -#region Custom Code -#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellCheck = $PSVersionTable.PSVersion -if ($PowershellCheck.Major -ge 4) -{ - $PowershellInstalled.Forecolor = "Green" - $PowershellInstalled.Text = "Installed Version $PowershellCheck" -} -else -{ - $PowershellInstalled.Forecolor = "Red" - $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" -} -#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) -$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) -if ($PowerCliModuleCheck -ne $null) -{ - $PowerCliModuleInstalled.Forecolor = "Green" - $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" -} -else -{ - $PowerCliModuleInstalled.Forecolor = "Red" - $PowerCliModuleInstalled.Text = "Not Installed" -} -#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerClI Installed" -} -elseif ($PowerCliModuleCheck -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerCLI Module Installed" -} -else -{ - $PowerCliInstalled.Forecolor = "Red" - $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" -} -#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) -{ - $VisioInstalled.Forecolor = "Green" - $VisioInstalled.Text = "Installed" -} -else -{ - $VisioInstalled.Forecolor = "Red" - $VisioInstalled.Text = "Visio is Not Installed" -} -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) -$ConnectButton.Add_Click({ Connect_vCenter_Main }) -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } -Check_CaptureCsvFolder } ) -#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton.Add_Click({ - if($CaptureCsvFolder -eq $null) - { - $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" - } - else - { - if ($vCenterCsvCheckBox.Checked -eq "True") - { - $vCenterCsvValidationComplete.Forecolor = "Blue" - $vCenterCsvValidationComplete.Text = "Processing ....." - vCenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" - $vCenterCsvComplete = Test-Path $vCenterExportFileComplete - if ($vCenterCsvComplete -eq $True) - { - $vCenterCsvValidationComplete.Forecolor = "Green" - $vCenterCsvValidationComplete.Text = "Complete" - } - else - { - $vCenterCsvValidationComplete.Forecolor = "Red" - $vCenterCsvValidationComplete.Text = "Not Complete" - } - } - Connect_vCenter - $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager - if ($Connected -eq $null) { Connect_vCenter_Main } - $ConnectButton.Forecolor = [System.Drawing.Color]::Green - $ConnectButton.Text = "Connected to $DefaultViserver" - if ($DatacenterCsvCheckBox.Checked -eq "True") - { - $DatacenterCsvValidationComplete.Forecolor = "Blue" - $DatacenterCsvValidationComplete.Text = "Processing ....." - Datacenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" - $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete - if ($DatacenterCsvComplete -eq $True) - { - $DatacenterCsvValidationComplete.Forecolor = "Green" - $DatacenterCsvValidationComplete.Text = "Complete" - } - else - { - $DatacenterCsvValidationComplete.Forecolor = "Red" - $DatacenterCsvValidationComplete.Text = "Not Complete" - } - } - if ($ClusterCsvCheckBox.Checked -eq "True") - { - $ClusterCsvValidationComplete.Forecolor = "Blue" - $ClusterCsvValidationComplete.Text = "Processing ....." - Cluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" - $ClusterCsvComplete = Test-Path $ClusterExportFileComplete - if ($ClusterCsvComplete -eq $True) - { - $ClusterCsvValidationComplete.Forecolor = "Green" - $ClusterCsvValidationComplete.Text = "Complete" - } - else - { - $ClusterCsvValidationComplete.Forecolor = "Red" - $ClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmHostCsvCheckBox.Checked -eq "True") - { - $VmHostCsvValidationComplete.Forecolor = "Blue" - $VmHostCsvValidationComplete.Text = "Processing ....." - VmHost_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" - $VmHostCsvComplete = Test-Path $VmHostExportFileComplete - if ($VmHostCsvComplete -eq $True) - { - $VmHostCsvValidationComplete.Forecolor = "Green" - $VmHostCsvValidationComplete.Text = "Complete" - } - else - { - $VmHostCsvValidationComplete.Forecolor = "Red" - $VmHostCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmCsvCheckBox.Checked -eq "True") - { - $VmCsvValidationComplete.Forecolor = "Blue" - $VmCsvValidationComplete.Text = "Processing ....." - Vm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" - $VmCsvComplete = Test-Path $VmExportFileComplete - if ($VmCsvComplete -eq $True) - { - $VmCsvValidationComplete.Forecolor = "Green" - $VmCsvValidationComplete.Text = "Complete" - } - else - { - $VmCsvValidationComplete.Forecolor = "Red" - $VmCsvValidationComplete.Text = "Not Complete" - } - } - if ($TemplateCsvCheckBox.Checked -eq "True") - { - $TemplateCsvValidationComplete.Forecolor = "Blue" - $TemplateCsvValidationComplete.Text = "Processing ....." - Template_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" - $TemplateCsvComplete = Test-Path $TemplateExportFileComplete - if ($TemplateCsvComplete -eq $True) - { - $TemplateCsvValidationComplete.Forecolor = "Green" - $TemplateCsvValidationComplete.Text = "Complete" - } - else - { - $TemplateCsvValidationComplete.Forecolor = "Red" - $TemplateCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreClusterCsvCheckBox.Checked -eq "True") - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" - $DatastoreClusterCsvValidationComplete.Text = "Processing ....." - DatastoreCluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete - if ($DatastoreClusterCsvComplete -eq $True) - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Green" - $DatastoreClusterCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Red" - $DatastoreClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreCsvCheckBox.Checked -eq "True") - { - $DatastoreCsvValidationComplete.Forecolor = "Blue" - $DatastoreCsvValidationComplete.Text = "Processing ....." - Datastore_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" - $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete - if ($DatastoreCsvComplete -eq $True) - { - $DatastoreCsvValidationComplete.Forecolor = "Green" - $DatastoreCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreCsvValidationComplete.Forecolor = "Red" - $DatastoreCsvValidationComplete.Text = "Not Complete" - } - } - if ($VsSwitchCsvCheckBox.Checked -eq "True") - { - $VsSwitchCsvValidationComplete.Forecolor = "Blue" - $VsSwitchCsvValidationComplete.Text = "Processing ....." - VsSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" - $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete - if ($vSSwitchCsvComplete -eq $True) - { - $vSSwitchCsvValidationComplete.Forecolor = "Green" - $vSSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $vSSwitchCsvValidationComplete.Forecolor = "Red" - $vSSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPortGroupCsvCheckBox.Checked -eq "True") - { - $VssPortGroupCsvValidationComplete.Forecolor = "Blue" - $VssPortGroupCsvValidationComplete.Text = "Processing ....." - VssPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete - if ($VssPortGroupCsvComplete -eq $True) - { - $VssPortGroupCsvValidationComplete.Forecolor = "Green" - $VssPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VssPortGroupCsvValidationComplete.Forecolor = "Red" - $VssPortGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssVmkernelCsvCheckBox.Checked -eq "True") - { - $VssVmkernelCsvValidationComplete.Forecolor = "Blue" - $VssVmkernelCsvValidationComplete.Text = "Processing ....." - VssVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete - if ($VssVmkernelCsvComplete -eq $True) - { - $VssVmkernelCsvValidationComplete.Forecolor = "Green" - $VssVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VssVmkernelCsvValidationComplete.Forecolor = "Red" - $VssVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPnicCsvCheckBox.Checked -eq "True") - { - $VssPnicCsvValidationComplete.Forecolor = "Blue" - $VssPnicCsvValidationComplete.Text = "Processing ....." - VssPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" - $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete - if ($VssPnicCsvComplete -eq $True) - { - $VssPnicCsvValidationComplete.Forecolor = "Green" - $VssPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VssPnicCsvValidationComplete.Forecolor = "Red" - $VssPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdSwitchCsvCheckBox.Checked -eq "True") - { - $VdSwitchCsvValidationComplete.Forecolor = "Blue" - $VdSwitchCsvValidationComplete.Text = "Processing ....." - VdSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" - $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete - if ($VdSwitchCsvComplete -eq $True) - { - $VdSwitchCsvValidationComplete.Forecolor = "Green" - $VdSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $VdSwitchCsvValidationComplete.Forecolor = "Red" - $VdSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPortGroupCsvCheckBox.Checked -eq "True") - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" - $VdsPortGroupCsvValidationComplete.Text = "Processing ....." - VdsPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete - if ($VdsPortGroupCsvComplete -eq $True) - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Green" - $VdsPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Red" - $VdsPortGroupCsvValidationComplete.Text = "Not Complete" - - } - } - if ($VdsVmkernelCsvCheckBox.Checked -eq "True") - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" - $VdsVmkernelCsvValidationComplete.Text = "Processing ....." - VdsVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete - if ($VdsVmkernelCsvComplete -eq $True) - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Green" - $VdsVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Red" - $VdsVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPnicCsvCheckBox.Checked -eq "True") - { - $VdsPnicCsvValidationComplete.Forecolor = "Blue" - $VdsPnicCsvValidationComplete.Text = "Processing ....." - VdsPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" - $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete - if ($VdsPnicCsvComplete -eq $True) - { - $VdsPnicCsvValidationComplete.Forecolor = "Green" - $VdsPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPnicCsvValidationComplete.Forecolor = "Red" - $VdsPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($FolderCsvCheckBox.Checked -eq "True") - { - $FolderCsvValidationComplete.Forecolor = "Blue" - $FolderCsvValidationComplete.Text = "Processing ....." - Folder_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" - $FolderCsvComplete = Test-Path $FolderExportFileComplete - if ($FolderCsvComplete -eq $True) - { - $FolderCsvValidationComplete.Forecolor = "Green" - $FolderCsvValidationComplete.Text = "Complete" - } - else - { - $FolderCsvValidationComplete.Forecolor = "Red" - $FolderCsvValidationComplete.Text = "Not Complete" - } - } - if ($RdmCsvCheckBox.Checked -eq "True") - { - $RdmCsvValidationComplete.Forecolor = "Blue" - $RdmCsvValidationComplete.Text = "Processing ....." - Rdm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" - $RdmCsvComplete = Test-Path $RdmExportFileComplete - if ($RdmCsvComplete -eq $True) - { - $RdmCsvValidationComplete.Forecolor = "Green" - $RdmCsvValidationComplete.Text = "Complete" - } - else - { - $RdmCsvValidationComplete.Forecolor = "Red" - $RdmCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsRuleCsvCheckBox.Checked -eq "True") - { - $DrsRuleCsvValidationComplete.Forecolor = "Blue" - $DrsRuleCsvValidationComplete.Text = "Processing ....." - Drs_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" - $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete - if ($DrsRuleCsvComplete -eq $True) - { - $DrsRuleCsvValidationComplete.Forecolor = "Green" - $DrsRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsRuleCsvValidationComplete.Forecolor = "Red" - $DrsRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" - $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." - Drs_Cluster_Group_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete - if ($DrsClusterGroupCsvComplete -eq $True) - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" - $DrsClusterGroupCsvValidationComplete.Text = "Complete" - } - else - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" - $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" - $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." - Drs_VmHost_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete - if ($DrsVmHostRuleCsvComplete -eq $True) - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" - $DrsVmHostRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" - $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($ResourcePoolCsvCheckBox.Checked -eq "True") - { - $ResourcePoolCsvValidationComplete.Forecolor = "Blue" - $ResourcePoolCsvValidationComplete.Text = "Processing ....." - Resource_Pool_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete - if ($ResourcePoolCsvComplete -eq $True) - { - $ResourcePoolCsvValidationComplete.Forecolor = "Green" - $ResourcePoolCsvValidationComplete.Text = "Complete" - } - else - { - $ResourcePoolCsvValidationComplete.Forecolor = "Red" - $ResourcePoolCsvValidationComplete.Text = "Not Complete" - } - } - Disconnect_vCenter - $ConnectButton.Forecolor = [System.Drawing.Color]::Red - $ConnectButton.Text = "Disconnected" - $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" - } -}) -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) -$TabDraw.Controls.Add($DrawCsvInputButton) -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton.Add_Click( -{ - $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text - $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" - $vCenterCsvExists = Test-Path $vCenterExportFile - $TabDraw.Controls.Add($vCenterCsvValidationCheck) - if ($vCenterCsvExists -eq $True) - { - - $vCenterCsvValidationCheck.Forecolor = "Green" - $vCenterCsvValidationCheck.Text = "Present" - } - else - { - $vCenterCsvValidationCheck.Forecolor = "Red" - $vCenterCsvValidationCheck.Text = "Not Present" - } - - $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" - $DatacenterCsvExists = Test-Path $DatacenterExportFile - $TabDraw.Controls.Add($DatacenterCsvValidationCheck) - - if ($DatacenterCsvExists -eq $True) - { - $DatacenterCsvValidationCheck.Forecolor = "Green" - $DatacenterCsvValidationCheck.Text = "Present" - } - else - { - $DatacenterCsvValidationCheck.Forecolor = "Red" - $DatacenterCsvValidationCheck.Text = "Not Present" - } - - $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" - $ClusterCsvExists = Test-Path $ClusterExportFile - $TabDraw.Controls.Add($ClusterCsvValidationCheck) - - if ($ClusterCsvExists -eq $True) - { - $ClusterCsvValidationCheck.Forecolor = "Green" - $ClusterCsvValidationCheck.Text = "Present" - } - else - { - $ClusterCsvValidationCheck.Forecolor = "Red" - $ClusterCsvValidationCheck.Text = "Not Present" - } - - $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" - $VmHostCsvExists = Test-Path $VmHostExportFile - $TabDraw.Controls.Add($VmHostCsvValidationCheck) - - if ($VmHostCsvExists -eq $True) - { - $VmHostCsvValidationCheck.Forecolor = "Green" - $VmHostCsvValidationCheck.Text = "Present" - } - else - { - $VmHostCsvValidationCheck.Forecolor = "Red" - $VmHostCsvValidationCheck.Text = "Not Present" - } - - $VmExportFile = $CsvInputDir + "-VmExport.csv" - $VmCsvExists = Test-Path $VmExportFile - $TabDraw.Controls.Add($VmCsvValidationCheck) - - if ($VmCsvExists -eq $True) - { - $VmCsvValidationCheck.Forecolor = "Green" - $VmCsvValidationCheck.Text = "Present" - } - else - { - $VmCsvValidationCheck.Forecolor = "Red" - $VmCsvValidationCheck.Text = "Not Present" - } - - $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" - $TemplateCsvExists = Test-Path $TemplateExportFile - $TabDraw.Controls.Add($TemplateCsvValidationCheck) - - if ($TemplateCsvExists -eq $True) - { - $TemplateCsvValidationCheck.Forecolor = "Green" - $TemplateCsvValidationCheck.Text = "Present" - } - else - { - $TemplateCsvValidationCheck.Forecolor = "Red" - $TemplateCsvValidationCheck.Text = "Not Present" - } - - $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile - $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) - - if ($DatastoreClusterCsvExists -eq $True) - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Green" - $DatastoreClusterCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Red" - $DatastoreClusterCsvValidationCheck.Text = "Not Present" - } - - $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" - $DatastoreCsvExists = Test-Path $DatastoreExportFile - $TabDraw.Controls.Add($DatastoreCsvValidationCheck) - - if ($DatastoreCsvExists -eq $True) - { - $DatastoreCsvValidationCheck.Forecolor = "Green" - $DatastoreCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreCsvValidationCheck.Forecolor = "Red" - $DatastoreCsvValidationCheck.Text = "Not Present" - } - - $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" - $VsSwitchCsvExists = Test-Path $VsSwitchExportFile - $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) - - if ($VsSwitchCsvExists -eq $True) - { - $VsSwitchCsvValidationCheck.Forecolor = "Green" - $VsSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VsSwitchCsvValidationCheck.Forecolor = "Red" - $VsSwitchCsvValidationCheck.Text = "Not Present" - $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile - $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) - - if ($VssPortGroupCsvExists -eq $True) - { - $VssPortGroupCsvValidationCheck.Forecolor = "Green" - $VssPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VssPortGroupCsvValidationCheck.Forecolor = "Red" - $VssPortGroupCsvValidationCheck.Text = "Not Present" - $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile - $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) - - if ($VssVmkernelCsvExists -eq $True) - { - $VssVmkernelCsvValidationCheck.Forecolor = "Green" - $VssVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VssVmkernelCsvValidationCheck.Forecolor = "Red" - $VssVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" - $VssPnicCsvExists = Test-Path $VssPnicExportFile - $TabDraw.Controls.Add($VssPnicCsvValidationCheck) - - if ($VssPnicCsvExists -eq $True) - { - $VssPnicCsvValidationCheck.Forecolor = "Green" - $VssPnicCsvValidationCheck.Text = "Present" - } - else - { - $VssPnicCsvValidationCheck.Forecolor = "Red" - $VssPnicCsvValidationCheck.Text = "Not Present" - } - - $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" - $VdSwitchCsvExists = Test-Path $VdSwitchExportFile - $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) - - if ($VdSwitchCsvExists -eq $True) - { - $VdSwitchCsvValidationCheck.Forecolor = "Green" - $VdSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VdSwitchCsvValidationCheck.Forecolor = "Red" - $VdSwitchCsvValidationCheck.Text = "Not Present" - $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile - $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) - - if ($VdsPortGroupCsvExists -eq $True) - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Green" - $VdsPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Red" - $VdsPortGroupCsvValidationCheck.Text = "Not Present" - $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile - $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) - - if ($VdsVmkernelCsvExists -eq $True) - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Green" - $VdsVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Red" - $VdsVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" - $VdsPnicCsvExists = Test-Path $VdsPnicExportFile - $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) - - if ($VdsPnicCsvExists -eq $True) - { - $VdsPnicCsvValidationCheck.Forecolor = "Green" - $VdsPnicCsvValidationCheck.Text = "Present" - } - else - { - $VdsPnicCsvValidationCheck.Forecolor = "Red" - $VdsPnicCsvValidationCheck.Text = "Not Present" - } - - $FolderExportFile = $CsvInputDir + "-FolderExport.csv" - $FolderCsvExists = Test-Path $FolderExportFile - $TabDraw.Controls.Add($FolderCsvValidationCheck) - - if ($FolderCsvExists -eq $True) - { - $FolderCsvValidationCheck.Forecolor = "Green" - $FolderCsvValidationCheck.Text = "Present" - } - else - { - $FolderCsvValidationCheck.Forecolor = "Red" - $FolderCsvValidationCheck.Text = "Not Present" - } - - $RdmExportFile = $CsvInputDir + "-RdmExport.csv" - $RdmCsvExists = Test-Path $RdmExportFile - $TabDraw.Controls.Add($RdmCsvValidationCheck) - - if ($RdmCsvExists -eq $True) - { - $RdmCsvValidationCheck.Forecolor = "Green" - $RdmCsvValidationCheck.Text = "Present" - } - else - { - $RdmCsvValidationCheck.Forecolor = "Red" - $RdmCsvValidationCheck.Text = "Not Present" - $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" - $DrsRuleCsvExists = Test-Path $DrsRuleExportFile - $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) - - if ($DrsRuleCsvExists -eq $True) - { - $DrsRuleCsvValidationCheck.Forecolor = "Green" - $DrsRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsRuleCsvValidationCheck.Forecolor = "Red" - $DrsRuleCsvValidationCheck.Text = "Not Present" - $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile - $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) - - if ($DrsClusterGroupCsvExists -eq $True) - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" - $DrsClusterGroupCsvValidationCheck.Text = "Present" - } - else - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" - $DrsClusterGroupCsvValidationCheck.Text = "Not Present" - } - - $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile - $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) - - if ($DrsVmHostRuleCsvExists -eq $True) - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" - $DrsVmHostRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" - $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" - } - - $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile - $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) - - if ($ResourcePoolCsvExists -eq $True) - { - $ResourcePoolCsvValidationCheck.Forecolor = "Green" - $ResourcePoolCsvValidationCheck.Text = "Present" - } - else - { - $ResourcePoolCsvValidationCheck.Forecolor = "Red" - $ResourcePoolCsvValidationCheck.Text = "Not Present" - $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" - } -} ) -$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) -$TabDraw.Controls.Add($CsvValidationButton) -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) -$TabDraw.Controls.Add($VisioOpenOutputButton) -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) -$TabDraw.Controls.Add($DrawUncheckButton) -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) -$TabDraw.Controls.Add($DrawCheckButton) -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; -if ($VM_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Host_Complete.Forecolor = "Blue" - $VM_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Host_Complete) - VM_to_Host - $VM_to_Host_Complete.Forecolor = "Green" - $VM_to_Host_Complete.Text = "Complete" - $TabDraw.Controls.Add($VM_to_Host_Complete) -} -if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Folder_Complete.Forecolor = "Blue" - $VM_to_Folder_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Folder_Complete) - VM_to_Folder - $VM_to_Folder_Complete.Forecolor = "Green" - $VM_to_Folder_Complete.Text = "Complete" -} -if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") -{ - $VMs_with_RDMs_Complete.Forecolor = "Blue" - $VMs_with_RDMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMs_with_RDMs_Complete) - VMs_with_RDMs - $VMs_with_RDMs_Complete.Forecolor = "Green" - $VMs_with_RDMs_Complete.Text = "Complete" -} -if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") -{ - $SRM_Protected_VMs_Complete.Forecolor = "Blue" - $SRM_Protected_VMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) - SRM_Protected_VMs - $SRM_Protected_VMs_Complete.Forecolor = "Green" - $SRM_Protected_VMs_Complete.Text = "Complete" -} -if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Datastore_Complete.Forecolor = "Blue" - $VM_to_Datastore_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Datastore_Complete) - VM_to_Datastore - $VM_to_Datastore_Complete.Forecolor = "Green" - $VM_to_Datastore_Complete.Text = "Complete" -} -if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") -{ - $VM_to_ResourcePool_Complete.Forecolor = "Blue" - $VM_to_ResourcePool_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) - VM_to_ResourcePool - $VM_to_ResourcePool_Complete.Forecolor = "Green" - $VM_to_ResourcePool_Complete.Text = "Complete" -} -if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") -{ - $Datastore_to_Host_Complete.Forecolor = "Blue" - $Datastore_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Datastore_to_Host_Complete) - Datastore_to_Host - $Datastore_to_Host_Complete.Forecolor = "Green" - $Datastore_to_Host_Complete.Text = "Complete" -} -if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") -{ - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" - $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) - PhysicalNIC_to_vSwitch - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" - $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" -} -if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VSS_to_Host_Complete.Forecolor = "Blue" - $VSS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSS_to_Host_Complete) - VSS_to_Host - $VSS_to_Host_Complete.Forecolor = "Green" - $VSS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VSS_Complete.Forecolor = "Blue" - $VMK_to_VSS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VSS_Complete) - VMK_to_VSS - $VMK_to_VSS_Complete.Forecolor = "Green" - $VMK_to_VSS_Complete.Text = "Complete" -} -if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VSSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) - VSSPortGroup_to_VM - $VSSPortGroup_to_VM_Complete.Forecolor = "Green" - $VSSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VDS_to_Host_Complete.Forecolor = "Blue" - $VDS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDS_to_Host_Complete) - VDS_to_Host - $VDS_to_Host_Complete.Forecolor = "Green" - $VDS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VDS_Complete.Forecolor = "Blue" - $VMK_to_VDS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VDS_Complete) - VMK_to_VDS - $VMK_to_VDS_Complete.Forecolor = "Green" - $VMK_to_VDS_Complete.Text = "Complete" -} -if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VDSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) - VDSPortGroup_to_VM - $VDSPortGroup_to_VM_Complete.Forecolor = "Green" - $VDSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") -{ - $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" - $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) - Cluster_to_DRS_Rule - $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" - $Cluster_to_DRS_Rule_Complete.Text = "Complete" -}; -$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) -$TabDraw.Controls.Add($DrawButton) -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton.Add_Click({Open_Final_Visio}) -$TabDraw.Controls.Add($OpenVisioButton) - -#endregion - -#region Event Loop - -function Main{ - [System.Windows.Forms.Application]::EnableVisualStyles() - [System.Windows.Forms.Application]::Run($vDiagram) -} - -#endregion - -#endregion - -#region Event Handlers - -#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect_vCenter_Main -{ - $MainVC = $MainVcenterTextBox.Text - $MainUser = $UserNameTextBox.Text - $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text -} - -function Connect_vCenter -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $User = $UserNameTextBox.Text - $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text -} - -function Disconnect_vCenter -{ - $Disconnect = Disconnect-ViServer * -Confirm:$false -} - -#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Find_CaptureCsvFolder -{ - $CaptureCsvBrowseLoop = $True - while ($CaptureCsvBrowseLoop) - { - if ($CaptureCsvBrowse.ShowDialog() -eq "OK") - { - $CaptureCsvBrowseLoop = $False - } - else - { - $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($CaptureCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath -} - -function Check_CaptureCsvFolder -{ - $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $CheckContentDir = $CheckContentPath + "*.csv" - $CheckContent = Test-Path $CheckContentDir - if ($CheckContent -eq "True") - { - $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") - switch ($CheckContents_CaptureCsvFolder) { - 'Yes' - { - del $CheckContentDir - } - - 'No' - { - $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog - $CheckContentCsvBrowse.Description = "Select a directory to copy files to" - $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - $CheckContentCsvBrowse.ShowDialog() - $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath - copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder - del $CheckContentDir - } - } - } -} - -function Find_DrawCsvFolder -{ - $DrawCsvBrowseLoop = $True - while ($DrawCsvBrowseLoop) - { - if ($DrawCsvBrowse.ShowDialog() -eq "OK") - { - $DrawCsvBrowseLoop = $False - } - else - { - $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($DrawCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath -} - -function Find_DrawVisioFolder -{ - $VisioBrowseLoop = $True - while($VisioBrowseLoop) - { - if ($VisioBrowse.ShowDialog() -eq "OK") - { - $VisioBrowseLoop = $False - } - else - { - $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if($VisioBrowseRes -eq "Cancel") - { - return - } - } - } - $global:VisioFolder = $VisioBrowse.SelectedPath -} - -#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function vCenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, - @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation - - if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) - { - $null - } - else - { - Disconnect_vCenter - } -} - -function Datacenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort-Object Name | - Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation -} - -function Cluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, - @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, - @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, - @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, - @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, - @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, - @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, - @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, - @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, - @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation -} - -function VmHost_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent - while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent - } - if ($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name } } }, - @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent - while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent - } - if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, - @{ N = "Version" ; E = { $_.Config.Product.Version } }, - @{ N = "Build" ; E = { $_.Config.Product.Build } }, - @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, - @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, - @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, - @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, - @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, - @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, - @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, - @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, - @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, - @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, - @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, - @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation -} - -function Vm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select-Object Name , - @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, - @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, - @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, - @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, - @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, - @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, - @{ N = "OS" ; E = { $_.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.Config.Version } }, - @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, - @{ N = 'Folder' ; E = { $Folder.Name } }, - @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, - @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, - @{ N = "IP" ; E = { $_.Guest.IpAddress } }, - @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, - @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, - @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, - @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation - } -} - -function Template_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - foreach ($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { $VmHost.name } }, - @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, - @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, - @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, - @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, - @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, - @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, - @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, - @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation - } -} - -function DatastoreCluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, - @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, - @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation -} - -function Datastore_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, - @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, - @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, - @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, - @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, - @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, - @{ N = "Accessible" ; E = { $_.State } }, - @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation -} - -function VsSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "Nic" ; E = { $_.Nic } }, - @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, - @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, - @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, - @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, - @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation -} - -function VssPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "VLanId" ; E = { $_.VLanId } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VssVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation - } - } - } -} - -function VssPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation - } - } -} - -function VdSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - foreach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "Vendor" ; E = { $_.Vendor } }, - @{ N = "Version" ; E = { $_.Version } }, - @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, - @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation - } -} - -function VdsPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, - @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, - @{ N = "NumPorts" ; E = { $_.NumPorts } }, - @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, - @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, - @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VdsVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation - - } - } -} - -function VdsPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | - Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch } }, - @{ N = "Portgroup" ; E = { $_.Portgroup } }, - @{ N = "ConnectedEntity" ; E = { $_.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation - } - } -} - -function Folder_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - foreach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -type VM | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation - } -} - -function Rdm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | - Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, - @{ N = "Vm" ; E = { $_.Parent } }, - @{ N = "Label" ; E = { $_.Name } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, - @{ N = "DiskType" ; E = { $_.DiskType } }, - @{ N = "Persistence" ; E = { $_.Persistence } }, - @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, - @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, - @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation -} - -function Drs_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation - } -} - -function Drs_Cluster_Group_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "GroupType" ; E = { $_.GroupType } }, - @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation - } -} - -function Drs_VmHost_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) - { - Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "VMGroup" ; E = { $_.VMGroup } }, - @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, - @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, - @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation - } - } -} - -function Resource_Pool_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) - { - Get-ResourcePool $ResourcePool | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Cluster" ; E = { $Cluster.Name } }, - @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, - @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, - @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, - @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, - @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, - @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, - @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, - @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, - @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, - @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation - } - } -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect-VisioObject($firstObj, $secondObj) -{ - $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) - $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) - $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) -} - -function Add-VisioObjectVC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectCluster($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHost($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectTemplate($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectSRM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDatastore($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHardDisk($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.ScsiCanonicalName - return $shpObj -} - -function Add-VisioObjectFolder($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVsSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVssPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVMK($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsClusterGroup($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDRSVMHostRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectResourcePool($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -#~~< Visio Draw Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Draw_vCenter -{ - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' -} - -function Draw_Datacenter -{ - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' -} - -function Draw_Cluster -{ - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' -} - -function Draw_VmHost -{ - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' -} - -function Draw_VM -{ - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' -} - -function Draw_Template -{ - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' -} - -function Draw_Folder -{ - #Name - $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' -} - -function Draw_RDM -{ - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' -} - -function Draw_SRM -{ - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' -} - -function Draw_DatastoreCluster -{ - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' -} - -function Draw_Datastore -{ - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' -} - -function Draw_ResourcePool -{ - # Name - $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' - # Cluster - $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' - # CpuSharesLevel - $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' - # NumCpuShares - $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' - # CpuReservationMHz - $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' - # CpuExpandableReservation - $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' - # CpuLimitMHz - $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' - # MemSharesLevel - $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' - # NumMemShares - $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' - # MemReservationGB - $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' - # MemExpandableReservation - $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' - # MemLimitGB - $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' -} - -function Draw_VsSwitch -{ - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' -} - -function Draw_VssPnic -{ - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' -} - -function Draw_VssPort -{ - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' -} - -function Draw_VssVmk -{ - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' -} - -function Draw_VdSwitch -{ - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' -} - -function Draw_VdsPnic -{ - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' -} - -function Draw_VdsPort -{ - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' -} - -function Draw_VdsVmk -{ - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' -} - -function Draw_DrsRule -{ - # Name - $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' - # VM Affinity - $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' - # DRS Rule Enabled - $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' - # DRS Rule Mandatory - $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' -} - -function Draw_DrsVmHostRule -{ - # Name - $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' - # Enabled - $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' - # Type - $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' - # VMGroup - $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' - # VMHostGroup - $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' - # AffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' - # AntiAffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' -} - -function Draw_DrsClusterGroup -{ - # Name - $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' - # GroupType - $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' - # Members - $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' -} - -function CSV_In_Out -{ - # vCenter - $global:vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $global:vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $global:DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $global:DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $global:ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $global:ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $global:VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $global:VmHostImport = Import-Csv $VmHostExportFile - # Vm - $global:VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $global:VmImport = Import-Csv $VmExportFile - #Template - $global:TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $global:TemplateImport = Import-Csv $TemplateExportFile - # Folder - $global:FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - $global:FolderImport = Import-Csv $FolderExportFile - # Datastore Cluster - $global:DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $global:DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $global:DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $global:DatastoreImport = Import-Csv $DatastoreExportFile - # RDM's - $global:RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - $global:RdmImport = Import-Csv $RdmExportFile - # ResourcePool - $global:ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - $global:ResourcePoolImport = Import-Csv $ResourcePoolExportFile - # Vss Switch - $global:VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $global:VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $global:VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $global:VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $global:VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $global:VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $global:VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $global:VssPnicImport = Import-Csv $VssPnicExportFile - # Vds Switch - $global:VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $global:VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $global:VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $global:VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $global:VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $global:VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $global:VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $global:VdsPnicImport = Import-Csv $VdsPnicExportFile - # DRS Rule - $global:DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - $global:DrsRuleImport = Import-Csv $DrsRuleExportFile - # DRS Cluster Group - $global:DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - $global:DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile - # DRS VmHost Rule - $global:DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - $global:DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile -} - -function Visio_Shapes -{ - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $global:VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $global:DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $global:ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $global:HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $global:MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $global:LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $global:OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $global:TemplateObj = $stnObj.Masters.Item("Template") - # Folder Object - $global:FolderObj = $stnObj.Masters.Item("Folder") - # RDM Object - $global:RDMObj = $stnObj.Masters.Item("RDM") - # SRM Protected VM Object - $global:SRMObj = $stnObj.Masters.Item("SRM Protected Server") - # Datastore Cluster Object - $global:DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $global:DatastoreObj = $stnObj.Masters.Item("Datastore") - # Resource Pool Object - $global:ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") - # VSS Object - $global:VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $global:VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $global:VssNicObj = $stnObj.Masters.Item("VSS NIC") - # VDS Object - $global:VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $global:VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $global:VdsNicObj = $stnObj.Masters.Item("VDS NIC") - # VMK NIC Object - $global:VmkNicObj = $stnObj.Masters.Item("VMKernel") - # DRS Rule - $global:DRSRuleObj = $stnObj.Masters.Item("DRS Rule") - # DRS Cluster Group - $global:DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") - # DRS Host Rule - $global:DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") -} - -#~~< Visio Pages Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Create_Visio_Base -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $DocObj = $docsObj.Add("") - $DocObj.SaveAs($Savefile) - $AppVisio.Quit() -} - -function VM_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Host" - $Page = $DocsObj.Pages('VM to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - Draw_Template - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - Draw_Template - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Folder -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Folder" - $Page = $DocsObj.Pages('VM to Folder') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Folder') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $FolderObject = Add-VisioObjectFolder $FolderObj $Folder - Draw_Folder - Connect-VisioObject $DatacenterObject $FolderObject - $y += 1.50 - - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - Draw_Template - Connect-VisioObject $FolderObject $TemplateObject - $FolderObject = $TemplateObject - } - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - } - Connect-VisioObject $FolderObject $VMObject - $FolderObject = $VMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMs_with_RDMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" - $Page = $DocsObj.Pages('VM w/ RDMs') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM w/ RDMs') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - } - Connect-VisioObject $ClusterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 3.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - Draw_RDM - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - } - Connect-VisioObject $DatacenterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 2.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - Draw_RDM - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function SRM_Protected_VMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "SRM VM" - $Page = $DocsObj.Pages('SRM VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('SRM VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - Draw_SRM - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - Draw_SRM - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Datastore -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Datastore" - $Page = $DocsObj.Pages('VM to Datastore') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Datastore') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - Draw_DatastoreCluster - Connect-VisioObject $ClusterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - Draw_Datastore - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - Draw_Template - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - Draw_Datastore - Connect-VisioObject $ClusterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - Draw_Template - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - Draw_DatastoreCluster - Connect-VisioObject $DatacenterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - Draw_Datastore - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - Draw_Template - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - Draw_Datastore - Connect-VisioObject $DatacenterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - Draw_Template - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_ResourcePool -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" - $Page = $DocsObj.Pages('VM to Resource Pool') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Resource Pool') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool - Draw_ResourcePool - Connect-VisioObject $ClusterObject $ResourcePoolObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - } - Connect-VisioObject $ResourcePoolObject $VMObject - $ResourcePoolObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Datastore_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Datastore to Host" - $Page = $DocsObj.Pages('Datastore to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Datastore to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - Draw_Datastore - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - Draw_Datastore - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function PhysicalNIC_to_vSwitch -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "PNIC to switch" - $Page = $DocsObj.Pages('PNIC to Switch') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('PNIC to Switch') - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - Draw_VsSwitch - Connect-VisioObject $HostObject $VSSObject - $y += 1.50 - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - Draw_VssPnic - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - Draw_VdSwitch - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - Draw_VdsPnic - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - Draw_VsSwitch - Connect-VisioObject $HostObject $VSSObject - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - Draw_VssPnic - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - Draw_VdSwitch - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - Draw_VdsPnic - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSS to Host" - $Page = $DocsObj.Pages('VSS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - Draw_VsSwitch - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - Draw_VssPort - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - Draw_VsSwitch - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - Draw_VssPort - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VSS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VSS" - $Page = $DocsObj.Pages('VMK to VSS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VSS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - Draw_VsSwitch - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - Draw_VssVmk - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - Draw_VsSwitch - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - Draw_VssVmk - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" - $Page = $DocsObj.Pages('VSSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - Draw_VsSwitch - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - Draw_VssPort - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - Draw_VsSwitch - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - Draw_VssPort - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDS to Host" - $Page = $DocsObj.Pages('VDS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - Draw_VdSwitch - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - Draw_VdsPort - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - Draw_VdSwitch - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - Draw_VdsPort - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VDS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VDS" - $Page = $DocsObj.Pages('VMK to VDS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VDS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - Draw_VdSwitch - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - Draw_VdsVmk - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - Draw_VmHost - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - Draw_VdSwitch - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - Draw_VdsVmk - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" - $Page = $DocsObj.Pages('VDSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - Draw_VdSwitch - Connect-VisioObject $DatacenterObject $VdSwitchObject - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x = 6.00 - $y += 1.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - Draw_VdsPort - Connect-VisioObject $VdSwitchObject $VPGObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - Draw_VM - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - Draw_VM - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - Draw_VM - } - } - Connect-VisioObject $VPGObject $VMObject - $VPGObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Cluster_to_DRS_Rule -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - CSV_In_Out - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" - $Page = $DocsObj.Pages('Cluster to DRS Rule') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Cluster to DRS Rule') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - Visio_Shapes - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - Draw_vCenter - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - Draw_Datacenter - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - Draw_Cluster - Connect-VisioObject $DatacenterObject $ClusterObject - $y += 1.50 - - foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule - Draw_DrsRule - Connect-VisioObject $ClusterObject $DRSObject - $y += 1.50 - } - foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule - Draw_DrsVmHostRule - Connect-VisioObject $ClusterObject $DRSVMHostRuleObject - $y += 1.50 - - foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) - { - $x += 2.50 - $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup - Draw_DrsClusterGroup - Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject - $DRSVMHostRuleObject = $DrsClusterGroupObject - - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Open_Final_Visio -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.Application - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null -} - -Main - -#endregion \ No newline at end of file From 1799fbaae10006a71eb500ca560780ecbbe58083 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Sun, 6 May 2018 18:53:15 -0400 Subject: [PATCH 18/19] Delete vDiagram_Scheduled_Task_2.0.1.ps1 --- .../vDiagram_Scheduled_Task_2.0.1.ps1 | 593 ------------------ 1 file changed, 593 deletions(-) delete mode 100644 vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 deleted file mode 100644 index 751c2de..0000000 --- a/vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 +++ /dev/null @@ -1,593 +0,0 @@ -$Date = (Get-Date -format "yyyy_MM_dd") -$7zip = "C:\Program Files\7-Zip\7z.exe" - -# Variables -$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." -$vCenterShortName = "Replace with vCenter name." -$CsvDir = "C:\vDiagram\Capture" -$SMTPserver = "SMTP Server" -$Mailfrom = "outbound@email.com" -$Mailto = "you@email.com" -$Subject = "vDiagram 2.0 Files" -$ReportFile = "C:\vDiagram\Zip" -$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" -$AttachmentFile = $ZipFile -$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" - - -#region Functions -#region PsCreds -#region Export-PSCredential -Function Export-PSCredential { - param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) - - # Look at the object type of the $Credential parameter to determine how to handle it - switch ( $Credential.GetType().Name ) { - # It is a credential, so continue - PSCredential { continue } - # It is a string, so use that as the username and prompt for the password - String { $Credential = Get-Credential -credential $Credential } - # In all other caess, throw an error and exit - default { Throw "You must specify a credential object to export to disk." } - } - - # Create temporary object to be serialized to disk - $export = "" | Select-Object Username, EncryptedPassword - - # Give object a type name which can be identified later - #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) - - $export.Username = $Credential.Username - - # Encrypt SecureString password using Data Protection API - # Only the current user account can decrypt this cipher - $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString - - # Export using the Export-Clixml cmdlet - $export | Export-Clixml $Path - Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine - - # Return FileInfo object referring to saved credentials - Get-Item $Path -} -Export-PSCredential -#endregion Export-PSCredential - -#region Import-PSCredential -Function Import-PSCredential { - param ( $Path = "credentials.xml" ) - - # Import credential file - $import = Import-Clixml $Path - - # Test for valid import - if ( !$import.UserName -or !$import.EncryptedPassword ) { - Throw "Input is not a valid ExportedPSCredential object, exiting." - } - $Username = $import.Username - - # Decrypt the password and store as a SecureString object for safekeeping - $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString - - # Build the new credential object - $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass - Write-Output $Credential -} -#endregion Import-PSCredential - -#endregion PsCreds - -#region vCenterFunctions -#region Connect_vCenter_Main -Function Connect_vCenter_Main -{ - $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter_Main - -#region Connect_vCenter -Function Connect_vCenter -{ - $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter - -#region Disconnect_vCenter -Function Disconnect_vCenter -{ - Disconnect-ViServer * -Confirm:$False -} -#endregion Disconnect_vCenter -#endregion vCenterFunctions - -#region CsvExportFunctions -#region vCenter_Export -Function vCenter_Export -{ - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, - @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, - @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo - Disconnect_vCenter -} -#endregion vCenter_Export - -#region Datacenter_Export -Function Datacenter_Export -{ - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo -} -#endregion Datacenter_Export - -#region Cluster_Export -Function Cluster_Export -{ - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, - @{N="HAEnabled";E={$_.HAEnabled}}, - @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, - @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, - @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, - @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, - @{N="DrsEnabled";E={$_.DrsEnabled}}, - @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, - @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, - @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo -} -#endregion Cluster_Export - -#region VmHost_Export -Function VmHost_Export -{ - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={ - $Datacenter = Get-View -Id $_.Parent -Property Name,Parent - While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent - } - If($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name}}}, - @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent - While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent - } - If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, - @{N="Version";E={$_.Config.Product.Version}}, - @{N="Build";E={$_.Config.Product.Build}}, - @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, - @{N="Model";E={$_.Summary.Hardware.Model}}, - @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, - @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, - @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, - @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, - @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, - @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, - @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, - @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, - @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, - @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo -} -#endregion VmHost_Export - -#region Vm_Export -Function Vm_Export -{ - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select Name, - @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, - @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, - @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, - @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, - @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, - @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, - @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, - @{N="OS";E={$_.Config.GuestFullName}}, - @{N="Version";E={$_.Config.Version}}, - @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, - @{N='Folder';E={$Folder.Name}}, - @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, - @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, - @{N="IP";E={$_.Guest.IpAddress}}, - @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, - @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, - @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, - @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo - } -} -#endregion Vm_Export - -#region Template_Export -Function Template_Export -{ - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - ForEach($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$VmHost | Get-Datacenter}}, - @{N="Cluster";E={$VmHost | Get-Cluster}}, - @{N="VmHost";E={$VmHost.name}}, - @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, - @{N="Folder";E={Get-Folder -Id $_.FolderId}}, - @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, - @{N="Version";E={$_.ExtensionData.Config.Version}}, - @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, - @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, - @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, - @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, - @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo - } -} -#endregion Template_Export - -#region DatastoreCluster_Export -Function DatastoreCluster_Export -{ - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, - @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, - @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, - @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, - @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo -} -#endregion DatastoreCluster_Export - -#region Datastore_Export -Function Datastore_Export -{ - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, - @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, - @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, - @{N="Type";E={$_.Type}}, - @{N="FileSystemVersion";E={$_.FileSystemVersion}}, - @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, - @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, - @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, - @{N="Accessible";E={$_.State}}, - @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo -} -#endregion Datastore_Export - -#region VsSwitch_Export -Function VsSwitch_Export -{ - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="Nic";E={$_.Nic}}, - @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, - @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, - @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, - @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, - @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, - @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, - @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, - @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, - @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo -} -#endregion VsSwitch_Export - -#region VssPort_Export -Function VssPort_Export -{ - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="VLanId";E={$_.VLanId}}, - @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPort_Export - -#region VssVmk_Export -Function VssVmk_Export -{ - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo - } - } - } -} -#endregion VssVmk_Export - -#region VssPnic_Export -Function VssPnic_Export -{ - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPnic_Export - -#region VdSwitch_Export -Function VdSwitch_Export -{ - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - ForEach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="Vendor";E={$_.Vendor}}, - @{N="Version";E={$_.Version}}, - @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, - @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo - } -} -#endregion VdSwitch_Export - -#region VdsPort_Export -Function VdsPort_Export -{ - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}}, - @{N="VdSwitch";E={$_.VdSwitch}}, - @{N="NumPorts";E={$_.NumPorts}}, - @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, - @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, - @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, - @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, - @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, - @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPort_Export - -#region VdsVmk_Export -Function VdsVmk_Export -{ - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo - - } - } -} -#endregion VdsVmk_Export - -#region VdsPnic_Export -Function VdsPnic_Export -{ - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch}}, - @{N="Portgroup";E={$_.Portgroup}}, - @{N="ConnectedEntity";E={$_.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPnic_Export - -#region Folder_Export -Function Folder_Export -{ - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - ForEach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo - } -} -#endregion Folder_Export - -#region Rdm_Export -Function Rdm_Export -{ - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, - @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, - @{N="Vm";E={$_.Parent}}, - @{N="Label";E={$_.Name}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, - @{N="DiskType";E={$_.DiskType}}, - @{N="Persistence";E={$_.Persistence}}, - @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, - @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, - @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo -} -#endregion Rdm_Export - -#region Drs_Rule_Export -Function Drs_Rule_Export -{ - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Type";E={$_.Type}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Rule_Export - -#region Drs_Cluster_Group_Export -Function Drs_Cluster_Group_Export -{ - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="GroupType";E={$_.GroupType}}, - @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Cluster_Group_Export - -#region Drs_VmHost_Rule_Export -Function Drs_VmHost_Rule_Export -{ - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) - { - Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Type";E={$_.Type}}, - @{N="VMGroup";E={$_.VMGroup}}, - @{N="VMHostGroup";E={$_.VMHostGroup}}, - @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, - @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo - } - } -} -#endregion Drs_VmHost_Rule_Export - -#region Resource_Pool_Export -Function Resource_Pool_Export -{ - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) - { - Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Cluster";E={$Cluster.Name}}, - @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, - @{N="NumCpuShares";E={$_.NumCpuShares}}, - @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, - @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, - @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, - @{N="MemSharesLevel";E={$_.MemSharesLevel}}, - @{N="NumMemShares";E={$_.NumMemShares}}, - @{N="MemReservationGB";E={$_.MemReservationGB}}, - @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, - @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo - } - } -} -#endregion Resource_Pool_Export - -#endregion CsvExportFunctions - -#endregion Functions - -Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter - -#Zip Files -cd $CsvDir -dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } - -#Send E-mail -Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile - -#Clear CSV Folder -cd $CsvDir -del *.csv \ No newline at end of file From ca674fe6c49a47b8c813a9d6ad75410618feddd7 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Sun, 6 May 2018 18:56:29 -0400 Subject: [PATCH 19/19] Add files via upload --- vDiagram_2.0.1/vDiagram_2.0.1.ps1 | 11329 ++++++++++++++++ vDiagram_2.0.1/vDiagram_2.0.1.zip | Bin 0 -> 822956 bytes .../vDiagram_Scheduled_Task_2.0.1.ps1 | 593 + 3 files changed, 11922 insertions(+) create mode 100644 vDiagram_2.0.1/vDiagram_2.0.1.ps1 create mode 100644 vDiagram_2.0.1/vDiagram_2.0.1.zip create mode 100644 vDiagram_2.0.1/vDiagram_Scheduled_Task_2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram_2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 new file mode 100644 index 0000000..f61fbcb --- /dev/null +++ b/vDiagram_2.0.1/vDiagram_2.0.1.ps1 @@ -0,0 +1,11329 @@ +<# +.SYNOPSIS + vDiagram Visio Drawing Tool + +.DESCRIPTION + vDiagram Visio Drawing Tool + +.NOTES + File Name : vDiagram2.0.1.ps1 + Author : Tony Gonzalez + Author : Jason Hopkins + Based on : vDiagram by Alan Renouf + Version : 2.0.1 + +.USAGE NOTES + Ensure to unblock files before unzipping + Ensure to run as administrator + Required Files: + PowerCLI or PowerShell 5.0 with PowerCLI Modules installed + Active connection to vCenter to capture data + MS Visio + +.CHANGE LOG + - 04/12/2018 - v2.0.1 + Added MAC Addresses to VMs & Templates + Added a check to see if prior CSVs are still present + Added option to copy prior CSVs to new folder + Consolidate the object plaement into functions for ease of management + + - 04/11/2018 - v2.0.0 + Presented as a Community Theater Session at South Florida VMUG + Feature enhancement requests collected +#> + +#region ScriptForm Designer + +#region Constructor + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") +#endregion + +#region Post-Constructor Custom Code +$DateTime = (Get-Date -format "yyyy_MM_dd-HH_MM") +$MyVer = "2.0.1" +$LastUpdated = "April 12, 2018" +$About = +@" + + vDiagram $MyVer + + Contributors: Tony Gonzalez of RoundTower Technologies LLC + Jason Hopkins of RoundTower Technologies LLC + + Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram + + Created: February 13, 2018 + + Last Updated: $LastUpdated + +"@ +#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" +if (!(Test-Path $TestShapes)) +{ + $CurrentLocation = Get-Location + copy $CurrentLocation\vDiagram.vssx $TestShapes + Write-Host "Copying Shapes File to My Shapes" +} +$shpFile = "\vDiagram.vssx" +#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Set_WindowStyle { +param( + [Parameter()] + [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', + 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', + 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] + $Style = 'SHOW', + [Parameter()] + $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle +) + $WindowStates = @{ + FORCEMINIMIZE = 11; HIDE = 0 + MAXIMIZE = 3; MINIMIZE = 6 + RESTORE = 9; SHOW = 5 + SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 + SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 + SHOWNA = 8; SHOWNOACTIVATE = 4 + SHOWNORMAL = 1 + } + Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) + + $Win32ShowWindowAsync = Add-Type –memberDefinition @” + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); +“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru + + $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null +} +Set_WindowStyle MINIMIZE +#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function About_Config +{ + + $About + + #Add objects for About + $AboutForm = New-Object System.Windows.Forms.Form + $AboutTextBox = New-Object System.Windows.Forms.RichTextBox + + #About Form + $AboutForm.Icon = $Icon + $AboutForm.AutoScroll = $True + $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) + $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutForm.Name = "About" + $AboutForm.StartPosition = 1 + $AboutForm.Text = "About vDiagram $MyVer" + + $AboutTextBox.Anchor = 15 + $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) + $AboutTextBox.BorderStyle = 0 + $AboutTextBox.Font = "Tahoma" + $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) + $AboutTextBox.Name = "AboutTextBox" + $AboutTextBox.ReadOnly = $True + $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) + $AboutTextBox.Text = $About + + $AboutForm.Controls.Add($AboutTextBox) + + $AboutForm.Show() | Out-Null +} +#endregion + +#region Form Creation +#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vDiagram = New-Object System.Windows.Forms.Form +$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) +$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") +$vDiagram.Icon = $Icon +$vDiagram.Text = "vDiagram 2.0" +$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan +#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainMenu = New-Object System.Windows.Forms.MenuStrip +$MainMenu.Location = New-Object System.Drawing.Point(0, 0) +$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) +$MainMenu.TabIndex = 1 +$MainMenu.Text = "MainMenu" +#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) +$FileToolStripMenuItem.Text = "File" +#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) +$ExitToolStripMenuItem.Text = "Exit" +$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) +$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) +#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) +$HelpToolStripMenuItem.Text = "Help" +#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) +$AboutToolStripMenuItem.Text = "About" +$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) +$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) +$AboutToolStripMenuItem.Add_Click({About_Config}) +#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainTab = New-Object System.Windows.Forms.TabControl +$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) +$MainTab.Location = New-Object System.Drawing.Point(10, 30) +$MainTab.Size = New-Object System.Drawing.Size(990, 98) +$MainTab.TabIndex = 0 +$MainTab.Text = "MainTabs" +#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Prerequisites = New-Object System.Windows.Forms.TabPage +$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) +$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) +$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) +$Prerequisites.TabIndex = 0 +$Prerequisites.Text = "Prerequisites" +$Prerequisites.BackColor = [System.Drawing.Color]::LightGray +#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellLabel = New-Object System.Windows.Forms.Label +$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) +$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) +$PowershellLabel.TabIndex = 1 +$PowershellLabel.Text = "Powershell:" +#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellInstalled = New-Object System.Windows.Forms.Label +$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) +$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) +$PowershellInstalled.TabIndex = 2 +$PowershellInstalled.Text = "" +$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleLabel = New-Object System.Windows.Forms.Label +$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) +$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) +$PowerCliModuleLabel.TabIndex = 3 +$PowerCliModuleLabel.Text = "PowerCLI Module:" +#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label +$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) +$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) +$PowerCliModuleInstalled.TabIndex = 4 +$PowerCliModuleInstalled.Text = "" +$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliLabel = New-Object System.Windows.Forms.Label +$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) +$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) +$PowerCliLabel.TabIndex = 5 +$PowerCliLabel.Text = "PowerCLI:" +#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliInstalled = New-Object System.Windows.Forms.Label +$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) +$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) +$PowerCliInstalled.TabIndex = 6 +$PowerCliInstalled.Text = "" +$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioLabel = New-Object System.Windows.Forms.Label +$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) +$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) +$VisioLabel.TabIndex = 7 +$VisioLabel.Text = "Visio:" +#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioInstalled = New-Object System.Windows.Forms.Label +$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) +$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) +$VisioInstalled.TabIndex = 8 +$VisioInstalled.Text = "" +$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray +$Prerequisites.Controls.Add($PowershellLabel) +$Prerequisites.Controls.Add($PowershellInstalled) +$Prerequisites.Controls.Add($PowerCliModuleLabel) +$Prerequisites.Controls.Add($PowerCliModuleInstalled) +$Prerequisites.Controls.Add($PowerCliLabel) +$Prerequisites.Controls.Add($PowerCliInstalled) +$Prerequisites.Controls.Add($VisioLabel) +$Prerequisites.Controls.Add($VisioInstalled) +#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfo = New-Object System.Windows.Forms.TabPage +$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) +$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) +$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) +$vCenterInfo.TabIndex = 0 +$vCenterInfo.Text = "vCenter Info" +$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray +#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterLabel = New-Object System.Windows.Forms.Label +$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) +$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) +$MainVcenterLabel.TabIndex = 1 +$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" +#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox +$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) +$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) +$MainVcenterTextBox.TabIndex = 2 +$MainVcenterTextBox.Text = "" +#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterLabel = New-Object System.Windows.Forms.Label +$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) +$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) +$TargetVcenterLabel.TabIndex = 3 +$TargetVcenterLabel.Text = "Name of target vCenter:" +#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox +$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) +$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) +$TargetVcenterTextBox.TabIndex = 4 +$TargetVcenterTextBox.Text = "" +#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameLabel = New-Object System.Windows.Forms.Label +$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) +$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) +$UserNameLabel.TabIndex = 5 +$UserNameLabel.Text = "vCenter User Name:" +#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameTextBox = New-Object System.Windows.Forms.TextBox +$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) +$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) +$UserNameTextBox.TabIndex = 6 +$UserNameTextBox.Text = "" +#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) +$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) +$PasswordLabel.TabIndex = 7 +$PasswordLabel.Text = "Password:" +#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordTextBox = New-Object System.Windows.Forms.TextBox +$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) +$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) +$PasswordTextBox.TabIndex = 8 +$PasswordTextBox.Text = "" +$PasswordTextBox.UseSystemPasswordChar = $true +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton = New-Object System.Windows.Forms.Button +$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) +$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) +$ConnectButton.TabIndex = 9 +$ConnectButton.Text = "Connect to vCenter" +$ConnectButton.UseVisualStyleBackColor = $true +$vCenterInfo.Controls.Add($MainVcenterLabel) +$vCenterInfo.Controls.Add($MainVcenterTextBox) +$vCenterInfo.Controls.Add($TargetVcenterLabel) +$vCenterInfo.Controls.Add($TargetVcenterTextBox) +$vCenterInfo.Controls.Add($UserNameLabel) +$vCenterInfo.Controls.Add($UserNameTextBox) +$vCenterInfo.Controls.Add($PasswordLabel) +$vCenterInfo.Controls.Add($PasswordTextBox) +$vCenterInfo.Controls.Add($ConnectButton) +$MainTab.Controls.Add($Prerequisites) +$MainTab.Controls.Add($vCenterInfo) +$MainTab.SelectedIndex = 0 +#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SubTab = New-Object System.Windows.Forms.TabControl +$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$SubTab.Location = New-Object System.Drawing.Point(10, 136) +$SubTab.Size = New-Object System.Drawing.Size(990, 512) +$SubTab.TabIndex = 0 +$SubTab.Text = "SubTabs" +#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDirections = New-Object System.Windows.Forms.TabPage +$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDirections.Location = New-Object System.Drawing.Point(4, 22) +$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDirections.Size = New-Object System.Drawing.Size(982, 486) +$TabDirections.TabIndex = 0 +$TabDirections.Text = "Directions" +$TabDirections.UseVisualStyleBackColor = $true +#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesHeading = New-Object System.Windows.Forms.Label +$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) +$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) +$PrerequisitesHeading.TabIndex = 0 +$PrerequisitesHeading.Text = "Prerequisites Tab" +#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesDirections = New-Object System.Windows.Forms.Label +$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) +$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) +$PrerequisitesDirections.TabIndex = 1 +$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." +#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoHeading = New-Object System.Windows.Forms.Label +$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) +$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) +$vCenterInfoHeading.TabIndex = 2 +$vCenterInfoHeading.Text = "vCenter Info Tab" +#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoDirections = New-Object System.Windows.Forms.Label +$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) +$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) +$vCenterInfoDirections.TabIndex = 3 +$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." +#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvHeading = New-Object System.Windows.Forms.Label +$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) +$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) +$CaptureCsvHeading.TabIndex = 4 +$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" +#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureDirections = New-Object System.Windows.Forms.Label +$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) +$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) +$CaptureDirections.TabIndex = 5 +$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." +#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawHeading = New-Object System.Windows.Forms.Label +$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) +$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) +$DrawHeading.TabIndex = 6 +$DrawHeading.Text = "Draw Visio Tab" +#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawDirections = New-Object System.Windows.Forms.Label +$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) +$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) +$DrawDirections.TabIndex = 7 +$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." +$TabDirections.Controls.Add($PrerequisitesHeading) +$TabDirections.Controls.Add($PrerequisitesDirections) +$TabDirections.Controls.Add($vCenterInfoHeading) +$TabDirections.Controls.Add($vCenterInfoDirections) +$TabDirections.Controls.Add($CaptureCsvHeading) +$TabDirections.Controls.Add($CaptureDirections) +$TabDirections.Controls.Add($DrawHeading) +$TabDirections.Controls.Add($DrawDirections) +#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabCapture = New-Object System.Windows.Forms.TabPage +$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabCapture.Location = New-Object System.Drawing.Point(4, 22) +$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) +$TabCapture.Size = New-Object System.Drawing.Size(982, 486) +$TabCapture.TabIndex = 3 +$TabCapture.Text = "Capture CSVs for Visio" +$TabCapture.UseVisualStyleBackColor = $true +#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label +$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) +$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) +$CaptureCsvOutputLabel.TabIndex = 0 +$CaptureCsvOutputLabel.Text = "CSV Output Folder:" +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button +$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) +$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) +$CaptureCsvOutputButton.TabIndex = 0 +$CaptureCsvOutputButton.Text = "Select Output Folder" +$CaptureCsvOutputButton.UseVisualStyleBackColor = $false +$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$vCenterCsvCheckBox.Checked = $true +$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$vCenterCsvCheckBox.TabIndex = 1 +$vCenterCsvCheckBox.Text = "Export vCenter Info" +$vCenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) +$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationComplete.TabIndex = 26 +$vCenterCsvValidationComplete.Text = "" +#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatacenterCsvCheckBox.Checked = $true +$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatacenterCsvCheckBox.TabIndex = 2 +$DatacenterCsvCheckBox.Text = "Export Datacenter Info" +$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) +$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationComplete.TabIndex = 27 +$DatacenterCsvValidationComplete.Text = "" +#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ClusterCsvCheckBox.Checked = $true +$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ClusterCsvCheckBox.TabIndex = 3 +$ClusterCsvCheckBox.Text = "Export Cluster Info" +$ClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) +$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationComplete.TabIndex = 28 +$ClusterCsvValidationComplete.Text = "" +#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmHostCsvCheckBox.Checked = $true +$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmHostCsvCheckBox.TabIndex = 4 +$VmHostCsvCheckBox.Text = "Export VmHost Info" +$VmHostCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) +$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationComplete.TabIndex = 29 +$VmHostCsvValidationComplete.Text = "" +#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmCsvCheckBox.Checked = $true +$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmCsvCheckBox.TabIndex = 5 +$VmCsvCheckBox.Text = "Export Vm Info" +$VmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) +$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationComplete.TabIndex = 30 +$VmCsvValidationComplete.Text = "" +#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$TemplateCsvCheckBox.Checked = $true +$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$TemplateCsvCheckBox.TabIndex = 6 +$TemplateCsvCheckBox.Text = "Export Template Info" +$TemplateCsvCheckBox.UseVisualStyleBackColor = $true +#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label +$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) +$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationComplete.TabIndex = 31 +$TemplateCsvValidationComplete.Text = "" +#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreClusterCsvCheckBox.Checked = $true +$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreClusterCsvCheckBox.TabIndex = 7 +$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" +$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) +$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationComplete.TabIndex = 32 +$DatastoreClusterCsvValidationComplete.Text = "" +#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreCsvCheckBox.Checked = $true +$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreCsvCheckBox.TabIndex = 8 +$DatastoreCsvCheckBox.Text = "Export Datastore Info" +$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) +$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationComplete.TabIndex = 33 +$DatastoreCsvValidationComplete.Text = "" +#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VsSwitchCsvCheckBox.Checked = $true +$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) +$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VsSwitchCsvCheckBox.TabIndex = 9 +$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" +$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) +$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationComplete.TabIndex = 34 +$VsSwitchCsvValidationComplete.Text = "" +#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPortGroupCsvCheckBox.Checked = $true +$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) +$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPortGroupCsvCheckBox.TabIndex = 10 +$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" +$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) +$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationComplete.TabIndex = 35 +$VssPortGroupCsvValidationComplete.Text = "" +#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssVmkernelCsvCheckBox.Checked = $true +$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) +$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssVmkernelCsvCheckBox.TabIndex = 11 +$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" +$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) +$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationComplete.TabIndex = 36 +$VssVmkernelCsvValidationComplete.Text = "" +#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPnicCsvCheckBox.Checked = $true +$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) +$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPnicCsvCheckBox.TabIndex = 12 +$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" +$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) +$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationComplete.TabIndex = 37 +$VssPnicCsvValidationComplete.Text = "" +#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdSwitchCsvCheckBox.Checked = $true +$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) +$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdSwitchCsvCheckBox.TabIndex = 13 +$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" +$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) +$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationComplete.TabIndex = 38 +$VdSwitchCsvValidationComplete.Text = "" +#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPortGroupCsvCheckBox.Checked = $true +$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) +$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPortGroupCsvCheckBox.TabIndex = 14 +$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" +$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) +$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationComplete.TabIndex = 39 +$VdsPortGroupCsvValidationComplete.Text = "" +#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsVmkernelCsvCheckBox.Checked = $true +$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) +$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsVmkernelCsvCheckBox.TabIndex = 15 +$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" +$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) +$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationComplete.TabIndex = 40 +$VdsVmkernelCsvValidationComplete.Text = "" +#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPnicCsvCheckBox.Checked = $true +$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) +$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPnicCsvCheckBox.TabIndex = 16 +$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" +$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) +$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationComplete.TabIndex = 41 +$VdsPnicCsvValidationComplete.Text = "" +#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$FolderCsvCheckBox.Checked = $true +$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) +$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$FolderCsvCheckBox.TabIndex = 17 +$FolderCsvCheckBox.Text = "Export Folder Info" +$FolderCsvCheckBox.UseVisualStyleBackColor = $true +#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label +$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) +$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationComplete.TabIndex = 42 +$FolderCsvValidationComplete.Text = "" +#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$RdmCsvCheckBox.Checked = $true +$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) +$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$RdmCsvCheckBox.TabIndex = 18 +$RdmCsvCheckBox.Text = "Export RDM Info" +$RdmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label +$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) +$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationComplete.TabIndex = 43 +$RdmCsvValidationComplete.Text = "" +#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsRuleCsvCheckBox.Checked = $true +$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) +$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsRuleCsvCheckBox.TabIndex = 19 +$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" +$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) +$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationComplete.TabIndex = 44 +$DrsRuleCsvValidationComplete.Text = "" +#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsClusterGroupCsvCheckBox.Checked = $true +$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) +$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsClusterGroupCsvCheckBox.TabIndex = 20 +$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" +$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) +$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationComplete.TabIndex = 45 +$DrsClusterGroupCsvValidationComplete.Text = "" +#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsVmHostRuleCsvCheckBox.Checked = $true +$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) +$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsVmHostRuleCsvCheckBox.TabIndex = 21 +$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" +$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) +$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 +$DrsVmHostRuleCsvValidationComplete.Text = "" +#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ResourcePoolCsvCheckBox.Checked = $true +$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) +$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ResourcePoolCsvCheckBox.TabIndex = 22 +$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" +$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) +$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationComplete.TabIndex = 47 +$ResourcePoolCsvValidationComplete.Text = "" +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton = New-Object System.Windows.Forms.Button +$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) +$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureUncheckButton.TabIndex = 23 +$CaptureUncheckButton.Text = "Uncheck All" +$CaptureUncheckButton.UseVisualStyleBackColor = $false +$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton = New-Object System.Windows.Forms.Button +$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) +$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureCheckButton.TabIndex = 24 +$CaptureCheckButton.Text = "Check All" +$CaptureCheckButton.UseVisualStyleBackColor = $false +$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton = New-Object System.Windows.Forms.Button +$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) +$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureButton.TabIndex = 25 +$CaptureButton.Text = "Collect CSV Data" +$CaptureButton.UseVisualStyleBackColor = $false +$CaptureButton.BackColor = [System.Drawing.Color]::LightGray +$TabCapture.Controls.Add($CaptureCsvOutputLabel) +$TabCapture.Controls.Add($CaptureCsvOutputButton) +$TabCapture.Controls.Add($vCenterCsvCheckBox) +$TabCapture.Controls.Add($vCenterCsvValidationComplete) +$TabCapture.Controls.Add($DatacenterCsvCheckBox) +$TabCapture.Controls.Add($DatacenterCsvValidationComplete) +$TabCapture.Controls.Add($ClusterCsvCheckBox) +$TabCapture.Controls.Add($ClusterCsvValidationComplete) +$TabCapture.Controls.Add($VmHostCsvCheckBox) +$TabCapture.Controls.Add($VmHostCsvValidationComplete) +$TabCapture.Controls.Add($VmCsvCheckBox) +$TabCapture.Controls.Add($VmCsvValidationComplete) +$TabCapture.Controls.Add($TemplateCsvCheckBox) +$TabCapture.Controls.Add($TemplateCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) +$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreCsvCheckBox) +$TabCapture.Controls.Add($DatastoreCsvValidationComplete) +$TabCapture.Controls.Add($VsSwitchCsvCheckBox) +$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VssPnicCsvCheckBox) +$TabCapture.Controls.Add($VssPnicCsvValidationComplete) +$TabCapture.Controls.Add($VdSwitchCsvCheckBox) +$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VdsPnicCsvCheckBox) +$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) +$TabCapture.Controls.Add($FolderCsvCheckBox) +$TabCapture.Controls.Add($FolderCsvValidationComplete) +$TabCapture.Controls.Add($RdmCsvCheckBox) +$TabCapture.Controls.Add($RdmCsvValidationComplete) +$TabCapture.Controls.Add($DrsRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) +$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) +$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) +$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) +$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) +$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) +$TabCapture.Controls.Add($CaptureUncheckButton) +$TabCapture.Controls.Add($CaptureCheckButton) +$TabCapture.Controls.Add($CaptureButton) +#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDraw = New-Object System.Windows.Forms.TabPage +$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDraw.Location = New-Object System.Drawing.Point(4, 22) +$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDraw.Size = New-Object System.Drawing.Size(982, 486) +$TabDraw.TabIndex = 2 +$TabDraw.Text = "Draw Visio" +$TabDraw.UseVisualStyleBackColor = $true +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton = New-Object System.Windows.Forms.Button +$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) +$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) +$OpenVisioButton.TabIndex = 83 +$OpenVisioButton.Text = "Open Visio Drawing" +$OpenVisioButton.UseVisualStyleBackColor = $false +$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton = New-Object System.Windows.Forms.Button +$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) +$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawCheckButton.TabIndex = 82 +$DrawCheckButton.Text = "Check All" +$DrawCheckButton.UseVisualStyleBackColor = $false +$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton = New-Object System.Windows.Forms.Button +$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawButton.Location = New-Object System.Drawing.Point(448, 450) +$DrawButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawButton.TabIndex = 81 +$DrawButton.Text = "Draw Visio" +$DrawButton.UseVisualStyleBackColor = $false +$DrawButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton = New-Object System.Windows.Forms.Button +$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) +$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawUncheckButton.TabIndex = 80 +$DrawUncheckButton.Text = "Uncheck All" +$DrawUncheckButton.UseVisualStyleBackColor = $false +$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOutputLabel = New-Object System.Windows.Forms.Label +$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) +$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) +$VisioOutputLabel.TabIndex = 46 +$VisioOutputLabel.Text = "Visio Output Folder:" +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton = New-Object System.Windows.Forms.Button +$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) +$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) +$VisioOpenOutputButton.TabIndex = 47 +$VisioOpenOutputButton.Text = "Select Visio Output Folder" +$VisioOpenOutputButton.UseVisualStyleBackColor = $false +$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputLabel = New-Object System.Windows.Forms.Label +$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) +$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) +$DrawCsvInputLabel.TabIndex = 0 +$DrawCsvInputLabel.Text = "CSV Input Folder:" +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton = New-Object System.Windows.Forms.Button +$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) +$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) +$DrawCsvInputButton.TabIndex = 1 +$DrawCsvInputButton.Text = "Select CSV Input Folder" +$DrawCsvInputButton.UseVisualStyleBackColor = $false +$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidation = New-Object System.Windows.Forms.Label +$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$vCenterCsvValidation.TabIndex = 2 +$vCenterCsvValidation.Text = "vCenter CSV File:" +#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) +$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationCheck.TabIndex = 3 +$vCenterCsvValidationCheck.Text = "" +#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidation = New-Object System.Windows.Forms.Label +$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatacenterCsvValidation.TabIndex = 4 +$DatacenterCsvValidation.Text = "Datacenter CSV File:" +#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) +$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationCheck.TabIndex = 5 +$DatacenterCsvValidationCheck.Text = "" +#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidation = New-Object System.Windows.Forms.Label +$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ClusterCsvValidation.TabIndex = 6 +$ClusterCsvValidation.Text = "Cluster CSV File:" +#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) +$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationCheck.TabIndex = 7 +$ClusterCsvValidationCheck.Text = "" +#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidation = New-Object System.Windows.Forms.Label +$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmHostCsvValidation.TabIndex = 8 +$VmHostCsvValidation.Text = "VmHost CSV File:" +#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) +$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationCheck.TabIndex = 9 +$VmHostCsvValidationCheck.Text = "" +#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidation = New-Object System.Windows.Forms.Label +$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmCsvValidation.TabIndex = 10 +$VmCsvValidation.Text = "VM CSV File:" +#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) +$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationCheck.TabIndex = 11 +$VmCsvValidationCheck.Text = "" +#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidation = New-Object System.Windows.Forms.Label +$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$TemplateCsvValidation.TabIndex = 12 +$TemplateCsvValidation.Text = "Template CSV File:" +#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label +$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) +$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationCheck.TabIndex = 13 +$TemplateCsvValidationCheck.Text = "" +#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreClusterCsvValidation.TabIndex = 14 +$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" +#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) +$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationCheck.TabIndex = 15 +$DatastoreClusterCsvValidationCheck.Text = "" +#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreCsvValidation.TabIndex = 16 +$DatastoreCsvValidation.Text = "Datastore CSV File:" +#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) +$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationCheck.TabIndex = 17 +$DatastoreCsvValidationCheck.Text = "" +#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) +$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VsSwitchCsvValidation.TabIndex = 18 +$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" +#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) +$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationCheck.TabIndex = 19 +$VsSwitchCsvValidationCheck.Text = "" +#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) +$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPortGroupCsvValidation.TabIndex = 20 +$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" +#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) +$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationCheck.TabIndex = 21 +$VssPortGroupCsvValidationCheck.Text = "" +#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) +$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssVmkernelCsvValidation.TabIndex = 22 +$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" +#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) +$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationCheck.TabIndex = 23 +$VssVmkernelCsvValidationCheck.Text = "" +#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidation = New-Object System.Windows.Forms.Label +$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) +$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPnicCsvValidation.TabIndex = 24 +$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" +#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) +$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationCheck.TabIndex = 25 +$VssPnicCsvValidationCheck.Text = "" +#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) +$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdSwitchCsvValidation.TabIndex = 26 +$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" +#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) +$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationCheck.TabIndex = 27 +$VdSwitchCsvValidationCheck.Text = "" +#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) +$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPortGroupCsvValidation.TabIndex = 28 +$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" +#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) +$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationCheck.TabIndex = 29 +$VdsPortGroupCsvValidationCheck.Text = "" +#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) +$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsVmkernelCsvValidation.TabIndex = 30 +$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" +#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) +$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationCheck.TabIndex = 31 +$VdsVmkernelCsvValidationCheck.Text = "" +#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) +$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPnicCsvValidation.TabIndex = 32 +$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" +#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) +$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationCheck.TabIndex = 33 +$VdsPnicCsvValidationCheck.Text = "" +#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidation = New-Object System.Windows.Forms.Label +$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) +$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$FolderCsvValidation.TabIndex = 34 +$FolderCsvValidation.Text = "Folder CSV File:" +#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label +$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) +$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationCheck.TabIndex = 35 +$FolderCsvValidationCheck.Text = "" +#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidation = New-Object System.Windows.Forms.Label +$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) +$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$RdmCsvValidation.TabIndex = 36 +$RdmCsvValidation.Text = "RDM CSV File:" +#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label +$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) +$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationCheck.TabIndex = 37 +$RdmCsvValidationCheck.Text = "" +#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) +$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsRuleCsvValidation.TabIndex = 38 +$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" +#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) +$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationCheck.TabIndex = 39 +$DrsRuleCsvValidationCheck.Text = "" +#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) +$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsClusterGroupCsvValidation.TabIndex = 40 +$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" +#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) +$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationCheck.TabIndex = 41 +$DrsClusterGroupCsvValidationCheck.Text = "" +#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) +$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsVmHostRuleCsvValidation.TabIndex = 42 +$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" +#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) +$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 +$DrsVmHostRuleCsvValidationCheck.Text = "" +#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) +$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ResourcePoolCsvValidation.TabIndex = 44 +$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" +#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) +$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationCheck.TabIndex = 45 +$ResourcePoolCsvValidationCheck.Text = "" +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton = New-Object System.Windows.Forms.Button +$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) +$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) +$CsvValidationButton.TabIndex = 2 +$CsvValidationButton.Text = "Check for CSVs" +$CsvValidationButton.UseVisualStyleBackColor = $false +$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Host_DrawCheckBox.Checked = $true +$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) +$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Host_DrawCheckBox.TabIndex = 48 +$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" +$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_Complete = New-Object System.Windows.Forms.Label +$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) +$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Host_Complete.TabIndex = 49 +$VM_to_Host_Complete.Text = "" +#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Folder_DrawCheckBox.Checked = $true +$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) +$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Folder_DrawCheckBox.TabIndex = 50 +$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" +$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label +$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) +$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Folder_Complete.TabIndex = 51 +$VM_to_Folder_Complete.Text = "" +#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMs_with_RDMs_DrawCheckBox.Checked = $true +$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) +$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 +$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" +$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label +$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) +$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMs_with_RDMs_Complete.TabIndex = 53 +$VMs_with_RDMs_Complete.Text = "" +#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$SRM_Protected_VMs_DrawCheckBox.Checked = $true +$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) +$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 +$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" +$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label +$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) +$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$SRM_Protected_VMs_Complete.TabIndex = 55 +$SRM_Protected_VMs_Complete.Text = "" +#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Datastore_DrawCheckBox.Checked = $true +$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) +$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Datastore_DrawCheckBox.TabIndex = 56 +$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" +$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label +$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) +$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Datastore_Complete.TabIndex = 57 +$VM_to_Datastore_Complete.Text = "" +#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_ResourcePool_DrawCheckBox.Checked = $true +$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) +$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 +$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" +$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label +$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) +$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_ResourcePool_Complete.TabIndex = 59 +$VM_to_ResourcePool_Complete.Text = "" +#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Datastore_to_Host_DrawCheckBox.Checked = $true +$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) +$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$Datastore_to_Host_DrawCheckBox.TabIndex = 60 +$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" +$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label +$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) +$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Datastore_to_Host_Complete.TabIndex = 61 +$Datastore_to_Host_Complete.Text = "" +#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true +$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) +$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 +$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" +$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label +$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) +$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) +$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 +$PhysicalNIC_to_vSwitch_Complete.Text = "" +#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSS_to_Host_DrawCheckBox.Checked = $true +$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) +$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSS_to_Host_DrawCheckBox.TabIndex = 64 +$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" +$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) +$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSS_to_Host_Complete.TabIndex = 65 +$VSS_to_Host_Complete.Text = "" +#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VSS_DrawCheckBox.Checked = $true +$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) +$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VSS_DrawCheckBox.TabIndex = 66 +$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" +$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) +$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VSS_Complete.TabIndex = 67 +$VMK_to_VSS_Complete.Text = "" +#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) +$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 +$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" +$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) +$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSSPortGroup_to_VM_Complete.TabIndex = 69 +$VSSPortGroup_to_VM_Complete.Text = "" +#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDS_to_Host_DrawCheckBox.Checked = $true +$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) +$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDS_to_Host_DrawCheckBox.TabIndex = 70 +$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" +$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) +$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDS_to_Host_Complete.TabIndex = 71 +$VDS_to_Host_Complete.Text = "" +#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VDS_DrawCheckBox.Checked = $true +$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) +$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VDS_DrawCheckBox.TabIndex = 72 +$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" +$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) +$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VDS_Complete.TabIndex = 73 +$VMK_to_VDS_Complete.Text = "" +#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) +$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 +$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" +$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) +$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDSPortGroup_to_VM_Complete.TabIndex = 75 +$VDSPortGroup_to_VM_Complete.Text = "" +#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true +$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) +$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 +$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" +$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label +$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) +$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Cluster_to_DRS_Rule_Complete.TabIndex = 77 +$Cluster_to_DRS_Rule_Complete.Text = "" + +$TabDraw.Controls.Add($OpenVisioButton) +$TabDraw.Controls.Add($DrawCheckButton) +$TabDraw.Controls.Add($DrawButton) +$TabDraw.Controls.Add($DrawUncheckButton) +$TabDraw.Controls.Add($VisioOutputLabel) +$TabDraw.Controls.Add($VisioOpenOutputButton) +$TabDraw.Controls.Add($DrawCsvInputLabel) +$TabDraw.Controls.Add($DrawCsvInputButton) +$TabDraw.Controls.Add($vCenterCsvValidation) +$TabDraw.Controls.Add($vCenterCsvValidationCheck) +$TabDraw.Controls.Add($DatacenterCsvValidation) +$TabDraw.Controls.Add($DatacenterCsvValidationCheck) +$TabDraw.Controls.Add($ClusterCsvValidation) +$TabDraw.Controls.Add($ClusterCsvValidationCheck) +$TabDraw.Controls.Add($VmHostCsvValidation) +$TabDraw.Controls.Add($VmHostCsvValidationCheck) +$TabDraw.Controls.Add($VmCsvValidation) +$TabDraw.Controls.Add($VmCsvValidationCheck) +$TabDraw.Controls.Add($TemplateCsvValidation) +$TabDraw.Controls.Add($TemplateCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreClusterCsvValidation) +$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreCsvValidation) +$TabDraw.Controls.Add($DatastoreCsvValidationCheck) +$TabDraw.Controls.Add($VsSwitchCsvValidation) +$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VssPortGroupCsvValidation) +$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VssVmkernelCsvValidation) +$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VssPnicCsvValidation) +$TabDraw.Controls.Add($VssPnicCsvValidationCheck) +$TabDraw.Controls.Add($VdSwitchCsvValidation) +$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VdsPortGroupCsvValidation) +$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VdsVmkernelCsvValidation) +$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VdsPnicCsvValidation) +$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) +$TabDraw.Controls.Add($FolderCsvValidation) +$TabDraw.Controls.Add($FolderCsvValidationCheck) +$TabDraw.Controls.Add($RdmCsvValidation) +$TabDraw.Controls.Add($RdmCsvValidationCheck) +$TabDraw.Controls.Add($DrsRuleCsvValidation) +$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) +$TabDraw.Controls.Add($ResourcePoolCsvValidation) +$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) +$TabDraw.Controls.Add($CsvValidationButton) +$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Host_Complete) +$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Folder_Complete) +$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) +$TabDraw.Controls.Add($VMs_with_RDMs_Complete) +$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) +$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) +$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Datastore_Complete) +$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) +$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($Datastore_to_Host_Complete) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) +$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VSS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VSS_Complete) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VDS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VDS_Complete) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) +$SubTab.Controls.Add($TabDirections) +$SubTab.Controls.Add($TabCapture) +$SubTab.Controls.Add($TabDraw) +$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText +$SubTab.SelectedIndex = 0 +$vDiagram.Controls.Add($MainMenu) +$vDiagram.Controls.Add($MainTab) +$vDiagram.Controls.Add($SubTab) +#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$VisioBrowse.Description = "Select a directory" +$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$DrawCsvBrowse.Description = "Select a directory" +$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$CaptureCsvBrowse.Description = "Select a directory" +$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + +#endregion + +#region Custom Code +#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellCheck = $PSVersionTable.PSVersion +if ($PowershellCheck.Major -ge 4) +{ + $PowershellInstalled.Forecolor = "Green" + $PowershellInstalled.Text = "Installed Version $PowershellCheck" +} +else +{ + $PowershellInstalled.Forecolor = "Red" + $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" +} +#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) +$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) +if ($PowerCliModuleCheck -ne $null) +{ + $PowerCliModuleInstalled.Forecolor = "Green" + $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" +} +else +{ + $PowerCliModuleInstalled.Forecolor = "Red" + $PowerCliModuleInstalled.Text = "Not Installed" +} +#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerClI Installed" +} +elseif ($PowerCliModuleCheck -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerCLI Module Installed" +} +else +{ + $PowerCliInstalled.Forecolor = "Red" + $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" +} +#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) +{ + $VisioInstalled.Forecolor = "Green" + $VisioInstalled.Text = "Installed" +} +else +{ + $VisioInstalled.Forecolor = "Red" + $VisioInstalled.Text = "Visio is Not Installed" +} +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) +$ConnectButton.Add_Click({ Connect_vCenter_Main }) +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } +Check_CaptureCsvFolder } ) +#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton.Add_Click({ + if($CaptureCsvFolder -eq $null) + { + $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" + } + else + { + if ($vCenterCsvCheckBox.Checked -eq "True") + { + $vCenterCsvValidationComplete.Forecolor = "Blue" + $vCenterCsvValidationComplete.Text = "Processing ....." + vCenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" + $vCenterCsvComplete = Test-Path $vCenterExportFileComplete + if ($vCenterCsvComplete -eq $True) + { + $vCenterCsvValidationComplete.Forecolor = "Green" + $vCenterCsvValidationComplete.Text = "Complete" + } + else + { + $vCenterCsvValidationComplete.Forecolor = "Red" + $vCenterCsvValidationComplete.Text = "Not Complete" + } + } + Connect_vCenter + $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager + if ($Connected -eq $null) { Connect_vCenter_Main } + $ConnectButton.Forecolor = [System.Drawing.Color]::Green + $ConnectButton.Text = "Connected to $DefaultViserver" + if ($DatacenterCsvCheckBox.Checked -eq "True") + { + $DatacenterCsvValidationComplete.Forecolor = "Blue" + $DatacenterCsvValidationComplete.Text = "Processing ....." + Datacenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" + $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete + if ($DatacenterCsvComplete -eq $True) + { + $DatacenterCsvValidationComplete.Forecolor = "Green" + $DatacenterCsvValidationComplete.Text = "Complete" + } + else + { + $DatacenterCsvValidationComplete.Forecolor = "Red" + $DatacenterCsvValidationComplete.Text = "Not Complete" + } + } + if ($ClusterCsvCheckBox.Checked -eq "True") + { + $ClusterCsvValidationComplete.Forecolor = "Blue" + $ClusterCsvValidationComplete.Text = "Processing ....." + Cluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" + $ClusterCsvComplete = Test-Path $ClusterExportFileComplete + if ($ClusterCsvComplete -eq $True) + { + $ClusterCsvValidationComplete.Forecolor = "Green" + $ClusterCsvValidationComplete.Text = "Complete" + } + else + { + $ClusterCsvValidationComplete.Forecolor = "Red" + $ClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmHostCsvCheckBox.Checked -eq "True") + { + $VmHostCsvValidationComplete.Forecolor = "Blue" + $VmHostCsvValidationComplete.Text = "Processing ....." + VmHost_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" + $VmHostCsvComplete = Test-Path $VmHostExportFileComplete + if ($VmHostCsvComplete -eq $True) + { + $VmHostCsvValidationComplete.Forecolor = "Green" + $VmHostCsvValidationComplete.Text = "Complete" + } + else + { + $VmHostCsvValidationComplete.Forecolor = "Red" + $VmHostCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmCsvCheckBox.Checked -eq "True") + { + $VmCsvValidationComplete.Forecolor = "Blue" + $VmCsvValidationComplete.Text = "Processing ....." + Vm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" + $VmCsvComplete = Test-Path $VmExportFileComplete + if ($VmCsvComplete -eq $True) + { + $VmCsvValidationComplete.Forecolor = "Green" + $VmCsvValidationComplete.Text = "Complete" + } + else + { + $VmCsvValidationComplete.Forecolor = "Red" + $VmCsvValidationComplete.Text = "Not Complete" + } + } + if ($TemplateCsvCheckBox.Checked -eq "True") + { + $TemplateCsvValidationComplete.Forecolor = "Blue" + $TemplateCsvValidationComplete.Text = "Processing ....." + Template_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" + $TemplateCsvComplete = Test-Path $TemplateExportFileComplete + if ($TemplateCsvComplete -eq $True) + { + $TemplateCsvValidationComplete.Forecolor = "Green" + $TemplateCsvValidationComplete.Text = "Complete" + } + else + { + $TemplateCsvValidationComplete.Forecolor = "Red" + $TemplateCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreClusterCsvCheckBox.Checked -eq "True") + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" + $DatastoreClusterCsvValidationComplete.Text = "Processing ....." + DatastoreCluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete + if ($DatastoreClusterCsvComplete -eq $True) + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Green" + $DatastoreClusterCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Red" + $DatastoreClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreCsvCheckBox.Checked -eq "True") + { + $DatastoreCsvValidationComplete.Forecolor = "Blue" + $DatastoreCsvValidationComplete.Text = "Processing ....." + Datastore_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" + $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete + if ($DatastoreCsvComplete -eq $True) + { + $DatastoreCsvValidationComplete.Forecolor = "Green" + $DatastoreCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreCsvValidationComplete.Forecolor = "Red" + $DatastoreCsvValidationComplete.Text = "Not Complete" + } + } + if ($VsSwitchCsvCheckBox.Checked -eq "True") + { + $VsSwitchCsvValidationComplete.Forecolor = "Blue" + $VsSwitchCsvValidationComplete.Text = "Processing ....." + VsSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" + $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete + if ($vSSwitchCsvComplete -eq $True) + { + $vSSwitchCsvValidationComplete.Forecolor = "Green" + $vSSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $vSSwitchCsvValidationComplete.Forecolor = "Red" + $vSSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPortGroupCsvCheckBox.Checked -eq "True") + { + $VssPortGroupCsvValidationComplete.Forecolor = "Blue" + $VssPortGroupCsvValidationComplete.Text = "Processing ....." + VssPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete + if ($VssPortGroupCsvComplete -eq $True) + { + $VssPortGroupCsvValidationComplete.Forecolor = "Green" + $VssPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VssPortGroupCsvValidationComplete.Forecolor = "Red" + $VssPortGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssVmkernelCsvCheckBox.Checked -eq "True") + { + $VssVmkernelCsvValidationComplete.Forecolor = "Blue" + $VssVmkernelCsvValidationComplete.Text = "Processing ....." + VssVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete + if ($VssVmkernelCsvComplete -eq $True) + { + $VssVmkernelCsvValidationComplete.Forecolor = "Green" + $VssVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VssVmkernelCsvValidationComplete.Forecolor = "Red" + $VssVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPnicCsvCheckBox.Checked -eq "True") + { + $VssPnicCsvValidationComplete.Forecolor = "Blue" + $VssPnicCsvValidationComplete.Text = "Processing ....." + VssPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" + $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete + if ($VssPnicCsvComplete -eq $True) + { + $VssPnicCsvValidationComplete.Forecolor = "Green" + $VssPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VssPnicCsvValidationComplete.Forecolor = "Red" + $VssPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdSwitchCsvCheckBox.Checked -eq "True") + { + $VdSwitchCsvValidationComplete.Forecolor = "Blue" + $VdSwitchCsvValidationComplete.Text = "Processing ....." + VdSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" + $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete + if ($VdSwitchCsvComplete -eq $True) + { + $VdSwitchCsvValidationComplete.Forecolor = "Green" + $VdSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $VdSwitchCsvValidationComplete.Forecolor = "Red" + $VdSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPortGroupCsvCheckBox.Checked -eq "True") + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" + $VdsPortGroupCsvValidationComplete.Text = "Processing ....." + VdsPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete + if ($VdsPortGroupCsvComplete -eq $True) + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Green" + $VdsPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Red" + $VdsPortGroupCsvValidationComplete.Text = "Not Complete" + + } + } + if ($VdsVmkernelCsvCheckBox.Checked -eq "True") + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" + $VdsVmkernelCsvValidationComplete.Text = "Processing ....." + VdsVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete + if ($VdsVmkernelCsvComplete -eq $True) + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Green" + $VdsVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Red" + $VdsVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPnicCsvCheckBox.Checked -eq "True") + { + $VdsPnicCsvValidationComplete.Forecolor = "Blue" + $VdsPnicCsvValidationComplete.Text = "Processing ....." + VdsPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" + $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete + if ($VdsPnicCsvComplete -eq $True) + { + $VdsPnicCsvValidationComplete.Forecolor = "Green" + $VdsPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPnicCsvValidationComplete.Forecolor = "Red" + $VdsPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($FolderCsvCheckBox.Checked -eq "True") + { + $FolderCsvValidationComplete.Forecolor = "Blue" + $FolderCsvValidationComplete.Text = "Processing ....." + Folder_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" + $FolderCsvComplete = Test-Path $FolderExportFileComplete + if ($FolderCsvComplete -eq $True) + { + $FolderCsvValidationComplete.Forecolor = "Green" + $FolderCsvValidationComplete.Text = "Complete" + } + else + { + $FolderCsvValidationComplete.Forecolor = "Red" + $FolderCsvValidationComplete.Text = "Not Complete" + } + } + if ($RdmCsvCheckBox.Checked -eq "True") + { + $RdmCsvValidationComplete.Forecolor = "Blue" + $RdmCsvValidationComplete.Text = "Processing ....." + Rdm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" + $RdmCsvComplete = Test-Path $RdmExportFileComplete + if ($RdmCsvComplete -eq $True) + { + $RdmCsvValidationComplete.Forecolor = "Green" + $RdmCsvValidationComplete.Text = "Complete" + } + else + { + $RdmCsvValidationComplete.Forecolor = "Red" + $RdmCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsRuleCsvCheckBox.Checked -eq "True") + { + $DrsRuleCsvValidationComplete.Forecolor = "Blue" + $DrsRuleCsvValidationComplete.Text = "Processing ....." + Drs_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" + $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete + if ($DrsRuleCsvComplete -eq $True) + { + $DrsRuleCsvValidationComplete.Forecolor = "Green" + $DrsRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsRuleCsvValidationComplete.Forecolor = "Red" + $DrsRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" + $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." + Drs_Cluster_Group_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete + if ($DrsClusterGroupCsvComplete -eq $True) + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" + $DrsClusterGroupCsvValidationComplete.Text = "Complete" + } + else + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" + $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" + $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." + Drs_VmHost_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete + if ($DrsVmHostRuleCsvComplete -eq $True) + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" + $DrsVmHostRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" + $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($ResourcePoolCsvCheckBox.Checked -eq "True") + { + $ResourcePoolCsvValidationComplete.Forecolor = "Blue" + $ResourcePoolCsvValidationComplete.Text = "Processing ....." + Resource_Pool_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete + if ($ResourcePoolCsvComplete -eq $True) + { + $ResourcePoolCsvValidationComplete.Forecolor = "Green" + $ResourcePoolCsvValidationComplete.Text = "Complete" + } + else + { + $ResourcePoolCsvValidationComplete.Forecolor = "Red" + $ResourcePoolCsvValidationComplete.Text = "Not Complete" + } + } + Disconnect_vCenter + $ConnectButton.Forecolor = [System.Drawing.Color]::Red + $ConnectButton.Text = "Disconnected" + $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" + } +}) +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) +$TabDraw.Controls.Add($DrawCsvInputButton) +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton.Add_Click( +{ + $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text + $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" + $vCenterCsvExists = Test-Path $vCenterExportFile + $TabDraw.Controls.Add($vCenterCsvValidationCheck) + if ($vCenterCsvExists -eq $True) + { + + $vCenterCsvValidationCheck.Forecolor = "Green" + $vCenterCsvValidationCheck.Text = "Present" + } + else + { + $vCenterCsvValidationCheck.Forecolor = "Red" + $vCenterCsvValidationCheck.Text = "Not Present" + } + + $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" + $DatacenterCsvExists = Test-Path $DatacenterExportFile + $TabDraw.Controls.Add($DatacenterCsvValidationCheck) + + if ($DatacenterCsvExists -eq $True) + { + $DatacenterCsvValidationCheck.Forecolor = "Green" + $DatacenterCsvValidationCheck.Text = "Present" + } + else + { + $DatacenterCsvValidationCheck.Forecolor = "Red" + $DatacenterCsvValidationCheck.Text = "Not Present" + } + + $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" + $ClusterCsvExists = Test-Path $ClusterExportFile + $TabDraw.Controls.Add($ClusterCsvValidationCheck) + + if ($ClusterCsvExists -eq $True) + { + $ClusterCsvValidationCheck.Forecolor = "Green" + $ClusterCsvValidationCheck.Text = "Present" + } + else + { + $ClusterCsvValidationCheck.Forecolor = "Red" + $ClusterCsvValidationCheck.Text = "Not Present" + } + + $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" + $VmHostCsvExists = Test-Path $VmHostExportFile + $TabDraw.Controls.Add($VmHostCsvValidationCheck) + + if ($VmHostCsvExists -eq $True) + { + $VmHostCsvValidationCheck.Forecolor = "Green" + $VmHostCsvValidationCheck.Text = "Present" + } + else + { + $VmHostCsvValidationCheck.Forecolor = "Red" + $VmHostCsvValidationCheck.Text = "Not Present" + } + + $VmExportFile = $CsvInputDir + "-VmExport.csv" + $VmCsvExists = Test-Path $VmExportFile + $TabDraw.Controls.Add($VmCsvValidationCheck) + + if ($VmCsvExists -eq $True) + { + $VmCsvValidationCheck.Forecolor = "Green" + $VmCsvValidationCheck.Text = "Present" + } + else + { + $VmCsvValidationCheck.Forecolor = "Red" + $VmCsvValidationCheck.Text = "Not Present" + } + + $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" + $TemplateCsvExists = Test-Path $TemplateExportFile + $TabDraw.Controls.Add($TemplateCsvValidationCheck) + + if ($TemplateCsvExists -eq $True) + { + $TemplateCsvValidationCheck.Forecolor = "Green" + $TemplateCsvValidationCheck.Text = "Present" + } + else + { + $TemplateCsvValidationCheck.Forecolor = "Red" + $TemplateCsvValidationCheck.Text = "Not Present" + } + + $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile + $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) + + if ($DatastoreClusterCsvExists -eq $True) + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Green" + $DatastoreClusterCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Red" + $DatastoreClusterCsvValidationCheck.Text = "Not Present" + } + + $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" + $DatastoreCsvExists = Test-Path $DatastoreExportFile + $TabDraw.Controls.Add($DatastoreCsvValidationCheck) + + if ($DatastoreCsvExists -eq $True) + { + $DatastoreCsvValidationCheck.Forecolor = "Green" + $DatastoreCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreCsvValidationCheck.Forecolor = "Red" + $DatastoreCsvValidationCheck.Text = "Not Present" + } + + $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" + $VsSwitchCsvExists = Test-Path $VsSwitchExportFile + $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) + + if ($VsSwitchCsvExists -eq $True) + { + $VsSwitchCsvValidationCheck.Forecolor = "Green" + $VsSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VsSwitchCsvValidationCheck.Forecolor = "Red" + $VsSwitchCsvValidationCheck.Text = "Not Present" + $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile + $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) + + if ($VssPortGroupCsvExists -eq $True) + { + $VssPortGroupCsvValidationCheck.Forecolor = "Green" + $VssPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VssPortGroupCsvValidationCheck.Forecolor = "Red" + $VssPortGroupCsvValidationCheck.Text = "Not Present" + $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile + $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) + + if ($VssVmkernelCsvExists -eq $True) + { + $VssVmkernelCsvValidationCheck.Forecolor = "Green" + $VssVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VssVmkernelCsvValidationCheck.Forecolor = "Red" + $VssVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" + $VssPnicCsvExists = Test-Path $VssPnicExportFile + $TabDraw.Controls.Add($VssPnicCsvValidationCheck) + + if ($VssPnicCsvExists -eq $True) + { + $VssPnicCsvValidationCheck.Forecolor = "Green" + $VssPnicCsvValidationCheck.Text = "Present" + } + else + { + $VssPnicCsvValidationCheck.Forecolor = "Red" + $VssPnicCsvValidationCheck.Text = "Not Present" + } + + $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" + $VdSwitchCsvExists = Test-Path $VdSwitchExportFile + $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) + + if ($VdSwitchCsvExists -eq $True) + { + $VdSwitchCsvValidationCheck.Forecolor = "Green" + $VdSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VdSwitchCsvValidationCheck.Forecolor = "Red" + $VdSwitchCsvValidationCheck.Text = "Not Present" + $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile + $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) + + if ($VdsPortGroupCsvExists -eq $True) + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Green" + $VdsPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Red" + $VdsPortGroupCsvValidationCheck.Text = "Not Present" + $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile + $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) + + if ($VdsVmkernelCsvExists -eq $True) + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Green" + $VdsVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Red" + $VdsVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" + $VdsPnicCsvExists = Test-Path $VdsPnicExportFile + $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) + + if ($VdsPnicCsvExists -eq $True) + { + $VdsPnicCsvValidationCheck.Forecolor = "Green" + $VdsPnicCsvValidationCheck.Text = "Present" + } + else + { + $VdsPnicCsvValidationCheck.Forecolor = "Red" + $VdsPnicCsvValidationCheck.Text = "Not Present" + } + + $FolderExportFile = $CsvInputDir + "-FolderExport.csv" + $FolderCsvExists = Test-Path $FolderExportFile + $TabDraw.Controls.Add($FolderCsvValidationCheck) + + if ($FolderCsvExists -eq $True) + { + $FolderCsvValidationCheck.Forecolor = "Green" + $FolderCsvValidationCheck.Text = "Present" + } + else + { + $FolderCsvValidationCheck.Forecolor = "Red" + $FolderCsvValidationCheck.Text = "Not Present" + } + + $RdmExportFile = $CsvInputDir + "-RdmExport.csv" + $RdmCsvExists = Test-Path $RdmExportFile + $TabDraw.Controls.Add($RdmCsvValidationCheck) + + if ($RdmCsvExists -eq $True) + { + $RdmCsvValidationCheck.Forecolor = "Green" + $RdmCsvValidationCheck.Text = "Present" + } + else + { + $RdmCsvValidationCheck.Forecolor = "Red" + $RdmCsvValidationCheck.Text = "Not Present" + $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" + $DrsRuleCsvExists = Test-Path $DrsRuleExportFile + $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) + + if ($DrsRuleCsvExists -eq $True) + { + $DrsRuleCsvValidationCheck.Forecolor = "Green" + $DrsRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsRuleCsvValidationCheck.Forecolor = "Red" + $DrsRuleCsvValidationCheck.Text = "Not Present" + $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile + $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) + + if ($DrsClusterGroupCsvExists -eq $True) + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" + $DrsClusterGroupCsvValidationCheck.Text = "Present" + } + else + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" + $DrsClusterGroupCsvValidationCheck.Text = "Not Present" + } + + $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile + $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) + + if ($DrsVmHostRuleCsvExists -eq $True) + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" + $DrsVmHostRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" + $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" + } + + $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile + $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) + + if ($ResourcePoolCsvExists -eq $True) + { + $ResourcePoolCsvValidationCheck.Forecolor = "Green" + $ResourcePoolCsvValidationCheck.Text = "Present" + } + else + { + $ResourcePoolCsvValidationCheck.Forecolor = "Red" + $ResourcePoolCsvValidationCheck.Text = "Not Present" + $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" + } +} ) +$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) +$TabDraw.Controls.Add($CsvValidationButton) +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) +$TabDraw.Controls.Add($VisioOpenOutputButton) +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) +$TabDraw.Controls.Add($DrawUncheckButton) +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) +$TabDraw.Controls.Add($DrawCheckButton) +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; +if ($VM_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Host_Complete.Forecolor = "Blue" + $VM_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Host_Complete) + VM_to_Host + $VM_to_Host_Complete.Forecolor = "Green" + $VM_to_Host_Complete.Text = "Complete" + $TabDraw.Controls.Add($VM_to_Host_Complete) +} +if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Folder_Complete.Forecolor = "Blue" + $VM_to_Folder_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Folder_Complete) + VM_to_Folder + $VM_to_Folder_Complete.Forecolor = "Green" + $VM_to_Folder_Complete.Text = "Complete" +} +if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") +{ + $VMs_with_RDMs_Complete.Forecolor = "Blue" + $VMs_with_RDMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMs_with_RDMs_Complete) + VMs_with_RDMs + $VMs_with_RDMs_Complete.Forecolor = "Green" + $VMs_with_RDMs_Complete.Text = "Complete" +} +if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") +{ + $SRM_Protected_VMs_Complete.Forecolor = "Blue" + $SRM_Protected_VMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) + SRM_Protected_VMs + $SRM_Protected_VMs_Complete.Forecolor = "Green" + $SRM_Protected_VMs_Complete.Text = "Complete" +} +if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Datastore_Complete.Forecolor = "Blue" + $VM_to_Datastore_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Datastore_Complete) + VM_to_Datastore + $VM_to_Datastore_Complete.Forecolor = "Green" + $VM_to_Datastore_Complete.Text = "Complete" +} +if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") +{ + $VM_to_ResourcePool_Complete.Forecolor = "Blue" + $VM_to_ResourcePool_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) + VM_to_ResourcePool + $VM_to_ResourcePool_Complete.Forecolor = "Green" + $VM_to_ResourcePool_Complete.Text = "Complete" +} +if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") +{ + $Datastore_to_Host_Complete.Forecolor = "Blue" + $Datastore_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Datastore_to_Host_Complete) + Datastore_to_Host + $Datastore_to_Host_Complete.Forecolor = "Green" + $Datastore_to_Host_Complete.Text = "Complete" +} +if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") +{ + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" + $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) + PhysicalNIC_to_vSwitch + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" + $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" +} +if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VSS_to_Host_Complete.Forecolor = "Blue" + $VSS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSS_to_Host_Complete) + VSS_to_Host + $VSS_to_Host_Complete.Forecolor = "Green" + $VSS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VSS_Complete.Forecolor = "Blue" + $VMK_to_VSS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VSS_Complete) + VMK_to_VSS + $VMK_to_VSS_Complete.Forecolor = "Green" + $VMK_to_VSS_Complete.Text = "Complete" +} +if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VSSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) + VSSPortGroup_to_VM + $VSSPortGroup_to_VM_Complete.Forecolor = "Green" + $VSSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VDS_to_Host_Complete.Forecolor = "Blue" + $VDS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDS_to_Host_Complete) + VDS_to_Host + $VDS_to_Host_Complete.Forecolor = "Green" + $VDS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VDS_Complete.Forecolor = "Blue" + $VMK_to_VDS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VDS_Complete) + VMK_to_VDS + $VMK_to_VDS_Complete.Forecolor = "Green" + $VMK_to_VDS_Complete.Text = "Complete" +} +if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VDSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) + VDSPortGroup_to_VM + $VDSPortGroup_to_VM_Complete.Forecolor = "Green" + $VDSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") +{ + $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" + $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) + Cluster_to_DRS_Rule + $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" + $Cluster_to_DRS_Rule_Complete.Text = "Complete" +}; +$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) +$TabDraw.Controls.Add($DrawButton) +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton.Add_Click({Open_Final_Visio}) +$TabDraw.Controls.Add($OpenVisioButton) + +#endregion + +#region Event Loop + +function Main{ + [System.Windows.Forms.Application]::EnableVisualStyles() + [System.Windows.Forms.Application]::Run($vDiagram) +} + +#endregion + +#endregion + +#region Event Handlers + +#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect_vCenter_Main +{ + $MainVC = $MainVcenterTextBox.Text + $MainUser = $UserNameTextBox.Text + $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text +} + +function Connect_vCenter +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $User = $UserNameTextBox.Text + $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text +} + +function Disconnect_vCenter +{ + $Disconnect = Disconnect-ViServer * -Confirm:$false +} + +#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Find_CaptureCsvFolder +{ + $CaptureCsvBrowseLoop = $True + while ($CaptureCsvBrowseLoop) + { + if ($CaptureCsvBrowse.ShowDialog() -eq "OK") + { + $CaptureCsvBrowseLoop = $False + } + else + { + $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($CaptureCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath +} + +function Check_CaptureCsvFolder +{ + $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $CheckContentDir = $CheckContentPath + "*.csv" + $CheckContent = Test-Path $CheckContentDir + if ($CheckContent -eq "True") + { + $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") + switch ($CheckContents_CaptureCsvFolder) { + 'Yes' + { + del $CheckContentDir + } + + 'No' + { + $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog + $CheckContentCsvBrowse.Description = "Select a directory to copy files to" + $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + $CheckContentCsvBrowse.ShowDialog() + $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath + copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder + del $CheckContentDir + } + } + } +} + +function Find_DrawCsvFolder +{ + $DrawCsvBrowseLoop = $True + while ($DrawCsvBrowseLoop) + { + if ($DrawCsvBrowse.ShowDialog() -eq "OK") + { + $DrawCsvBrowseLoop = $False + } + else + { + $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($DrawCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath +} + +function Find_DrawVisioFolder +{ + $VisioBrowseLoop = $True + while($VisioBrowseLoop) + { + if ($VisioBrowse.ShowDialog() -eq "OK") + { + $VisioBrowseLoop = $False + } + else + { + $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if($VisioBrowseRes -eq "Cancel") + { + return + } + } + } + $global:VisioFolder = $VisioBrowse.SelectedPath +} + +#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function vCenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, + @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation + + if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) + { + $null + } + else + { + Disconnect_vCenter + } +} + +function Datacenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort-Object Name | + Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation +} + +function Cluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, + @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, + @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, + @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, + @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, + @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, + @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, + @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, + @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, + @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation +} + +function VmHost_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent + while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent + } + if ($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name } } }, + @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent + while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent + } + if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, + @{ N = "Version" ; E = { $_.Config.Product.Version } }, + @{ N = "Build" ; E = { $_.Config.Product.Build } }, + @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, + @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, + @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, + @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, + @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, + @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, + @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, + @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, + @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, + @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, + @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, + @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation +} + +function Vm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select-Object Name , + @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, + @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, + @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, + @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, + @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, + @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, + @{ N = "OS" ; E = { $_.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.Config.Version } }, + @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, + @{ N = 'Folder' ; E = { $Folder.Name } }, + @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, + @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, + @{ N = "IP" ; E = { $_.Guest.IpAddress } }, + @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, + @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, + @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, + @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation + } +} + +function Template_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + foreach ($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { $VmHost.name } }, + @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, + @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, + @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, + @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, + @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, + @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, + @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, + @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation + } +} + +function DatastoreCluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, + @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, + @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation +} + +function Datastore_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, + @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, + @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, + @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, + @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, + @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, + @{ N = "Accessible" ; E = { $_.State } }, + @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation +} + +function VsSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "Nic" ; E = { $_.Nic } }, + @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, + @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, + @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, + @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, + @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation +} + +function VssPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "VLanId" ; E = { $_.VLanId } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VssVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation + } + } + } +} + +function VssPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation + } + } +} + +function VdSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + foreach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "Vendor" ; E = { $_.Vendor } }, + @{ N = "Version" ; E = { $_.Version } }, + @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, + @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation + } +} + +function VdsPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, + @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, + @{ N = "NumPorts" ; E = { $_.NumPorts } }, + @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, + @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, + @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VdsVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation + + } + } +} + +function VdsPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | + Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch } }, + @{ N = "Portgroup" ; E = { $_.Portgroup } }, + @{ N = "ConnectedEntity" ; E = { $_.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation + } + } +} + +function Folder_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + foreach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -type VM | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation + } +} + +function Rdm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | + Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, + @{ N = "Vm" ; E = { $_.Parent } }, + @{ N = "Label" ; E = { $_.Name } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, + @{ N = "DiskType" ; E = { $_.DiskType } }, + @{ N = "Persistence" ; E = { $_.Persistence } }, + @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, + @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, + @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation +} + +function Drs_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation + } +} + +function Drs_Cluster_Group_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "GroupType" ; E = { $_.GroupType } }, + @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation + } +} + +function Drs_VmHost_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) + { + Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "VMGroup" ; E = { $_.VMGroup } }, + @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, + @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, + @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation + } + } +} + +function Resource_Pool_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) + { + Get-ResourcePool $ResourcePool | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Cluster" ; E = { $Cluster.Name } }, + @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, + @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, + @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, + @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, + @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, + @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, + @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, + @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, + @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, + @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation + } + } +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect-VisioObject($firstObj, $secondObj) +{ + $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) + $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) + $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) +} + +function Add-VisioObjectVC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectCluster($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHost($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectTemplate($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectSRM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDatastore($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHardDisk($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.ScsiCanonicalName + return $shpObj +} + +function Add-VisioObjectFolder($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVsSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVssPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVMK($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsClusterGroup($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDRSVMHostRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectResourcePool($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +#~~< Visio Draw Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Draw_vCenter +{ + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' +} + +function Draw_Datacenter +{ + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' +} + +function Draw_Cluster +{ + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' +} + +function Draw_VmHost +{ + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' +} + +function Draw_VM +{ + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' +} + +function Draw_Template +{ + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' +} + +function Draw_Folder +{ + #Name + $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' +} + +function Draw_RDM +{ + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' +} + +function Draw_SRM +{ + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' +} + +function Draw_DatastoreCluster +{ + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' +} + +function Draw_Datastore +{ + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' +} + +function Draw_ResourcePool +{ + # Name + $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' + # Cluster + $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' + # CpuSharesLevel + $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' + # NumCpuShares + $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' + # CpuReservationMHz + $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' + # CpuExpandableReservation + $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' + # CpuLimitMHz + $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' + # MemSharesLevel + $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' + # NumMemShares + $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' + # MemReservationGB + $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' + # MemExpandableReservation + $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' + # MemLimitGB + $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' +} + +function Draw_VsSwitch +{ + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' +} + +function Draw_VssPnic +{ + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' +} + +function Draw_VssPort +{ + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' +} + +function Draw_VssVmk +{ + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' +} + +function Draw_VdSwitch +{ + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' +} + +function Draw_VdsPnic +{ + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' +} + +function Draw_VdsPort +{ + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' +} + +function Draw_VdsVmk +{ + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' +} + +function Draw_DrsRule +{ + # Name + $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' + # VM Affinity + $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' + # DRS Rule Enabled + $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' + # DRS Rule Mandatory + $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' +} + +function Draw_DrsVmHostRule +{ + # Name + $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' + # Enabled + $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' + # Type + $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' + # VMGroup + $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' + # VMHostGroup + $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' + # AffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' + # AntiAffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' +} + +function Draw_DrsClusterGroup +{ + # Name + $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' + # GroupType + $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' + # Members + $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' +} + +function CSV_In_Out +{ + # vCenter + $global:vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $global:vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $global:DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $global:DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $global:ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $global:ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $global:VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $global:VmHostImport = Import-Csv $VmHostExportFile + # Vm + $global:VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $global:VmImport = Import-Csv $VmExportFile + #Template + $global:TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $global:TemplateImport = Import-Csv $TemplateExportFile + # Folder + $global:FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + $global:FolderImport = Import-Csv $FolderExportFile + # Datastore Cluster + $global:DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $global:DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $global:DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $global:DatastoreImport = Import-Csv $DatastoreExportFile + # RDM's + $global:RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + $global:RdmImport = Import-Csv $RdmExportFile + # ResourcePool + $global:ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + $global:ResourcePoolImport = Import-Csv $ResourcePoolExportFile + # Vss Switch + $global:VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $global:VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $global:VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $global:VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $global:VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $global:VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $global:VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $global:VssPnicImport = Import-Csv $VssPnicExportFile + # Vds Switch + $global:VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $global:VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $global:VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $global:VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $global:VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $global:VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $global:VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $global:VdsPnicImport = Import-Csv $VdsPnicExportFile + # DRS Rule + $global:DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + $global:DrsRuleImport = Import-Csv $DrsRuleExportFile + # DRS Cluster Group + $global:DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + $global:DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile + # DRS VmHost Rule + $global:DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + $global:DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile +} + +function Visio_Shapes +{ + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $global:VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $global:DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $global:ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $global:HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $global:MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $global:LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $global:OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $global:TemplateObj = $stnObj.Masters.Item("Template") + # Folder Object + $global:FolderObj = $stnObj.Masters.Item("Folder") + # RDM Object + $global:RDMObj = $stnObj.Masters.Item("RDM") + # SRM Protected VM Object + $global:SRMObj = $stnObj.Masters.Item("SRM Protected Server") + # Datastore Cluster Object + $global:DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $global:DatastoreObj = $stnObj.Masters.Item("Datastore") + # Resource Pool Object + $global:ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") + # VSS Object + $global:VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $global:VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $global:VssNicObj = $stnObj.Masters.Item("VSS NIC") + # VDS Object + $global:VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $global:VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $global:VdsNicObj = $stnObj.Masters.Item("VDS NIC") + # VMK NIC Object + $global:VmkNicObj = $stnObj.Masters.Item("VMKernel") + # DRS Rule + $global:DRSRuleObj = $stnObj.Masters.Item("DRS Rule") + # DRS Cluster Group + $global:DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") + # DRS Host Rule + $global:DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") +} + +#~~< Visio Pages Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Create_Visio_Base +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $DocObj = $docsObj.Add("") + $DocObj.SaveAs($Savefile) + $AppVisio.Quit() +} + +function VM_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Host" + $Page = $DocsObj.Pages('VM to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Folder +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Folder" + $Page = $DocsObj.Pages('VM to Folder') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Folder') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $FolderObject = Add-VisioObjectFolder $FolderObj $Folder + Draw_Folder + Connect-VisioObject $DatacenterObject $FolderObject + $y += 1.50 + + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $FolderObject $TemplateObject + $FolderObject = $TemplateObject + } + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $FolderObject $VMObject + $FolderObject = $VMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMs_with_RDMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" + $Page = $DocsObj.Pages('VM w/ RDMs') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM w/ RDMs') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $ClusterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 3.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + Draw_RDM + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $DatacenterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 2.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + Draw_RDM + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function SRM_Protected_VMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "SRM VM" + $Page = $DocsObj.Pages('SRM VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('SRM VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + Draw_SRM + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + Draw_SRM + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Datastore +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Datastore" + $Page = $DocsObj.Pages('VM to Datastore') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Datastore') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + Draw_DatastoreCluster + Connect-VisioObject $ClusterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $ClusterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + Draw_DatastoreCluster + Connect-VisioObject $DatacenterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatacenterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_ResourcePool +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" + $Page = $DocsObj.Pages('VM to Resource Pool') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Resource Pool') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool + Draw_ResourcePool + Connect-VisioObject $ClusterObject $ResourcePoolObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $ResourcePoolObject $VMObject + $ResourcePoolObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Datastore_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Datastore to Host" + $Page = $DocsObj.Pages('Datastore to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Datastore to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function PhysicalNIC_to_vSwitch +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "PNIC to switch" + $Page = $DocsObj.Pages('PNIC to Switch') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('PNIC to Switch') + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VSSObject + $y += 1.50 + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + Draw_VssPnic + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + Draw_VdsPnic + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VSSObject + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + Draw_VssPnic + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + Draw_VdsPnic + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSS to Host" + $Page = $DocsObj.Pages('VSS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VSS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VSS" + $Page = $DocsObj.Pages('VMK to VSS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VSS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + Draw_VssVmk + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + Draw_VssVmk + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" + $Page = $DocsObj.Pages('VSSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDS to Host" + $Page = $DocsObj.Pages('VDS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VDS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VDS" + $Page = $DocsObj.Pages('VMK to VDS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VDS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + Draw_VdsVmk + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + Draw_VdsVmk + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" + $Page = $DocsObj.Pages('VDSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $DatacenterObject $VdSwitchObject + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x = 6.00 + $y += 1.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VPGObject $VMObject + $VPGObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Cluster_to_DRS_Rule +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" + $Page = $DocsObj.Pages('Cluster to DRS Rule') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Cluster to DRS Rule') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + $y += 1.50 + + foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule + Draw_DrsRule + Connect-VisioObject $ClusterObject $DRSObject + $y += 1.50 + } + foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule + Draw_DrsVmHostRule + Connect-VisioObject $ClusterObject $DRSVMHostRuleObject + $y += 1.50 + + foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) + { + $x += 2.50 + $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup + Draw_DrsClusterGroup + Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject + $DRSVMHostRuleObject = $DrsClusterGroupObject + + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Open_Final_Visio +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.Application + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null +} + +Main + +======= +<# +.SYNOPSIS + vDiagram Visio Drawing Tool + +.DESCRIPTION + vDiagram Visio Drawing Tool + +.NOTES + File Name : vDiagram2.0.1.ps1 + Author : Tony Gonzalez + Author : Jason Hopkins + Based on : vDiagram by Alan Renouf + Version : 2.0.1 + +.USAGE NOTES + Ensure to unblock files before unzipping + Ensure to run as administrator + Required Files: + PowerCLI or PowerShell 5.0 with PowerCLI Modules installed + Active connection to vCenter to capture data + MS Visio + +.CHANGE LOG + - 04/12/2018 - v2.0.1 + Added MAC Addresses to VMs & Templates + Added a check to see if prior CSVs are still present + Added option to copy prior CSVs to new folder + Consolidate the object plaement into functions for ease of management + + - 04/11/2018 - v2.0.0 + Presented as a Community Theater Session at South Florida VMUG + Feature enhancement requests collected +#> + +#region ScriptForm Designer + +#region Constructor + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") +#endregion + +#region Post-Constructor Custom Code +$DateTime = (Get-Date -format "yyyy_MM_dd-HH_MM") +$MyVer = "2.0.1" +$LastUpdated = "April 12, 2018" +$About = +@" + + vDiagram $MyVer + + Contributors: Tony Gonzalez of RoundTower Technologies LLC + Jason Hopkins of RoundTower Technologies LLC + + Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram + + Created: February 13, 2018 + + Last Updated: $LastUpdated + +"@ +#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" +if (!(Test-Path $TestShapes)) +{ + $CurrentLocation = Get-Location + copy $CurrentLocation\vDiagram.vssx $TestShapes + Write-Host "Copying Shapes File to My Shapes" +} +$shpFile = "\vDiagram.vssx" +#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Set_WindowStyle { +param( + [Parameter()] + [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', + 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', + 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] + $Style = 'SHOW', + [Parameter()] + $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle +) + $WindowStates = @{ + FORCEMINIMIZE = 11; HIDE = 0 + MAXIMIZE = 3; MINIMIZE = 6 + RESTORE = 9; SHOW = 5 + SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 + SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 + SHOWNA = 8; SHOWNOACTIVATE = 4 + SHOWNORMAL = 1 + } + Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) + + $Win32ShowWindowAsync = Add-Type –memberDefinition @” + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); +“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru + + $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null +} +Set_WindowStyle MINIMIZE +#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function About_Config +{ + + $About + + #Add objects for About + $AboutForm = New-Object System.Windows.Forms.Form + $AboutTextBox = New-Object System.Windows.Forms.RichTextBox + + #About Form + $AboutForm.Icon = $Icon + $AboutForm.AutoScroll = $True + $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) + $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutForm.Name = "About" + $AboutForm.StartPosition = 1 + $AboutForm.Text = "About vDiagram $MyVer" + + $AboutTextBox.Anchor = 15 + $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) + $AboutTextBox.BorderStyle = 0 + $AboutTextBox.Font = "Tahoma" + $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) + $AboutTextBox.Name = "AboutTextBox" + $AboutTextBox.ReadOnly = $True + $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) + $AboutTextBox.Text = $About + + $AboutForm.Controls.Add($AboutTextBox) + + $AboutForm.Show() | Out-Null +} +#endregion + +#region Form Creation +#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vDiagram = New-Object System.Windows.Forms.Form +$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) +$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") +$vDiagram.Icon = $Icon +$vDiagram.Text = "vDiagram 2.0" +$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan +#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainMenu = New-Object System.Windows.Forms.MenuStrip +$MainMenu.Location = New-Object System.Drawing.Point(0, 0) +$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) +$MainMenu.TabIndex = 1 +$MainMenu.Text = "MainMenu" +#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) +$FileToolStripMenuItem.Text = "File" +#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) +$ExitToolStripMenuItem.Text = "Exit" +$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) +$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) +#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) +$HelpToolStripMenuItem.Text = "Help" +#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) +$AboutToolStripMenuItem.Text = "About" +$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) +$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) +$AboutToolStripMenuItem.Add_Click({About_Config}) +#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainTab = New-Object System.Windows.Forms.TabControl +$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) +$MainTab.Location = New-Object System.Drawing.Point(10, 30) +$MainTab.Size = New-Object System.Drawing.Size(990, 98) +$MainTab.TabIndex = 0 +$MainTab.Text = "MainTabs" +#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Prerequisites = New-Object System.Windows.Forms.TabPage +$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) +$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) +$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) +$Prerequisites.TabIndex = 0 +$Prerequisites.Text = "Prerequisites" +$Prerequisites.BackColor = [System.Drawing.Color]::LightGray +#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellLabel = New-Object System.Windows.Forms.Label +$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) +$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) +$PowershellLabel.TabIndex = 1 +$PowershellLabel.Text = "Powershell:" +#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellInstalled = New-Object System.Windows.Forms.Label +$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) +$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) +$PowershellInstalled.TabIndex = 2 +$PowershellInstalled.Text = "" +$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleLabel = New-Object System.Windows.Forms.Label +$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) +$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) +$PowerCliModuleLabel.TabIndex = 3 +$PowerCliModuleLabel.Text = "PowerCLI Module:" +#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label +$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) +$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) +$PowerCliModuleInstalled.TabIndex = 4 +$PowerCliModuleInstalled.Text = "" +$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliLabel = New-Object System.Windows.Forms.Label +$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) +$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) +$PowerCliLabel.TabIndex = 5 +$PowerCliLabel.Text = "PowerCLI:" +#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliInstalled = New-Object System.Windows.Forms.Label +$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) +$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) +$PowerCliInstalled.TabIndex = 6 +$PowerCliInstalled.Text = "" +$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioLabel = New-Object System.Windows.Forms.Label +$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) +$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) +$VisioLabel.TabIndex = 7 +$VisioLabel.Text = "Visio:" +#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioInstalled = New-Object System.Windows.Forms.Label +$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) +$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) +$VisioInstalled.TabIndex = 8 +$VisioInstalled.Text = "" +$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray +$Prerequisites.Controls.Add($PowershellLabel) +$Prerequisites.Controls.Add($PowershellInstalled) +$Prerequisites.Controls.Add($PowerCliModuleLabel) +$Prerequisites.Controls.Add($PowerCliModuleInstalled) +$Prerequisites.Controls.Add($PowerCliLabel) +$Prerequisites.Controls.Add($PowerCliInstalled) +$Prerequisites.Controls.Add($VisioLabel) +$Prerequisites.Controls.Add($VisioInstalled) +#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfo = New-Object System.Windows.Forms.TabPage +$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) +$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) +$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) +$vCenterInfo.TabIndex = 0 +$vCenterInfo.Text = "vCenter Info" +$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray +#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterLabel = New-Object System.Windows.Forms.Label +$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) +$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) +$MainVcenterLabel.TabIndex = 1 +$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" +#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox +$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) +$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) +$MainVcenterTextBox.TabIndex = 2 +$MainVcenterTextBox.Text = "" +#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterLabel = New-Object System.Windows.Forms.Label +$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) +$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) +$TargetVcenterLabel.TabIndex = 3 +$TargetVcenterLabel.Text = "Name of target vCenter:" +#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox +$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) +$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) +$TargetVcenterTextBox.TabIndex = 4 +$TargetVcenterTextBox.Text = "" +#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameLabel = New-Object System.Windows.Forms.Label +$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) +$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) +$UserNameLabel.TabIndex = 5 +$UserNameLabel.Text = "vCenter User Name:" +#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameTextBox = New-Object System.Windows.Forms.TextBox +$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) +$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) +$UserNameTextBox.TabIndex = 6 +$UserNameTextBox.Text = "" +#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) +$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) +$PasswordLabel.TabIndex = 7 +$PasswordLabel.Text = "Password:" +#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordTextBox = New-Object System.Windows.Forms.TextBox +$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) +$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) +$PasswordTextBox.TabIndex = 8 +$PasswordTextBox.Text = "" +$PasswordTextBox.UseSystemPasswordChar = $true +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton = New-Object System.Windows.Forms.Button +$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) +$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) +$ConnectButton.TabIndex = 9 +$ConnectButton.Text = "Connect to vCenter" +$ConnectButton.UseVisualStyleBackColor = $true +$vCenterInfo.Controls.Add($MainVcenterLabel) +$vCenterInfo.Controls.Add($MainVcenterTextBox) +$vCenterInfo.Controls.Add($TargetVcenterLabel) +$vCenterInfo.Controls.Add($TargetVcenterTextBox) +$vCenterInfo.Controls.Add($UserNameLabel) +$vCenterInfo.Controls.Add($UserNameTextBox) +$vCenterInfo.Controls.Add($PasswordLabel) +$vCenterInfo.Controls.Add($PasswordTextBox) +$vCenterInfo.Controls.Add($ConnectButton) +$MainTab.Controls.Add($Prerequisites) +$MainTab.Controls.Add($vCenterInfo) +$MainTab.SelectedIndex = 0 +#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SubTab = New-Object System.Windows.Forms.TabControl +$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$SubTab.Location = New-Object System.Drawing.Point(10, 136) +$SubTab.Size = New-Object System.Drawing.Size(990, 512) +$SubTab.TabIndex = 0 +$SubTab.Text = "SubTabs" +#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDirections = New-Object System.Windows.Forms.TabPage +$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDirections.Location = New-Object System.Drawing.Point(4, 22) +$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDirections.Size = New-Object System.Drawing.Size(982, 486) +$TabDirections.TabIndex = 0 +$TabDirections.Text = "Directions" +$TabDirections.UseVisualStyleBackColor = $true +#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesHeading = New-Object System.Windows.Forms.Label +$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) +$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) +$PrerequisitesHeading.TabIndex = 0 +$PrerequisitesHeading.Text = "Prerequisites Tab" +#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesDirections = New-Object System.Windows.Forms.Label +$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) +$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) +$PrerequisitesDirections.TabIndex = 1 +$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." +#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoHeading = New-Object System.Windows.Forms.Label +$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) +$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) +$vCenterInfoHeading.TabIndex = 2 +$vCenterInfoHeading.Text = "vCenter Info Tab" +#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoDirections = New-Object System.Windows.Forms.Label +$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) +$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) +$vCenterInfoDirections.TabIndex = 3 +$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." +#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvHeading = New-Object System.Windows.Forms.Label +$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) +$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) +$CaptureCsvHeading.TabIndex = 4 +$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" +#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureDirections = New-Object System.Windows.Forms.Label +$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) +$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) +$CaptureDirections.TabIndex = 5 +$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." +#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawHeading = New-Object System.Windows.Forms.Label +$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) +$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) +$DrawHeading.TabIndex = 6 +$DrawHeading.Text = "Draw Visio Tab" +#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawDirections = New-Object System.Windows.Forms.Label +$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) +$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) +$DrawDirections.TabIndex = 7 +$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." +$TabDirections.Controls.Add($PrerequisitesHeading) +$TabDirections.Controls.Add($PrerequisitesDirections) +$TabDirections.Controls.Add($vCenterInfoHeading) +$TabDirections.Controls.Add($vCenterInfoDirections) +$TabDirections.Controls.Add($CaptureCsvHeading) +$TabDirections.Controls.Add($CaptureDirections) +$TabDirections.Controls.Add($DrawHeading) +$TabDirections.Controls.Add($DrawDirections) +#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabCapture = New-Object System.Windows.Forms.TabPage +$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabCapture.Location = New-Object System.Drawing.Point(4, 22) +$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) +$TabCapture.Size = New-Object System.Drawing.Size(982, 486) +$TabCapture.TabIndex = 3 +$TabCapture.Text = "Capture CSVs for Visio" +$TabCapture.UseVisualStyleBackColor = $true +#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label +$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) +$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) +$CaptureCsvOutputLabel.TabIndex = 0 +$CaptureCsvOutputLabel.Text = "CSV Output Folder:" +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button +$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) +$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) +$CaptureCsvOutputButton.TabIndex = 0 +$CaptureCsvOutputButton.Text = "Select Output Folder" +$CaptureCsvOutputButton.UseVisualStyleBackColor = $false +$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$vCenterCsvCheckBox.Checked = $true +$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$vCenterCsvCheckBox.TabIndex = 1 +$vCenterCsvCheckBox.Text = "Export vCenter Info" +$vCenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) +$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationComplete.TabIndex = 26 +$vCenterCsvValidationComplete.Text = "" +#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatacenterCsvCheckBox.Checked = $true +$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatacenterCsvCheckBox.TabIndex = 2 +$DatacenterCsvCheckBox.Text = "Export Datacenter Info" +$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) +$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationComplete.TabIndex = 27 +$DatacenterCsvValidationComplete.Text = "" +#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ClusterCsvCheckBox.Checked = $true +$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ClusterCsvCheckBox.TabIndex = 3 +$ClusterCsvCheckBox.Text = "Export Cluster Info" +$ClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) +$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationComplete.TabIndex = 28 +$ClusterCsvValidationComplete.Text = "" +#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmHostCsvCheckBox.Checked = $true +$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmHostCsvCheckBox.TabIndex = 4 +$VmHostCsvCheckBox.Text = "Export VmHost Info" +$VmHostCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) +$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationComplete.TabIndex = 29 +$VmHostCsvValidationComplete.Text = "" +#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmCsvCheckBox.Checked = $true +$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmCsvCheckBox.TabIndex = 5 +$VmCsvCheckBox.Text = "Export Vm Info" +$VmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) +$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationComplete.TabIndex = 30 +$VmCsvValidationComplete.Text = "" +#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$TemplateCsvCheckBox.Checked = $true +$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$TemplateCsvCheckBox.TabIndex = 6 +$TemplateCsvCheckBox.Text = "Export Template Info" +$TemplateCsvCheckBox.UseVisualStyleBackColor = $true +#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label +$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) +$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationComplete.TabIndex = 31 +$TemplateCsvValidationComplete.Text = "" +#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreClusterCsvCheckBox.Checked = $true +$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreClusterCsvCheckBox.TabIndex = 7 +$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" +$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) +$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationComplete.TabIndex = 32 +$DatastoreClusterCsvValidationComplete.Text = "" +#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreCsvCheckBox.Checked = $true +$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreCsvCheckBox.TabIndex = 8 +$DatastoreCsvCheckBox.Text = "Export Datastore Info" +$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) +$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationComplete.TabIndex = 33 +$DatastoreCsvValidationComplete.Text = "" +#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VsSwitchCsvCheckBox.Checked = $true +$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) +$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VsSwitchCsvCheckBox.TabIndex = 9 +$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" +$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) +$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationComplete.TabIndex = 34 +$VsSwitchCsvValidationComplete.Text = "" +#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPortGroupCsvCheckBox.Checked = $true +$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) +$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPortGroupCsvCheckBox.TabIndex = 10 +$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" +$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) +$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationComplete.TabIndex = 35 +$VssPortGroupCsvValidationComplete.Text = "" +#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssVmkernelCsvCheckBox.Checked = $true +$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) +$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssVmkernelCsvCheckBox.TabIndex = 11 +$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" +$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) +$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationComplete.TabIndex = 36 +$VssVmkernelCsvValidationComplete.Text = "" +#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPnicCsvCheckBox.Checked = $true +$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) +$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPnicCsvCheckBox.TabIndex = 12 +$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" +$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) +$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationComplete.TabIndex = 37 +$VssPnicCsvValidationComplete.Text = "" +#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdSwitchCsvCheckBox.Checked = $true +$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) +$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdSwitchCsvCheckBox.TabIndex = 13 +$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" +$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) +$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationComplete.TabIndex = 38 +$VdSwitchCsvValidationComplete.Text = "" +#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPortGroupCsvCheckBox.Checked = $true +$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) +$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPortGroupCsvCheckBox.TabIndex = 14 +$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" +$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) +$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationComplete.TabIndex = 39 +$VdsPortGroupCsvValidationComplete.Text = "" +#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsVmkernelCsvCheckBox.Checked = $true +$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) +$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsVmkernelCsvCheckBox.TabIndex = 15 +$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" +$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) +$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationComplete.TabIndex = 40 +$VdsVmkernelCsvValidationComplete.Text = "" +#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPnicCsvCheckBox.Checked = $true +$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) +$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPnicCsvCheckBox.TabIndex = 16 +$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" +$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) +$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationComplete.TabIndex = 41 +$VdsPnicCsvValidationComplete.Text = "" +#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$FolderCsvCheckBox.Checked = $true +$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) +$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$FolderCsvCheckBox.TabIndex = 17 +$FolderCsvCheckBox.Text = "Export Folder Info" +$FolderCsvCheckBox.UseVisualStyleBackColor = $true +#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label +$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) +$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationComplete.TabIndex = 42 +$FolderCsvValidationComplete.Text = "" +#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$RdmCsvCheckBox.Checked = $true +$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) +$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$RdmCsvCheckBox.TabIndex = 18 +$RdmCsvCheckBox.Text = "Export RDM Info" +$RdmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label +$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) +$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationComplete.TabIndex = 43 +$RdmCsvValidationComplete.Text = "" +#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsRuleCsvCheckBox.Checked = $true +$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) +$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsRuleCsvCheckBox.TabIndex = 19 +$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" +$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) +$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationComplete.TabIndex = 44 +$DrsRuleCsvValidationComplete.Text = "" +#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsClusterGroupCsvCheckBox.Checked = $true +$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) +$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsClusterGroupCsvCheckBox.TabIndex = 20 +$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" +$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) +$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationComplete.TabIndex = 45 +$DrsClusterGroupCsvValidationComplete.Text = "" +#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsVmHostRuleCsvCheckBox.Checked = $true +$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) +$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsVmHostRuleCsvCheckBox.TabIndex = 21 +$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" +$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) +$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 +$DrsVmHostRuleCsvValidationComplete.Text = "" +#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ResourcePoolCsvCheckBox.Checked = $true +$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) +$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ResourcePoolCsvCheckBox.TabIndex = 22 +$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" +$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) +$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationComplete.TabIndex = 47 +$ResourcePoolCsvValidationComplete.Text = "" +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton = New-Object System.Windows.Forms.Button +$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) +$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureUncheckButton.TabIndex = 23 +$CaptureUncheckButton.Text = "Uncheck All" +$CaptureUncheckButton.UseVisualStyleBackColor = $false +$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton = New-Object System.Windows.Forms.Button +$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) +$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureCheckButton.TabIndex = 24 +$CaptureCheckButton.Text = "Check All" +$CaptureCheckButton.UseVisualStyleBackColor = $false +$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton = New-Object System.Windows.Forms.Button +$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) +$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureButton.TabIndex = 25 +$CaptureButton.Text = "Collect CSV Data" +$CaptureButton.UseVisualStyleBackColor = $false +$CaptureButton.BackColor = [System.Drawing.Color]::LightGray +$TabCapture.Controls.Add($CaptureCsvOutputLabel) +$TabCapture.Controls.Add($CaptureCsvOutputButton) +$TabCapture.Controls.Add($vCenterCsvCheckBox) +$TabCapture.Controls.Add($vCenterCsvValidationComplete) +$TabCapture.Controls.Add($DatacenterCsvCheckBox) +$TabCapture.Controls.Add($DatacenterCsvValidationComplete) +$TabCapture.Controls.Add($ClusterCsvCheckBox) +$TabCapture.Controls.Add($ClusterCsvValidationComplete) +$TabCapture.Controls.Add($VmHostCsvCheckBox) +$TabCapture.Controls.Add($VmHostCsvValidationComplete) +$TabCapture.Controls.Add($VmCsvCheckBox) +$TabCapture.Controls.Add($VmCsvValidationComplete) +$TabCapture.Controls.Add($TemplateCsvCheckBox) +$TabCapture.Controls.Add($TemplateCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) +$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreCsvCheckBox) +$TabCapture.Controls.Add($DatastoreCsvValidationComplete) +$TabCapture.Controls.Add($VsSwitchCsvCheckBox) +$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VssPnicCsvCheckBox) +$TabCapture.Controls.Add($VssPnicCsvValidationComplete) +$TabCapture.Controls.Add($VdSwitchCsvCheckBox) +$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VdsPnicCsvCheckBox) +$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) +$TabCapture.Controls.Add($FolderCsvCheckBox) +$TabCapture.Controls.Add($FolderCsvValidationComplete) +$TabCapture.Controls.Add($RdmCsvCheckBox) +$TabCapture.Controls.Add($RdmCsvValidationComplete) +$TabCapture.Controls.Add($DrsRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) +$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) +$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) +$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) +$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) +$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) +$TabCapture.Controls.Add($CaptureUncheckButton) +$TabCapture.Controls.Add($CaptureCheckButton) +$TabCapture.Controls.Add($CaptureButton) +#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDraw = New-Object System.Windows.Forms.TabPage +$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDraw.Location = New-Object System.Drawing.Point(4, 22) +$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDraw.Size = New-Object System.Drawing.Size(982, 486) +$TabDraw.TabIndex = 2 +$TabDraw.Text = "Draw Visio" +$TabDraw.UseVisualStyleBackColor = $true +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton = New-Object System.Windows.Forms.Button +$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) +$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) +$OpenVisioButton.TabIndex = 83 +$OpenVisioButton.Text = "Open Visio Drawing" +$OpenVisioButton.UseVisualStyleBackColor = $false +$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton = New-Object System.Windows.Forms.Button +$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) +$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawCheckButton.TabIndex = 82 +$DrawCheckButton.Text = "Check All" +$DrawCheckButton.UseVisualStyleBackColor = $false +$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton = New-Object System.Windows.Forms.Button +$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawButton.Location = New-Object System.Drawing.Point(448, 450) +$DrawButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawButton.TabIndex = 81 +$DrawButton.Text = "Draw Visio" +$DrawButton.UseVisualStyleBackColor = $false +$DrawButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton = New-Object System.Windows.Forms.Button +$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) +$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawUncheckButton.TabIndex = 80 +$DrawUncheckButton.Text = "Uncheck All" +$DrawUncheckButton.UseVisualStyleBackColor = $false +$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOutputLabel = New-Object System.Windows.Forms.Label +$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) +$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) +$VisioOutputLabel.TabIndex = 46 +$VisioOutputLabel.Text = "Visio Output Folder:" +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton = New-Object System.Windows.Forms.Button +$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) +$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) +$VisioOpenOutputButton.TabIndex = 47 +$VisioOpenOutputButton.Text = "Select Visio Output Folder" +$VisioOpenOutputButton.UseVisualStyleBackColor = $false +$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputLabel = New-Object System.Windows.Forms.Label +$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) +$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) +$DrawCsvInputLabel.TabIndex = 0 +$DrawCsvInputLabel.Text = "CSV Input Folder:" +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton = New-Object System.Windows.Forms.Button +$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) +$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) +$DrawCsvInputButton.TabIndex = 1 +$DrawCsvInputButton.Text = "Select CSV Input Folder" +$DrawCsvInputButton.UseVisualStyleBackColor = $false +$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidation = New-Object System.Windows.Forms.Label +$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$vCenterCsvValidation.TabIndex = 2 +$vCenterCsvValidation.Text = "vCenter CSV File:" +#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) +$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationCheck.TabIndex = 3 +$vCenterCsvValidationCheck.Text = "" +#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidation = New-Object System.Windows.Forms.Label +$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatacenterCsvValidation.TabIndex = 4 +$DatacenterCsvValidation.Text = "Datacenter CSV File:" +#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) +$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationCheck.TabIndex = 5 +$DatacenterCsvValidationCheck.Text = "" +#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidation = New-Object System.Windows.Forms.Label +$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ClusterCsvValidation.TabIndex = 6 +$ClusterCsvValidation.Text = "Cluster CSV File:" +#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) +$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationCheck.TabIndex = 7 +$ClusterCsvValidationCheck.Text = "" +#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidation = New-Object System.Windows.Forms.Label +$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmHostCsvValidation.TabIndex = 8 +$VmHostCsvValidation.Text = "VmHost CSV File:" +#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) +$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationCheck.TabIndex = 9 +$VmHostCsvValidationCheck.Text = "" +#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidation = New-Object System.Windows.Forms.Label +$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmCsvValidation.TabIndex = 10 +$VmCsvValidation.Text = "VM CSV File:" +#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) +$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationCheck.TabIndex = 11 +$VmCsvValidationCheck.Text = "" +#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidation = New-Object System.Windows.Forms.Label +$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$TemplateCsvValidation.TabIndex = 12 +$TemplateCsvValidation.Text = "Template CSV File:" +#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label +$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) +$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationCheck.TabIndex = 13 +$TemplateCsvValidationCheck.Text = "" +#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreClusterCsvValidation.TabIndex = 14 +$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" +#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) +$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationCheck.TabIndex = 15 +$DatastoreClusterCsvValidationCheck.Text = "" +#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreCsvValidation.TabIndex = 16 +$DatastoreCsvValidation.Text = "Datastore CSV File:" +#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) +$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationCheck.TabIndex = 17 +$DatastoreCsvValidationCheck.Text = "" +#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) +$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VsSwitchCsvValidation.TabIndex = 18 +$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" +#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) +$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationCheck.TabIndex = 19 +$VsSwitchCsvValidationCheck.Text = "" +#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) +$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPortGroupCsvValidation.TabIndex = 20 +$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" +#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) +$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationCheck.TabIndex = 21 +$VssPortGroupCsvValidationCheck.Text = "" +#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) +$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssVmkernelCsvValidation.TabIndex = 22 +$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" +#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) +$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationCheck.TabIndex = 23 +$VssVmkernelCsvValidationCheck.Text = "" +#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidation = New-Object System.Windows.Forms.Label +$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) +$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPnicCsvValidation.TabIndex = 24 +$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" +#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) +$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationCheck.TabIndex = 25 +$VssPnicCsvValidationCheck.Text = "" +#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) +$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdSwitchCsvValidation.TabIndex = 26 +$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" +#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) +$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationCheck.TabIndex = 27 +$VdSwitchCsvValidationCheck.Text = "" +#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) +$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPortGroupCsvValidation.TabIndex = 28 +$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" +#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) +$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationCheck.TabIndex = 29 +$VdsPortGroupCsvValidationCheck.Text = "" +#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) +$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsVmkernelCsvValidation.TabIndex = 30 +$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" +#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) +$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationCheck.TabIndex = 31 +$VdsVmkernelCsvValidationCheck.Text = "" +#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) +$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPnicCsvValidation.TabIndex = 32 +$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" +#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) +$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationCheck.TabIndex = 33 +$VdsPnicCsvValidationCheck.Text = "" +#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidation = New-Object System.Windows.Forms.Label +$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) +$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$FolderCsvValidation.TabIndex = 34 +$FolderCsvValidation.Text = "Folder CSV File:" +#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label +$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) +$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationCheck.TabIndex = 35 +$FolderCsvValidationCheck.Text = "" +#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidation = New-Object System.Windows.Forms.Label +$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) +$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$RdmCsvValidation.TabIndex = 36 +$RdmCsvValidation.Text = "RDM CSV File:" +#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label +$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) +$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationCheck.TabIndex = 37 +$RdmCsvValidationCheck.Text = "" +#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) +$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsRuleCsvValidation.TabIndex = 38 +$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" +#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) +$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationCheck.TabIndex = 39 +$DrsRuleCsvValidationCheck.Text = "" +#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) +$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsClusterGroupCsvValidation.TabIndex = 40 +$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" +#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) +$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationCheck.TabIndex = 41 +$DrsClusterGroupCsvValidationCheck.Text = "" +#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) +$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsVmHostRuleCsvValidation.TabIndex = 42 +$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" +#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) +$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 +$DrsVmHostRuleCsvValidationCheck.Text = "" +#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) +$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ResourcePoolCsvValidation.TabIndex = 44 +$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" +#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) +$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationCheck.TabIndex = 45 +$ResourcePoolCsvValidationCheck.Text = "" +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton = New-Object System.Windows.Forms.Button +$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) +$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) +$CsvValidationButton.TabIndex = 2 +$CsvValidationButton.Text = "Check for CSVs" +$CsvValidationButton.UseVisualStyleBackColor = $false +$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Host_DrawCheckBox.Checked = $true +$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) +$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Host_DrawCheckBox.TabIndex = 48 +$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" +$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_Complete = New-Object System.Windows.Forms.Label +$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) +$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Host_Complete.TabIndex = 49 +$VM_to_Host_Complete.Text = "" +#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Folder_DrawCheckBox.Checked = $true +$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) +$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Folder_DrawCheckBox.TabIndex = 50 +$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" +$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label +$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) +$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Folder_Complete.TabIndex = 51 +$VM_to_Folder_Complete.Text = "" +#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMs_with_RDMs_DrawCheckBox.Checked = $true +$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) +$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 +$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" +$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label +$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) +$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMs_with_RDMs_Complete.TabIndex = 53 +$VMs_with_RDMs_Complete.Text = "" +#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$SRM_Protected_VMs_DrawCheckBox.Checked = $true +$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) +$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 +$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" +$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label +$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) +$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$SRM_Protected_VMs_Complete.TabIndex = 55 +$SRM_Protected_VMs_Complete.Text = "" +#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Datastore_DrawCheckBox.Checked = $true +$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) +$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Datastore_DrawCheckBox.TabIndex = 56 +$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" +$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label +$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) +$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Datastore_Complete.TabIndex = 57 +$VM_to_Datastore_Complete.Text = "" +#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_ResourcePool_DrawCheckBox.Checked = $true +$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) +$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 +$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" +$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label +$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) +$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_ResourcePool_Complete.TabIndex = 59 +$VM_to_ResourcePool_Complete.Text = "" +#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Datastore_to_Host_DrawCheckBox.Checked = $true +$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) +$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$Datastore_to_Host_DrawCheckBox.TabIndex = 60 +$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" +$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label +$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) +$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Datastore_to_Host_Complete.TabIndex = 61 +$Datastore_to_Host_Complete.Text = "" +#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true +$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) +$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 +$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" +$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label +$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) +$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) +$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 +$PhysicalNIC_to_vSwitch_Complete.Text = "" +#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSS_to_Host_DrawCheckBox.Checked = $true +$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) +$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSS_to_Host_DrawCheckBox.TabIndex = 64 +$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" +$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) +$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSS_to_Host_Complete.TabIndex = 65 +$VSS_to_Host_Complete.Text = "" +#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VSS_DrawCheckBox.Checked = $true +$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) +$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VSS_DrawCheckBox.TabIndex = 66 +$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" +$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) +$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VSS_Complete.TabIndex = 67 +$VMK_to_VSS_Complete.Text = "" +#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) +$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 +$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" +$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) +$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSSPortGroup_to_VM_Complete.TabIndex = 69 +$VSSPortGroup_to_VM_Complete.Text = "" +#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDS_to_Host_DrawCheckBox.Checked = $true +$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) +$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDS_to_Host_DrawCheckBox.TabIndex = 70 +$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" +$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) +$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDS_to_Host_Complete.TabIndex = 71 +$VDS_to_Host_Complete.Text = "" +#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VDS_DrawCheckBox.Checked = $true +$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) +$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VDS_DrawCheckBox.TabIndex = 72 +$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" +$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) +$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VDS_Complete.TabIndex = 73 +$VMK_to_VDS_Complete.Text = "" +#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) +$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 +$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" +$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) +$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDSPortGroup_to_VM_Complete.TabIndex = 75 +$VDSPortGroup_to_VM_Complete.Text = "" +#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true +$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) +$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 +$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" +$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label +$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) +$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Cluster_to_DRS_Rule_Complete.TabIndex = 77 +$Cluster_to_DRS_Rule_Complete.Text = "" + +$TabDraw.Controls.Add($OpenVisioButton) +$TabDraw.Controls.Add($DrawCheckButton) +$TabDraw.Controls.Add($DrawButton) +$TabDraw.Controls.Add($DrawUncheckButton) +$TabDraw.Controls.Add($VisioOutputLabel) +$TabDraw.Controls.Add($VisioOpenOutputButton) +$TabDraw.Controls.Add($DrawCsvInputLabel) +$TabDraw.Controls.Add($DrawCsvInputButton) +$TabDraw.Controls.Add($vCenterCsvValidation) +$TabDraw.Controls.Add($vCenterCsvValidationCheck) +$TabDraw.Controls.Add($DatacenterCsvValidation) +$TabDraw.Controls.Add($DatacenterCsvValidationCheck) +$TabDraw.Controls.Add($ClusterCsvValidation) +$TabDraw.Controls.Add($ClusterCsvValidationCheck) +$TabDraw.Controls.Add($VmHostCsvValidation) +$TabDraw.Controls.Add($VmHostCsvValidationCheck) +$TabDraw.Controls.Add($VmCsvValidation) +$TabDraw.Controls.Add($VmCsvValidationCheck) +$TabDraw.Controls.Add($TemplateCsvValidation) +$TabDraw.Controls.Add($TemplateCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreClusterCsvValidation) +$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreCsvValidation) +$TabDraw.Controls.Add($DatastoreCsvValidationCheck) +$TabDraw.Controls.Add($VsSwitchCsvValidation) +$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VssPortGroupCsvValidation) +$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VssVmkernelCsvValidation) +$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VssPnicCsvValidation) +$TabDraw.Controls.Add($VssPnicCsvValidationCheck) +$TabDraw.Controls.Add($VdSwitchCsvValidation) +$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VdsPortGroupCsvValidation) +$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VdsVmkernelCsvValidation) +$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VdsPnicCsvValidation) +$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) +$TabDraw.Controls.Add($FolderCsvValidation) +$TabDraw.Controls.Add($FolderCsvValidationCheck) +$TabDraw.Controls.Add($RdmCsvValidation) +$TabDraw.Controls.Add($RdmCsvValidationCheck) +$TabDraw.Controls.Add($DrsRuleCsvValidation) +$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) +$TabDraw.Controls.Add($ResourcePoolCsvValidation) +$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) +$TabDraw.Controls.Add($CsvValidationButton) +$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Host_Complete) +$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Folder_Complete) +$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) +$TabDraw.Controls.Add($VMs_with_RDMs_Complete) +$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) +$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) +$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Datastore_Complete) +$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) +$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($Datastore_to_Host_Complete) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) +$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VSS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VSS_Complete) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VDS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VDS_Complete) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) +$SubTab.Controls.Add($TabDirections) +$SubTab.Controls.Add($TabCapture) +$SubTab.Controls.Add($TabDraw) +$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText +$SubTab.SelectedIndex = 0 +$vDiagram.Controls.Add($MainMenu) +$vDiagram.Controls.Add($MainTab) +$vDiagram.Controls.Add($SubTab) +#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$VisioBrowse.Description = "Select a directory" +$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$DrawCsvBrowse.Description = "Select a directory" +$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$CaptureCsvBrowse.Description = "Select a directory" +$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + +#endregion + +#region Custom Code +#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellCheck = $PSVersionTable.PSVersion +if ($PowershellCheck.Major -ge 4) +{ + $PowershellInstalled.Forecolor = "Green" + $PowershellInstalled.Text = "Installed Version $PowershellCheck" +} +else +{ + $PowershellInstalled.Forecolor = "Red" + $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" +} +#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) +$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) +if ($PowerCliModuleCheck -ne $null) +{ + $PowerCliModuleInstalled.Forecolor = "Green" + $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" +} +else +{ + $PowerCliModuleInstalled.Forecolor = "Red" + $PowerCliModuleInstalled.Text = "Not Installed" +} +#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerClI Installed" +} +elseif ($PowerCliModuleCheck -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerCLI Module Installed" +} +else +{ + $PowerCliInstalled.Forecolor = "Red" + $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" +} +#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) +{ + $VisioInstalled.Forecolor = "Green" + $VisioInstalled.Text = "Installed" +} +else +{ + $VisioInstalled.Forecolor = "Red" + $VisioInstalled.Text = "Visio is Not Installed" +} +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) +$ConnectButton.Add_Click({ Connect_vCenter_Main }) +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } +Check_CaptureCsvFolder } ) +#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton.Add_Click({ + if($CaptureCsvFolder -eq $null) + { + $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" + } + else + { + if ($vCenterCsvCheckBox.Checked -eq "True") + { + $vCenterCsvValidationComplete.Forecolor = "Blue" + $vCenterCsvValidationComplete.Text = "Processing ....." + vCenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" + $vCenterCsvComplete = Test-Path $vCenterExportFileComplete + if ($vCenterCsvComplete -eq $True) + { + $vCenterCsvValidationComplete.Forecolor = "Green" + $vCenterCsvValidationComplete.Text = "Complete" + } + else + { + $vCenterCsvValidationComplete.Forecolor = "Red" + $vCenterCsvValidationComplete.Text = "Not Complete" + } + } + Connect_vCenter + $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager + if ($Connected -eq $null) { Connect_vCenter_Main } + $ConnectButton.Forecolor = [System.Drawing.Color]::Green + $ConnectButton.Text = "Connected to $DefaultViserver" + if ($DatacenterCsvCheckBox.Checked -eq "True") + { + $DatacenterCsvValidationComplete.Forecolor = "Blue" + $DatacenterCsvValidationComplete.Text = "Processing ....." + Datacenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" + $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete + if ($DatacenterCsvComplete -eq $True) + { + $DatacenterCsvValidationComplete.Forecolor = "Green" + $DatacenterCsvValidationComplete.Text = "Complete" + } + else + { + $DatacenterCsvValidationComplete.Forecolor = "Red" + $DatacenterCsvValidationComplete.Text = "Not Complete" + } + } + if ($ClusterCsvCheckBox.Checked -eq "True") + { + $ClusterCsvValidationComplete.Forecolor = "Blue" + $ClusterCsvValidationComplete.Text = "Processing ....." + Cluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" + $ClusterCsvComplete = Test-Path $ClusterExportFileComplete + if ($ClusterCsvComplete -eq $True) + { + $ClusterCsvValidationComplete.Forecolor = "Green" + $ClusterCsvValidationComplete.Text = "Complete" + } + else + { + $ClusterCsvValidationComplete.Forecolor = "Red" + $ClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmHostCsvCheckBox.Checked -eq "True") + { + $VmHostCsvValidationComplete.Forecolor = "Blue" + $VmHostCsvValidationComplete.Text = "Processing ....." + VmHost_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" + $VmHostCsvComplete = Test-Path $VmHostExportFileComplete + if ($VmHostCsvComplete -eq $True) + { + $VmHostCsvValidationComplete.Forecolor = "Green" + $VmHostCsvValidationComplete.Text = "Complete" + } + else + { + $VmHostCsvValidationComplete.Forecolor = "Red" + $VmHostCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmCsvCheckBox.Checked -eq "True") + { + $VmCsvValidationComplete.Forecolor = "Blue" + $VmCsvValidationComplete.Text = "Processing ....." + Vm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" + $VmCsvComplete = Test-Path $VmExportFileComplete + if ($VmCsvComplete -eq $True) + { + $VmCsvValidationComplete.Forecolor = "Green" + $VmCsvValidationComplete.Text = "Complete" + } + else + { + $VmCsvValidationComplete.Forecolor = "Red" + $VmCsvValidationComplete.Text = "Not Complete" + } + } + if ($TemplateCsvCheckBox.Checked -eq "True") + { + $TemplateCsvValidationComplete.Forecolor = "Blue" + $TemplateCsvValidationComplete.Text = "Processing ....." + Template_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" + $TemplateCsvComplete = Test-Path $TemplateExportFileComplete + if ($TemplateCsvComplete -eq $True) + { + $TemplateCsvValidationComplete.Forecolor = "Green" + $TemplateCsvValidationComplete.Text = "Complete" + } + else + { + $TemplateCsvValidationComplete.Forecolor = "Red" + $TemplateCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreClusterCsvCheckBox.Checked -eq "True") + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" + $DatastoreClusterCsvValidationComplete.Text = "Processing ....." + DatastoreCluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete + if ($DatastoreClusterCsvComplete -eq $True) + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Green" + $DatastoreClusterCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Red" + $DatastoreClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreCsvCheckBox.Checked -eq "True") + { + $DatastoreCsvValidationComplete.Forecolor = "Blue" + $DatastoreCsvValidationComplete.Text = "Processing ....." + Datastore_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" + $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete + if ($DatastoreCsvComplete -eq $True) + { + $DatastoreCsvValidationComplete.Forecolor = "Green" + $DatastoreCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreCsvValidationComplete.Forecolor = "Red" + $DatastoreCsvValidationComplete.Text = "Not Complete" + } + } + if ($VsSwitchCsvCheckBox.Checked -eq "True") + { + $VsSwitchCsvValidationComplete.Forecolor = "Blue" + $VsSwitchCsvValidationComplete.Text = "Processing ....." + VsSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" + $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete + if ($vSSwitchCsvComplete -eq $True) + { + $vSSwitchCsvValidationComplete.Forecolor = "Green" + $vSSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $vSSwitchCsvValidationComplete.Forecolor = "Red" + $vSSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPortGroupCsvCheckBox.Checked -eq "True") + { + $VssPortGroupCsvValidationComplete.Forecolor = "Blue" + $VssPortGroupCsvValidationComplete.Text = "Processing ....." + VssPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete + if ($VssPortGroupCsvComplete -eq $True) + { + $VssPortGroupCsvValidationComplete.Forecolor = "Green" + $VssPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VssPortGroupCsvValidationComplete.Forecolor = "Red" + $VssPortGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssVmkernelCsvCheckBox.Checked -eq "True") + { + $VssVmkernelCsvValidationComplete.Forecolor = "Blue" + $VssVmkernelCsvValidationComplete.Text = "Processing ....." + VssVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete + if ($VssVmkernelCsvComplete -eq $True) + { + $VssVmkernelCsvValidationComplete.Forecolor = "Green" + $VssVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VssVmkernelCsvValidationComplete.Forecolor = "Red" + $VssVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPnicCsvCheckBox.Checked -eq "True") + { + $VssPnicCsvValidationComplete.Forecolor = "Blue" + $VssPnicCsvValidationComplete.Text = "Processing ....." + VssPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" + $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete + if ($VssPnicCsvComplete -eq $True) + { + $VssPnicCsvValidationComplete.Forecolor = "Green" + $VssPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VssPnicCsvValidationComplete.Forecolor = "Red" + $VssPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdSwitchCsvCheckBox.Checked -eq "True") + { + $VdSwitchCsvValidationComplete.Forecolor = "Blue" + $VdSwitchCsvValidationComplete.Text = "Processing ....." + VdSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" + $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete + if ($VdSwitchCsvComplete -eq $True) + { + $VdSwitchCsvValidationComplete.Forecolor = "Green" + $VdSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $VdSwitchCsvValidationComplete.Forecolor = "Red" + $VdSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPortGroupCsvCheckBox.Checked -eq "True") + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" + $VdsPortGroupCsvValidationComplete.Text = "Processing ....." + VdsPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete + if ($VdsPortGroupCsvComplete -eq $True) + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Green" + $VdsPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Red" + $VdsPortGroupCsvValidationComplete.Text = "Not Complete" + + } + } + if ($VdsVmkernelCsvCheckBox.Checked -eq "True") + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" + $VdsVmkernelCsvValidationComplete.Text = "Processing ....." + VdsVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete + if ($VdsVmkernelCsvComplete -eq $True) + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Green" + $VdsVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Red" + $VdsVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPnicCsvCheckBox.Checked -eq "True") + { + $VdsPnicCsvValidationComplete.Forecolor = "Blue" + $VdsPnicCsvValidationComplete.Text = "Processing ....." + VdsPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" + $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete + if ($VdsPnicCsvComplete -eq $True) + { + $VdsPnicCsvValidationComplete.Forecolor = "Green" + $VdsPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPnicCsvValidationComplete.Forecolor = "Red" + $VdsPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($FolderCsvCheckBox.Checked -eq "True") + { + $FolderCsvValidationComplete.Forecolor = "Blue" + $FolderCsvValidationComplete.Text = "Processing ....." + Folder_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" + $FolderCsvComplete = Test-Path $FolderExportFileComplete + if ($FolderCsvComplete -eq $True) + { + $FolderCsvValidationComplete.Forecolor = "Green" + $FolderCsvValidationComplete.Text = "Complete" + } + else + { + $FolderCsvValidationComplete.Forecolor = "Red" + $FolderCsvValidationComplete.Text = "Not Complete" + } + } + if ($RdmCsvCheckBox.Checked -eq "True") + { + $RdmCsvValidationComplete.Forecolor = "Blue" + $RdmCsvValidationComplete.Text = "Processing ....." + Rdm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" + $RdmCsvComplete = Test-Path $RdmExportFileComplete + if ($RdmCsvComplete -eq $True) + { + $RdmCsvValidationComplete.Forecolor = "Green" + $RdmCsvValidationComplete.Text = "Complete" + } + else + { + $RdmCsvValidationComplete.Forecolor = "Red" + $RdmCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsRuleCsvCheckBox.Checked -eq "True") + { + $DrsRuleCsvValidationComplete.Forecolor = "Blue" + $DrsRuleCsvValidationComplete.Text = "Processing ....." + Drs_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" + $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete + if ($DrsRuleCsvComplete -eq $True) + { + $DrsRuleCsvValidationComplete.Forecolor = "Green" + $DrsRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsRuleCsvValidationComplete.Forecolor = "Red" + $DrsRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" + $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." + Drs_Cluster_Group_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete + if ($DrsClusterGroupCsvComplete -eq $True) + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" + $DrsClusterGroupCsvValidationComplete.Text = "Complete" + } + else + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" + $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" + $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." + Drs_VmHost_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete + if ($DrsVmHostRuleCsvComplete -eq $True) + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" + $DrsVmHostRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" + $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($ResourcePoolCsvCheckBox.Checked -eq "True") + { + $ResourcePoolCsvValidationComplete.Forecolor = "Blue" + $ResourcePoolCsvValidationComplete.Text = "Processing ....." + Resource_Pool_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete + if ($ResourcePoolCsvComplete -eq $True) + { + $ResourcePoolCsvValidationComplete.Forecolor = "Green" + $ResourcePoolCsvValidationComplete.Text = "Complete" + } + else + { + $ResourcePoolCsvValidationComplete.Forecolor = "Red" + $ResourcePoolCsvValidationComplete.Text = "Not Complete" + } + } + Disconnect_vCenter + $ConnectButton.Forecolor = [System.Drawing.Color]::Red + $ConnectButton.Text = "Disconnected" + $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" + } +}) +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) +$TabDraw.Controls.Add($DrawCsvInputButton) +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton.Add_Click( +{ + $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text + $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" + $vCenterCsvExists = Test-Path $vCenterExportFile + $TabDraw.Controls.Add($vCenterCsvValidationCheck) + if ($vCenterCsvExists -eq $True) + { + + $vCenterCsvValidationCheck.Forecolor = "Green" + $vCenterCsvValidationCheck.Text = "Present" + } + else + { + $vCenterCsvValidationCheck.Forecolor = "Red" + $vCenterCsvValidationCheck.Text = "Not Present" + } + + $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" + $DatacenterCsvExists = Test-Path $DatacenterExportFile + $TabDraw.Controls.Add($DatacenterCsvValidationCheck) + + if ($DatacenterCsvExists -eq $True) + { + $DatacenterCsvValidationCheck.Forecolor = "Green" + $DatacenterCsvValidationCheck.Text = "Present" + } + else + { + $DatacenterCsvValidationCheck.Forecolor = "Red" + $DatacenterCsvValidationCheck.Text = "Not Present" + } + + $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" + $ClusterCsvExists = Test-Path $ClusterExportFile + $TabDraw.Controls.Add($ClusterCsvValidationCheck) + + if ($ClusterCsvExists -eq $True) + { + $ClusterCsvValidationCheck.Forecolor = "Green" + $ClusterCsvValidationCheck.Text = "Present" + } + else + { + $ClusterCsvValidationCheck.Forecolor = "Red" + $ClusterCsvValidationCheck.Text = "Not Present" + } + + $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" + $VmHostCsvExists = Test-Path $VmHostExportFile + $TabDraw.Controls.Add($VmHostCsvValidationCheck) + + if ($VmHostCsvExists -eq $True) + { + $VmHostCsvValidationCheck.Forecolor = "Green" + $VmHostCsvValidationCheck.Text = "Present" + } + else + { + $VmHostCsvValidationCheck.Forecolor = "Red" + $VmHostCsvValidationCheck.Text = "Not Present" + } + + $VmExportFile = $CsvInputDir + "-VmExport.csv" + $VmCsvExists = Test-Path $VmExportFile + $TabDraw.Controls.Add($VmCsvValidationCheck) + + if ($VmCsvExists -eq $True) + { + $VmCsvValidationCheck.Forecolor = "Green" + $VmCsvValidationCheck.Text = "Present" + } + else + { + $VmCsvValidationCheck.Forecolor = "Red" + $VmCsvValidationCheck.Text = "Not Present" + } + + $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" + $TemplateCsvExists = Test-Path $TemplateExportFile + $TabDraw.Controls.Add($TemplateCsvValidationCheck) + + if ($TemplateCsvExists -eq $True) + { + $TemplateCsvValidationCheck.Forecolor = "Green" + $TemplateCsvValidationCheck.Text = "Present" + } + else + { + $TemplateCsvValidationCheck.Forecolor = "Red" + $TemplateCsvValidationCheck.Text = "Not Present" + } + + $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile + $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) + + if ($DatastoreClusterCsvExists -eq $True) + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Green" + $DatastoreClusterCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Red" + $DatastoreClusterCsvValidationCheck.Text = "Not Present" + } + + $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" + $DatastoreCsvExists = Test-Path $DatastoreExportFile + $TabDraw.Controls.Add($DatastoreCsvValidationCheck) + + if ($DatastoreCsvExists -eq $True) + { + $DatastoreCsvValidationCheck.Forecolor = "Green" + $DatastoreCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreCsvValidationCheck.Forecolor = "Red" + $DatastoreCsvValidationCheck.Text = "Not Present" + } + + $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" + $VsSwitchCsvExists = Test-Path $VsSwitchExportFile + $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) + + if ($VsSwitchCsvExists -eq $True) + { + $VsSwitchCsvValidationCheck.Forecolor = "Green" + $VsSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VsSwitchCsvValidationCheck.Forecolor = "Red" + $VsSwitchCsvValidationCheck.Text = "Not Present" + $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile + $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) + + if ($VssPortGroupCsvExists -eq $True) + { + $VssPortGroupCsvValidationCheck.Forecolor = "Green" + $VssPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VssPortGroupCsvValidationCheck.Forecolor = "Red" + $VssPortGroupCsvValidationCheck.Text = "Not Present" + $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile + $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) + + if ($VssVmkernelCsvExists -eq $True) + { + $VssVmkernelCsvValidationCheck.Forecolor = "Green" + $VssVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VssVmkernelCsvValidationCheck.Forecolor = "Red" + $VssVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" + $VssPnicCsvExists = Test-Path $VssPnicExportFile + $TabDraw.Controls.Add($VssPnicCsvValidationCheck) + + if ($VssPnicCsvExists -eq $True) + { + $VssPnicCsvValidationCheck.Forecolor = "Green" + $VssPnicCsvValidationCheck.Text = "Present" + } + else + { + $VssPnicCsvValidationCheck.Forecolor = "Red" + $VssPnicCsvValidationCheck.Text = "Not Present" + } + + $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" + $VdSwitchCsvExists = Test-Path $VdSwitchExportFile + $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) + + if ($VdSwitchCsvExists -eq $True) + { + $VdSwitchCsvValidationCheck.Forecolor = "Green" + $VdSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VdSwitchCsvValidationCheck.Forecolor = "Red" + $VdSwitchCsvValidationCheck.Text = "Not Present" + $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile + $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) + + if ($VdsPortGroupCsvExists -eq $True) + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Green" + $VdsPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Red" + $VdsPortGroupCsvValidationCheck.Text = "Not Present" + $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile + $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) + + if ($VdsVmkernelCsvExists -eq $True) + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Green" + $VdsVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Red" + $VdsVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" + $VdsPnicCsvExists = Test-Path $VdsPnicExportFile + $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) + + if ($VdsPnicCsvExists -eq $True) + { + $VdsPnicCsvValidationCheck.Forecolor = "Green" + $VdsPnicCsvValidationCheck.Text = "Present" + } + else + { + $VdsPnicCsvValidationCheck.Forecolor = "Red" + $VdsPnicCsvValidationCheck.Text = "Not Present" + } + + $FolderExportFile = $CsvInputDir + "-FolderExport.csv" + $FolderCsvExists = Test-Path $FolderExportFile + $TabDraw.Controls.Add($FolderCsvValidationCheck) + + if ($FolderCsvExists -eq $True) + { + $FolderCsvValidationCheck.Forecolor = "Green" + $FolderCsvValidationCheck.Text = "Present" + } + else + { + $FolderCsvValidationCheck.Forecolor = "Red" + $FolderCsvValidationCheck.Text = "Not Present" + } + + $RdmExportFile = $CsvInputDir + "-RdmExport.csv" + $RdmCsvExists = Test-Path $RdmExportFile + $TabDraw.Controls.Add($RdmCsvValidationCheck) + + if ($RdmCsvExists -eq $True) + { + $RdmCsvValidationCheck.Forecolor = "Green" + $RdmCsvValidationCheck.Text = "Present" + } + else + { + $RdmCsvValidationCheck.Forecolor = "Red" + $RdmCsvValidationCheck.Text = "Not Present" + $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" + $DrsRuleCsvExists = Test-Path $DrsRuleExportFile + $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) + + if ($DrsRuleCsvExists -eq $True) + { + $DrsRuleCsvValidationCheck.Forecolor = "Green" + $DrsRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsRuleCsvValidationCheck.Forecolor = "Red" + $DrsRuleCsvValidationCheck.Text = "Not Present" + $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile + $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) + + if ($DrsClusterGroupCsvExists -eq $True) + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" + $DrsClusterGroupCsvValidationCheck.Text = "Present" + } + else + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" + $DrsClusterGroupCsvValidationCheck.Text = "Not Present" + } + + $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile + $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) + + if ($DrsVmHostRuleCsvExists -eq $True) + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" + $DrsVmHostRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" + $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" + } + + $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile + $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) + + if ($ResourcePoolCsvExists -eq $True) + { + $ResourcePoolCsvValidationCheck.Forecolor = "Green" + $ResourcePoolCsvValidationCheck.Text = "Present" + } + else + { + $ResourcePoolCsvValidationCheck.Forecolor = "Red" + $ResourcePoolCsvValidationCheck.Text = "Not Present" + $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" + } +} ) +$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) +$TabDraw.Controls.Add($CsvValidationButton) +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) +$TabDraw.Controls.Add($VisioOpenOutputButton) +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) +$TabDraw.Controls.Add($DrawUncheckButton) +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) +$TabDraw.Controls.Add($DrawCheckButton) +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; +if ($VM_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Host_Complete.Forecolor = "Blue" + $VM_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Host_Complete) + VM_to_Host + $VM_to_Host_Complete.Forecolor = "Green" + $VM_to_Host_Complete.Text = "Complete" + $TabDraw.Controls.Add($VM_to_Host_Complete) +} +if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Folder_Complete.Forecolor = "Blue" + $VM_to_Folder_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Folder_Complete) + VM_to_Folder + $VM_to_Folder_Complete.Forecolor = "Green" + $VM_to_Folder_Complete.Text = "Complete" +} +if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") +{ + $VMs_with_RDMs_Complete.Forecolor = "Blue" + $VMs_with_RDMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMs_with_RDMs_Complete) + VMs_with_RDMs + $VMs_with_RDMs_Complete.Forecolor = "Green" + $VMs_with_RDMs_Complete.Text = "Complete" +} +if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") +{ + $SRM_Protected_VMs_Complete.Forecolor = "Blue" + $SRM_Protected_VMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) + SRM_Protected_VMs + $SRM_Protected_VMs_Complete.Forecolor = "Green" + $SRM_Protected_VMs_Complete.Text = "Complete" +} +if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Datastore_Complete.Forecolor = "Blue" + $VM_to_Datastore_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Datastore_Complete) + VM_to_Datastore + $VM_to_Datastore_Complete.Forecolor = "Green" + $VM_to_Datastore_Complete.Text = "Complete" +} +if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") +{ + $VM_to_ResourcePool_Complete.Forecolor = "Blue" + $VM_to_ResourcePool_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) + VM_to_ResourcePool + $VM_to_ResourcePool_Complete.Forecolor = "Green" + $VM_to_ResourcePool_Complete.Text = "Complete" +} +if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") +{ + $Datastore_to_Host_Complete.Forecolor = "Blue" + $Datastore_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Datastore_to_Host_Complete) + Datastore_to_Host + $Datastore_to_Host_Complete.Forecolor = "Green" + $Datastore_to_Host_Complete.Text = "Complete" +} +if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") +{ + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" + $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) + PhysicalNIC_to_vSwitch + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" + $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" +} +if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VSS_to_Host_Complete.Forecolor = "Blue" + $VSS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSS_to_Host_Complete) + VSS_to_Host + $VSS_to_Host_Complete.Forecolor = "Green" + $VSS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VSS_Complete.Forecolor = "Blue" + $VMK_to_VSS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VSS_Complete) + VMK_to_VSS + $VMK_to_VSS_Complete.Forecolor = "Green" + $VMK_to_VSS_Complete.Text = "Complete" +} +if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VSSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) + VSSPortGroup_to_VM + $VSSPortGroup_to_VM_Complete.Forecolor = "Green" + $VSSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VDS_to_Host_Complete.Forecolor = "Blue" + $VDS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDS_to_Host_Complete) + VDS_to_Host + $VDS_to_Host_Complete.Forecolor = "Green" + $VDS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VDS_Complete.Forecolor = "Blue" + $VMK_to_VDS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VDS_Complete) + VMK_to_VDS + $VMK_to_VDS_Complete.Forecolor = "Green" + $VMK_to_VDS_Complete.Text = "Complete" +} +if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VDSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) + VDSPortGroup_to_VM + $VDSPortGroup_to_VM_Complete.Forecolor = "Green" + $VDSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") +{ + $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" + $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) + Cluster_to_DRS_Rule + $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" + $Cluster_to_DRS_Rule_Complete.Text = "Complete" +}; +$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) +$TabDraw.Controls.Add($DrawButton) +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton.Add_Click({Open_Final_Visio}) +$TabDraw.Controls.Add($OpenVisioButton) + +#endregion + +#region Event Loop + +function Main{ + [System.Windows.Forms.Application]::EnableVisualStyles() + [System.Windows.Forms.Application]::Run($vDiagram) +} + +#endregion + +#endregion + +#region Event Handlers + +#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect_vCenter_Main +{ + $MainVC = $MainVcenterTextBox.Text + $MainUser = $UserNameTextBox.Text + $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text +} + +function Connect_vCenter +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $User = $UserNameTextBox.Text + $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text +} + +function Disconnect_vCenter +{ + $Disconnect = Disconnect-ViServer * -Confirm:$false +} + +#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Find_CaptureCsvFolder +{ + $CaptureCsvBrowseLoop = $True + while ($CaptureCsvBrowseLoop) + { + if ($CaptureCsvBrowse.ShowDialog() -eq "OK") + { + $CaptureCsvBrowseLoop = $False + } + else + { + $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($CaptureCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath +} + +function Check_CaptureCsvFolder +{ + $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $CheckContentDir = $CheckContentPath + "*.csv" + $CheckContent = Test-Path $CheckContentDir + if ($CheckContent -eq "True") + { + $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") + switch ($CheckContents_CaptureCsvFolder) { + 'Yes' + { + del $CheckContentDir + } + + 'No' + { + $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog + $CheckContentCsvBrowse.Description = "Select a directory to copy files to" + $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + $CheckContentCsvBrowse.ShowDialog() + $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath + copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder + del $CheckContentDir + } + } + } +} + +function Find_DrawCsvFolder +{ + $DrawCsvBrowseLoop = $True + while ($DrawCsvBrowseLoop) + { + if ($DrawCsvBrowse.ShowDialog() -eq "OK") + { + $DrawCsvBrowseLoop = $False + } + else + { + $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($DrawCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath +} + +function Find_DrawVisioFolder +{ + $VisioBrowseLoop = $True + while($VisioBrowseLoop) + { + if ($VisioBrowse.ShowDialog() -eq "OK") + { + $VisioBrowseLoop = $False + } + else + { + $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if($VisioBrowseRes -eq "Cancel") + { + return + } + } + } + $global:VisioFolder = $VisioBrowse.SelectedPath +} + +#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function vCenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, + @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation + + if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) + { + $null + } + else + { + Disconnect_vCenter + } +} + +function Datacenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort-Object Name | + Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation +} + +function Cluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, + @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, + @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, + @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, + @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, + @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, + @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, + @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, + @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, + @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation +} + +function VmHost_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent + while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent + } + if ($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name } } }, + @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent + while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent + } + if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, + @{ N = "Version" ; E = { $_.Config.Product.Version } }, + @{ N = "Build" ; E = { $_.Config.Product.Build } }, + @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, + @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, + @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, + @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, + @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, + @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, + @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, + @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, + @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, + @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, + @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, + @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation +} + +function Vm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select-Object Name , + @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, + @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, + @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, + @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, + @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, + @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, + @{ N = "OS" ; E = { $_.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.Config.Version } }, + @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, + @{ N = 'Folder' ; E = { $Folder.Name } }, + @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, + @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, + @{ N = "IP" ; E = { $_.Guest.IpAddress } }, + @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, + @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, + @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, + @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation + } +} + +function Template_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + foreach ($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { $VmHost.name } }, + @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, + @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, + @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, + @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, + @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, + @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, + @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, + @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation + } +} + +function DatastoreCluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, + @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, + @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation +} + +function Datastore_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, + @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, + @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, + @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, + @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, + @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, + @{ N = "Accessible" ; E = { $_.State } }, + @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation +} + +function VsSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "Nic" ; E = { $_.Nic } }, + @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, + @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, + @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, + @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, + @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation +} + +function VssPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "VLanId" ; E = { $_.VLanId } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VssVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation + } + } + } +} + +function VssPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation + } + } +} + +function VdSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + foreach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "Vendor" ; E = { $_.Vendor } }, + @{ N = "Version" ; E = { $_.Version } }, + @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, + @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation + } +} + +function VdsPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, + @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, + @{ N = "NumPorts" ; E = { $_.NumPorts } }, + @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, + @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, + @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VdsVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation + + } + } +} + +function VdsPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | + Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch } }, + @{ N = "Portgroup" ; E = { $_.Portgroup } }, + @{ N = "ConnectedEntity" ; E = { $_.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation + } + } +} + +function Folder_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + foreach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -type VM | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation + } +} + +function Rdm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | + Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, + @{ N = "Vm" ; E = { $_.Parent } }, + @{ N = "Label" ; E = { $_.Name } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, + @{ N = "DiskType" ; E = { $_.DiskType } }, + @{ N = "Persistence" ; E = { $_.Persistence } }, + @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, + @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, + @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation +} + +function Drs_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation + } +} + +function Drs_Cluster_Group_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "GroupType" ; E = { $_.GroupType } }, + @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation + } +} + +function Drs_VmHost_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) + { + Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "VMGroup" ; E = { $_.VMGroup } }, + @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, + @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, + @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation + } + } +} + +function Resource_Pool_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) + { + Get-ResourcePool $ResourcePool | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Cluster" ; E = { $Cluster.Name } }, + @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, + @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, + @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, + @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, + @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, + @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, + @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, + @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, + @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, + @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation + } + } +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect-VisioObject($firstObj, $secondObj) +{ + $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) + $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) + $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) +} + +function Add-VisioObjectVC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectCluster($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHost($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectTemplate($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectSRM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDatastore($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHardDisk($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.ScsiCanonicalName + return $shpObj +} + +function Add-VisioObjectFolder($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVsSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVssPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVMK($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsClusterGroup($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDRSVMHostRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectResourcePool($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +#~~< Visio Draw Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Draw_vCenter +{ + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' +} + +function Draw_Datacenter +{ + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' +} + +function Draw_Cluster +{ + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' +} + +function Draw_VmHost +{ + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' +} + +function Draw_VM +{ + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' +} + +function Draw_Template +{ + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' +} + +function Draw_Folder +{ + #Name + $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' +} + +function Draw_RDM +{ + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' +} + +function Draw_SRM +{ + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' +} + +function Draw_DatastoreCluster +{ + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' +} + +function Draw_Datastore +{ + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' +} + +function Draw_ResourcePool +{ + # Name + $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' + # Cluster + $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' + # CpuSharesLevel + $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' + # NumCpuShares + $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' + # CpuReservationMHz + $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' + # CpuExpandableReservation + $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' + # CpuLimitMHz + $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' + # MemSharesLevel + $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' + # NumMemShares + $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' + # MemReservationGB + $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' + # MemExpandableReservation + $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' + # MemLimitGB + $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' +} + +function Draw_VsSwitch +{ + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' +} + +function Draw_VssPnic +{ + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' +} + +function Draw_VssPort +{ + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' +} + +function Draw_VssVmk +{ + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' +} + +function Draw_VdSwitch +{ + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' +} + +function Draw_VdsPnic +{ + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' +} + +function Draw_VdsPort +{ + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' +} + +function Draw_VdsVmk +{ + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' +} + +function Draw_DrsRule +{ + # Name + $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' + # VM Affinity + $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' + # DRS Rule Enabled + $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' + # DRS Rule Mandatory + $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' +} + +function Draw_DrsVmHostRule +{ + # Name + $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' + # Enabled + $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' + # Type + $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' + # VMGroup + $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' + # VMHostGroup + $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' + # AffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' + # AntiAffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' +} + +function Draw_DrsClusterGroup +{ + # Name + $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' + # GroupType + $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' + # Members + $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' +} + +function CSV_In_Out +{ + # vCenter + $global:vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $global:vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $global:DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $global:DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $global:ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $global:ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $global:VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $global:VmHostImport = Import-Csv $VmHostExportFile + # Vm + $global:VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $global:VmImport = Import-Csv $VmExportFile + #Template + $global:TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $global:TemplateImport = Import-Csv $TemplateExportFile + # Folder + $global:FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + $global:FolderImport = Import-Csv $FolderExportFile + # Datastore Cluster + $global:DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $global:DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $global:DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $global:DatastoreImport = Import-Csv $DatastoreExportFile + # RDM's + $global:RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + $global:RdmImport = Import-Csv $RdmExportFile + # ResourcePool + $global:ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + $global:ResourcePoolImport = Import-Csv $ResourcePoolExportFile + # Vss Switch + $global:VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $global:VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $global:VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $global:VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $global:VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $global:VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $global:VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $global:VssPnicImport = Import-Csv $VssPnicExportFile + # Vds Switch + $global:VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $global:VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $global:VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $global:VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $global:VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $global:VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $global:VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $global:VdsPnicImport = Import-Csv $VdsPnicExportFile + # DRS Rule + $global:DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + $global:DrsRuleImport = Import-Csv $DrsRuleExportFile + # DRS Cluster Group + $global:DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + $global:DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile + # DRS VmHost Rule + $global:DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + $global:DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile +} + +function Visio_Shapes +{ + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $global:VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $global:DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $global:ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $global:HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $global:MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $global:LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $global:OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $global:TemplateObj = $stnObj.Masters.Item("Template") + # Folder Object + $global:FolderObj = $stnObj.Masters.Item("Folder") + # RDM Object + $global:RDMObj = $stnObj.Masters.Item("RDM") + # SRM Protected VM Object + $global:SRMObj = $stnObj.Masters.Item("SRM Protected Server") + # Datastore Cluster Object + $global:DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $global:DatastoreObj = $stnObj.Masters.Item("Datastore") + # Resource Pool Object + $global:ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") + # VSS Object + $global:VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $global:VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $global:VssNicObj = $stnObj.Masters.Item("VSS NIC") + # VDS Object + $global:VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $global:VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $global:VdsNicObj = $stnObj.Masters.Item("VDS NIC") + # VMK NIC Object + $global:VmkNicObj = $stnObj.Masters.Item("VMKernel") + # DRS Rule + $global:DRSRuleObj = $stnObj.Masters.Item("DRS Rule") + # DRS Cluster Group + $global:DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") + # DRS Host Rule + $global:DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") +} + +#~~< Visio Pages Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Create_Visio_Base +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $DocObj = $docsObj.Add("") + $DocObj.SaveAs($Savefile) + $AppVisio.Quit() +} + +function VM_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Host" + $Page = $DocsObj.Pages('VM to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Folder +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Folder" + $Page = $DocsObj.Pages('VM to Folder') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Folder') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $FolderObject = Add-VisioObjectFolder $FolderObj $Folder + Draw_Folder + Connect-VisioObject $DatacenterObject $FolderObject + $y += 1.50 + + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $FolderObject $TemplateObject + $FolderObject = $TemplateObject + } + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $FolderObject $VMObject + $FolderObject = $VMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMs_with_RDMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" + $Page = $DocsObj.Pages('VM w/ RDMs') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM w/ RDMs') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $ClusterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 3.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + Draw_RDM + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $DatacenterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 2.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + Draw_RDM + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function SRM_Protected_VMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "SRM VM" + $Page = $DocsObj.Pages('SRM VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('SRM VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + Draw_SRM + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + Draw_SRM + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Datastore +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Datastore" + $Page = $DocsObj.Pages('VM to Datastore') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Datastore') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + Draw_DatastoreCluster + Connect-VisioObject $ClusterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $ClusterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + Draw_DatastoreCluster + Connect-VisioObject $DatacenterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $DatacenterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + Draw_Template + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_ResourcePool +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" + $Page = $DocsObj.Pages('VM to Resource Pool') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Resource Pool') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool + Draw_ResourcePool + Connect-VisioObject $ClusterObject $ResourcePoolObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + } + Connect-VisioObject $ResourcePoolObject $VMObject + $ResourcePoolObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Datastore_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Datastore to Host" + $Page = $DocsObj.Pages('Datastore to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Datastore to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + Draw_Datastore + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function PhysicalNIC_to_vSwitch +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "PNIC to switch" + $Page = $DocsObj.Pages('PNIC to Switch') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('PNIC to Switch') + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VSSObject + $y += 1.50 + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + Draw_VssPnic + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + Draw_VdsPnic + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VSSObject + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + Draw_VssPnic + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + Draw_VdsPnic + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSS to Host" + $Page = $DocsObj.Pages('VSS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VSS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VSS" + $Page = $DocsObj.Pages('VMK to VSS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VSS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + Draw_VssVmk + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + Draw_VssVmk + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" + $Page = $DocsObj.Pages('VSSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + Draw_VsSwitch + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + Draw_VssPort + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDS to Host" + $Page = $DocsObj.Pages('VDS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VDS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VDS" + $Page = $DocsObj.Pages('VMK to VDS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VDS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + Draw_VdsVmk + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + Draw_VmHost + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + Draw_VdsVmk + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" + $Page = $DocsObj.Pages('VDSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + Draw_VdSwitch + Connect-VisioObject $DatacenterObject $VdSwitchObject + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x = 6.00 + $y += 1.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + Draw_VdsPort + Connect-VisioObject $VdSwitchObject $VPGObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + Draw_VM + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + Draw_VM + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + Draw_VM + } + } + Connect-VisioObject $VPGObject $VMObject + $VPGObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Cluster_to_DRS_Rule +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + CSV_In_Out + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" + $Page = $DocsObj.Pages('Cluster to DRS Rule') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Cluster to DRS Rule') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + Visio_Shapes + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + Draw_vCenter + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + Draw_Datacenter + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + Draw_Cluster + Connect-VisioObject $DatacenterObject $ClusterObject + $y += 1.50 + + foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule + Draw_DrsRule + Connect-VisioObject $ClusterObject $DRSObject + $y += 1.50 + } + foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule + Draw_DrsVmHostRule + Connect-VisioObject $ClusterObject $DRSVMHostRuleObject + $y += 1.50 + + foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) + { + $x += 2.50 + $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup + Draw_DrsClusterGroup + Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject + $DRSVMHostRuleObject = $DrsClusterGroupObject + + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Open_Final_Visio +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram - " + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.Application + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null +} + +Main + +>>>>>>> 0967e32961ee6b04195c73c094d3adc1121d49ec +#endregion \ No newline at end of file diff --git a/vDiagram_2.0.1/vDiagram_2.0.1.zip b/vDiagram_2.0.1/vDiagram_2.0.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..af95ad6217a3e49e648e9ffbe7d3d4294d91b080 GIT binary patch literal 822956 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

<%3T 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%0DlW@QE?! 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 z�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,grU3(NQ=J{m$R`4F2^_zZ8>d z-+IRQeHa$`+?du@rDL^fM4#8|)BDcD!QhUXX$HKY4~4QoR;>E`mB@kG6j^RinM_{@>+aJtHRXv{;LcsT&tpDOV)9U@dLL^B%TuJva&t8I4^fNvRysoBJQMoKs*G{xWD2G$}gnu?z zdwQ=mpc)!MvNo<^IujtXCVTm_U4xaEQNk<9Z-1W80$+}$1p-u^b=5XYPA;@+k!0QDozU zBBRuTUykp&NxB`Dm)8}i?q^~J27cD3iqD@Xe{p{qE%7hJJHi4nXJ*II@nvQ-G#fr= zdyd;quKa@Ba|Lb*c0$7qoz!1(Nq0>EYR`7i1^~bovqgOBYHk5Y9=GZK7&Bq#xf=2c z0F;u%`)S;t`nN&}r?DY;ZFq6XBkRs`5)l3Rdyu^OS}E`8$w*&{~0yYnkM9S=MZg|-A(r-)|gy-vJR zxe+ne#QQk?s%lym;zlSFbE7Q%t{f*?a(@7?TUkE5Lh8G085q2g_Hxk+AxTx?`1kTW z1JbC^cnDD8e;wCHbk0e}c3=IcPp%EHvnGB+fzV!sC%J-}&8&Y07jsdN9M07`ECSw9 zs>-{$)0EtE>sD*Ewf+QE^N$vW|Vlw!%JoBy`y zr@4kmIo7)ic3b7aGc&|+uM>_i5N#Qerd$TB+)C|Gv!y^HV&XL1U{|@K2UF?=d+~O_ zl@#3Fae6hDduV5&J(;9{#=1PYpjRe!ufFqi*XV)0Jb@pR$Y@qr6mB-{+PFk(4-*dzkz3px$=SZSIuwh5 zFSoD<_u}E=j$kcf0cO!s{%#otHf?yo+wvq*OA8z&&x_|p;?0xp>=}2DwwzShrjM%S z%#2hvy1z(Kf|6<|+00eny2q$FX^2y(kpBtRE4j@wAu*ncwEJLiIQ9Kk*)oLrs((%< ziX}iYbptvEtUc}E(HE>USr3Evo?PbL{$VCGQ%1S$9hSJ1-*l`-Gn_n@MFZg(y%&pJd8C0G3`waBlF zKBSvnBTtjV!fw!~8~ghct1M*LZn_Q$J87q+-maN-kg=S)hoRTU!P^3ZOfuQ(?5=jw ztoIA!q@!yo`Be;H3&MPSpH&4!f&I_8`CHLsAfq&P#8Dvm2XlBK(CJvJaodWmbQZ_~ z*~@QKkaL{vmROFYiFELhSFglRheh(<2#1kurK>ZE#teGG7XkhbS_Q`VDNZ>uilk5Sa*>H_i%}kQc=$0sDzTBlRBpP4nBmp^ z!n!u_8pu7fF%GB5NA>SsEqP^NAgu9+;3i4LlM&hnu_W_D(Pr4Ca%MeNyn≫ICS{VUPpVj9X#C+FS!oB!@bxh@K>diD7- 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

)83&_OK+XY2j4223|5Fv{KaZYf#;-I&{Qfj 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

KV@*riP>;57RTO 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 z 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�*1&6;y8wnnxE`|i9fE=n9LkINS~r5dK(ib#uU{Hg$z{P<@z z^C_!c@L;Epq82qx@Wk~w(H6byPnskd!V;iKghDJRtBCs;i~_M2$7{hzK%j`2$gM0& zvNUS4v|%^khWsB`_{^qx#$Mu#j{;RK-YG;pbMrxp&#jHNTojVIQfm)qP$qtDIJ@~P z!J8_Bm#bboA@u|;ZBS1iJhB?(3l&6db2Ecz;L-4ZI@Qy$9rXv($vKoErrQ@Mou;yOAU&!gbPHMJoP=-~M za-dykVd{1kObo2E57b

9@6|HJaX=mjp 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⁡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 I?_~i014p;Y`Tzg` diff --git a/vDiagram_2.0.1/vDiagram2.0.1.ps1 b/vDiagram_2.0.1/vDiagram2.0.1.ps1 deleted file mode 100644 index c13525d..0000000 --- a/vDiagram_2.0.1/vDiagram2.0.1.ps1 +++ /dev/null @@ -1,8807 +0,0 @@ -<# -.SYNOPSIS - vDiagram Visio Drawing Tool - -.DESCRIPTION - vDiagram Visio Drawing Tool - -.NOTES - File Name : vDiagram2.0.1.ps1 - Author : Tony Gonzalez - Author : Jason Hopkins - Based on : vDiagram by Alan Renouf - Version : 2.0.0 - -.USAGE NOTES - Ensure to unblock files before unzipping - Ensure to run as administrator - Required Files: - PowerCLI or PowerShell 5.0 with PowerCLI Modules installed - Active connection to vCenter to capture data - MS Visio - -.CHANGE LOG - - 04/12/2018 - v2.0.1 - Added MAC Addresses to VMs & Templates - Added a check to see if prior CSVs are still present - Added option to copy prior CSVs to new folder - - - 04/11/2018 - v2.0.0 - Presented as a Community Theater Session at South Florida VMUG - Feature enhancement requests collected -#> - -#region ScriptForm Designer - -#region Constructor - -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") -[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") -#endregion - -#region Post-Constructor Custom Code -$MyVer = "2.0.1" -$LastUpdated = "April 12, 2018" -$About = -@" - - vDiagram $MyVer - - Contributors: Tony Gonzalez of RoundTower Technologies LLC - Jason Hopkins of RoundTower Technologies LLC - - Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram - - Created: February 13, 2018 - - Last Updated: $LastUpdated - -"@ -#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" -if (!(Test-Path $TestShapes)) -{ - $CurrentLocation = Get-Location - copy $CurrentLocation\vDiagram.vssx $TestShapes - Write-Host "Copying Shapes File to My Shapes" -} -$shpFile = "\vDiagram.vssx" -#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Set_WindowStyle { -param( - [Parameter()] - [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', - 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', - 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] - $Style = 'SHOW', - [Parameter()] - $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle -) - $WindowStates = @{ - FORCEMINIMIZE = 11; HIDE = 0 - MAXIMIZE = 3; MINIMIZE = 6 - RESTORE = 9; SHOW = 5 - SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 - SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 - SHOWNA = 8; SHOWNOACTIVATE = 4 - SHOWNORMAL = 1 - } - Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) - - $Win32ShowWindowAsync = Add-Type –memberDefinition @” - [DllImport("user32.dll")] - public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); -“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru - - $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null -} -Set_WindowStyle MINIMIZE -#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function About_Config -{ - - $About - - #Add objects for About - $AboutForm = New-Object System.Windows.Forms.Form - $AboutTextBox = New-Object System.Windows.Forms.RichTextBox - - #About Form - $AboutForm.Icon = $Icon - $AboutForm.AutoScroll = $True - $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) - $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutForm.Name = "About" - $AboutForm.StartPosition = 1 - $AboutForm.Text = "About vDiagram $MyVer" - - $AboutTextBox.Anchor = 15 - $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) - $AboutTextBox.BorderStyle = 0 - $AboutTextBox.Font = "Tahoma" - $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) - $AboutTextBox.Name = "AboutTextBox" - $AboutTextBox.ReadOnly = $True - $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) - $AboutTextBox.Text = $About - - $AboutForm.Controls.Add($AboutTextBox) - - $AboutForm.Show() | Out-Null -} -#endregion - -#region Form Creation -#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vDiagram = New-Object System.Windows.Forms.Form -$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) -$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") -$vDiagram.Icon = $Icon -$vDiagram.Text = "vDiagram 2.0" -$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan -#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainMenu = New-Object System.Windows.Forms.MenuStrip -$MainMenu.Location = New-Object System.Drawing.Point(0, 0) -$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) -$MainMenu.TabIndex = 1 -$MainMenu.Text = "MainMenu" -#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) -$FileToolStripMenuItem.Text = "File" -#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) -$ExitToolStripMenuItem.Text = "Exit" -$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) -$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) -#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) -$HelpToolStripMenuItem.Text = "Help" -#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) -$AboutToolStripMenuItem.Text = "About" -$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) -$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) -$AboutToolStripMenuItem.Add_Click({About_Config}) -#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainTab = New-Object System.Windows.Forms.TabControl -$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) -$MainTab.Location = New-Object System.Drawing.Point(10, 30) -$MainTab.Size = New-Object System.Drawing.Size(990, 98) -$MainTab.TabIndex = 0 -$MainTab.Text = "MainTabs" -#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Prerequisites = New-Object System.Windows.Forms.TabPage -$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) -$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) -$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) -$Prerequisites.TabIndex = 0 -$Prerequisites.Text = "Prerequisites" -$Prerequisites.BackColor = [System.Drawing.Color]::LightGray -#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellLabel = New-Object System.Windows.Forms.Label -$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) -$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) -$PowershellLabel.TabIndex = 1 -$PowershellLabel.Text = "Powershell:" -#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellInstalled = New-Object System.Windows.Forms.Label -$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) -$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) -$PowershellInstalled.TabIndex = 2 -$PowershellInstalled.Text = "" -$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleLabel = New-Object System.Windows.Forms.Label -$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) -$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) -$PowerCliModuleLabel.TabIndex = 3 -$PowerCliModuleLabel.Text = "PowerCLI Module:" -#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label -$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) -$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) -$PowerCliModuleInstalled.TabIndex = 4 -$PowerCliModuleInstalled.Text = "" -$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliLabel = New-Object System.Windows.Forms.Label -$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) -$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) -$PowerCliLabel.TabIndex = 5 -$PowerCliLabel.Text = "PowerCLI:" -#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliInstalled = New-Object System.Windows.Forms.Label -$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) -$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) -$PowerCliInstalled.TabIndex = 6 -$PowerCliInstalled.Text = "" -$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioLabel = New-Object System.Windows.Forms.Label -$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) -$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) -$VisioLabel.TabIndex = 7 -$VisioLabel.Text = "Visio:" -#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioInstalled = New-Object System.Windows.Forms.Label -$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) -$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) -$VisioInstalled.TabIndex = 8 -$VisioInstalled.Text = "" -$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray -$Prerequisites.Controls.Add($PowershellLabel) -$Prerequisites.Controls.Add($PowershellInstalled) -$Prerequisites.Controls.Add($PowerCliModuleLabel) -$Prerequisites.Controls.Add($PowerCliModuleInstalled) -$Prerequisites.Controls.Add($PowerCliLabel) -$Prerequisites.Controls.Add($PowerCliInstalled) -$Prerequisites.Controls.Add($VisioLabel) -$Prerequisites.Controls.Add($VisioInstalled) -#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfo = New-Object System.Windows.Forms.TabPage -$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) -$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) -$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) -$vCenterInfo.TabIndex = 0 -$vCenterInfo.Text = "vCenter Info" -$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray -#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterLabel = New-Object System.Windows.Forms.Label -$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) -$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) -$MainVcenterLabel.TabIndex = 1 -$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" -#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox -$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) -$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) -$MainVcenterTextBox.TabIndex = 2 -$MainVcenterTextBox.Text = "" -#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterLabel = New-Object System.Windows.Forms.Label -$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) -$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) -$TargetVcenterLabel.TabIndex = 3 -$TargetVcenterLabel.Text = "Name of target vCenter:" -#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox -$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) -$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) -$TargetVcenterTextBox.TabIndex = 4 -$TargetVcenterTextBox.Text = "" -#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameLabel = New-Object System.Windows.Forms.Label -$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) -$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) -$UserNameLabel.TabIndex = 5 -$UserNameLabel.Text = "vCenter User Name:" -#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameTextBox = New-Object System.Windows.Forms.TextBox -$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) -$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) -$UserNameTextBox.TabIndex = 6 -$UserNameTextBox.Text = "" -#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordLabel = New-Object System.Windows.Forms.Label -$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) -$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) -$PasswordLabel.TabIndex = 7 -$PasswordLabel.Text = "Password:" -#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordTextBox = New-Object System.Windows.Forms.TextBox -$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) -$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) -$PasswordTextBox.TabIndex = 8 -$PasswordTextBox.Text = "" -$PasswordTextBox.UseSystemPasswordChar = $true -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton = New-Object System.Windows.Forms.Button -$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) -$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) -$ConnectButton.TabIndex = 9 -$ConnectButton.Text = "Connect to vCenter" -$ConnectButton.UseVisualStyleBackColor = $true -$vCenterInfo.Controls.Add($MainVcenterLabel) -$vCenterInfo.Controls.Add($MainVcenterTextBox) -$vCenterInfo.Controls.Add($TargetVcenterLabel) -$vCenterInfo.Controls.Add($TargetVcenterTextBox) -$vCenterInfo.Controls.Add($UserNameLabel) -$vCenterInfo.Controls.Add($UserNameTextBox) -$vCenterInfo.Controls.Add($PasswordLabel) -$vCenterInfo.Controls.Add($PasswordTextBox) -$vCenterInfo.Controls.Add($ConnectButton) -$MainTab.Controls.Add($Prerequisites) -$MainTab.Controls.Add($vCenterInfo) -$MainTab.SelectedIndex = 0 -#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SubTab = New-Object System.Windows.Forms.TabControl -$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$SubTab.Location = New-Object System.Drawing.Point(10, 136) -$SubTab.Size = New-Object System.Drawing.Size(990, 512) -$SubTab.TabIndex = 0 -$SubTab.Text = "SubTabs" -#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDirections = New-Object System.Windows.Forms.TabPage -$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDirections.Location = New-Object System.Drawing.Point(4, 22) -$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDirections.Size = New-Object System.Drawing.Size(982, 486) -$TabDirections.TabIndex = 0 -$TabDirections.Text = "Directions" -$TabDirections.UseVisualStyleBackColor = $true -#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesHeading = New-Object System.Windows.Forms.Label -$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) -$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) -$PrerequisitesHeading.TabIndex = 0 -$PrerequisitesHeading.Text = "Prerequisites Tab" -#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesDirections = New-Object System.Windows.Forms.Label -$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) -$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) -$PrerequisitesDirections.TabIndex = 1 -$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." -#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoHeading = New-Object System.Windows.Forms.Label -$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) -$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) -$vCenterInfoHeading.TabIndex = 2 -$vCenterInfoHeading.Text = "vCenter Info Tab" -#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoDirections = New-Object System.Windows.Forms.Label -$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) -$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) -$vCenterInfoDirections.TabIndex = 3 -$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." -#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvHeading = New-Object System.Windows.Forms.Label -$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) -$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) -$CaptureCsvHeading.TabIndex = 4 -$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" -#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureDirections = New-Object System.Windows.Forms.Label -$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) -$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) -$CaptureDirections.TabIndex = 5 -$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." -#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawHeading = New-Object System.Windows.Forms.Label -$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) -$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) -$DrawHeading.TabIndex = 6 -$DrawHeading.Text = "Draw Visio Tab" -#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawDirections = New-Object System.Windows.Forms.Label -$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) -$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) -$DrawDirections.TabIndex = 7 -$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." -$TabDirections.Controls.Add($PrerequisitesHeading) -$TabDirections.Controls.Add($PrerequisitesDirections) -$TabDirections.Controls.Add($vCenterInfoHeading) -$TabDirections.Controls.Add($vCenterInfoDirections) -$TabDirections.Controls.Add($CaptureCsvHeading) -$TabDirections.Controls.Add($CaptureDirections) -$TabDirections.Controls.Add($DrawHeading) -$TabDirections.Controls.Add($DrawDirections) -#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabCapture = New-Object System.Windows.Forms.TabPage -$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabCapture.Location = New-Object System.Drawing.Point(4, 22) -$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) -$TabCapture.Size = New-Object System.Drawing.Size(982, 486) -$TabCapture.TabIndex = 3 -$TabCapture.Text = "Capture CSVs for Visio" -$TabCapture.UseVisualStyleBackColor = $true -#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label -$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) -$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) -$CaptureCsvOutputLabel.TabIndex = 0 -$CaptureCsvOutputLabel.Text = "CSV Output Folder:" -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button -$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) -$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) -$CaptureCsvOutputButton.TabIndex = 0 -$CaptureCsvOutputButton.Text = "Select Output Folder" -$CaptureCsvOutputButton.UseVisualStyleBackColor = $false -$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$vCenterCsvCheckBox.Checked = $true -$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$vCenterCsvCheckBox.TabIndex = 1 -$vCenterCsvCheckBox.Text = "Export vCenter Info" -$vCenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) -$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationComplete.TabIndex = 26 -$vCenterCsvValidationComplete.Text = "" -#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatacenterCsvCheckBox.Checked = $true -$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatacenterCsvCheckBox.TabIndex = 2 -$DatacenterCsvCheckBox.Text = "Export Datacenter Info" -$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) -$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationComplete.TabIndex = 27 -$DatacenterCsvValidationComplete.Text = "" -#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ClusterCsvCheckBox.Checked = $true -$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ClusterCsvCheckBox.TabIndex = 3 -$ClusterCsvCheckBox.Text = "Export Cluster Info" -$ClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) -$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationComplete.TabIndex = 28 -$ClusterCsvValidationComplete.Text = "" -#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmHostCsvCheckBox.Checked = $true -$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmHostCsvCheckBox.TabIndex = 4 -$VmHostCsvCheckBox.Text = "Export VmHost Info" -$VmHostCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) -$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationComplete.TabIndex = 29 -$VmHostCsvValidationComplete.Text = "" -#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmCsvCheckBox.Checked = $true -$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmCsvCheckBox.TabIndex = 5 -$VmCsvCheckBox.Text = "Export Vm Info" -$VmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) -$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationComplete.TabIndex = 30 -$VmCsvValidationComplete.Text = "" -#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$TemplateCsvCheckBox.Checked = $true -$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$TemplateCsvCheckBox.TabIndex = 6 -$TemplateCsvCheckBox.Text = "Export Template Info" -$TemplateCsvCheckBox.UseVisualStyleBackColor = $true -#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label -$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) -$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationComplete.TabIndex = 31 -$TemplateCsvValidationComplete.Text = "" -#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreClusterCsvCheckBox.Checked = $true -$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreClusterCsvCheckBox.TabIndex = 7 -$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" -$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) -$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationComplete.TabIndex = 32 -$DatastoreClusterCsvValidationComplete.Text = "" -#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreCsvCheckBox.Checked = $true -$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreCsvCheckBox.TabIndex = 8 -$DatastoreCsvCheckBox.Text = "Export Datastore Info" -$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) -$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationComplete.TabIndex = 33 -$DatastoreCsvValidationComplete.Text = "" -#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VsSwitchCsvCheckBox.Checked = $true -$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) -$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VsSwitchCsvCheckBox.TabIndex = 9 -$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" -$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) -$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationComplete.TabIndex = 34 -$VsSwitchCsvValidationComplete.Text = "" -#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPortGroupCsvCheckBox.Checked = $true -$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) -$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPortGroupCsvCheckBox.TabIndex = 10 -$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" -$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) -$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationComplete.TabIndex = 35 -$VssPortGroupCsvValidationComplete.Text = "" -#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssVmkernelCsvCheckBox.Checked = $true -$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) -$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssVmkernelCsvCheckBox.TabIndex = 11 -$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" -$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) -$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationComplete.TabIndex = 36 -$VssVmkernelCsvValidationComplete.Text = "" -#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPnicCsvCheckBox.Checked = $true -$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) -$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPnicCsvCheckBox.TabIndex = 12 -$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" -$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) -$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationComplete.TabIndex = 37 -$VssPnicCsvValidationComplete.Text = "" -#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdSwitchCsvCheckBox.Checked = $true -$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) -$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdSwitchCsvCheckBox.TabIndex = 13 -$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" -$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) -$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationComplete.TabIndex = 38 -$VdSwitchCsvValidationComplete.Text = "" -#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPortGroupCsvCheckBox.Checked = $true -$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) -$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPortGroupCsvCheckBox.TabIndex = 14 -$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" -$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) -$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationComplete.TabIndex = 39 -$VdsPortGroupCsvValidationComplete.Text = "" -#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsVmkernelCsvCheckBox.Checked = $true -$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) -$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsVmkernelCsvCheckBox.TabIndex = 15 -$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" -$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) -$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationComplete.TabIndex = 40 -$VdsVmkernelCsvValidationComplete.Text = "" -#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPnicCsvCheckBox.Checked = $true -$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) -$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPnicCsvCheckBox.TabIndex = 16 -$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" -$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) -$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationComplete.TabIndex = 41 -$VdsPnicCsvValidationComplete.Text = "" -#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$FolderCsvCheckBox.Checked = $true -$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) -$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$FolderCsvCheckBox.TabIndex = 17 -$FolderCsvCheckBox.Text = "Export Folder Info" -$FolderCsvCheckBox.UseVisualStyleBackColor = $true -#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label -$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) -$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationComplete.TabIndex = 42 -$FolderCsvValidationComplete.Text = "" -#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$RdmCsvCheckBox.Checked = $true -$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) -$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$RdmCsvCheckBox.TabIndex = 18 -$RdmCsvCheckBox.Text = "Export RDM Info" -$RdmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label -$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) -$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationComplete.TabIndex = 43 -$RdmCsvValidationComplete.Text = "" -#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsRuleCsvCheckBox.Checked = $true -$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) -$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsRuleCsvCheckBox.TabIndex = 19 -$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" -$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) -$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationComplete.TabIndex = 44 -$DrsRuleCsvValidationComplete.Text = "" -#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsClusterGroupCsvCheckBox.Checked = $true -$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) -$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsClusterGroupCsvCheckBox.TabIndex = 20 -$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" -$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) -$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationComplete.TabIndex = 45 -$DrsClusterGroupCsvValidationComplete.Text = "" -#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsVmHostRuleCsvCheckBox.Checked = $true -$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) -$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsVmHostRuleCsvCheckBox.TabIndex = 21 -$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" -$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) -$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 -$DrsVmHostRuleCsvValidationComplete.Text = "" -#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ResourcePoolCsvCheckBox.Checked = $true -$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) -$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ResourcePoolCsvCheckBox.TabIndex = 22 -$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" -$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) -$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationComplete.TabIndex = 47 -$ResourcePoolCsvValidationComplete.Text = "" -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton = New-Object System.Windows.Forms.Button -$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) -$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureUncheckButton.TabIndex = 23 -$CaptureUncheckButton.Text = "Uncheck All" -$CaptureUncheckButton.UseVisualStyleBackColor = $false -$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton = New-Object System.Windows.Forms.Button -$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) -$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureCheckButton.TabIndex = 24 -$CaptureCheckButton.Text = "Check All" -$CaptureCheckButton.UseVisualStyleBackColor = $false -$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton = New-Object System.Windows.Forms.Button -$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) -$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureButton.TabIndex = 25 -$CaptureButton.Text = "Collect CSV Data" -$CaptureButton.UseVisualStyleBackColor = $false -$CaptureButton.BackColor = [System.Drawing.Color]::LightGray -$TabCapture.Controls.Add($CaptureCsvOutputLabel) -$TabCapture.Controls.Add($CaptureCsvOutputButton) -$TabCapture.Controls.Add($vCenterCsvCheckBox) -$TabCapture.Controls.Add($vCenterCsvValidationComplete) -$TabCapture.Controls.Add($DatacenterCsvCheckBox) -$TabCapture.Controls.Add($DatacenterCsvValidationComplete) -$TabCapture.Controls.Add($ClusterCsvCheckBox) -$TabCapture.Controls.Add($ClusterCsvValidationComplete) -$TabCapture.Controls.Add($VmHostCsvCheckBox) -$TabCapture.Controls.Add($VmHostCsvValidationComplete) -$TabCapture.Controls.Add($VmCsvCheckBox) -$TabCapture.Controls.Add($VmCsvValidationComplete) -$TabCapture.Controls.Add($TemplateCsvCheckBox) -$TabCapture.Controls.Add($TemplateCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) -$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreCsvCheckBox) -$TabCapture.Controls.Add($DatastoreCsvValidationComplete) -$TabCapture.Controls.Add($VsSwitchCsvCheckBox) -$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VssPnicCsvCheckBox) -$TabCapture.Controls.Add($VssPnicCsvValidationComplete) -$TabCapture.Controls.Add($VdSwitchCsvCheckBox) -$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VdsPnicCsvCheckBox) -$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) -$TabCapture.Controls.Add($FolderCsvCheckBox) -$TabCapture.Controls.Add($FolderCsvValidationComplete) -$TabCapture.Controls.Add($RdmCsvCheckBox) -$TabCapture.Controls.Add($RdmCsvValidationComplete) -$TabCapture.Controls.Add($DrsRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) -$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) -$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) -$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) -$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) -$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) -$TabCapture.Controls.Add($CaptureUncheckButton) -$TabCapture.Controls.Add($CaptureCheckButton) -$TabCapture.Controls.Add($CaptureButton) -#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDraw = New-Object System.Windows.Forms.TabPage -$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDraw.Location = New-Object System.Drawing.Point(4, 22) -$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDraw.Size = New-Object System.Drawing.Size(982, 486) -$TabDraw.TabIndex = 2 -$TabDraw.Text = "Draw Visio" -$TabDraw.UseVisualStyleBackColor = $true -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton = New-Object System.Windows.Forms.Button -$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) -$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) -$OpenVisioButton.TabIndex = 83 -$OpenVisioButton.Text = "Open Visio Drawing" -$OpenVisioButton.UseVisualStyleBackColor = $false -$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton = New-Object System.Windows.Forms.Button -$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) -$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawCheckButton.TabIndex = 82 -$DrawCheckButton.Text = "Check All" -$DrawCheckButton.UseVisualStyleBackColor = $false -$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton = New-Object System.Windows.Forms.Button -$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawButton.Location = New-Object System.Drawing.Point(448, 450) -$DrawButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawButton.TabIndex = 81 -$DrawButton.Text = "Draw Visio" -$DrawButton.UseVisualStyleBackColor = $false -$DrawButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton = New-Object System.Windows.Forms.Button -$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) -$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawUncheckButton.TabIndex = 80 -$DrawUncheckButton.Text = "Uncheck All" -$DrawUncheckButton.UseVisualStyleBackColor = $false -$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOutputLabel = New-Object System.Windows.Forms.Label -$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) -$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) -$VisioOutputLabel.TabIndex = 46 -$VisioOutputLabel.Text = "Visio Output Folder:" -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton = New-Object System.Windows.Forms.Button -$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) -$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) -$VisioOpenOutputButton.TabIndex = 47 -$VisioOpenOutputButton.Text = "Select Visio Output Folder" -$VisioOpenOutputButton.UseVisualStyleBackColor = $false -$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputLabel = New-Object System.Windows.Forms.Label -$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) -$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) -$DrawCsvInputLabel.TabIndex = 0 -$DrawCsvInputLabel.Text = "CSV Input Folder:" -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton = New-Object System.Windows.Forms.Button -$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) -$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) -$DrawCsvInputButton.TabIndex = 1 -$DrawCsvInputButton.Text = "Select CSV Input Folder" -$DrawCsvInputButton.UseVisualStyleBackColor = $false -$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidation = New-Object System.Windows.Forms.Label -$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$vCenterCsvValidation.TabIndex = 2 -$vCenterCsvValidation.Text = "vCenter CSV File:" -#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) -$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationCheck.TabIndex = 3 -$vCenterCsvValidationCheck.Text = "" -#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidation = New-Object System.Windows.Forms.Label -$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatacenterCsvValidation.TabIndex = 4 -$DatacenterCsvValidation.Text = "Datacenter CSV File:" -#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) -$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationCheck.TabIndex = 5 -$DatacenterCsvValidationCheck.Text = "" -#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidation = New-Object System.Windows.Forms.Label -$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ClusterCsvValidation.TabIndex = 6 -$ClusterCsvValidation.Text = "Cluster CSV File:" -#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) -$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationCheck.TabIndex = 7 -$ClusterCsvValidationCheck.Text = "" -#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidation = New-Object System.Windows.Forms.Label -$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmHostCsvValidation.TabIndex = 8 -$VmHostCsvValidation.Text = "VmHost CSV File:" -#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) -$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationCheck.TabIndex = 9 -$VmHostCsvValidationCheck.Text = "" -#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidation = New-Object System.Windows.Forms.Label -$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmCsvValidation.TabIndex = 10 -$VmCsvValidation.Text = "VM CSV File:" -#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) -$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationCheck.TabIndex = 11 -$VmCsvValidationCheck.Text = "" -#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidation = New-Object System.Windows.Forms.Label -$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$TemplateCsvValidation.TabIndex = 12 -$TemplateCsvValidation.Text = "Template CSV File:" -#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label -$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) -$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationCheck.TabIndex = 13 -$TemplateCsvValidationCheck.Text = "" -#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreClusterCsvValidation.TabIndex = 14 -$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" -#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) -$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationCheck.TabIndex = 15 -$DatastoreClusterCsvValidationCheck.Text = "" -#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreCsvValidation.TabIndex = 16 -$DatastoreCsvValidation.Text = "Datastore CSV File:" -#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) -$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationCheck.TabIndex = 17 -$DatastoreCsvValidationCheck.Text = "" -#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) -$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VsSwitchCsvValidation.TabIndex = 18 -$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" -#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) -$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationCheck.TabIndex = 19 -$VsSwitchCsvValidationCheck.Text = "" -#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) -$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPortGroupCsvValidation.TabIndex = 20 -$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" -#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) -$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationCheck.TabIndex = 21 -$VssPortGroupCsvValidationCheck.Text = "" -#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) -$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssVmkernelCsvValidation.TabIndex = 22 -$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" -#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) -$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationCheck.TabIndex = 23 -$VssVmkernelCsvValidationCheck.Text = "" -#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidation = New-Object System.Windows.Forms.Label -$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) -$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPnicCsvValidation.TabIndex = 24 -$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" -#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) -$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationCheck.TabIndex = 25 -$VssPnicCsvValidationCheck.Text = "" -#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) -$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdSwitchCsvValidation.TabIndex = 26 -$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" -#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) -$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationCheck.TabIndex = 27 -$VdSwitchCsvValidationCheck.Text = "" -#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) -$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPortGroupCsvValidation.TabIndex = 28 -$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" -#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) -$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationCheck.TabIndex = 29 -$VdsPortGroupCsvValidationCheck.Text = "" -#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) -$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsVmkernelCsvValidation.TabIndex = 30 -$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" -#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) -$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationCheck.TabIndex = 31 -$VdsVmkernelCsvValidationCheck.Text = "" -#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) -$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPnicCsvValidation.TabIndex = 32 -$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" -#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) -$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationCheck.TabIndex = 33 -$VdsPnicCsvValidationCheck.Text = "" -#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidation = New-Object System.Windows.Forms.Label -$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) -$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$FolderCsvValidation.TabIndex = 34 -$FolderCsvValidation.Text = "Folder CSV File:" -#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label -$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) -$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationCheck.TabIndex = 35 -$FolderCsvValidationCheck.Text = "" -#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidation = New-Object System.Windows.Forms.Label -$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) -$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$RdmCsvValidation.TabIndex = 36 -$RdmCsvValidation.Text = "RDM CSV File:" -#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label -$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) -$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationCheck.TabIndex = 37 -$RdmCsvValidationCheck.Text = "" -#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) -$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsRuleCsvValidation.TabIndex = 38 -$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" -#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) -$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationCheck.TabIndex = 39 -$DrsRuleCsvValidationCheck.Text = "" -#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) -$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsClusterGroupCsvValidation.TabIndex = 40 -$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" -#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) -$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationCheck.TabIndex = 41 -$DrsClusterGroupCsvValidationCheck.Text = "" -#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) -$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsVmHostRuleCsvValidation.TabIndex = 42 -$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" -#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) -$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 -$DrsVmHostRuleCsvValidationCheck.Text = "" -#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) -$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ResourcePoolCsvValidation.TabIndex = 44 -$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" -#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) -$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationCheck.TabIndex = 45 -$ResourcePoolCsvValidationCheck.Text = "" -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton = New-Object System.Windows.Forms.Button -$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) -$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) -$CsvValidationButton.TabIndex = 2 -$CsvValidationButton.Text = "Check for CSVs" -$CsvValidationButton.UseVisualStyleBackColor = $false -$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Host_DrawCheckBox.Checked = $true -$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) -$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Host_DrawCheckBox.TabIndex = 48 -$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" -$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_Complete = New-Object System.Windows.Forms.Label -$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) -$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Host_Complete.TabIndex = 49 -$VM_to_Host_Complete.Text = "" -#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Folder_DrawCheckBox.Checked = $true -$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) -$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Folder_DrawCheckBox.TabIndex = 50 -$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" -$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label -$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) -$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Folder_Complete.TabIndex = 51 -$VM_to_Folder_Complete.Text = "" -#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMs_with_RDMs_DrawCheckBox.Checked = $true -$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) -$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 -$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" -$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label -$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) -$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMs_with_RDMs_Complete.TabIndex = 53 -$VMs_with_RDMs_Complete.Text = "" -#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$SRM_Protected_VMs_DrawCheckBox.Checked = $true -$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) -$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 -$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" -$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label -$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) -$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$SRM_Protected_VMs_Complete.TabIndex = 55 -$SRM_Protected_VMs_Complete.Text = "" -#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Datastore_DrawCheckBox.Checked = $true -$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) -$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Datastore_DrawCheckBox.TabIndex = 56 -$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" -$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label -$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) -$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Datastore_Complete.TabIndex = 57 -$VM_to_Datastore_Complete.Text = "" -#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_ResourcePool_DrawCheckBox.Checked = $true -$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) -$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 -$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" -$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label -$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) -$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_ResourcePool_Complete.TabIndex = 59 -$VM_to_ResourcePool_Complete.Text = "" -#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Datastore_to_Host_DrawCheckBox.Checked = $true -$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) -$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$Datastore_to_Host_DrawCheckBox.TabIndex = 60 -$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" -$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label -$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) -$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Datastore_to_Host_Complete.TabIndex = 61 -$Datastore_to_Host_Complete.Text = "" -#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true -$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) -$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 -$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" -$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label -$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) -$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) -$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 -$PhysicalNIC_to_vSwitch_Complete.Text = "" -#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSS_to_Host_DrawCheckBox.Checked = $true -$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) -$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSS_to_Host_DrawCheckBox.TabIndex = 64 -$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" -$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) -$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSS_to_Host_Complete.TabIndex = 65 -$VSS_to_Host_Complete.Text = "" -#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VSS_DrawCheckBox.Checked = $true -$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) -$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VSS_DrawCheckBox.TabIndex = 66 -$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" -$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) -$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VSS_Complete.TabIndex = 67 -$VMK_to_VSS_Complete.Text = "" -#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) -$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 -$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" -$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) -$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSSPortGroup_to_VM_Complete.TabIndex = 69 -$VSSPortGroup_to_VM_Complete.Text = "" -#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDS_to_Host_DrawCheckBox.Checked = $true -$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) -$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDS_to_Host_DrawCheckBox.TabIndex = 70 -$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" -$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) -$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDS_to_Host_Complete.TabIndex = 71 -$VDS_to_Host_Complete.Text = "" -#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VDS_DrawCheckBox.Checked = $true -$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) -$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VDS_DrawCheckBox.TabIndex = 72 -$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" -$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) -$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VDS_Complete.TabIndex = 73 -$VMK_to_VDS_Complete.Text = "" -#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) -$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 -$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" -$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) -$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDSPortGroup_to_VM_Complete.TabIndex = 75 -$VDSPortGroup_to_VM_Complete.Text = "" -#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true -$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) -$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 -$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" -$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label -$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) -$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Cluster_to_DRS_Rule_Complete.TabIndex = 77 -$Cluster_to_DRS_Rule_Complete.Text = "" - -$TabDraw.Controls.Add($OpenVisioButton) -$TabDraw.Controls.Add($DrawCheckButton) -$TabDraw.Controls.Add($DrawButton) -$TabDraw.Controls.Add($DrawUncheckButton) -$TabDraw.Controls.Add($VisioOutputLabel) -$TabDraw.Controls.Add($VisioOpenOutputButton) -$TabDraw.Controls.Add($DrawCsvInputLabel) -$TabDraw.Controls.Add($DrawCsvInputButton) -$TabDraw.Controls.Add($vCenterCsvValidation) -$TabDraw.Controls.Add($vCenterCsvValidationCheck) -$TabDraw.Controls.Add($DatacenterCsvValidation) -$TabDraw.Controls.Add($DatacenterCsvValidationCheck) -$TabDraw.Controls.Add($ClusterCsvValidation) -$TabDraw.Controls.Add($ClusterCsvValidationCheck) -$TabDraw.Controls.Add($VmHostCsvValidation) -$TabDraw.Controls.Add($VmHostCsvValidationCheck) -$TabDraw.Controls.Add($VmCsvValidation) -$TabDraw.Controls.Add($VmCsvValidationCheck) -$TabDraw.Controls.Add($TemplateCsvValidation) -$TabDraw.Controls.Add($TemplateCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreClusterCsvValidation) -$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreCsvValidation) -$TabDraw.Controls.Add($DatastoreCsvValidationCheck) -$TabDraw.Controls.Add($VsSwitchCsvValidation) -$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VssPortGroupCsvValidation) -$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VssVmkernelCsvValidation) -$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VssPnicCsvValidation) -$TabDraw.Controls.Add($VssPnicCsvValidationCheck) -$TabDraw.Controls.Add($VdSwitchCsvValidation) -$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VdsPortGroupCsvValidation) -$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VdsVmkernelCsvValidation) -$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VdsPnicCsvValidation) -$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) -$TabDraw.Controls.Add($FolderCsvValidation) -$TabDraw.Controls.Add($FolderCsvValidationCheck) -$TabDraw.Controls.Add($RdmCsvValidation) -$TabDraw.Controls.Add($RdmCsvValidationCheck) -$TabDraw.Controls.Add($DrsRuleCsvValidation) -$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) -$TabDraw.Controls.Add($ResourcePoolCsvValidation) -$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) -$TabDraw.Controls.Add($CsvValidationButton) -$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Host_Complete) -$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Folder_Complete) -$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) -$TabDraw.Controls.Add($VMs_with_RDMs_Complete) -$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) -$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) -$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Datastore_Complete) -$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) -$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($Datastore_to_Host_Complete) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) -$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VSS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VSS_Complete) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VDS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VDS_Complete) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) -$SubTab.Controls.Add($TabDirections) -$SubTab.Controls.Add($TabCapture) -$SubTab.Controls.Add($TabDraw) -$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText -$SubTab.SelectedIndex = 0 -$vDiagram.Controls.Add($MainMenu) -$vDiagram.Controls.Add($MainTab) -$vDiagram.Controls.Add($SubTab) -#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$VisioBrowse.Description = "Select a directory" -$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$DrawCsvBrowse.Description = "Select a directory" -$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$CaptureCsvBrowse.Description = "Select a directory" -$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - -#endregion - -#region Custom Code -#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellCheck = $PSVersionTable.PSVersion -if ($PowershellCheck.Major -ge 4) -{ - $PowershellInstalled.Forecolor = "Green" - $PowershellInstalled.Text = "Installed Version $PowershellCheck" -} -else -{ - $PowershellInstalled.Forecolor = "Red" - $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" -} -#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) -$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) -if ($PowerCliModuleCheck -ne $null) -{ - $PowerCliModuleInstalled.Forecolor = "Green" - $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" -} -else -{ - $PowerCliModuleInstalled.Forecolor = "Red" - $PowerCliModuleInstalled.Text = "Not Installed" -} -#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerClI Installed" -} -elseif ($PowerCliModuleCheck -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerCLI Module Installed" -} -else -{ - $PowerCliInstalled.Forecolor = "Red" - $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" -} -#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) -{ - $VisioInstalled.Forecolor = "Green" - $VisioInstalled.Text = "Installed" -} -else -{ - $VisioInstalled.Forecolor = "Red" - $VisioInstalled.Text = "Visio is Not Installed" -} -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) -$ConnectButton.Add_Click({ Connect_vCenter_Main }) -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } -Check_CaptureCsvFolder } ) -#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton.Add_Click({ - if($CaptureCsvFolder -eq $null) - { - $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" - } - else - { - if ($vCenterCsvCheckBox.Checked -eq "True") - { - $vCenterCsvValidationComplete.Forecolor = "Blue" - $vCenterCsvValidationComplete.Text = "Processing ....." - vCenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" - $vCenterCsvComplete = Test-Path $vCenterExportFileComplete - if ($vCenterCsvComplete -eq $True) - { - $vCenterCsvValidationComplete.Forecolor = "Green" - $vCenterCsvValidationComplete.Text = "Complete" - } - else - { - $vCenterCsvValidationComplete.Forecolor = "Red" - $vCenterCsvValidationComplete.Text = "Not Complete" - } - } - Connect_vCenter - $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager - if ($Connected -eq $null) { Connect_vCenter_Main } - $ConnectButton.Forecolor = [System.Drawing.Color]::Green - $ConnectButton.Text = "Connected to $DefaultViserver" - if ($DatacenterCsvCheckBox.Checked -eq "True") - { - $DatacenterCsvValidationComplete.Forecolor = "Blue" - $DatacenterCsvValidationComplete.Text = "Processing ....." - Datacenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" - $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete - if ($DatacenterCsvComplete -eq $True) - { - $DatacenterCsvValidationComplete.Forecolor = "Green" - $DatacenterCsvValidationComplete.Text = "Complete" - } - else - { - $DatacenterCsvValidationComplete.Forecolor = "Red" - $DatacenterCsvValidationComplete.Text = "Not Complete" - } - } - if ($ClusterCsvCheckBox.Checked -eq "True") - { - $ClusterCsvValidationComplete.Forecolor = "Blue" - $ClusterCsvValidationComplete.Text = "Processing ....." - Cluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" - $ClusterCsvComplete = Test-Path $ClusterExportFileComplete - if ($ClusterCsvComplete -eq $True) - { - $ClusterCsvValidationComplete.Forecolor = "Green" - $ClusterCsvValidationComplete.Text = "Complete" - } - else - { - $ClusterCsvValidationComplete.Forecolor = "Red" - $ClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmHostCsvCheckBox.Checked -eq "True") - { - $VmHostCsvValidationComplete.Forecolor = "Blue" - $VmHostCsvValidationComplete.Text = "Processing ....." - VmHost_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" - $VmHostCsvComplete = Test-Path $VmHostExportFileComplete - if ($VmHostCsvComplete -eq $True) - { - $VmHostCsvValidationComplete.Forecolor = "Green" - $VmHostCsvValidationComplete.Text = "Complete" - } - else - { - $VmHostCsvValidationComplete.Forecolor = "Red" - $VmHostCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmCsvCheckBox.Checked -eq "True") - { - $VmCsvValidationComplete.Forecolor = "Blue" - $VmCsvValidationComplete.Text = "Processing ....." - Vm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" - $VmCsvComplete = Test-Path $VmExportFileComplete - if ($VmCsvComplete -eq $True) - { - $VmCsvValidationComplete.Forecolor = "Green" - $VmCsvValidationComplete.Text = "Complete" - } - else - { - $VmCsvValidationComplete.Forecolor = "Red" - $VmCsvValidationComplete.Text = "Not Complete" - } - } - if ($TemplateCsvCheckBox.Checked -eq "True") - { - $TemplateCsvValidationComplete.Forecolor = "Blue" - $TemplateCsvValidationComplete.Text = "Processing ....." - Template_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" - $TemplateCsvComplete = Test-Path $TemplateExportFileComplete - if ($TemplateCsvComplete -eq $True) - { - $TemplateCsvValidationComplete.Forecolor = "Green" - $TemplateCsvValidationComplete.Text = "Complete" - } - else - { - $TemplateCsvValidationComplete.Forecolor = "Red" - $TemplateCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreClusterCsvCheckBox.Checked -eq "True") - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" - $DatastoreClusterCsvValidationComplete.Text = "Processing ....." - DatastoreCluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete - if ($DatastoreClusterCsvComplete -eq $True) - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Green" - $DatastoreClusterCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Red" - $DatastoreClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreCsvCheckBox.Checked -eq "True") - { - $DatastoreCsvValidationComplete.Forecolor = "Blue" - $DatastoreCsvValidationComplete.Text = "Processing ....." - Datastore_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" - $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete - if ($DatastoreCsvComplete -eq $True) - { - $DatastoreCsvValidationComplete.Forecolor = "Green" - $DatastoreCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreCsvValidationComplete.Forecolor = "Red" - $DatastoreCsvValidationComplete.Text = "Not Complete" - } - } - if ($VsSwitchCsvCheckBox.Checked -eq "True") - { - $VsSwitchCsvValidationComplete.Forecolor = "Blue" - $VsSwitchCsvValidationComplete.Text = "Processing ....." - VsSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" - $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete - if ($vSSwitchCsvComplete -eq $True) - { - $vSSwitchCsvValidationComplete.Forecolor = "Green" - $vSSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $vSSwitchCsvValidationComplete.Forecolor = "Red" - $vSSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPortGroupCsvCheckBox.Checked -eq "True") - { - $VssPortGroupCsvValidationComplete.Forecolor = "Blue" - $VssPortGroupCsvValidationComplete.Text = "Processing ....." - VssPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete - if ($VssPortGroupCsvComplete -eq $True) - { - $VssPortGroupCsvValidationComplete.Forecolor = "Green" - $VssPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VssPortGroupCsvValidationComplete.Forecolor = "Red" - $VssPortGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssVmkernelCsvCheckBox.Checked -eq "True") - { - $VssVmkernelCsvValidationComplete.Forecolor = "Blue" - $VssVmkernelCsvValidationComplete.Text = "Processing ....." - VssVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete - if ($VssVmkernelCsvComplete -eq $True) - { - $VssVmkernelCsvValidationComplete.Forecolor = "Green" - $VssVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VssVmkernelCsvValidationComplete.Forecolor = "Red" - $VssVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPnicCsvCheckBox.Checked -eq "True") - { - $VssPnicCsvValidationComplete.Forecolor = "Blue" - $VssPnicCsvValidationComplete.Text = "Processing ....." - VssPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" - $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete - if ($VssPnicCsvComplete -eq $True) - { - $VssPnicCsvValidationComplete.Forecolor = "Green" - $VssPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VssPnicCsvValidationComplete.Forecolor = "Red" - $VssPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdSwitchCsvCheckBox.Checked -eq "True") - { - $VdSwitchCsvValidationComplete.Forecolor = "Blue" - $VdSwitchCsvValidationComplete.Text = "Processing ....." - VdSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" - $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete - if ($VdSwitchCsvComplete -eq $True) - { - $VdSwitchCsvValidationComplete.Forecolor = "Green" - $VdSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $VdSwitchCsvValidationComplete.Forecolor = "Red" - $VdSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPortGroupCsvCheckBox.Checked -eq "True") - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" - $VdsPortGroupCsvValidationComplete.Text = "Processing ....." - VdsPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete - if ($VdsPortGroupCsvComplete -eq $True) - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Green" - $VdsPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Red" - $VdsPortGroupCsvValidationComplete.Text = "Not Complete" - - } - } - if ($VdsVmkernelCsvCheckBox.Checked -eq "True") - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" - $VdsVmkernelCsvValidationComplete.Text = "Processing ....." - VdsVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete - if ($VdsVmkernelCsvComplete -eq $True) - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Green" - $VdsVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Red" - $VdsVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPnicCsvCheckBox.Checked -eq "True") - { - $VdsPnicCsvValidationComplete.Forecolor = "Blue" - $VdsPnicCsvValidationComplete.Text = "Processing ....." - VdsPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" - $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete - if ($VdsPnicCsvComplete -eq $True) - { - $VdsPnicCsvValidationComplete.Forecolor = "Green" - $VdsPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPnicCsvValidationComplete.Forecolor = "Red" - $VdsPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($FolderCsvCheckBox.Checked -eq "True") - { - $FolderCsvValidationComplete.Forecolor = "Blue" - $FolderCsvValidationComplete.Text = "Processing ....." - Folder_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" - $FolderCsvComplete = Test-Path $FolderExportFileComplete - if ($FolderCsvComplete -eq $True) - { - $FolderCsvValidationComplete.Forecolor = "Green" - $FolderCsvValidationComplete.Text = "Complete" - } - else - { - $FolderCsvValidationComplete.Forecolor = "Red" - $FolderCsvValidationComplete.Text = "Not Complete" - } - } - if ($RdmCsvCheckBox.Checked -eq "True") - { - $RdmCsvValidationComplete.Forecolor = "Blue" - $RdmCsvValidationComplete.Text = "Processing ....." - Rdm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" - $RdmCsvComplete = Test-Path $RdmExportFileComplete - if ($RdmCsvComplete -eq $True) - { - $RdmCsvValidationComplete.Forecolor = "Green" - $RdmCsvValidationComplete.Text = "Complete" - } - else - { - $RdmCsvValidationComplete.Forecolor = "Red" - $RdmCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsRuleCsvCheckBox.Checked -eq "True") - { - $DrsRuleCsvValidationComplete.Forecolor = "Blue" - $DrsRuleCsvValidationComplete.Text = "Processing ....." - Drs_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" - $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete - if ($DrsRuleCsvComplete -eq $True) - { - $DrsRuleCsvValidationComplete.Forecolor = "Green" - $DrsRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsRuleCsvValidationComplete.Forecolor = "Red" - $DrsRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" - $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." - Drs_Cluster_Group_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete - if ($DrsClusterGroupCsvComplete -eq $True) - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" - $DrsClusterGroupCsvValidationComplete.Text = "Complete" - } - else - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" - $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" - $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." - Drs_VmHost_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete - if ($DrsVmHostRuleCsvComplete -eq $True) - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" - $DrsVmHostRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" - $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($ResourcePoolCsvCheckBox.Checked -eq "True") - { - $ResourcePoolCsvValidationComplete.Forecolor = "Blue" - $ResourcePoolCsvValidationComplete.Text = "Processing ....." - Resource_Pool_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete - if ($ResourcePoolCsvComplete -eq $True) - { - $ResourcePoolCsvValidationComplete.Forecolor = "Green" - $ResourcePoolCsvValidationComplete.Text = "Complete" - } - else - { - $ResourcePoolCsvValidationComplete.Forecolor = "Red" - $ResourcePoolCsvValidationComplete.Text = "Not Complete" - } - } - Disconnect_vCenter - $ConnectButton.Forecolor = [System.Drawing.Color]::Red - $ConnectButton.Text = "Disconnected" - $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" - } -}) -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) -$TabDraw.Controls.Add($DrawCsvInputButton) -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton.Add_Click( -{ - $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text - $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" - $vCenterCsvExists = Test-Path $vCenterExportFile - $TabDraw.Controls.Add($vCenterCsvValidationCheck) - if ($vCenterCsvExists -eq $True) - { - - $vCenterCsvValidationCheck.Forecolor = "Green" - $vCenterCsvValidationCheck.Text = "Present" - } - else - { - $vCenterCsvValidationCheck.Forecolor = "Red" - $vCenterCsvValidationCheck.Text = "Not Present" - } - - $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" - $DatacenterCsvExists = Test-Path $DatacenterExportFile - $TabDraw.Controls.Add($DatacenterCsvValidationCheck) - - if ($DatacenterCsvExists -eq $True) - { - $DatacenterCsvValidationCheck.Forecolor = "Green" - $DatacenterCsvValidationCheck.Text = "Present" - } - else - { - $DatacenterCsvValidationCheck.Forecolor = "Red" - $DatacenterCsvValidationCheck.Text = "Not Present" - } - - $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" - $ClusterCsvExists = Test-Path $ClusterExportFile - $TabDraw.Controls.Add($ClusterCsvValidationCheck) - - if ($ClusterCsvExists -eq $True) - { - $ClusterCsvValidationCheck.Forecolor = "Green" - $ClusterCsvValidationCheck.Text = "Present" - } - else - { - $ClusterCsvValidationCheck.Forecolor = "Red" - $ClusterCsvValidationCheck.Text = "Not Present" - } - - $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" - $VmHostCsvExists = Test-Path $VmHostExportFile - $TabDraw.Controls.Add($VmHostCsvValidationCheck) - - if ($VmHostCsvExists -eq $True) - { - $VmHostCsvValidationCheck.Forecolor = "Green" - $VmHostCsvValidationCheck.Text = "Present" - } - else - { - $VmHostCsvValidationCheck.Forecolor = "Red" - $VmHostCsvValidationCheck.Text = "Not Present" - } - - $VmExportFile = $CsvInputDir + "-VmExport.csv" - $VmCsvExists = Test-Path $VmExportFile - $TabDraw.Controls.Add($VmCsvValidationCheck) - - if ($VmCsvExists -eq $True) - { - $VmCsvValidationCheck.Forecolor = "Green" - $VmCsvValidationCheck.Text = "Present" - } - else - { - $VmCsvValidationCheck.Forecolor = "Red" - $VmCsvValidationCheck.Text = "Not Present" - } - - $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" - $TemplateCsvExists = Test-Path $TemplateExportFile - $TabDraw.Controls.Add($TemplateCsvValidationCheck) - - if ($TemplateCsvExists -eq $True) - { - $TemplateCsvValidationCheck.Forecolor = "Green" - $TemplateCsvValidationCheck.Text = "Present" - } - else - { - $TemplateCsvValidationCheck.Forecolor = "Red" - $TemplateCsvValidationCheck.Text = "Not Present" - } - - $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile - $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) - - if ($DatastoreClusterCsvExists -eq $True) - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Green" - $DatastoreClusterCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Red" - $DatastoreClusterCsvValidationCheck.Text = "Not Present" - } - - $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" - $DatastoreCsvExists = Test-Path $DatastoreExportFile - $TabDraw.Controls.Add($DatastoreCsvValidationCheck) - - if ($DatastoreCsvExists -eq $True) - { - $DatastoreCsvValidationCheck.Forecolor = "Green" - $DatastoreCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreCsvValidationCheck.Forecolor = "Red" - $DatastoreCsvValidationCheck.Text = "Not Present" - } - - $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" - $VsSwitchCsvExists = Test-Path $VsSwitchExportFile - $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) - - if ($VsSwitchCsvExists -eq $True) - { - $VsSwitchCsvValidationCheck.Forecolor = "Green" - $VsSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VsSwitchCsvValidationCheck.Forecolor = "Red" - $VsSwitchCsvValidationCheck.Text = "Not Present" - $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile - $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) - - if ($VssPortGroupCsvExists -eq $True) - { - $VssPortGroupCsvValidationCheck.Forecolor = "Green" - $VssPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VssPortGroupCsvValidationCheck.Forecolor = "Red" - $VssPortGroupCsvValidationCheck.Text = "Not Present" - $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile - $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) - - if ($VssVmkernelCsvExists -eq $True) - { - $VssVmkernelCsvValidationCheck.Forecolor = "Green" - $VssVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VssVmkernelCsvValidationCheck.Forecolor = "Red" - $VssVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" - $VssPnicCsvExists = Test-Path $VssPnicExportFile - $TabDraw.Controls.Add($VssPnicCsvValidationCheck) - - if ($VssPnicCsvExists -eq $True) - { - $VssPnicCsvValidationCheck.Forecolor = "Green" - $VssPnicCsvValidationCheck.Text = "Present" - } - else - { - $VssPnicCsvValidationCheck.Forecolor = "Red" - $VssPnicCsvValidationCheck.Text = "Not Present" - } - - $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" - $VdSwitchCsvExists = Test-Path $VdSwitchExportFile - $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) - - if ($VdSwitchCsvExists -eq $True) - { - $VdSwitchCsvValidationCheck.Forecolor = "Green" - $VdSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VdSwitchCsvValidationCheck.Forecolor = "Red" - $VdSwitchCsvValidationCheck.Text = "Not Present" - $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile - $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) - - if ($VdsPortGroupCsvExists -eq $True) - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Green" - $VdsPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Red" - $VdsPortGroupCsvValidationCheck.Text = "Not Present" - $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile - $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) - - if ($VdsVmkernelCsvExists -eq $True) - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Green" - $VdsVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Red" - $VdsVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" - $VdsPnicCsvExists = Test-Path $VdsPnicExportFile - $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) - - if ($VdsPnicCsvExists -eq $True) - { - $VdsPnicCsvValidationCheck.Forecolor = "Green" - $VdsPnicCsvValidationCheck.Text = "Present" - } - else - { - $VdsPnicCsvValidationCheck.Forecolor = "Red" - $VdsPnicCsvValidationCheck.Text = "Not Present" - } - - $FolderExportFile = $CsvInputDir + "-FolderExport.csv" - $FolderCsvExists = Test-Path $FolderExportFile - $TabDraw.Controls.Add($FolderCsvValidationCheck) - - if ($FolderCsvExists -eq $True) - { - $FolderCsvValidationCheck.Forecolor = "Green" - $FolderCsvValidationCheck.Text = "Present" - } - else - { - $FolderCsvValidationCheck.Forecolor = "Red" - $FolderCsvValidationCheck.Text = "Not Present" - } - - $RdmExportFile = $CsvInputDir + "-RdmExport.csv" - $RdmCsvExists = Test-Path $RdmExportFile - $TabDraw.Controls.Add($RdmCsvValidationCheck) - - if ($RdmCsvExists -eq $True) - { - $RdmCsvValidationCheck.Forecolor = "Green" - $RdmCsvValidationCheck.Text = "Present" - } - else - { - $RdmCsvValidationCheck.Forecolor = "Red" - $RdmCsvValidationCheck.Text = "Not Present" - $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" - $DrsRuleCsvExists = Test-Path $DrsRuleExportFile - $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) - - if ($DrsRuleCsvExists -eq $True) - { - $DrsRuleCsvValidationCheck.Forecolor = "Green" - $DrsRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsRuleCsvValidationCheck.Forecolor = "Red" - $DrsRuleCsvValidationCheck.Text = "Not Present" - $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile - $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) - - if ($DrsClusterGroupCsvExists -eq $True) - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" - $DrsClusterGroupCsvValidationCheck.Text = "Present" - } - else - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" - $DrsClusterGroupCsvValidationCheck.Text = "Not Present" - } - - $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile - $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) - - if ($DrsVmHostRuleCsvExists -eq $True) - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" - $DrsVmHostRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" - $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" - } - - $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile - $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) - - if ($ResourcePoolCsvExists -eq $True) - { - $ResourcePoolCsvValidationCheck.Forecolor = "Green" - $ResourcePoolCsvValidationCheck.Text = "Present" - } - else - { - $ResourcePoolCsvValidationCheck.Forecolor = "Red" - $ResourcePoolCsvValidationCheck.Text = "Not Present" - $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" - } -} ) -$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) -$TabDraw.Controls.Add($CsvValidationButton) -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) -$TabDraw.Controls.Add($VisioOpenOutputButton) -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) -$TabDraw.Controls.Add($DrawUncheckButton) -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) -$TabDraw.Controls.Add($DrawCheckButton) -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; -if ($VM_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Host_Complete.Forecolor = "Blue" - $VM_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Host_Complete) - VM_to_Host - $VM_to_Host_Complete.Forecolor = "Green" - $VM_to_Host_Complete.Text = "Complete" - $TabDraw.Controls.Add($VM_to_Host_Complete) -} -if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Folder_Complete.Forecolor = "Blue" - $VM_to_Folder_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Folder_Complete) - VM_to_Folder - $VM_to_Folder_Complete.Forecolor = "Green" - $VM_to_Folder_Complete.Text = "Complete" -} -if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") -{ - $VMs_with_RDMs_Complete.Forecolor = "Blue" - $VMs_with_RDMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMs_with_RDMs_Complete) - VMs_with_RDMs - $VMs_with_RDMs_Complete.Forecolor = "Green" - $VMs_with_RDMs_Complete.Text = "Complete" -} -if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") -{ - $SRM_Protected_VMs_Complete.Forecolor = "Blue" - $SRM_Protected_VMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) - SRM_Protected_VMs - $SRM_Protected_VMs_Complete.Forecolor = "Green" - $SRM_Protected_VMs_Complete.Text = "Complete" -} -if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Datastore_Complete.Forecolor = "Blue" - $VM_to_Datastore_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Datastore_Complete) - VM_to_Datastore - $VM_to_Datastore_Complete.Forecolor = "Green" - $VM_to_Datastore_Complete.Text = "Complete" -} -if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") -{ - $VM_to_ResourcePool_Complete.Forecolor = "Blue" - $VM_to_ResourcePool_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) - VM_to_ResourcePool - $VM_to_ResourcePool_Complete.Forecolor = "Green" - $VM_to_ResourcePool_Complete.Text = "Complete" -} -if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") -{ - $Datastore_to_Host_Complete.Forecolor = "Blue" - $Datastore_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Datastore_to_Host_Complete) - Datastore_to_Host - $Datastore_to_Host_Complete.Forecolor = "Green" - $Datastore_to_Host_Complete.Text = "Complete" -} -if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") -{ - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" - $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) - PhysicalNIC_to_vSwitch - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" - $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" -} -if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VSS_to_Host_Complete.Forecolor = "Blue" - $VSS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSS_to_Host_Complete) - VSS_to_Host - $VSS_to_Host_Complete.Forecolor = "Green" - $VSS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VSS_Complete.Forecolor = "Blue" - $VMK_to_VSS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VSS_Complete) - VMK_to_VSS - $VMK_to_VSS_Complete.Forecolor = "Green" - $VMK_to_VSS_Complete.Text = "Complete" -} -if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VSSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) - VSSPortGroup_to_VM - $VSSPortGroup_to_VM_Complete.Forecolor = "Green" - $VSSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VDS_to_Host_Complete.Forecolor = "Blue" - $VDS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDS_to_Host_Complete) - VDS_to_Host - $VDS_to_Host_Complete.Forecolor = "Green" - $VDS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VDS_Complete.Forecolor = "Blue" - $VMK_to_VDS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VDS_Complete) - VMK_to_VDS - $VMK_to_VDS_Complete.Forecolor = "Green" - $VMK_to_VDS_Complete.Text = "Complete" -} -if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VDSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) - VDSPortGroup_to_VM - $VDSPortGroup_to_VM_Complete.Forecolor = "Green" - $VDSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") -{ - $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" - $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) - Cluster_to_DRS_Rule - $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" - $Cluster_to_DRS_Rule_Complete.Text = "Complete" -}; -$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) -$TabDraw.Controls.Add($DrawButton) -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton.Add_Click({Open_Final_Visio}) -$TabDraw.Controls.Add($OpenVisioButton) - -#endregion - -#region Event Loop - -function Main{ - [System.Windows.Forms.Application]::EnableVisualStyles() - [System.Windows.Forms.Application]::Run($vDiagram) -} - -#endregion - -#endregion - -#region Event Handlers - -#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect_vCenter_Main -{ - $MainVC = $MainVcenterTextBox.Text - $MainUser = $UserNameTextBox.Text - $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text -} - -function Connect_vCenter -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $User = $UserNameTextBox.Text - $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text -} - -function Disconnect_vCenter -{ - $Disconnect = Disconnect-ViServer * -Confirm:$false -} -#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Find_CaptureCsvFolder -{ - $CaptureCsvBrowseLoop = $True - while ($CaptureCsvBrowseLoop) - { - if ($CaptureCsvBrowse.ShowDialog() -eq "OK") - { - $CaptureCsvBrowseLoop = $False - } - else - { - $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($CaptureCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath -} - -function Check_CaptureCsvFolder -{ - $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $CheckContentDir = $CheckContentPath + "*.csv" - $CheckContent = Test-Path $CheckContentDir - if ($CheckContent -eq "True") - { - $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") - switch ($CheckContents_CaptureCsvFolder) { - 'Yes' - { - del $CheckContentDir - } - - 'No' - { - $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog - $CheckContentCsvBrowse.Description = "Select a directory to copy files to" - $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - $CheckContentCsvBrowse.ShowDialog() - $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath - copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder - del $CheckContentDir - } - } - } -} - -function Find_DrawCsvFolder -{ - $DrawCsvBrowseLoop = $True - while ($DrawCsvBrowseLoop) - { - if ($DrawCsvBrowse.ShowDialog() -eq "OK") - { - $DrawCsvBrowseLoop = $False - } - else - { - $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($DrawCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath -} - -function Find_DrawVisioFolder -{ - $VisioBrowseLoop = $True - while($VisioBrowseLoop) - { - if ($VisioBrowse.ShowDialog() -eq "OK") - { - $VisioBrowseLoop = $False - } - else - { - $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if($VisioBrowseRes -eq "Cancel") - { - return - } - } - } - $global:VisioFolder = $VisioBrowse.SelectedPath -} -#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function vCenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, - @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation - - if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) - { - $null - } - else - { - Disconnect_vCenter - } -} - -function Datacenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort-Object Name | - Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation -} - -function Cluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, - @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, - @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, - @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, - @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, - @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, - @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, - @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, - @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, - @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation -} - -function VmHost_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent - while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent - } - if ($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name } } }, - @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent - while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent - } - if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, - @{ N = "Version" ; E = { $_.Config.Product.Version } }, - @{ N = "Build" ; E = { $_.Config.Product.Build } }, - @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, - @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, - @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, - @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, - @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, - @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, - @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, - @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, - @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, - @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, - @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, - @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation -} - -function Vm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select-Object Name , - @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, - @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, - @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, - @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, - @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, - @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, - @{ N = "OS" ; E = { $_.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.Config.Version } }, - @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, - @{ N = 'Folder' ; E = { $Folder.Name } }, - @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, - @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, - @{ N = "IP" ; E = { $_.Guest.IpAddress } }, - @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, - @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, - @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, - @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation - } -} - -function Template_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - foreach ($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { $VmHost.name } }, - @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, - @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, - @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, - @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, - @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, - @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, - @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, - @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation - } -} - -function DatastoreCluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, - @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, - @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation -} - -function Datastore_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, - @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, - @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, - @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, - @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, - @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, - @{ N = "Accessible" ; E = { $_.State } }, - @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation -} - -function VsSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "Nic" ; E = { $_.Nic } }, - @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, - @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, - @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, - @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, - @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation -} - -function VssPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "VLanId" ; E = { $_.VLanId } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VssVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation - } - } - } -} - -function VssPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation - } - } -} - -function VdSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - foreach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "Vendor" ; E = { $_.Vendor } }, - @{ N = "Version" ; E = { $_.Version } }, - @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, - @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation - } -} - -function VdsPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, - @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, - @{ N = "NumPorts" ; E = { $_.NumPorts } }, - @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, - @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, - @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VdsVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation - - } - } -} - -function VdsPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | - Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch } }, - @{ N = "Portgroup" ; E = { $_.Portgroup } }, - @{ N = "ConnectedEntity" ; E = { $_.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation - } - } -} - -function Folder_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - foreach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -type VM | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation - } -} - -function Rdm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | - Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, - @{ N = "Vm" ; E = { $_.Parent } }, - @{ N = "Label" ; E = { $_.Name } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, - @{ N = "DiskType" ; E = { $_.DiskType } }, - @{ N = "Persistence" ; E = { $_.Persistence } }, - @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, - @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, - @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation -} - -function Drs_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation - } -} - -function Drs_Cluster_Group_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "GroupType" ; E = { $_.GroupType } }, - @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation - } -} - -function Drs_VmHost_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) - { - Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "VMGroup" ; E = { $_.VMGroup } }, - @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, - @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, - @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation - } - } -} - -function Resource_Pool_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) - { - Get-ResourcePool $ResourcePool | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Cluster" ; E = { $Cluster.Name } }, - @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, - @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, - @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, - @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, - @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, - @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, - @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, - @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, - @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, - @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation - } - } -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect-VisioObject($firstObj, $secondObj) -{ - $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) - $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) - $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) -} - -function Add-VisioObjectVC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectCluster($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHost($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectTemplate($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectSRM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDatastore($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHardDisk($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.ScsiCanonicalName - return $shpObj -} - -function Add-VisioObjectFolder($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVsSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVssPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVMK($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsClusterGroup($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDRSVMHostRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectResourcePool($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Create_Visio_Base -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $DocObj = $docsObj.Add("") - $DocObj.SaveAs($Savefile) - $AppVisio.Quit() -} - -function VM_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Host" - $Page = $DocsObj.Pages('VM to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Folder -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Folder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - $FolderImport = Import-Csv $FolderExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Folder" - $Page = $DocsObj.Pages('VM to Folder') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Folder') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Folder Object - $FolderObj = $stnObj.Masters.Item("Folder") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $FolderObject = Add-VisioObjectFolder $FolderObj $Folder - $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' - Connect-VisioObject $DatacenterObject $FolderObject - $y += 1.50 - - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $FolderObject $TemplateObject - $FolderObject = $TemplateObject - } - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $FolderObject $VMObject - $FolderObject = $VMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMs_with_RDMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - # RDM's - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - $RdmImport = Import-Csv $RdmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" - $Page = $DocsObj.Pages('VM w/ RDMs') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM w/ RDMs') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # RDM Object - $RDMObj = $stnObj.Masters.Item("RDM") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ClusterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 3.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatacenterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 2.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function SRM_Protected_VMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "SRM VM" - $Page = $DocsObj.Pages('SRM VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('SRM VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # SRM Protected VM Object - $SRMObj = $stnObj.Masters.Item("SRM Protected Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Datastore -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Datastore" - $Page = $DocsObj.Pages('VM to Datastore') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Datastore') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $ClusterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $ClusterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_ResourcePool -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # ResourcePool - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - $ResourcePoolImport = Import-Csv $ResourcePoolExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" - $Page = $DocsObj.Pages('VM to Resource Pool') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Resource Pool') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Resource Pool Object - $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool - # Name - $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' - # Cluster - $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' - # CpuSharesLevel - $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' - # NumCpuShares - $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' - # CpuReservationMHz - $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' - # CpuExpandableReservation - $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' - # CpuLimitMHz - $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' - # MemSharesLevel - $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' - # NumMemShares - $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' - # MemReservationGB - $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' - # MemExpandableReservation - $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' - # MemLimitGB - $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' - Connect-VisioObject $ClusterObject $ResourcePoolObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ResourcePoolObject $VMObject - $ResourcePoolObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Datastore_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Datastore to Host" - $Page = $DocsObj.Pages('Datastore to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Datastore to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function PhysicalNIC_to_vSwitch -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "PNIC to switch" - $Page = $DocsObj.Pages('PNIC to Switch') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('PNIC to Switch') - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - $y += 1.50 - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSS to Host" - $Page = $DocsObj.Pages('VSS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VSS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VSS" - $Page = $DocsObj.Pages('VMK to VSS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VSS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" - $Page = $DocsObj.Pages('VSSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDS to Host" - $Page = $DocsObj.Pages('VDS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VDS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VDS" - $Page = $DocsObj.Pages('VMK to VDS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VDS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" - $Page = $DocsObj.Pages('VDSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $DatacenterObject $VdSwitchObject - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x = 6.00 - $y += 1.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VPGObject $VMObject - $VPGObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Cluster_to_DRS_Rule -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # DRS Rule - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - $DrsRuleImport = Import-Csv $DrsRuleExportFile - # DRS Cluster Group - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile - # DRS VmHost Rule - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" - $Page = $DocsObj.Pages('Cluster to DRS Rule') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Cluster to DRS Rule') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # DRS Rule - $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") - # DRS Cluster Group - $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") - # DRS Host Rule - $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") - # Microsoft VM Object - $MSObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LXObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - $y += 1.50 - - foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule - # Name - $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' - # VM Affinity - $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' - # DRS Rule Enabled - $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' - # DRS Rule Mandatory - $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' - Connect-VisioObject $ClusterObject $DRSObject - #$ClusterObject = $DRSObject - $y += 1.50 - } - foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule - # Name - $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' - # Enabled - $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' - # Type - $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' - # VMGroup - $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' - # VMHostGroup - $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' - # AffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' - # AntiAffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' - Connect-VisioObject $ClusterObject $DRSVMHostRuleObject - $y += 1.50 - #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject - #$DrsClusterGroupObject = $DRSVMHostRuleObject - - foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) - { - $x += 2.50 - $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup - # Name - $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' - # GroupType - $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' - # Members - $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' - Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject - $DRSVMHostRuleObject = $DrsClusterGroupObject - - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Open_Final_Visio -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.Application - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null -} - -Main - -#endregion \ No newline at end of file diff --git a/vDiagram_2.0.1/vDiagram_Scheduled_Task 2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task 2.0.1.ps1 deleted file mode 100644 index 13421ae..0000000 --- a/vDiagram_2.0.1/vDiagram_Scheduled_Task 2.0.1.ps1 +++ /dev/null @@ -1,593 +0,0 @@ -$Date = (Get-Date -format "yyyy_MM_dd") -$7zip = "C:\Program Files\7-Zip\7z.exe" - -# Variables -$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." -$vCenterShortName = "Replace with vCenter name." -$CsvDir = "C:\vDiagram\Capture" -$SMTPserver = "SMTP Server" -$Mailfrom = "outbound@email.com" -$Mailto = "you@email.com" -$Subject = "vDiagram 2.0 Files" -$ReportFile = "C:\vDiagram\Zip" -$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" -$AttachmentFile = $ZipFile -$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" - - -#region Functions -#region PsCreds -#region Export-PSCredential -Function Export-PSCredential { - param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) - - # Look at the object type of the $Credential parameter to determine how to handle it - switch ( $Credential.GetType().Name ) { - # It is a credential, so continue - PSCredential { continue } - # It is a string, so use that as the username and prompt for the password - String { $Credential = Get-Credential -credential $Credential } - # In all other caess, throw an error and exit - default { Throw "You must specify a credential object to export to disk." } - } - - # Create temporary object to be serialized to disk - $export = "" | Select-Object Username, EncryptedPassword - - # Give object a type name which can be identified later - #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) - - $export.Username = $Credential.Username - - # Encrypt SecureString password using Data Protection API - # Only the current user account can decrypt this cipher - $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString - - # Export using the Export-Clixml cmdlet - $export | Export-Clixml $Path - Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine - - # Return FileInfo object referring to saved credentials - Get-Item $Path -} -Export-PSCredential -#endregion Export-PSCredential - -#region Import-PSCredential -Function Import-PSCredential { - param ( $Path = "credentials.xml" ) - - # Import credential file - $import = Import-Clixml $Path - - # Test for valid import - if ( !$import.UserName -or !$import.EncryptedPassword ) { - Throw "Input is not a valid ExportedPSCredential object, exiting." - } - $Username = $import.Username - - # Decrypt the password and store as a SecureString object for safekeeping - $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString - - # Build the new credential object - $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass - Write-Output $Credential -} -#endregion Import-PSCredential - -#endregion PsCreds - -#region vCenterFunctions -#region Connect_vCenter_Main -Function Connect_vCenter_Main -{ - $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter_Main - -#region Connect_vCenter -Function Connect_vCenter -{ - $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter - -#region Disconnect_vCenter -Function Disconnect_vCenter -{ - Disconnect-ViServer * -Confirm:$False -} -#endregion Disconnect_vCenter -#endregion vCenterFunctions - -#region CsvExportFunctions -#region vCenter_Export -Function vCenter_Export -{ - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, - @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, - @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo - Disconnect_vCenter -} -#endregion vCenter_Export - -#region Datacenter_Export -Function Datacenter_Export -{ - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo -} -#endregion Datacenter_Export - -#region Cluster_Export -Function Cluster_Export -{ - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, - @{N="HAEnabled";E={$_.HAEnabled}}, - @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, - @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, - @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, - @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, - @{N="DrsEnabled";E={$_.DrsEnabled}}, - @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, - @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, - @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo -} -#endregion Cluster_Export - -#region VmHost_Export -Function VmHost_Export -{ - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={ - $Datacenter = Get-View -Id $_.Parent -Property Name,Parent - While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent - } - If($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name}}}, - @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent - While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent - } - If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, - @{N="Version";E={$_.Config.Product.Version}}, - @{N="Build";E={$_.Config.Product.Build}}, - @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, - @{N="Model";E={$_.Summary.Hardware.Model}}, - @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, - @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, - @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, - @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, - @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, - @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, - @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, - @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, - @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, - @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo -} -#endregion VmHost_Export - -#region Vm_Export -Function Vm_Export -{ - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select Name, - @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, - @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, - @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, - @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, - @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, - @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, - @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, - @{N="OS";E={$_.Config.GuestFullName}}, - @{N="Version";E={$_.Config.Version}}, - @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, - @{N='Folder';E={$Folder.Name}}, - @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, - @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, - @{N="IP";E={$_.Guest.IpAddress}}, - @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, - @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, - @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, - @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo - } -} -#endregion Vm_Export - -#region Template_Export -Function Template_Export -{ - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - ForEach($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$VmHost | Get-Datacenter}}, - @{N="Cluster";E={$VmHost | Get-Cluster}}, - @{N="VmHost";E={$VmHost.name}}, - @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, - @{N="Folder";E={Get-Folder -Id $_.FolderId}}, - @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, - @{N="Version";E={$_.ExtensionData.Config.Version}}, - @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, - @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, - @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, - @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, - @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo - } -} -#endregion Template_Export - -#region DatastoreCluster_Export -Function DatastoreCluster_Export -{ - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, - @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, - @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, - @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, - @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo -} -#endregion DatastoreCluster_Export - -#region Datastore_Export -Function Datastore_Export -{ - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, - @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, - @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, - @{N="Type";E={$_.Type}}, - @{N="FileSystemVersion";E={$_.FileSystemVersion}}, - @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, - @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, - @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, - @{N="Accessible";E={$_.State}}, - @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo -} -#endregion Datastore_Export - -#region VsSwitch_Export -Function VsSwitch_Export -{ - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="Nic";E={$_.Nic}}, - @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, - @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, - @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, - @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, - @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, - @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, - @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, - @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, - @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo -} -#endregion VsSwitch_Export - -#region VssPort_Export -Function VssPort_Export -{ - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="VLanId";E={$_.VLanId}}, - @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPort_Export - -#region VssVmk_Export -Function VssVmk_Export -{ - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo - } - } - } -} -#endregion VssVmk_Export - -#region VssPnic_Export -Function VssPnic_Export -{ - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPnic_Export - -#region VdSwitch_Export -Function VdSwitch_Export -{ - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - ForEach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="Vendor";E={$_.Vendor}}, - @{N="Version";E={$_.Version}}, - @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, - @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo - } -} -#endregion VdSwitch_Export - -#region VdsPort_Export -Function VdsPort_Export -{ - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}}, - @{N="VdSwitch";E={$_.VdSwitch}}, - @{N="NumPorts";E={$_.NumPorts}}, - @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, - @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, - @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, - @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, - @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, - @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPort_Export - -#region VdsVmk_Export -Function VdsVmk_Export -{ - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo - - } - } -} -#endregion VdsVmk_Export - -#region VdsPnic_Export -Function VdsPnic_Export -{ - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch}}, - @{N="Portgroup";E={$_.Portgroup}}, - @{N="ConnectedEntity";E={$_.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPnic_Export - -#region Folder_Export -Function Folder_Export -{ - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - ForEach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo - } -} -#endregion Folder_Export - -#region Rdm_Export -Function Rdm_Export -{ - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, - @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, - @{N="Vm";E={$_.Parent}}, - @{N="Label";E={$_.Name}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, - @{N="DiskType";E={$_.DiskType}}, - @{N="Persistence";E={$_.Persistence}}, - @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, - @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, - @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo -} -#endregion Rdm_Export - -#region Drs_Rule_Export -Function Drs_Rule_Export -{ - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Type";E={$_.Type}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Rule_Export - -#region Drs_Cluster_Group_Export -Function Drs_Cluster_Group_Export -{ - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="GroupType";E={$_.GroupType}}, - @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Cluster_Group_Export - -#region Drs_VmHost_Rule_Export -Function Drs_VmHost_Rule_Export -{ - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) - { - Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Type";E={$_.Type}}, - @{N="VMGroup";E={$_.VMGroup}}, - @{N="VMHostGroup";E={$_.VMHostGroup}}, - @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, - @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo - } - } -} -#endregion Drs_VmHost_Rule_Export - -#region Resource_Pool_Export -Function Resource_Pool_Export -{ - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) - { - Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Cluster";E={$Cluster.Name}}, - @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, - @{N="NumCpuShares";E={$_.NumCpuShares}}, - @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, - @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, - @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, - @{N="MemSharesLevel";E={$_.MemSharesLevel}}, - @{N="NumMemShares";E={$_.NumMemShares}}, - @{N="MemReservationGB";E={$_.MemReservationGB}}, - @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, - @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo - } - } -} -#endregion Resource_Pool_Export - -#endregion CsvExportFunctions - -#endregion Functions - -Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter - -#Zip Files -cd $CsvDir -dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } - -#Send E-mail -Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile - -#Clear CSV Folder -cd $CsvDir -del *.csv \ No newline at end of file From 27379d65524afd6569726ec7b0ddca0351ca9c41 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Fri, 13 Apr 2018 08:37:16 -0400 Subject: [PATCH 04/19] vDiagram_2.0.1 - Visio Shape File --- vDiagram_2.0.1/vDiagram.vssx | Bin 0 -> 811190 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 vDiagram_2.0.1/vDiagram.vssx diff --git a/vDiagram_2.0.1/vDiagram.vssx b/vDiagram_2.0.1/vDiagram.vssx new file mode 100644 index 0000000000000000000000000000000000000000..5acb6e696e4a8a05619143b83a6350e21f0b8af7 GIT binary patch literal 811190 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 z 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%0AW#|s-_LSUe?VI^wixa*f&e-XqC*?O|B%(C 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 w>+;fF& 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⪻j=$~evfD3|ZEan5f63xkm!R5c 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 I?_~i014p;Y`Tzg` literal 0 HcmV?d00001 diff --git a/vDiagram2.0.1.ps1 b/vDiagram2.0.1.ps1 new file mode 100644 index 0000000..fbb9c51 --- /dev/null +++ b/vDiagram2.0.1.ps1 @@ -0,0 +1,8807 @@ +<# +.SYNOPSIS + vDiagram Visio Drawing Tool + +.DESCRIPTION + vDiagram Visio Drawing Tool + +.NOTES + File Name : vDiagram2.0.1.ps1 + Author : Tony Gonzalez + Author : Jason Hopkins + Based on : vDiagram by Alan Renouf + Version : 2.0.0 + +.USAGE NOTES + Ensure to unblock files before unzipping + Ensure to run as administrator + Required Files: + PowerCLI or PowerShell 5.0 with PowerCLI Modules installed + Active connection to vCenter to capture data + MS Visio + +.CHANGE LOG + - 04/12/2018 - v2.0.1 + Added MAC Addresses to VMs & Templates + Added a check to see if prior CSVs are still present + Added option to copy prior CSVs to new folder + + - 04/11/2018 - v2.0.0 + Presented as a Community Theater Session at South Florida VMUG + Feature enhancement requests collected +#> + +#region ScriptForm Designer + +#region Constructor + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") +#endregion + +#region Post-Constructor Custom Code +$MyVer = "2.0.1" +$LastUpdated = "April 12, 2018" +$About = +@" + + vDiagram $MyVer + + Contributors: Tony Gonzalez of RoundTower Technologies LLC + Jason Hopkins of RoundTower Technologies LLC + + Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram + + Created: February 13, 2018 + + Last Updated: $LastUpdated + +"@ +#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" +if (!(Test-Path $TestShapes)) +{ + $CurrentLocation = Get-Location + copy $CurrentLocation\vDiagram.vssx $TestShapes + Write-Host "Copying Shapes File to My Shapes" +} +$shpFile = "\vDiagram.vssx" +#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Set_WindowStyle { +param( + [Parameter()] + [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', + 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', + 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] + $Style = 'SHOW', + [Parameter()] + $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle +) + $WindowStates = @{ + FORCEMINIMIZE = 11; HIDE = 0 + MAXIMIZE = 3; MINIMIZE = 6 + RESTORE = 9; SHOW = 5 + SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 + SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 + SHOWNA = 8; SHOWNOACTIVATE = 4 + SHOWNORMAL = 1 + } + Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) + + $Win32ShowWindowAsync = Add-Type –memberDefinition @” + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); +“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru + + $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null +} +Set_WindowStyle MINIMIZE +#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function About_Config +{ + + $About + + #Add objects for About + $AboutForm = New-Object System.Windows.Forms.Form + $AboutTextBox = New-Object System.Windows.Forms.RichTextBox + + #About Form + $AboutForm.Icon = $Icon + $AboutForm.AutoScroll = $True + $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) + $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutForm.Name = "About" + $AboutForm.StartPosition = 1 + $AboutForm.Text = "About vDiagram $MyVer" + + $AboutTextBox.Anchor = 15 + $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) + $AboutTextBox.BorderStyle = 0 + $AboutTextBox.Font = "Tahoma" + $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) + $AboutTextBox.Name = "AboutTextBox" + $AboutTextBox.ReadOnly = $True + $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) + $AboutTextBox.Text = $About + + $AboutForm.Controls.Add($AboutTextBox) + + $AboutForm.Show() | Out-Null +} +#endregion + +#region Form Creation +#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vDiagram = New-Object System.Windows.Forms.Form +$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) +$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") +$vDiagram.Icon = $Icon +$vDiagram.Text = "vDiagram 2.0" +$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan +#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainMenu = New-Object System.Windows.Forms.MenuStrip +$MainMenu.Location = New-Object System.Drawing.Point(0, 0) +$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) +$MainMenu.TabIndex = 1 +$MainMenu.Text = "MainMenu" +#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) +$FileToolStripMenuItem.Text = "File" +#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) +$ExitToolStripMenuItem.Text = "Exit" +$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) +$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) +#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) +$HelpToolStripMenuItem.Text = "Help" +#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) +$AboutToolStripMenuItem.Text = "About" +$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) +$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) +$AboutToolStripMenuItem.Add_Click({About_Config}) +#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainTab = New-Object System.Windows.Forms.TabControl +$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) +$MainTab.Location = New-Object System.Drawing.Point(10, 30) +$MainTab.Size = New-Object System.Drawing.Size(990, 98) +$MainTab.TabIndex = 0 +$MainTab.Text = "MainTabs" +#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Prerequisites = New-Object System.Windows.Forms.TabPage +$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) +$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) +$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) +$Prerequisites.TabIndex = 0 +$Prerequisites.Text = "Prerequisites" +$Prerequisites.BackColor = [System.Drawing.Color]::LightGray +#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellLabel = New-Object System.Windows.Forms.Label +$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) +$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) +$PowershellLabel.TabIndex = 1 +$PowershellLabel.Text = "Powershell:" +#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellInstalled = New-Object System.Windows.Forms.Label +$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) +$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) +$PowershellInstalled.TabIndex = 2 +$PowershellInstalled.Text = "" +$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleLabel = New-Object System.Windows.Forms.Label +$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) +$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) +$PowerCliModuleLabel.TabIndex = 3 +$PowerCliModuleLabel.Text = "PowerCLI Module:" +#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label +$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) +$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) +$PowerCliModuleInstalled.TabIndex = 4 +$PowerCliModuleInstalled.Text = "" +$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliLabel = New-Object System.Windows.Forms.Label +$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) +$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) +$PowerCliLabel.TabIndex = 5 +$PowerCliLabel.Text = "PowerCLI:" +#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliInstalled = New-Object System.Windows.Forms.Label +$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) +$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) +$PowerCliInstalled.TabIndex = 6 +$PowerCliInstalled.Text = "" +$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioLabel = New-Object System.Windows.Forms.Label +$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) +$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) +$VisioLabel.TabIndex = 7 +$VisioLabel.Text = "Visio:" +#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioInstalled = New-Object System.Windows.Forms.Label +$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) +$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) +$VisioInstalled.TabIndex = 8 +$VisioInstalled.Text = "" +$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray +$Prerequisites.Controls.Add($PowershellLabel) +$Prerequisites.Controls.Add($PowershellInstalled) +$Prerequisites.Controls.Add($PowerCliModuleLabel) +$Prerequisites.Controls.Add($PowerCliModuleInstalled) +$Prerequisites.Controls.Add($PowerCliLabel) +$Prerequisites.Controls.Add($PowerCliInstalled) +$Prerequisites.Controls.Add($VisioLabel) +$Prerequisites.Controls.Add($VisioInstalled) +#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfo = New-Object System.Windows.Forms.TabPage +$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) +$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) +$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) +$vCenterInfo.TabIndex = 0 +$vCenterInfo.Text = "vCenter Info" +$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray +#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterLabel = New-Object System.Windows.Forms.Label +$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) +$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) +$MainVcenterLabel.TabIndex = 1 +$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" +#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox +$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) +$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) +$MainVcenterTextBox.TabIndex = 2 +$MainVcenterTextBox.Text = "" +#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterLabel = New-Object System.Windows.Forms.Label +$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) +$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) +$TargetVcenterLabel.TabIndex = 3 +$TargetVcenterLabel.Text = "Name of target vCenter:" +#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox +$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) +$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) +$TargetVcenterTextBox.TabIndex = 4 +$TargetVcenterTextBox.Text = "" +#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameLabel = New-Object System.Windows.Forms.Label +$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) +$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) +$UserNameLabel.TabIndex = 5 +$UserNameLabel.Text = "vCenter User Name:" +#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameTextBox = New-Object System.Windows.Forms.TextBox +$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) +$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) +$UserNameTextBox.TabIndex = 6 +$UserNameTextBox.Text = "" +#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) +$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) +$PasswordLabel.TabIndex = 7 +$PasswordLabel.Text = "Password:" +#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordTextBox = New-Object System.Windows.Forms.TextBox +$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) +$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) +$PasswordTextBox.TabIndex = 8 +$PasswordTextBox.Text = "" +$PasswordTextBox.UseSystemPasswordChar = $true +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton = New-Object System.Windows.Forms.Button +$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) +$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) +$ConnectButton.TabIndex = 9 +$ConnectButton.Text = "Connect to vCenter" +$ConnectButton.UseVisualStyleBackColor = $true +$vCenterInfo.Controls.Add($MainVcenterLabel) +$vCenterInfo.Controls.Add($MainVcenterTextBox) +$vCenterInfo.Controls.Add($TargetVcenterLabel) +$vCenterInfo.Controls.Add($TargetVcenterTextBox) +$vCenterInfo.Controls.Add($UserNameLabel) +$vCenterInfo.Controls.Add($UserNameTextBox) +$vCenterInfo.Controls.Add($PasswordLabel) +$vCenterInfo.Controls.Add($PasswordTextBox) +$vCenterInfo.Controls.Add($ConnectButton) +$MainTab.Controls.Add($Prerequisites) +$MainTab.Controls.Add($vCenterInfo) +$MainTab.SelectedIndex = 0 +#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SubTab = New-Object System.Windows.Forms.TabControl +$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$SubTab.Location = New-Object System.Drawing.Point(10, 136) +$SubTab.Size = New-Object System.Drawing.Size(990, 512) +$SubTab.TabIndex = 0 +$SubTab.Text = "SubTabs" +#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDirections = New-Object System.Windows.Forms.TabPage +$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDirections.Location = New-Object System.Drawing.Point(4, 22) +$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDirections.Size = New-Object System.Drawing.Size(982, 486) +$TabDirections.TabIndex = 0 +$TabDirections.Text = "Directions" +$TabDirections.UseVisualStyleBackColor = $true +#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesHeading = New-Object System.Windows.Forms.Label +$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) +$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) +$PrerequisitesHeading.TabIndex = 0 +$PrerequisitesHeading.Text = "Prerequisites Tab" +#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesDirections = New-Object System.Windows.Forms.Label +$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) +$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) +$PrerequisitesDirections.TabIndex = 1 +$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." +#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoHeading = New-Object System.Windows.Forms.Label +$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) +$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) +$vCenterInfoHeading.TabIndex = 2 +$vCenterInfoHeading.Text = "vCenter Info Tab" +#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoDirections = New-Object System.Windows.Forms.Label +$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) +$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) +$vCenterInfoDirections.TabIndex = 3 +$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." +#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvHeading = New-Object System.Windows.Forms.Label +$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) +$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) +$CaptureCsvHeading.TabIndex = 4 +$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" +#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureDirections = New-Object System.Windows.Forms.Label +$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) +$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) +$CaptureDirections.TabIndex = 5 +$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." +#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawHeading = New-Object System.Windows.Forms.Label +$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) +$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) +$DrawHeading.TabIndex = 6 +$DrawHeading.Text = "Draw Visio Tab" +#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawDirections = New-Object System.Windows.Forms.Label +$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) +$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) +$DrawDirections.TabIndex = 7 +$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." +$TabDirections.Controls.Add($PrerequisitesHeading) +$TabDirections.Controls.Add($PrerequisitesDirections) +$TabDirections.Controls.Add($vCenterInfoHeading) +$TabDirections.Controls.Add($vCenterInfoDirections) +$TabDirections.Controls.Add($CaptureCsvHeading) +$TabDirections.Controls.Add($CaptureDirections) +$TabDirections.Controls.Add($DrawHeading) +$TabDirections.Controls.Add($DrawDirections) +#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabCapture = New-Object System.Windows.Forms.TabPage +$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabCapture.Location = New-Object System.Drawing.Point(4, 22) +$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) +$TabCapture.Size = New-Object System.Drawing.Size(982, 486) +$TabCapture.TabIndex = 3 +$TabCapture.Text = "Capture CSVs for Visio" +$TabCapture.UseVisualStyleBackColor = $true +#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label +$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) +$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) +$CaptureCsvOutputLabel.TabIndex = 0 +$CaptureCsvOutputLabel.Text = "CSV Output Folder:" +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button +$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) +$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) +$CaptureCsvOutputButton.TabIndex = 0 +$CaptureCsvOutputButton.Text = "Select Output Folder" +$CaptureCsvOutputButton.UseVisualStyleBackColor = $false +$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$vCenterCsvCheckBox.Checked = $true +$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$vCenterCsvCheckBox.TabIndex = 1 +$vCenterCsvCheckBox.Text = "Export vCenter Info" +$vCenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) +$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationComplete.TabIndex = 26 +$vCenterCsvValidationComplete.Text = "" +#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatacenterCsvCheckBox.Checked = $true +$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatacenterCsvCheckBox.TabIndex = 2 +$DatacenterCsvCheckBox.Text = "Export Datacenter Info" +$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) +$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationComplete.TabIndex = 27 +$DatacenterCsvValidationComplete.Text = "" +#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ClusterCsvCheckBox.Checked = $true +$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ClusterCsvCheckBox.TabIndex = 3 +$ClusterCsvCheckBox.Text = "Export Cluster Info" +$ClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) +$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationComplete.TabIndex = 28 +$ClusterCsvValidationComplete.Text = "" +#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmHostCsvCheckBox.Checked = $true +$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmHostCsvCheckBox.TabIndex = 4 +$VmHostCsvCheckBox.Text = "Export VmHost Info" +$VmHostCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) +$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationComplete.TabIndex = 29 +$VmHostCsvValidationComplete.Text = "" +#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmCsvCheckBox.Checked = $true +$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmCsvCheckBox.TabIndex = 5 +$VmCsvCheckBox.Text = "Export Vm Info" +$VmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) +$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationComplete.TabIndex = 30 +$VmCsvValidationComplete.Text = "" +#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$TemplateCsvCheckBox.Checked = $true +$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$TemplateCsvCheckBox.TabIndex = 6 +$TemplateCsvCheckBox.Text = "Export Template Info" +$TemplateCsvCheckBox.UseVisualStyleBackColor = $true +#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label +$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) +$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationComplete.TabIndex = 31 +$TemplateCsvValidationComplete.Text = "" +#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreClusterCsvCheckBox.Checked = $true +$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreClusterCsvCheckBox.TabIndex = 7 +$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" +$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) +$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationComplete.TabIndex = 32 +$DatastoreClusterCsvValidationComplete.Text = "" +#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreCsvCheckBox.Checked = $true +$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreCsvCheckBox.TabIndex = 8 +$DatastoreCsvCheckBox.Text = "Export Datastore Info" +$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) +$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationComplete.TabIndex = 33 +$DatastoreCsvValidationComplete.Text = "" +#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VsSwitchCsvCheckBox.Checked = $true +$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) +$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VsSwitchCsvCheckBox.TabIndex = 9 +$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" +$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) +$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationComplete.TabIndex = 34 +$VsSwitchCsvValidationComplete.Text = "" +#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPortGroupCsvCheckBox.Checked = $true +$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) +$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPortGroupCsvCheckBox.TabIndex = 10 +$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" +$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) +$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationComplete.TabIndex = 35 +$VssPortGroupCsvValidationComplete.Text = "" +#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssVmkernelCsvCheckBox.Checked = $true +$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) +$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssVmkernelCsvCheckBox.TabIndex = 11 +$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" +$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) +$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationComplete.TabIndex = 36 +$VssVmkernelCsvValidationComplete.Text = "" +#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPnicCsvCheckBox.Checked = $true +$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) +$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPnicCsvCheckBox.TabIndex = 12 +$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" +$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) +$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationComplete.TabIndex = 37 +$VssPnicCsvValidationComplete.Text = "" +#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdSwitchCsvCheckBox.Checked = $true +$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) +$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdSwitchCsvCheckBox.TabIndex = 13 +$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" +$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) +$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationComplete.TabIndex = 38 +$VdSwitchCsvValidationComplete.Text = "" +#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPortGroupCsvCheckBox.Checked = $true +$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) +$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPortGroupCsvCheckBox.TabIndex = 14 +$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" +$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) +$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationComplete.TabIndex = 39 +$VdsPortGroupCsvValidationComplete.Text = "" +#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsVmkernelCsvCheckBox.Checked = $true +$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) +$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsVmkernelCsvCheckBox.TabIndex = 15 +$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" +$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) +$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationComplete.TabIndex = 40 +$VdsVmkernelCsvValidationComplete.Text = "" +#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPnicCsvCheckBox.Checked = $true +$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) +$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPnicCsvCheckBox.TabIndex = 16 +$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" +$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) +$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationComplete.TabIndex = 41 +$VdsPnicCsvValidationComplete.Text = "" +#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$FolderCsvCheckBox.Checked = $true +$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) +$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$FolderCsvCheckBox.TabIndex = 17 +$FolderCsvCheckBox.Text = "Export Folder Info" +$FolderCsvCheckBox.UseVisualStyleBackColor = $true +#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label +$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) +$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationComplete.TabIndex = 42 +$FolderCsvValidationComplete.Text = "" +#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$RdmCsvCheckBox.Checked = $true +$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) +$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$RdmCsvCheckBox.TabIndex = 18 +$RdmCsvCheckBox.Text = "Export RDM Info" +$RdmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label +$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) +$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationComplete.TabIndex = 43 +$RdmCsvValidationComplete.Text = "" +#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsRuleCsvCheckBox.Checked = $true +$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) +$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsRuleCsvCheckBox.TabIndex = 19 +$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" +$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) +$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationComplete.TabIndex = 44 +$DrsRuleCsvValidationComplete.Text = "" +#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsClusterGroupCsvCheckBox.Checked = $true +$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) +$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsClusterGroupCsvCheckBox.TabIndex = 20 +$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" +$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) +$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationComplete.TabIndex = 45 +$DrsClusterGroupCsvValidationComplete.Text = "" +#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsVmHostRuleCsvCheckBox.Checked = $true +$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) +$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsVmHostRuleCsvCheckBox.TabIndex = 21 +$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" +$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) +$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 +$DrsVmHostRuleCsvValidationComplete.Text = "" +#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ResourcePoolCsvCheckBox.Checked = $true +$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) +$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ResourcePoolCsvCheckBox.TabIndex = 22 +$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" +$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) +$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationComplete.TabIndex = 47 +$ResourcePoolCsvValidationComplete.Text = "" +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton = New-Object System.Windows.Forms.Button +$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) +$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureUncheckButton.TabIndex = 23 +$CaptureUncheckButton.Text = "Uncheck All" +$CaptureUncheckButton.UseVisualStyleBackColor = $false +$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton = New-Object System.Windows.Forms.Button +$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) +$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureCheckButton.TabIndex = 24 +$CaptureCheckButton.Text = "Check All" +$CaptureCheckButton.UseVisualStyleBackColor = $false +$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton = New-Object System.Windows.Forms.Button +$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) +$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureButton.TabIndex = 25 +$CaptureButton.Text = "Collect CSV Data" +$CaptureButton.UseVisualStyleBackColor = $false +$CaptureButton.BackColor = [System.Drawing.Color]::LightGray +$TabCapture.Controls.Add($CaptureCsvOutputLabel) +$TabCapture.Controls.Add($CaptureCsvOutputButton) +$TabCapture.Controls.Add($vCenterCsvCheckBox) +$TabCapture.Controls.Add($vCenterCsvValidationComplete) +$TabCapture.Controls.Add($DatacenterCsvCheckBox) +$TabCapture.Controls.Add($DatacenterCsvValidationComplete) +$TabCapture.Controls.Add($ClusterCsvCheckBox) +$TabCapture.Controls.Add($ClusterCsvValidationComplete) +$TabCapture.Controls.Add($VmHostCsvCheckBox) +$TabCapture.Controls.Add($VmHostCsvValidationComplete) +$TabCapture.Controls.Add($VmCsvCheckBox) +$TabCapture.Controls.Add($VmCsvValidationComplete) +$TabCapture.Controls.Add($TemplateCsvCheckBox) +$TabCapture.Controls.Add($TemplateCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) +$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreCsvCheckBox) +$TabCapture.Controls.Add($DatastoreCsvValidationComplete) +$TabCapture.Controls.Add($VsSwitchCsvCheckBox) +$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VssPnicCsvCheckBox) +$TabCapture.Controls.Add($VssPnicCsvValidationComplete) +$TabCapture.Controls.Add($VdSwitchCsvCheckBox) +$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VdsPnicCsvCheckBox) +$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) +$TabCapture.Controls.Add($FolderCsvCheckBox) +$TabCapture.Controls.Add($FolderCsvValidationComplete) +$TabCapture.Controls.Add($RdmCsvCheckBox) +$TabCapture.Controls.Add($RdmCsvValidationComplete) +$TabCapture.Controls.Add($DrsRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) +$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) +$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) +$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) +$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) +$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) +$TabCapture.Controls.Add($CaptureUncheckButton) +$TabCapture.Controls.Add($CaptureCheckButton) +$TabCapture.Controls.Add($CaptureButton) +#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDraw = New-Object System.Windows.Forms.TabPage +$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDraw.Location = New-Object System.Drawing.Point(4, 22) +$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDraw.Size = New-Object System.Drawing.Size(982, 486) +$TabDraw.TabIndex = 2 +$TabDraw.Text = "Draw Visio" +$TabDraw.UseVisualStyleBackColor = $true +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton = New-Object System.Windows.Forms.Button +$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) +$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) +$OpenVisioButton.TabIndex = 83 +$OpenVisioButton.Text = "Open Visio Drawing" +$OpenVisioButton.UseVisualStyleBackColor = $false +$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton = New-Object System.Windows.Forms.Button +$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) +$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawCheckButton.TabIndex = 82 +$DrawCheckButton.Text = "Check All" +$DrawCheckButton.UseVisualStyleBackColor = $false +$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton = New-Object System.Windows.Forms.Button +$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawButton.Location = New-Object System.Drawing.Point(448, 450) +$DrawButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawButton.TabIndex = 81 +$DrawButton.Text = "Draw Visio" +$DrawButton.UseVisualStyleBackColor = $false +$DrawButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton = New-Object System.Windows.Forms.Button +$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) +$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawUncheckButton.TabIndex = 80 +$DrawUncheckButton.Text = "Uncheck All" +$DrawUncheckButton.UseVisualStyleBackColor = $false +$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOutputLabel = New-Object System.Windows.Forms.Label +$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) +$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) +$VisioOutputLabel.TabIndex = 46 +$VisioOutputLabel.Text = "Visio Output Folder:" +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton = New-Object System.Windows.Forms.Button +$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) +$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) +$VisioOpenOutputButton.TabIndex = 47 +$VisioOpenOutputButton.Text = "Select Visio Output Folder" +$VisioOpenOutputButton.UseVisualStyleBackColor = $false +$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputLabel = New-Object System.Windows.Forms.Label +$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) +$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) +$DrawCsvInputLabel.TabIndex = 0 +$DrawCsvInputLabel.Text = "CSV Input Folder:" +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton = New-Object System.Windows.Forms.Button +$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) +$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) +$DrawCsvInputButton.TabIndex = 1 +$DrawCsvInputButton.Text = "Select CSV Input Folder" +$DrawCsvInputButton.UseVisualStyleBackColor = $false +$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidation = New-Object System.Windows.Forms.Label +$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$vCenterCsvValidation.TabIndex = 2 +$vCenterCsvValidation.Text = "vCenter CSV File:" +#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) +$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationCheck.TabIndex = 3 +$vCenterCsvValidationCheck.Text = "" +#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidation = New-Object System.Windows.Forms.Label +$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatacenterCsvValidation.TabIndex = 4 +$DatacenterCsvValidation.Text = "Datacenter CSV File:" +#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) +$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationCheck.TabIndex = 5 +$DatacenterCsvValidationCheck.Text = "" +#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidation = New-Object System.Windows.Forms.Label +$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ClusterCsvValidation.TabIndex = 6 +$ClusterCsvValidation.Text = "Cluster CSV File:" +#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) +$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationCheck.TabIndex = 7 +$ClusterCsvValidationCheck.Text = "" +#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidation = New-Object System.Windows.Forms.Label +$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmHostCsvValidation.TabIndex = 8 +$VmHostCsvValidation.Text = "VmHost CSV File:" +#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) +$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationCheck.TabIndex = 9 +$VmHostCsvValidationCheck.Text = "" +#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidation = New-Object System.Windows.Forms.Label +$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmCsvValidation.TabIndex = 10 +$VmCsvValidation.Text = "VM CSV File:" +#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) +$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationCheck.TabIndex = 11 +$VmCsvValidationCheck.Text = "" +#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidation = New-Object System.Windows.Forms.Label +$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$TemplateCsvValidation.TabIndex = 12 +$TemplateCsvValidation.Text = "Template CSV File:" +#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label +$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) +$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationCheck.TabIndex = 13 +$TemplateCsvValidationCheck.Text = "" +#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreClusterCsvValidation.TabIndex = 14 +$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" +#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) +$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationCheck.TabIndex = 15 +$DatastoreClusterCsvValidationCheck.Text = "" +#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreCsvValidation.TabIndex = 16 +$DatastoreCsvValidation.Text = "Datastore CSV File:" +#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) +$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationCheck.TabIndex = 17 +$DatastoreCsvValidationCheck.Text = "" +#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) +$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VsSwitchCsvValidation.TabIndex = 18 +$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" +#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) +$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationCheck.TabIndex = 19 +$VsSwitchCsvValidationCheck.Text = "" +#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) +$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPortGroupCsvValidation.TabIndex = 20 +$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" +#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) +$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationCheck.TabIndex = 21 +$VssPortGroupCsvValidationCheck.Text = "" +#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) +$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssVmkernelCsvValidation.TabIndex = 22 +$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" +#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) +$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationCheck.TabIndex = 23 +$VssVmkernelCsvValidationCheck.Text = "" +#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidation = New-Object System.Windows.Forms.Label +$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) +$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPnicCsvValidation.TabIndex = 24 +$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" +#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) +$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationCheck.TabIndex = 25 +$VssPnicCsvValidationCheck.Text = "" +#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) +$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdSwitchCsvValidation.TabIndex = 26 +$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" +#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) +$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationCheck.TabIndex = 27 +$VdSwitchCsvValidationCheck.Text = "" +#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) +$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPortGroupCsvValidation.TabIndex = 28 +$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" +#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) +$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationCheck.TabIndex = 29 +$VdsPortGroupCsvValidationCheck.Text = "" +#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) +$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsVmkernelCsvValidation.TabIndex = 30 +$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" +#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) +$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationCheck.TabIndex = 31 +$VdsVmkernelCsvValidationCheck.Text = "" +#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) +$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPnicCsvValidation.TabIndex = 32 +$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" +#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) +$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationCheck.TabIndex = 33 +$VdsPnicCsvValidationCheck.Text = "" +#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidation = New-Object System.Windows.Forms.Label +$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) +$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$FolderCsvValidation.TabIndex = 34 +$FolderCsvValidation.Text = "Folder CSV File:" +#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label +$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) +$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationCheck.TabIndex = 35 +$FolderCsvValidationCheck.Text = "" +#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidation = New-Object System.Windows.Forms.Label +$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) +$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$RdmCsvValidation.TabIndex = 36 +$RdmCsvValidation.Text = "RDM CSV File:" +#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label +$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) +$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationCheck.TabIndex = 37 +$RdmCsvValidationCheck.Text = "" +#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) +$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsRuleCsvValidation.TabIndex = 38 +$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" +#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) +$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationCheck.TabIndex = 39 +$DrsRuleCsvValidationCheck.Text = "" +#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) +$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsClusterGroupCsvValidation.TabIndex = 40 +$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" +#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) +$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationCheck.TabIndex = 41 +$DrsClusterGroupCsvValidationCheck.Text = "" +#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) +$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsVmHostRuleCsvValidation.TabIndex = 42 +$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" +#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) +$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 +$DrsVmHostRuleCsvValidationCheck.Text = "" +#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) +$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ResourcePoolCsvValidation.TabIndex = 44 +$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" +#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) +$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationCheck.TabIndex = 45 +$ResourcePoolCsvValidationCheck.Text = "" +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton = New-Object System.Windows.Forms.Button +$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) +$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) +$CsvValidationButton.TabIndex = 2 +$CsvValidationButton.Text = "Check for CSVs" +$CsvValidationButton.UseVisualStyleBackColor = $false +$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Host_DrawCheckBox.Checked = $true +$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) +$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Host_DrawCheckBox.TabIndex = 48 +$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" +$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_Complete = New-Object System.Windows.Forms.Label +$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) +$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Host_Complete.TabIndex = 49 +$VM_to_Host_Complete.Text = "" +#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Folder_DrawCheckBox.Checked = $true +$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) +$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Folder_DrawCheckBox.TabIndex = 50 +$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" +$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label +$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) +$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Folder_Complete.TabIndex = 51 +$VM_to_Folder_Complete.Text = "" +#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMs_with_RDMs_DrawCheckBox.Checked = $true +$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) +$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 +$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" +$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label +$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) +$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMs_with_RDMs_Complete.TabIndex = 53 +$VMs_with_RDMs_Complete.Text = "" +#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$SRM_Protected_VMs_DrawCheckBox.Checked = $true +$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) +$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 +$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" +$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label +$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) +$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$SRM_Protected_VMs_Complete.TabIndex = 55 +$SRM_Protected_VMs_Complete.Text = "" +#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Datastore_DrawCheckBox.Checked = $true +$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) +$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Datastore_DrawCheckBox.TabIndex = 56 +$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" +$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label +$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) +$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Datastore_Complete.TabIndex = 57 +$VM_to_Datastore_Complete.Text = "" +#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_ResourcePool_DrawCheckBox.Checked = $true +$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) +$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 +$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" +$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label +$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) +$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_ResourcePool_Complete.TabIndex = 59 +$VM_to_ResourcePool_Complete.Text = "" +#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Datastore_to_Host_DrawCheckBox.Checked = $true +$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) +$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$Datastore_to_Host_DrawCheckBox.TabIndex = 60 +$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" +$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label +$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) +$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Datastore_to_Host_Complete.TabIndex = 61 +$Datastore_to_Host_Complete.Text = "" +#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true +$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) +$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 +$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" +$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label +$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) +$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) +$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 +$PhysicalNIC_to_vSwitch_Complete.Text = "" +#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSS_to_Host_DrawCheckBox.Checked = $true +$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) +$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSS_to_Host_DrawCheckBox.TabIndex = 64 +$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" +$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) +$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSS_to_Host_Complete.TabIndex = 65 +$VSS_to_Host_Complete.Text = "" +#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VSS_DrawCheckBox.Checked = $true +$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) +$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VSS_DrawCheckBox.TabIndex = 66 +$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" +$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) +$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VSS_Complete.TabIndex = 67 +$VMK_to_VSS_Complete.Text = "" +#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) +$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 +$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" +$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) +$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSSPortGroup_to_VM_Complete.TabIndex = 69 +$VSSPortGroup_to_VM_Complete.Text = "" +#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDS_to_Host_DrawCheckBox.Checked = $true +$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) +$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDS_to_Host_DrawCheckBox.TabIndex = 70 +$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" +$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) +$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDS_to_Host_Complete.TabIndex = 71 +$VDS_to_Host_Complete.Text = "" +#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VDS_DrawCheckBox.Checked = $true +$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) +$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VDS_DrawCheckBox.TabIndex = 72 +$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" +$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) +$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VDS_Complete.TabIndex = 73 +$VMK_to_VDS_Complete.Text = "" +#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) +$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 +$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" +$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) +$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDSPortGroup_to_VM_Complete.TabIndex = 75 +$VDSPortGroup_to_VM_Complete.Text = "" +#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true +$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) +$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 +$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" +$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label +$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) +$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Cluster_to_DRS_Rule_Complete.TabIndex = 77 +$Cluster_to_DRS_Rule_Complete.Text = "" + +$TabDraw.Controls.Add($OpenVisioButton) +$TabDraw.Controls.Add($DrawCheckButton) +$TabDraw.Controls.Add($DrawButton) +$TabDraw.Controls.Add($DrawUncheckButton) +$TabDraw.Controls.Add($VisioOutputLabel) +$TabDraw.Controls.Add($VisioOpenOutputButton) +$TabDraw.Controls.Add($DrawCsvInputLabel) +$TabDraw.Controls.Add($DrawCsvInputButton) +$TabDraw.Controls.Add($vCenterCsvValidation) +$TabDraw.Controls.Add($vCenterCsvValidationCheck) +$TabDraw.Controls.Add($DatacenterCsvValidation) +$TabDraw.Controls.Add($DatacenterCsvValidationCheck) +$TabDraw.Controls.Add($ClusterCsvValidation) +$TabDraw.Controls.Add($ClusterCsvValidationCheck) +$TabDraw.Controls.Add($VmHostCsvValidation) +$TabDraw.Controls.Add($VmHostCsvValidationCheck) +$TabDraw.Controls.Add($VmCsvValidation) +$TabDraw.Controls.Add($VmCsvValidationCheck) +$TabDraw.Controls.Add($TemplateCsvValidation) +$TabDraw.Controls.Add($TemplateCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreClusterCsvValidation) +$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreCsvValidation) +$TabDraw.Controls.Add($DatastoreCsvValidationCheck) +$TabDraw.Controls.Add($VsSwitchCsvValidation) +$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VssPortGroupCsvValidation) +$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VssVmkernelCsvValidation) +$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VssPnicCsvValidation) +$TabDraw.Controls.Add($VssPnicCsvValidationCheck) +$TabDraw.Controls.Add($VdSwitchCsvValidation) +$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VdsPortGroupCsvValidation) +$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VdsVmkernelCsvValidation) +$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VdsPnicCsvValidation) +$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) +$TabDraw.Controls.Add($FolderCsvValidation) +$TabDraw.Controls.Add($FolderCsvValidationCheck) +$TabDraw.Controls.Add($RdmCsvValidation) +$TabDraw.Controls.Add($RdmCsvValidationCheck) +$TabDraw.Controls.Add($DrsRuleCsvValidation) +$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) +$TabDraw.Controls.Add($ResourcePoolCsvValidation) +$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) +$TabDraw.Controls.Add($CsvValidationButton) +$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Host_Complete) +$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Folder_Complete) +$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) +$TabDraw.Controls.Add($VMs_with_RDMs_Complete) +$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) +$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) +$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Datastore_Complete) +$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) +$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($Datastore_to_Host_Complete) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) +$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VSS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VSS_Complete) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VDS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VDS_Complete) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) +$SubTab.Controls.Add($TabDirections) +$SubTab.Controls.Add($TabCapture) +$SubTab.Controls.Add($TabDraw) +$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText +$SubTab.SelectedIndex = 0 +$vDiagram.Controls.Add($MainMenu) +$vDiagram.Controls.Add($MainTab) +$vDiagram.Controls.Add($SubTab) +#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$VisioBrowse.Description = "Select a directory" +$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$DrawCsvBrowse.Description = "Select a directory" +$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$CaptureCsvBrowse.Description = "Select a directory" +$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + +#endregion + +#region Custom Code +#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellCheck = $PSVersionTable.PSVersion +if ($PowershellCheck.Major -ge 4) +{ + $PowershellInstalled.Forecolor = "Green" + $PowershellInstalled.Text = "Installed Version $PowershellCheck" +} +else +{ + $PowershellInstalled.Forecolor = "Red" + $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" +} +#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) +$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) +if ($PowerCliModuleCheck -ne $null) +{ + $PowerCliModuleInstalled.Forecolor = "Green" + $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" +} +else +{ + $PowerCliModuleInstalled.Forecolor = "Red" + $PowerCliModuleInstalled.Text = "Not Installed" +} +#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerClI Installed" +} +elseif ($PowerCliModuleCheck -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerCLI Module Installed" +} +else +{ + $PowerCliInstalled.Forecolor = "Red" + $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" +} +#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) +{ + $VisioInstalled.Forecolor = "Green" + $VisioInstalled.Text = "Installed" +} +else +{ + $VisioInstalled.Forecolor = "Red" + $VisioInstalled.Text = "Visio is Not Installed" +} +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) +$ConnectButton.Add_Click({ Connect_vCenter_Main }) +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } +Check_CaptureCsvFolder } ) +#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton.Add_Click({ + if($CaptureCsvFolder -eq $null) + { + $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" + } + else + { + if ($vCenterCsvCheckBox.Checked -eq "True") + { + $vCenterCsvValidationComplete.Forecolor = "Blue" + $vCenterCsvValidationComplete.Text = "Processing ....." + vCenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" + $vCenterCsvComplete = Test-Path $vCenterExportFileComplete + if ($vCenterCsvComplete -eq $True) + { + $vCenterCsvValidationComplete.Forecolor = "Green" + $vCenterCsvValidationComplete.Text = "Complete" + } + else + { + $vCenterCsvValidationComplete.Forecolor = "Red" + $vCenterCsvValidationComplete.Text = "Not Complete" + } + } + Connect_vCenter + $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager + if ($Connected -eq $null) { Connect_vCenter_Main } + $ConnectButton.Forecolor = [System.Drawing.Color]::Green + $ConnectButton.Text = "Connected to $DefaultViserver" + if ($DatacenterCsvCheckBox.Checked -eq "True") + { + $DatacenterCsvValidationComplete.Forecolor = "Blue" + $DatacenterCsvValidationComplete.Text = "Processing ....." + Datacenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" + $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete + if ($DatacenterCsvComplete -eq $True) + { + $DatacenterCsvValidationComplete.Forecolor = "Green" + $DatacenterCsvValidationComplete.Text = "Complete" + } + else + { + $DatacenterCsvValidationComplete.Forecolor = "Red" + $DatacenterCsvValidationComplete.Text = "Not Complete" + } + } + if ($ClusterCsvCheckBox.Checked -eq "True") + { + $ClusterCsvValidationComplete.Forecolor = "Blue" + $ClusterCsvValidationComplete.Text = "Processing ....." + Cluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" + $ClusterCsvComplete = Test-Path $ClusterExportFileComplete + if ($ClusterCsvComplete -eq $True) + { + $ClusterCsvValidationComplete.Forecolor = "Green" + $ClusterCsvValidationComplete.Text = "Complete" + } + else + { + $ClusterCsvValidationComplete.Forecolor = "Red" + $ClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmHostCsvCheckBox.Checked -eq "True") + { + $VmHostCsvValidationComplete.Forecolor = "Blue" + $VmHostCsvValidationComplete.Text = "Processing ....." + VmHost_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" + $VmHostCsvComplete = Test-Path $VmHostExportFileComplete + if ($VmHostCsvComplete -eq $True) + { + $VmHostCsvValidationComplete.Forecolor = "Green" + $VmHostCsvValidationComplete.Text = "Complete" + } + else + { + $VmHostCsvValidationComplete.Forecolor = "Red" + $VmHostCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmCsvCheckBox.Checked -eq "True") + { + $VmCsvValidationComplete.Forecolor = "Blue" + $VmCsvValidationComplete.Text = "Processing ....." + Vm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" + $VmCsvComplete = Test-Path $VmExportFileComplete + if ($VmCsvComplete -eq $True) + { + $VmCsvValidationComplete.Forecolor = "Green" + $VmCsvValidationComplete.Text = "Complete" + } + else + { + $VmCsvValidationComplete.Forecolor = "Red" + $VmCsvValidationComplete.Text = "Not Complete" + } + } + if ($TemplateCsvCheckBox.Checked -eq "True") + { + $TemplateCsvValidationComplete.Forecolor = "Blue" + $TemplateCsvValidationComplete.Text = "Processing ....." + Template_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" + $TemplateCsvComplete = Test-Path $TemplateExportFileComplete + if ($TemplateCsvComplete -eq $True) + { + $TemplateCsvValidationComplete.Forecolor = "Green" + $TemplateCsvValidationComplete.Text = "Complete" + } + else + { + $TemplateCsvValidationComplete.Forecolor = "Red" + $TemplateCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreClusterCsvCheckBox.Checked -eq "True") + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" + $DatastoreClusterCsvValidationComplete.Text = "Processing ....." + DatastoreCluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete + if ($DatastoreClusterCsvComplete -eq $True) + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Green" + $DatastoreClusterCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Red" + $DatastoreClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreCsvCheckBox.Checked -eq "True") + { + $DatastoreCsvValidationComplete.Forecolor = "Blue" + $DatastoreCsvValidationComplete.Text = "Processing ....." + Datastore_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" + $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete + if ($DatastoreCsvComplete -eq $True) + { + $DatastoreCsvValidationComplete.Forecolor = "Green" + $DatastoreCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreCsvValidationComplete.Forecolor = "Red" + $DatastoreCsvValidationComplete.Text = "Not Complete" + } + } + if ($VsSwitchCsvCheckBox.Checked -eq "True") + { + $VsSwitchCsvValidationComplete.Forecolor = "Blue" + $VsSwitchCsvValidationComplete.Text = "Processing ....." + VsSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" + $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete + if ($vSSwitchCsvComplete -eq $True) + { + $vSSwitchCsvValidationComplete.Forecolor = "Green" + $vSSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $vSSwitchCsvValidationComplete.Forecolor = "Red" + $vSSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPortGroupCsvCheckBox.Checked -eq "True") + { + $VssPortGroupCsvValidationComplete.Forecolor = "Blue" + $VssPortGroupCsvValidationComplete.Text = "Processing ....." + VssPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete + if ($VssPortGroupCsvComplete -eq $True) + { + $VssPortGroupCsvValidationComplete.Forecolor = "Green" + $VssPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VssPortGroupCsvValidationComplete.Forecolor = "Red" + $VssPortGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssVmkernelCsvCheckBox.Checked -eq "True") + { + $VssVmkernelCsvValidationComplete.Forecolor = "Blue" + $VssVmkernelCsvValidationComplete.Text = "Processing ....." + VssVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete + if ($VssVmkernelCsvComplete -eq $True) + { + $VssVmkernelCsvValidationComplete.Forecolor = "Green" + $VssVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VssVmkernelCsvValidationComplete.Forecolor = "Red" + $VssVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPnicCsvCheckBox.Checked -eq "True") + { + $VssPnicCsvValidationComplete.Forecolor = "Blue" + $VssPnicCsvValidationComplete.Text = "Processing ....." + VssPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" + $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete + if ($VssPnicCsvComplete -eq $True) + { + $VssPnicCsvValidationComplete.Forecolor = "Green" + $VssPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VssPnicCsvValidationComplete.Forecolor = "Red" + $VssPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdSwitchCsvCheckBox.Checked -eq "True") + { + $VdSwitchCsvValidationComplete.Forecolor = "Blue" + $VdSwitchCsvValidationComplete.Text = "Processing ....." + VdSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" + $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete + if ($VdSwitchCsvComplete -eq $True) + { + $VdSwitchCsvValidationComplete.Forecolor = "Green" + $VdSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $VdSwitchCsvValidationComplete.Forecolor = "Red" + $VdSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPortGroupCsvCheckBox.Checked -eq "True") + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" + $VdsPortGroupCsvValidationComplete.Text = "Processing ....." + VdsPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete + if ($VdsPortGroupCsvComplete -eq $True) + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Green" + $VdsPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Red" + $VdsPortGroupCsvValidationComplete.Text = "Not Complete" + + } + } + if ($VdsVmkernelCsvCheckBox.Checked -eq "True") + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" + $VdsVmkernelCsvValidationComplete.Text = "Processing ....." + VdsVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete + if ($VdsVmkernelCsvComplete -eq $True) + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Green" + $VdsVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Red" + $VdsVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPnicCsvCheckBox.Checked -eq "True") + { + $VdsPnicCsvValidationComplete.Forecolor = "Blue" + $VdsPnicCsvValidationComplete.Text = "Processing ....." + VdsPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" + $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete + if ($VdsPnicCsvComplete -eq $True) + { + $VdsPnicCsvValidationComplete.Forecolor = "Green" + $VdsPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPnicCsvValidationComplete.Forecolor = "Red" + $VdsPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($FolderCsvCheckBox.Checked -eq "True") + { + $FolderCsvValidationComplete.Forecolor = "Blue" + $FolderCsvValidationComplete.Text = "Processing ....." + Folder_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" + $FolderCsvComplete = Test-Path $FolderExportFileComplete + if ($FolderCsvComplete -eq $True) + { + $FolderCsvValidationComplete.Forecolor = "Green" + $FolderCsvValidationComplete.Text = "Complete" + } + else + { + $FolderCsvValidationComplete.Forecolor = "Red" + $FolderCsvValidationComplete.Text = "Not Complete" + } + } + if ($RdmCsvCheckBox.Checked -eq "True") + { + $RdmCsvValidationComplete.Forecolor = "Blue" + $RdmCsvValidationComplete.Text = "Processing ....." + Rdm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" + $RdmCsvComplete = Test-Path $RdmExportFileComplete + if ($RdmCsvComplete -eq $True) + { + $RdmCsvValidationComplete.Forecolor = "Green" + $RdmCsvValidationComplete.Text = "Complete" + } + else + { + $RdmCsvValidationComplete.Forecolor = "Red" + $RdmCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsRuleCsvCheckBox.Checked -eq "True") + { + $DrsRuleCsvValidationComplete.Forecolor = "Blue" + $DrsRuleCsvValidationComplete.Text = "Processing ....." + Drs_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" + $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete + if ($DrsRuleCsvComplete -eq $True) + { + $DrsRuleCsvValidationComplete.Forecolor = "Green" + $DrsRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsRuleCsvValidationComplete.Forecolor = "Red" + $DrsRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" + $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." + Drs_Cluster_Group_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete + if ($DrsClusterGroupCsvComplete -eq $True) + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" + $DrsClusterGroupCsvValidationComplete.Text = "Complete" + } + else + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" + $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" + $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." + Drs_VmHost_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete + if ($DrsVmHostRuleCsvComplete -eq $True) + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" + $DrsVmHostRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" + $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($ResourcePoolCsvCheckBox.Checked -eq "True") + { + $ResourcePoolCsvValidationComplete.Forecolor = "Blue" + $ResourcePoolCsvValidationComplete.Text = "Processing ....." + Resource_Pool_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete + if ($ResourcePoolCsvComplete -eq $True) + { + $ResourcePoolCsvValidationComplete.Forecolor = "Green" + $ResourcePoolCsvValidationComplete.Text = "Complete" + } + else + { + $ResourcePoolCsvValidationComplete.Forecolor = "Red" + $ResourcePoolCsvValidationComplete.Text = "Not Complete" + } + } + Disconnect_vCenter + $ConnectButton.Forecolor = [System.Drawing.Color]::Red + $ConnectButton.Text = "Disconnected" + $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" + } +}) +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) +$TabDraw.Controls.Add($DrawCsvInputButton) +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton.Add_Click( +{ + $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text + $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" + $vCenterCsvExists = Test-Path $vCenterExportFile + $TabDraw.Controls.Add($vCenterCsvValidationCheck) + if ($vCenterCsvExists -eq $True) + { + + $vCenterCsvValidationCheck.Forecolor = "Green" + $vCenterCsvValidationCheck.Text = "Present" + } + else + { + $vCenterCsvValidationCheck.Forecolor = "Red" + $vCenterCsvValidationCheck.Text = "Not Present" + } + + $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" + $DatacenterCsvExists = Test-Path $DatacenterExportFile + $TabDraw.Controls.Add($DatacenterCsvValidationCheck) + + if ($DatacenterCsvExists -eq $True) + { + $DatacenterCsvValidationCheck.Forecolor = "Green" + $DatacenterCsvValidationCheck.Text = "Present" + } + else + { + $DatacenterCsvValidationCheck.Forecolor = "Red" + $DatacenterCsvValidationCheck.Text = "Not Present" + } + + $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" + $ClusterCsvExists = Test-Path $ClusterExportFile + $TabDraw.Controls.Add($ClusterCsvValidationCheck) + + if ($ClusterCsvExists -eq $True) + { + $ClusterCsvValidationCheck.Forecolor = "Green" + $ClusterCsvValidationCheck.Text = "Present" + } + else + { + $ClusterCsvValidationCheck.Forecolor = "Red" + $ClusterCsvValidationCheck.Text = "Not Present" + } + + $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" + $VmHostCsvExists = Test-Path $VmHostExportFile + $TabDraw.Controls.Add($VmHostCsvValidationCheck) + + if ($VmHostCsvExists -eq $True) + { + $VmHostCsvValidationCheck.Forecolor = "Green" + $VmHostCsvValidationCheck.Text = "Present" + } + else + { + $VmHostCsvValidationCheck.Forecolor = "Red" + $VmHostCsvValidationCheck.Text = "Not Present" + } + + $VmExportFile = $CsvInputDir + "-VmExport.csv" + $VmCsvExists = Test-Path $VmExportFile + $TabDraw.Controls.Add($VmCsvValidationCheck) + + if ($VmCsvExists -eq $True) + { + $VmCsvValidationCheck.Forecolor = "Green" + $VmCsvValidationCheck.Text = "Present" + } + else + { + $VmCsvValidationCheck.Forecolor = "Red" + $VmCsvValidationCheck.Text = "Not Present" + } + + $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" + $TemplateCsvExists = Test-Path $TemplateExportFile + $TabDraw.Controls.Add($TemplateCsvValidationCheck) + + if ($TemplateCsvExists -eq $True) + { + $TemplateCsvValidationCheck.Forecolor = "Green" + $TemplateCsvValidationCheck.Text = "Present" + } + else + { + $TemplateCsvValidationCheck.Forecolor = "Red" + $TemplateCsvValidationCheck.Text = "Not Present" + } + + $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile + $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) + + if ($DatastoreClusterCsvExists -eq $True) + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Green" + $DatastoreClusterCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Red" + $DatastoreClusterCsvValidationCheck.Text = "Not Present" + } + + $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" + $DatastoreCsvExists = Test-Path $DatastoreExportFile + $TabDraw.Controls.Add($DatastoreCsvValidationCheck) + + if ($DatastoreCsvExists -eq $True) + { + $DatastoreCsvValidationCheck.Forecolor = "Green" + $DatastoreCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreCsvValidationCheck.Forecolor = "Red" + $DatastoreCsvValidationCheck.Text = "Not Present" + } + + $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" + $VsSwitchCsvExists = Test-Path $VsSwitchExportFile + $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) + + if ($VsSwitchCsvExists -eq $True) + { + $VsSwitchCsvValidationCheck.Forecolor = "Green" + $VsSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VsSwitchCsvValidationCheck.Forecolor = "Red" + $VsSwitchCsvValidationCheck.Text = "Not Present" + $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile + $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) + + if ($VssPortGroupCsvExists -eq $True) + { + $VssPortGroupCsvValidationCheck.Forecolor = "Green" + $VssPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VssPortGroupCsvValidationCheck.Forecolor = "Red" + $VssPortGroupCsvValidationCheck.Text = "Not Present" + $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile + $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) + + if ($VssVmkernelCsvExists -eq $True) + { + $VssVmkernelCsvValidationCheck.Forecolor = "Green" + $VssVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VssVmkernelCsvValidationCheck.Forecolor = "Red" + $VssVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" + $VssPnicCsvExists = Test-Path $VssPnicExportFile + $TabDraw.Controls.Add($VssPnicCsvValidationCheck) + + if ($VssPnicCsvExists -eq $True) + { + $VssPnicCsvValidationCheck.Forecolor = "Green" + $VssPnicCsvValidationCheck.Text = "Present" + } + else + { + $VssPnicCsvValidationCheck.Forecolor = "Red" + $VssPnicCsvValidationCheck.Text = "Not Present" + } + + $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" + $VdSwitchCsvExists = Test-Path $VdSwitchExportFile + $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) + + if ($VdSwitchCsvExists -eq $True) + { + $VdSwitchCsvValidationCheck.Forecolor = "Green" + $VdSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VdSwitchCsvValidationCheck.Forecolor = "Red" + $VdSwitchCsvValidationCheck.Text = "Not Present" + $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile + $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) + + if ($VdsPortGroupCsvExists -eq $True) + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Green" + $VdsPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Red" + $VdsPortGroupCsvValidationCheck.Text = "Not Present" + $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile + $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) + + if ($VdsVmkernelCsvExists -eq $True) + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Green" + $VdsVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Red" + $VdsVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" + $VdsPnicCsvExists = Test-Path $VdsPnicExportFile + $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) + + if ($VdsPnicCsvExists -eq $True) + { + $VdsPnicCsvValidationCheck.Forecolor = "Green" + $VdsPnicCsvValidationCheck.Text = "Present" + } + else + { + $VdsPnicCsvValidationCheck.Forecolor = "Red" + $VdsPnicCsvValidationCheck.Text = "Not Present" + } + + $FolderExportFile = $CsvInputDir + "-FolderExport.csv" + $FolderCsvExists = Test-Path $FolderExportFile + $TabDraw.Controls.Add($FolderCsvValidationCheck) + + if ($FolderCsvExists -eq $True) + { + $FolderCsvValidationCheck.Forecolor = "Green" + $FolderCsvValidationCheck.Text = "Present" + } + else + { + $FolderCsvValidationCheck.Forecolor = "Red" + $FolderCsvValidationCheck.Text = "Not Present" + } + + $RdmExportFile = $CsvInputDir + "-RdmExport.csv" + $RdmCsvExists = Test-Path $RdmExportFile + $TabDraw.Controls.Add($RdmCsvValidationCheck) + + if ($RdmCsvExists -eq $True) + { + $RdmCsvValidationCheck.Forecolor = "Green" + $RdmCsvValidationCheck.Text = "Present" + } + else + { + $RdmCsvValidationCheck.Forecolor = "Red" + $RdmCsvValidationCheck.Text = "Not Present" + $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" + $DrsRuleCsvExists = Test-Path $DrsRuleExportFile + $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) + + if ($DrsRuleCsvExists -eq $True) + { + $DrsRuleCsvValidationCheck.Forecolor = "Green" + $DrsRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsRuleCsvValidationCheck.Forecolor = "Red" + $DrsRuleCsvValidationCheck.Text = "Not Present" + $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile + $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) + + if ($DrsClusterGroupCsvExists -eq $True) + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" + $DrsClusterGroupCsvValidationCheck.Text = "Present" + } + else + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" + $DrsClusterGroupCsvValidationCheck.Text = "Not Present" + } + + $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile + $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) + + if ($DrsVmHostRuleCsvExists -eq $True) + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" + $DrsVmHostRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" + $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" + } + + $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile + $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) + + if ($ResourcePoolCsvExists -eq $True) + { + $ResourcePoolCsvValidationCheck.Forecolor = "Green" + $ResourcePoolCsvValidationCheck.Text = "Present" + } + else + { + $ResourcePoolCsvValidationCheck.Forecolor = "Red" + $ResourcePoolCsvValidationCheck.Text = "Not Present" + $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" + } +} ) +$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) +$TabDraw.Controls.Add($CsvValidationButton) +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) +$TabDraw.Controls.Add($VisioOpenOutputButton) +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) +$TabDraw.Controls.Add($DrawUncheckButton) +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) +$TabDraw.Controls.Add($DrawCheckButton) +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; +if ($VM_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Host_Complete.Forecolor = "Blue" + $VM_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Host_Complete) + VM_to_Host + $VM_to_Host_Complete.Forecolor = "Green" + $VM_to_Host_Complete.Text = "Complete" + $TabDraw.Controls.Add($VM_to_Host_Complete) +} +if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Folder_Complete.Forecolor = "Blue" + $VM_to_Folder_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Folder_Complete) + VM_to_Folder + $VM_to_Folder_Complete.Forecolor = "Green" + $VM_to_Folder_Complete.Text = "Complete" +} +if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") +{ + $VMs_with_RDMs_Complete.Forecolor = "Blue" + $VMs_with_RDMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMs_with_RDMs_Complete) + VMs_with_RDMs + $VMs_with_RDMs_Complete.Forecolor = "Green" + $VMs_with_RDMs_Complete.Text = "Complete" +} +if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") +{ + $SRM_Protected_VMs_Complete.Forecolor = "Blue" + $SRM_Protected_VMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) + SRM_Protected_VMs + $SRM_Protected_VMs_Complete.Forecolor = "Green" + $SRM_Protected_VMs_Complete.Text = "Complete" +} +if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Datastore_Complete.Forecolor = "Blue" + $VM_to_Datastore_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Datastore_Complete) + VM_to_Datastore + $VM_to_Datastore_Complete.Forecolor = "Green" + $VM_to_Datastore_Complete.Text = "Complete" +} +if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") +{ + $VM_to_ResourcePool_Complete.Forecolor = "Blue" + $VM_to_ResourcePool_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) + VM_to_ResourcePool + $VM_to_ResourcePool_Complete.Forecolor = "Green" + $VM_to_ResourcePool_Complete.Text = "Complete" +} +if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") +{ + $Datastore_to_Host_Complete.Forecolor = "Blue" + $Datastore_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Datastore_to_Host_Complete) + Datastore_to_Host + $Datastore_to_Host_Complete.Forecolor = "Green" + $Datastore_to_Host_Complete.Text = "Complete" +} +if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") +{ + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" + $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) + PhysicalNIC_to_vSwitch + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" + $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" +} +if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VSS_to_Host_Complete.Forecolor = "Blue" + $VSS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSS_to_Host_Complete) + VSS_to_Host + $VSS_to_Host_Complete.Forecolor = "Green" + $VSS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VSS_Complete.Forecolor = "Blue" + $VMK_to_VSS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VSS_Complete) + VMK_to_VSS + $VMK_to_VSS_Complete.Forecolor = "Green" + $VMK_to_VSS_Complete.Text = "Complete" +} +if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VSSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) + VSSPortGroup_to_VM + $VSSPortGroup_to_VM_Complete.Forecolor = "Green" + $VSSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VDS_to_Host_Complete.Forecolor = "Blue" + $VDS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDS_to_Host_Complete) + VDS_to_Host + $VDS_to_Host_Complete.Forecolor = "Green" + $VDS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VDS_Complete.Forecolor = "Blue" + $VMK_to_VDS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VDS_Complete) + VMK_to_VDS + $VMK_to_VDS_Complete.Forecolor = "Green" + $VMK_to_VDS_Complete.Text = "Complete" +} +if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VDSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) + VDSPortGroup_to_VM + $VDSPortGroup_to_VM_Complete.Forecolor = "Green" + $VDSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") +{ + $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" + $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) + Cluster_to_DRS_Rule + $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" + $Cluster_to_DRS_Rule_Complete.Text = "Complete" +}; +$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) +$TabDraw.Controls.Add($DrawButton) +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton.Add_Click({Open_Final_Visio}) +$TabDraw.Controls.Add($OpenVisioButton) + +#endregion + +#region Event Loop + +function Main{ + [System.Windows.Forms.Application]::EnableVisualStyles() + [System.Windows.Forms.Application]::Run($vDiagram) +} + +#endregion + +#endregion + +#region Event Handlers + +#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect_vCenter_Main +{ + $MainVC = $MainVcenterTextBox.Text + $MainUser = $UserNameTextBox.Text + $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text +} + +function Connect_vCenter +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $User = $UserNameTextBox.Text + $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text +} + +function Disconnect_vCenter +{ + $Disconnect = Disconnect-ViServer * -Confirm:$false +} +#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Find_CaptureCsvFolder +{ + $CaptureCsvBrowseLoop = $True + while ($CaptureCsvBrowseLoop) + { + if ($CaptureCsvBrowse.ShowDialog() -eq "OK") + { + $CaptureCsvBrowseLoop = $False + } + else + { + $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($CaptureCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath +} + +function Check_CaptureCsvFolder +{ + $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $CheckContentDir = $CheckContentPath + "*.csv" + $CheckContent = Test-Path $CheckContentDir + if ($CheckContent -eq "True") + { + $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") + switch ($CheckContents_CaptureCsvFolder) { + 'Yes' + { + del $CheckContentDir + } + + 'No' + { + $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog + $CheckContentCsvBrowse.Description = "Select a directory to copy files to" + $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + $CheckContentCsvBrowse.ShowDialog() + $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath + copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder + del $CheckContentDir + } + } + } +} + +function Find_DrawCsvFolder +{ + $DrawCsvBrowseLoop = $True + while ($DrawCsvBrowseLoop) + { + if ($DrawCsvBrowse.ShowDialog() -eq "OK") + { + $DrawCsvBrowseLoop = $False + } + else + { + $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($DrawCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath +} + +function Find_DrawVisioFolder +{ + $VisioBrowseLoop = $True + while($VisioBrowseLoop) + { + if ($VisioBrowse.ShowDialog() -eq "OK") + { + $VisioBrowseLoop = $False + } + else + { + $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if($VisioBrowseRes -eq "Cancel") + { + return + } + } + } + $global:VisioFolder = $VisioBrowse.SelectedPath +} +#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function vCenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, + @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation + + if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) + { + $null + } + else + { + Disconnect_vCenter + } +} + +function Datacenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort-Object Name | + Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation +} + +function Cluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, + @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, + @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, + @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, + @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, + @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, + @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, + @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, + @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, + @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation +} + +function VmHost_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent + while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent + } + if ($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name } } }, + @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent + while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent + } + if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, + @{ N = "Version" ; E = { $_.Config.Product.Version } }, + @{ N = "Build" ; E = { $_.Config.Product.Build } }, + @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, + @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, + @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, + @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, + @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, + @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, + @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, + @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, + @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, + @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, + @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, + @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation +} + +function Vm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select-Object Name , + @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, + @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, + @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, + @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, + @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, + @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, + @{ N = "OS" ; E = { $_.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.Config.Version } }, + @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, + @{ N = 'Folder' ; E = { $Folder.Name } }, + @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, + @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, + @{ N = "IP" ; E = { $_.Guest.IpAddress } }, + @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, + @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, + @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, + @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation + } +} + +function Template_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + foreach ($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { $VmHost.name } }, + @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, + @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, + @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, + @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, + @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, + @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, + @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, + @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation + } +} + +function DatastoreCluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, + @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, + @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation +} + +function Datastore_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, + @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, + @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, + @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, + @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, + @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, + @{ N = "Accessible" ; E = { $_.State } }, + @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation +} + +function VsSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "Nic" ; E = { $_.Nic } }, + @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, + @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, + @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, + @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, + @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation +} + +function VssPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "VLanId" ; E = { $_.VLanId } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VssVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation + } + } + } +} + +function VssPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation + } + } +} + +function VdSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + foreach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "Vendor" ; E = { $_.Vendor } }, + @{ N = "Version" ; E = { $_.Version } }, + @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, + @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation + } +} + +function VdsPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, + @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, + @{ N = "NumPorts" ; E = { $_.NumPorts } }, + @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, + @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, + @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VdsVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation + + } + } +} + +function VdsPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | + Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch } }, + @{ N = "Portgroup" ; E = { $_.Portgroup } }, + @{ N = "ConnectedEntity" ; E = { $_.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation + } + } +} + +function Folder_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + foreach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -type VM | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation + } +} + +function Rdm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | + Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, + @{ N = "Vm" ; E = { $_.Parent } }, + @{ N = "Label" ; E = { $_.Name } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, + @{ N = "DiskType" ; E = { $_.DiskType } }, + @{ N = "Persistence" ; E = { $_.Persistence } }, + @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, + @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, + @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation +} + +function Drs_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation + } +} + +function Drs_Cluster_Group_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "GroupType" ; E = { $_.GroupType } }, + @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation + } +} + +function Drs_VmHost_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) + { + Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "VMGroup" ; E = { $_.VMGroup } }, + @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, + @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, + @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation + } + } +} + +function Resource_Pool_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) + { + Get-ResourcePool $ResourcePool | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Cluster" ; E = { $Cluster.Name } }, + @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, + @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, + @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, + @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, + @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, + @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, + @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, + @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, + @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, + @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation + } + } +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect-VisioObject($firstObj, $secondObj) +{ + $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) + $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) + $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) +} + +function Add-VisioObjectVC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectCluster($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHost($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectTemplate($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectSRM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDatastore($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHardDisk($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.ScsiCanonicalName + return $shpObj +} + +function Add-VisioObjectFolder($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVsSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVssPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVMK($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsClusterGroup($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDRSVMHostRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectResourcePool($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Create_Visio_Base +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $DocObj = $docsObj.Add("") + $DocObj.SaveAs($Savefile) + $AppVisio.Quit() +} + +function VM_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Host" + $Page = $DocsObj.Pages('VM to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Folder +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Folder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + $FolderImport = Import-Csv $FolderExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Folder" + $Page = $DocsObj.Pages('VM to Folder') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Folder') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Folder Object + $FolderObj = $stnObj.Masters.Item("Folder") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $FolderObject = Add-VisioObjectFolder $FolderObj $Folder + $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' + Connect-VisioObject $DatacenterObject $FolderObject + $y += 1.50 + + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $FolderObject $TemplateObject + $FolderObject = $TemplateObject + } + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $FolderObject $VMObject + $FolderObject = $VMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMs_with_RDMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + # RDM's + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + $RdmImport = Import-Csv $RdmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" + $Page = $DocsObj.Pages('VM w/ RDMs') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM w/ RDMs') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # RDM Object + $RDMObj = $stnObj.Masters.Item("RDM") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ClusterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 3.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatacenterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 2.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function SRM_Protected_VMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "SRM VM" + $Page = $DocsObj.Pages('SRM VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('SRM VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # SRM Protected VM Object + $SRMObj = $stnObj.Masters.Item("SRM Protected Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Datastore +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Datastore" + $Page = $DocsObj.Pages('VM to Datastore') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Datastore') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $ClusterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $ClusterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_ResourcePool +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # ResourcePool + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + $ResourcePoolImport = Import-Csv $ResourcePoolExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" + $Page = $DocsObj.Pages('VM to Resource Pool') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Resource Pool') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Resource Pool Object + $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool + # Name + $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' + # Cluster + $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' + # CpuSharesLevel + $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' + # NumCpuShares + $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' + # CpuReservationMHz + $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' + # CpuExpandableReservation + $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' + # CpuLimitMHz + $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' + # MemSharesLevel + $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' + # NumMemShares + $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' + # MemReservationGB + $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' + # MemExpandableReservation + $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' + # MemLimitGB + $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' + Connect-VisioObject $ClusterObject $ResourcePoolObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ResourcePoolObject $VMObject + $ResourcePoolObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Datastore_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Datastore to Host" + $Page = $DocsObj.Pages('Datastore to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Datastore to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function PhysicalNIC_to_vSwitch +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "PNIC to switch" + $Page = $DocsObj.Pages('PNIC to Switch') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('PNIC to Switch') + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + $y += 1.50 + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSS to Host" + $Page = $DocsObj.Pages('VSS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VSS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VSS" + $Page = $DocsObj.Pages('VMK to VSS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VSS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" + $Page = $DocsObj.Pages('VSSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDS to Host" + $Page = $DocsObj.Pages('VDS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VDS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VDS" + $Page = $DocsObj.Pages('VMK to VDS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VDS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" + $Page = $DocsObj.Pages('VDSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $DatacenterObject $VdSwitchObject + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x = 6.00 + $y += 1.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VPGObject $VMObject + $VPGObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Cluster_to_DRS_Rule +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # DRS Rule + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + $DrsRuleImport = Import-Csv $DrsRuleExportFile + # DRS Cluster Group + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile + # DRS VmHost Rule + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" + $Page = $DocsObj.Pages('Cluster to DRS Rule') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Cluster to DRS Rule') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # DRS Rule + $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") + # DRS Cluster Group + $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") + # DRS Host Rule + $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") + # Microsoft VM Object + $MSObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LXObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + $y += 1.50 + + foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule + # Name + $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' + # VM Affinity + $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' + # DRS Rule Enabled + $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' + # DRS Rule Mandatory + $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' + Connect-VisioObject $ClusterObject $DRSObject + #$ClusterObject = $DRSObject + $y += 1.50 + } + foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule + # Name + $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' + # Enabled + $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' + # Type + $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' + # VMGroup + $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' + # VMHostGroup + $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' + # AffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' + # AntiAffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' + Connect-VisioObject $ClusterObject $DRSVMHostRuleObject + $y += 1.50 + #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject + #$DrsClusterGroupObject = $DRSVMHostRuleObject + + foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) + { + $x += 2.50 + $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup + # Name + $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' + # GroupType + $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' + # Members + $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' + Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject + $DRSVMHostRuleObject = $DrsClusterGroupObject + + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Open_Final_Visio +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.Application + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null +} + +Main + +#endregion \ No newline at end of file diff --git a/vDiagram_Scheduled_Task 2.0.1.ps1 b/vDiagram_Scheduled_Task 2.0.1.ps1 new file mode 100644 index 0000000..751c2de --- /dev/null +++ b/vDiagram_Scheduled_Task 2.0.1.ps1 @@ -0,0 +1,593 @@ +$Date = (Get-Date -format "yyyy_MM_dd") +$7zip = "C:\Program Files\7-Zip\7z.exe" + +# Variables +$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." +$vCenterShortName = "Replace with vCenter name." +$CsvDir = "C:\vDiagram\Capture" +$SMTPserver = "SMTP Server" +$Mailfrom = "outbound@email.com" +$Mailto = "you@email.com" +$Subject = "vDiagram 2.0 Files" +$ReportFile = "C:\vDiagram\Zip" +$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" +$AttachmentFile = $ZipFile +$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" + + +#region Functions +#region PsCreds +#region Export-PSCredential +Function Export-PSCredential { + param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) + + # Look at the object type of the $Credential parameter to determine how to handle it + switch ( $Credential.GetType().Name ) { + # It is a credential, so continue + PSCredential { continue } + # It is a string, so use that as the username and prompt for the password + String { $Credential = Get-Credential -credential $Credential } + # In all other caess, throw an error and exit + default { Throw "You must specify a credential object to export to disk." } + } + + # Create temporary object to be serialized to disk + $export = "" | Select-Object Username, EncryptedPassword + + # Give object a type name which can be identified later + #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) + + $export.Username = $Credential.Username + + # Encrypt SecureString password using Data Protection API + # Only the current user account can decrypt this cipher + $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString + + # Export using the Export-Clixml cmdlet + $export | Export-Clixml $Path + Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine + + # Return FileInfo object referring to saved credentials + Get-Item $Path +} +Export-PSCredential +#endregion Export-PSCredential + +#region Import-PSCredential +Function Import-PSCredential { + param ( $Path = "credentials.xml" ) + + # Import credential file + $import = Import-Clixml $Path + + # Test for valid import + if ( !$import.UserName -or !$import.EncryptedPassword ) { + Throw "Input is not a valid ExportedPSCredential object, exiting." + } + $Username = $import.Username + + # Decrypt the password and store as a SecureString object for safekeeping + $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString + + # Build the new credential object + $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass + Write-Output $Credential +} +#endregion Import-PSCredential + +#endregion PsCreds + +#region vCenterFunctions +#region Connect_vCenter_Main +Function Connect_vCenter_Main +{ + $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter_Main + +#region Connect_vCenter +Function Connect_vCenter +{ + $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter + +#region Disconnect_vCenter +Function Disconnect_vCenter +{ + Disconnect-ViServer * -Confirm:$False +} +#endregion Disconnect_vCenter +#endregion vCenterFunctions + +#region CsvExportFunctions +#region vCenter_Export +Function vCenter_Export +{ + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, + @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, + @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo + Disconnect_vCenter +} +#endregion vCenter_Export + +#region Datacenter_Export +Function Datacenter_Export +{ + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo +} +#endregion Datacenter_Export + +#region Cluster_Export +Function Cluster_Export +{ + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, + @{N="HAEnabled";E={$_.HAEnabled}}, + @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, + @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, + @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, + @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, + @{N="DrsEnabled";E={$_.DrsEnabled}}, + @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, + @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, + @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo +} +#endregion Cluster_Export + +#region VmHost_Export +Function VmHost_Export +{ + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={ + $Datacenter = Get-View -Id $_.Parent -Property Name,Parent + While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent + } + If($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name}}}, + @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent + While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent + } + If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, + @{N="Version";E={$_.Config.Product.Version}}, + @{N="Build";E={$_.Config.Product.Build}}, + @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, + @{N="Model";E={$_.Summary.Hardware.Model}}, + @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, + @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, + @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, + @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, + @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, + @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, + @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, + @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, + @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, + @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo +} +#endregion VmHost_Export + +#region Vm_Export +Function Vm_Export +{ + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select Name, + @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, + @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, + @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, + @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, + @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, + @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, + @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, + @{N="OS";E={$_.Config.GuestFullName}}, + @{N="Version";E={$_.Config.Version}}, + @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, + @{N='Folder';E={$Folder.Name}}, + @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, + @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, + @{N="IP";E={$_.Guest.IpAddress}}, + @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, + @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, + @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, + @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo + } +} +#endregion Vm_Export + +#region Template_Export +Function Template_Export +{ + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + ForEach($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$VmHost | Get-Datacenter}}, + @{N="Cluster";E={$VmHost | Get-Cluster}}, + @{N="VmHost";E={$VmHost.name}}, + @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, + @{N="Folder";E={Get-Folder -Id $_.FolderId}}, + @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, + @{N="Version";E={$_.ExtensionData.Config.Version}}, + @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, + @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, + @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, + @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, + @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo + } +} +#endregion Template_Export + +#region DatastoreCluster_Export +Function DatastoreCluster_Export +{ + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, + @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, + @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, + @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, + @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo +} +#endregion DatastoreCluster_Export + +#region Datastore_Export +Function Datastore_Export +{ + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, + @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, + @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, + @{N="Type";E={$_.Type}}, + @{N="FileSystemVersion";E={$_.FileSystemVersion}}, + @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, + @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, + @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, + @{N="Accessible";E={$_.State}}, + @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo +} +#endregion Datastore_Export + +#region VsSwitch_Export +Function VsSwitch_Export +{ + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="Nic";E={$_.Nic}}, + @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, + @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, + @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, + @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, + @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, + @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, + @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, + @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, + @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo +} +#endregion VsSwitch_Export + +#region VssPort_Export +Function VssPort_Export +{ + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="VLanId";E={$_.VLanId}}, + @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPort_Export + +#region VssVmk_Export +Function VssVmk_Export +{ + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo + } + } + } +} +#endregion VssVmk_Export + +#region VssPnic_Export +Function VssPnic_Export +{ + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPnic_Export + +#region VdSwitch_Export +Function VdSwitch_Export +{ + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + ForEach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="Vendor";E={$_.Vendor}}, + @{N="Version";E={$_.Version}}, + @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, + @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo + } +} +#endregion VdSwitch_Export + +#region VdsPort_Export +Function VdsPort_Export +{ + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}}, + @{N="VdSwitch";E={$_.VdSwitch}}, + @{N="NumPorts";E={$_.NumPorts}}, + @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, + @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, + @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, + @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, + @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, + @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPort_Export + +#region VdsVmk_Export +Function VdsVmk_Export +{ + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo + + } + } +} +#endregion VdsVmk_Export + +#region VdsPnic_Export +Function VdsPnic_Export +{ + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch}}, + @{N="Portgroup";E={$_.Portgroup}}, + @{N="ConnectedEntity";E={$_.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPnic_Export + +#region Folder_Export +Function Folder_Export +{ + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + ForEach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo + } +} +#endregion Folder_Export + +#region Rdm_Export +Function Rdm_Export +{ + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, + @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, + @{N="Vm";E={$_.Parent}}, + @{N="Label";E={$_.Name}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, + @{N="DiskType";E={$_.DiskType}}, + @{N="Persistence";E={$_.Persistence}}, + @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, + @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, + @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo +} +#endregion Rdm_Export + +#region Drs_Rule_Export +Function Drs_Rule_Export +{ + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Type";E={$_.Type}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Rule_Export + +#region Drs_Cluster_Group_Export +Function Drs_Cluster_Group_Export +{ + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="GroupType";E={$_.GroupType}}, + @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Cluster_Group_Export + +#region Drs_VmHost_Rule_Export +Function Drs_VmHost_Rule_Export +{ + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) + { + Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Type";E={$_.Type}}, + @{N="VMGroup";E={$_.VMGroup}}, + @{N="VMHostGroup";E={$_.VMHostGroup}}, + @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, + @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo + } + } +} +#endregion Drs_VmHost_Rule_Export + +#region Resource_Pool_Export +Function Resource_Pool_Export +{ + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) + { + Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Cluster";E={$Cluster.Name}}, + @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, + @{N="NumCpuShares";E={$_.NumCpuShares}}, + @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, + @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, + @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, + @{N="MemSharesLevel";E={$_.MemSharesLevel}}, + @{N="NumMemShares";E={$_.NumMemShares}}, + @{N="MemReservationGB";E={$_.MemReservationGB}}, + @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, + @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo + } + } +} +#endregion Resource_Pool_Export + +#endregion CsvExportFunctions + +#endregion Functions + +Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter + +#Zip Files +cd $CsvDir +dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } + +#Send E-mail +Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile + +#Clear CSV Folder +cd $CsvDir +del *.csv \ No newline at end of file From d29e65293e1f810b437aec2542c08fbb534784ce Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Fri, 13 Apr 2018 08:31:25 -0400 Subject: [PATCH 02/19] Moving files --- vDiagram.vssx => vDiagram_2.0.1/vDiagram.vssx | Bin .../vDiagram2.0.1.ps1 | 17612 ++++++++-------- .../vDiagram_Scheduled_Task 2.0.1.ps1 | 1184 +- 3 files changed, 9398 insertions(+), 9398 deletions(-) rename vDiagram.vssx => vDiagram_2.0.1/vDiagram.vssx (100%) rename vDiagram2.0.1.ps1 => vDiagram_2.0.1/vDiagram2.0.1.ps1 (97%) rename vDiagram_Scheduled_Task 2.0.1.ps1 => vDiagram_2.0.1/vDiagram_Scheduled_Task 2.0.1.ps1 (97%) diff --git a/vDiagram.vssx b/vDiagram_2.0.1/vDiagram.vssx similarity index 100% rename from vDiagram.vssx rename to vDiagram_2.0.1/vDiagram.vssx diff --git a/vDiagram2.0.1.ps1 b/vDiagram_2.0.1/vDiagram2.0.1.ps1 similarity index 97% rename from vDiagram2.0.1.ps1 rename to vDiagram_2.0.1/vDiagram2.0.1.ps1 index fbb9c51..c13525d 100644 --- a/vDiagram2.0.1.ps1 +++ b/vDiagram_2.0.1/vDiagram2.0.1.ps1 @@ -1,8807 +1,8807 @@ -<# -.SYNOPSIS - vDiagram Visio Drawing Tool - -.DESCRIPTION - vDiagram Visio Drawing Tool - -.NOTES - File Name : vDiagram2.0.1.ps1 - Author : Tony Gonzalez - Author : Jason Hopkins - Based on : vDiagram by Alan Renouf - Version : 2.0.0 - -.USAGE NOTES - Ensure to unblock files before unzipping - Ensure to run as administrator - Required Files: - PowerCLI or PowerShell 5.0 with PowerCLI Modules installed - Active connection to vCenter to capture data - MS Visio - -.CHANGE LOG - - 04/12/2018 - v2.0.1 - Added MAC Addresses to VMs & Templates - Added a check to see if prior CSVs are still present - Added option to copy prior CSVs to new folder - - - 04/11/2018 - v2.0.0 - Presented as a Community Theater Session at South Florida VMUG - Feature enhancement requests collected -#> - -#region ScriptForm Designer - -#region Constructor - -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") -[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") -[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") -#endregion - -#region Post-Constructor Custom Code -$MyVer = "2.0.1" -$LastUpdated = "April 12, 2018" -$About = -@" - - vDiagram $MyVer - - Contributors: Tony Gonzalez of RoundTower Technologies LLC - Jason Hopkins of RoundTower Technologies LLC - - Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram - - Created: February 13, 2018 - - Last Updated: $LastUpdated - -"@ -#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" -if (!(Test-Path $TestShapes)) -{ - $CurrentLocation = Get-Location - copy $CurrentLocation\vDiagram.vssx $TestShapes - Write-Host "Copying Shapes File to My Shapes" -} -$shpFile = "\vDiagram.vssx" -#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Set_WindowStyle { -param( - [Parameter()] - [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', - 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', - 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] - $Style = 'SHOW', - [Parameter()] - $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle -) - $WindowStates = @{ - FORCEMINIMIZE = 11; HIDE = 0 - MAXIMIZE = 3; MINIMIZE = 6 - RESTORE = 9; SHOW = 5 - SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 - SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 - SHOWNA = 8; SHOWNOACTIVATE = 4 - SHOWNORMAL = 1 - } - Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) - - $Win32ShowWindowAsync = Add-Type –memberDefinition @” - [DllImport("user32.dll")] - public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); -“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru - - $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null -} -Set_WindowStyle MINIMIZE -#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function About_Config -{ - - $About - - #Add objects for About - $AboutForm = New-Object System.Windows.Forms.Form - $AboutTextBox = New-Object System.Windows.Forms.RichTextBox - - #About Form - $AboutForm.Icon = $Icon - $AboutForm.AutoScroll = $True - $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) - $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutForm.Name = "About" - $AboutForm.StartPosition = 1 - $AboutForm.Text = "About vDiagram $MyVer" - - $AboutTextBox.Anchor = 15 - $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) - $AboutTextBox.BorderStyle = 0 - $AboutTextBox.Font = "Tahoma" - $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 - $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) - $AboutTextBox.Name = "AboutTextBox" - $AboutTextBox.ReadOnly = $True - $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) - $AboutTextBox.Text = $About - - $AboutForm.Controls.Add($AboutTextBox) - - $AboutForm.Show() | Out-Null -} -#endregion - -#region Form Creation -#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vDiagram = New-Object System.Windows.Forms.Form -$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) -$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") -$vDiagram.Icon = $Icon -$vDiagram.Text = "vDiagram 2.0" -$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan -#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainMenu = New-Object System.Windows.Forms.MenuStrip -$MainMenu.Location = New-Object System.Drawing.Point(0, 0) -$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) -$MainMenu.TabIndex = 1 -$MainMenu.Text = "MainMenu" -#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) -$FileToolStripMenuItem.Text = "File" -#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) -$ExitToolStripMenuItem.Text = "Exit" -$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) -$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) -#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) -$HelpToolStripMenuItem.Text = "Help" -#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem -$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) -$AboutToolStripMenuItem.Text = "About" -$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) -$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) -$AboutToolStripMenuItem.Add_Click({About_Config}) -#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainTab = New-Object System.Windows.Forms.TabControl -$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) -$MainTab.Location = New-Object System.Drawing.Point(10, 30) -$MainTab.Size = New-Object System.Drawing.Size(990, 98) -$MainTab.TabIndex = 0 -$MainTab.Text = "MainTabs" -#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Prerequisites = New-Object System.Windows.Forms.TabPage -$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) -$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) -$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) -$Prerequisites.TabIndex = 0 -$Prerequisites.Text = "Prerequisites" -$Prerequisites.BackColor = [System.Drawing.Color]::LightGray -#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellLabel = New-Object System.Windows.Forms.Label -$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) -$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) -$PowershellLabel.TabIndex = 1 -$PowershellLabel.Text = "Powershell:" -#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellInstalled = New-Object System.Windows.Forms.Label -$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) -$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) -$PowershellInstalled.TabIndex = 2 -$PowershellInstalled.Text = "" -$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleLabel = New-Object System.Windows.Forms.Label -$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) -$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) -$PowerCliModuleLabel.TabIndex = 3 -$PowerCliModuleLabel.Text = "PowerCLI Module:" -#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label -$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) -$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) -$PowerCliModuleInstalled.TabIndex = 4 -$PowerCliModuleInstalled.Text = "" -$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliLabel = New-Object System.Windows.Forms.Label -$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) -$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) -$PowerCliLabel.TabIndex = 5 -$PowerCliLabel.Text = "PowerCLI:" -#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliInstalled = New-Object System.Windows.Forms.Label -$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) -$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) -$PowerCliInstalled.TabIndex = 6 -$PowerCliInstalled.Text = "" -$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioLabel = New-Object System.Windows.Forms.Label -$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) -$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) -$VisioLabel.TabIndex = 7 -$VisioLabel.Text = "Visio:" -#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioInstalled = New-Object System.Windows.Forms.Label -$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) -$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) -$VisioInstalled.TabIndex = 8 -$VisioInstalled.Text = "" -$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray -$Prerequisites.Controls.Add($PowershellLabel) -$Prerequisites.Controls.Add($PowershellInstalled) -$Prerequisites.Controls.Add($PowerCliModuleLabel) -$Prerequisites.Controls.Add($PowerCliModuleInstalled) -$Prerequisites.Controls.Add($PowerCliLabel) -$Prerequisites.Controls.Add($PowerCliInstalled) -$Prerequisites.Controls.Add($VisioLabel) -$Prerequisites.Controls.Add($VisioInstalled) -#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfo = New-Object System.Windows.Forms.TabPage -$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) -$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) -$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) -$vCenterInfo.TabIndex = 0 -$vCenterInfo.Text = "vCenter Info" -$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray -#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterLabel = New-Object System.Windows.Forms.Label -$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) -$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) -$MainVcenterLabel.TabIndex = 1 -$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" -#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox -$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) -$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) -$MainVcenterTextBox.TabIndex = 2 -$MainVcenterTextBox.Text = "" -#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterLabel = New-Object System.Windows.Forms.Label -$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) -$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) -$TargetVcenterLabel.TabIndex = 3 -$TargetVcenterLabel.Text = "Name of target vCenter:" -#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox -$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) -$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) -$TargetVcenterTextBox.TabIndex = 4 -$TargetVcenterTextBox.Text = "" -#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameLabel = New-Object System.Windows.Forms.Label -$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) -$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) -$UserNameLabel.TabIndex = 5 -$UserNameLabel.Text = "vCenter User Name:" -#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$UserNameTextBox = New-Object System.Windows.Forms.TextBox -$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) -$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) -$UserNameTextBox.TabIndex = 6 -$UserNameTextBox.Text = "" -#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordLabel = New-Object System.Windows.Forms.Label -$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) -$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) -$PasswordLabel.TabIndex = 7 -$PasswordLabel.Text = "Password:" -#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PasswordTextBox = New-Object System.Windows.Forms.TextBox -$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) -$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) -$PasswordTextBox.TabIndex = 8 -$PasswordTextBox.Text = "" -$PasswordTextBox.UseSystemPasswordChar = $true -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton = New-Object System.Windows.Forms.Button -$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) -$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) -$ConnectButton.TabIndex = 9 -$ConnectButton.Text = "Connect to vCenter" -$ConnectButton.UseVisualStyleBackColor = $true -$vCenterInfo.Controls.Add($MainVcenterLabel) -$vCenterInfo.Controls.Add($MainVcenterTextBox) -$vCenterInfo.Controls.Add($TargetVcenterLabel) -$vCenterInfo.Controls.Add($TargetVcenterTextBox) -$vCenterInfo.Controls.Add($UserNameLabel) -$vCenterInfo.Controls.Add($UserNameTextBox) -$vCenterInfo.Controls.Add($PasswordLabel) -$vCenterInfo.Controls.Add($PasswordTextBox) -$vCenterInfo.Controls.Add($ConnectButton) -$MainTab.Controls.Add($Prerequisites) -$MainTab.Controls.Add($vCenterInfo) -$MainTab.SelectedIndex = 0 -#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SubTab = New-Object System.Windows.Forms.TabControl -$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$SubTab.Location = New-Object System.Drawing.Point(10, 136) -$SubTab.Size = New-Object System.Drawing.Size(990, 512) -$SubTab.TabIndex = 0 -$SubTab.Text = "SubTabs" -#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDirections = New-Object System.Windows.Forms.TabPage -$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDirections.Location = New-Object System.Drawing.Point(4, 22) -$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDirections.Size = New-Object System.Drawing.Size(982, 486) -$TabDirections.TabIndex = 0 -$TabDirections.Text = "Directions" -$TabDirections.UseVisualStyleBackColor = $true -#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesHeading = New-Object System.Windows.Forms.Label -$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) -$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) -$PrerequisitesHeading.TabIndex = 0 -$PrerequisitesHeading.Text = "Prerequisites Tab" -#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PrerequisitesDirections = New-Object System.Windows.Forms.Label -$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) -$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) -$PrerequisitesDirections.TabIndex = 1 -$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." -#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoHeading = New-Object System.Windows.Forms.Label -$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) -$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) -$vCenterInfoHeading.TabIndex = 2 -$vCenterInfoHeading.Text = "vCenter Info Tab" -#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterInfoDirections = New-Object System.Windows.Forms.Label -$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) -$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) -$vCenterInfoDirections.TabIndex = 3 -$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." -#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvHeading = New-Object System.Windows.Forms.Label -$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) -$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) -$CaptureCsvHeading.TabIndex = 4 -$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" -#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureDirections = New-Object System.Windows.Forms.Label -$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) -$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) -$CaptureDirections.TabIndex = 5 -$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." -#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawHeading = New-Object System.Windows.Forms.Label -$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) -$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) -$DrawHeading.TabIndex = 6 -$DrawHeading.Text = "Draw Visio Tab" -#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawDirections = New-Object System.Windows.Forms.Label -$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) -$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) -$DrawDirections.TabIndex = 7 -$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." -$TabDirections.Controls.Add($PrerequisitesHeading) -$TabDirections.Controls.Add($PrerequisitesDirections) -$TabDirections.Controls.Add($vCenterInfoHeading) -$TabDirections.Controls.Add($vCenterInfoDirections) -$TabDirections.Controls.Add($CaptureCsvHeading) -$TabDirections.Controls.Add($CaptureDirections) -$TabDirections.Controls.Add($DrawHeading) -$TabDirections.Controls.Add($DrawDirections) -#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabCapture = New-Object System.Windows.Forms.TabPage -$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabCapture.Location = New-Object System.Drawing.Point(4, 22) -$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) -$TabCapture.Size = New-Object System.Drawing.Size(982, 486) -$TabCapture.TabIndex = 3 -$TabCapture.Text = "Capture CSVs for Visio" -$TabCapture.UseVisualStyleBackColor = $true -#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label -$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) -$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) -$CaptureCsvOutputLabel.TabIndex = 0 -$CaptureCsvOutputLabel.Text = "CSV Output Folder:" -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button -$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) -$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) -$CaptureCsvOutputButton.TabIndex = 0 -$CaptureCsvOutputButton.Text = "Select Output Folder" -$CaptureCsvOutputButton.UseVisualStyleBackColor = $false -$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$vCenterCsvCheckBox.Checked = $true -$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$vCenterCsvCheckBox.TabIndex = 1 -$vCenterCsvCheckBox.Text = "Export vCenter Info" -$vCenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) -$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationComplete.TabIndex = 26 -$vCenterCsvValidationComplete.Text = "" -#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatacenterCsvCheckBox.Checked = $true -$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatacenterCsvCheckBox.TabIndex = 2 -$DatacenterCsvCheckBox.Text = "Export Datacenter Info" -$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) -$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationComplete.TabIndex = 27 -$DatacenterCsvValidationComplete.Text = "" -#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ClusterCsvCheckBox.Checked = $true -$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ClusterCsvCheckBox.TabIndex = 3 -$ClusterCsvCheckBox.Text = "Export Cluster Info" -$ClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) -$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationComplete.TabIndex = 28 -$ClusterCsvValidationComplete.Text = "" -#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmHostCsvCheckBox.Checked = $true -$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmHostCsvCheckBox.TabIndex = 4 -$VmHostCsvCheckBox.Text = "Export VmHost Info" -$VmHostCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) -$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationComplete.TabIndex = 29 -$VmHostCsvValidationComplete.Text = "" -#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VmCsvCheckBox.Checked = $true -$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VmCsvCheckBox.TabIndex = 5 -$VmCsvCheckBox.Text = "Export Vm Info" -$VmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationComplete = New-Object System.Windows.Forms.Label -$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) -$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationComplete.TabIndex = 30 -$VmCsvValidationComplete.Text = "" -#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$TemplateCsvCheckBox.Checked = $true -$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$TemplateCsvCheckBox.TabIndex = 6 -$TemplateCsvCheckBox.Text = "Export Template Info" -$TemplateCsvCheckBox.UseVisualStyleBackColor = $true -#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label -$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) -$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationComplete.TabIndex = 31 -$TemplateCsvValidationComplete.Text = "" -#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreClusterCsvCheckBox.Checked = $true -$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreClusterCsvCheckBox.TabIndex = 7 -$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" -$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) -$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationComplete.TabIndex = 32 -$DatastoreClusterCsvValidationComplete.Text = "" -#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DatastoreCsvCheckBox.Checked = $true -$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DatastoreCsvCheckBox.TabIndex = 8 -$DatastoreCsvCheckBox.Text = "Export Datastore Info" -$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) -$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationComplete.TabIndex = 33 -$DatastoreCsvValidationComplete.Text = "" -#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VsSwitchCsvCheckBox.Checked = $true -$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) -$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VsSwitchCsvCheckBox.TabIndex = 9 -$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" -$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) -$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationComplete.TabIndex = 34 -$VsSwitchCsvValidationComplete.Text = "" -#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPortGroupCsvCheckBox.Checked = $true -$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) -$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPortGroupCsvCheckBox.TabIndex = 10 -$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" -$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) -$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationComplete.TabIndex = 35 -$VssPortGroupCsvValidationComplete.Text = "" -#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssVmkernelCsvCheckBox.Checked = $true -$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) -$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssVmkernelCsvCheckBox.TabIndex = 11 -$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" -$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) -$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationComplete.TabIndex = 36 -$VssVmkernelCsvValidationComplete.Text = "" -#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VssPnicCsvCheckBox.Checked = $true -$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) -$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VssPnicCsvCheckBox.TabIndex = 12 -$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" -$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) -$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationComplete.TabIndex = 37 -$VssPnicCsvValidationComplete.Text = "" -#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdSwitchCsvCheckBox.Checked = $true -$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) -$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdSwitchCsvCheckBox.TabIndex = 13 -$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" -$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) -$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationComplete.TabIndex = 38 -$VdSwitchCsvValidationComplete.Text = "" -#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPortGroupCsvCheckBox.Checked = $true -$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) -$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPortGroupCsvCheckBox.TabIndex = 14 -$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" -$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) -$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationComplete.TabIndex = 39 -$VdsPortGroupCsvValidationComplete.Text = "" -#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsVmkernelCsvCheckBox.Checked = $true -$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) -$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsVmkernelCsvCheckBox.TabIndex = 15 -$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" -$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) -$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationComplete.TabIndex = 40 -$VdsVmkernelCsvValidationComplete.Text = "" -#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$VdsPnicCsvCheckBox.Checked = $true -$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) -$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$VdsPnicCsvCheckBox.TabIndex = 16 -$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" -$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true -#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) -$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationComplete.TabIndex = 41 -$VdsPnicCsvValidationComplete.Text = "" -#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$FolderCsvCheckBox.Checked = $true -$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) -$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$FolderCsvCheckBox.TabIndex = 17 -$FolderCsvCheckBox.Text = "Export Folder Info" -$FolderCsvCheckBox.UseVisualStyleBackColor = $true -#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label -$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) -$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationComplete.TabIndex = 42 -$FolderCsvValidationComplete.Text = "" -#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$RdmCsvCheckBox.Checked = $true -$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) -$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$RdmCsvCheckBox.TabIndex = 18 -$RdmCsvCheckBox.Text = "Export RDM Info" -$RdmCsvCheckBox.UseVisualStyleBackColor = $true -#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label -$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) -$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationComplete.TabIndex = 43 -$RdmCsvValidationComplete.Text = "" -#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsRuleCsvCheckBox.Checked = $true -$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) -$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsRuleCsvCheckBox.TabIndex = 19 -$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" -$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) -$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationComplete.TabIndex = 44 -$DrsRuleCsvValidationComplete.Text = "" -#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsClusterGroupCsvCheckBox.Checked = $true -$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) -$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsClusterGroupCsvCheckBox.TabIndex = 20 -$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" -$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) -$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationComplete.TabIndex = 45 -$DrsClusterGroupCsvValidationComplete.Text = "" -#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$DrsVmHostRuleCsvCheckBox.Checked = $true -$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) -$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$DrsVmHostRuleCsvCheckBox.TabIndex = 21 -$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" -$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true -#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) -$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 -$DrsVmHostRuleCsvValidationComplete.Text = "" -#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox -$ResourcePoolCsvCheckBox.Checked = $true -$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) -$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) -$ResourcePoolCsvCheckBox.TabIndex = 22 -$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" -$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true -#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) -$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationComplete.TabIndex = 47 -$ResourcePoolCsvValidationComplete.Text = "" -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton = New-Object System.Windows.Forms.Button -$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) -$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureUncheckButton.TabIndex = 23 -$CaptureUncheckButton.Text = "Uncheck All" -$CaptureUncheckButton.UseVisualStyleBackColor = $false -$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton = New-Object System.Windows.Forms.Button -$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) -$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureCheckButton.TabIndex = 24 -$CaptureCheckButton.Text = "Check All" -$CaptureCheckButton.UseVisualStyleBackColor = $false -$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton = New-Object System.Windows.Forms.Button -$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) -$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) -$CaptureButton.TabIndex = 25 -$CaptureButton.Text = "Collect CSV Data" -$CaptureButton.UseVisualStyleBackColor = $false -$CaptureButton.BackColor = [System.Drawing.Color]::LightGray -$TabCapture.Controls.Add($CaptureCsvOutputLabel) -$TabCapture.Controls.Add($CaptureCsvOutputButton) -$TabCapture.Controls.Add($vCenterCsvCheckBox) -$TabCapture.Controls.Add($vCenterCsvValidationComplete) -$TabCapture.Controls.Add($DatacenterCsvCheckBox) -$TabCapture.Controls.Add($DatacenterCsvValidationComplete) -$TabCapture.Controls.Add($ClusterCsvCheckBox) -$TabCapture.Controls.Add($ClusterCsvValidationComplete) -$TabCapture.Controls.Add($VmHostCsvCheckBox) -$TabCapture.Controls.Add($VmHostCsvValidationComplete) -$TabCapture.Controls.Add($VmCsvCheckBox) -$TabCapture.Controls.Add($VmCsvValidationComplete) -$TabCapture.Controls.Add($TemplateCsvCheckBox) -$TabCapture.Controls.Add($TemplateCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) -$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) -$TabCapture.Controls.Add($DatastoreCsvCheckBox) -$TabCapture.Controls.Add($DatastoreCsvValidationComplete) -$TabCapture.Controls.Add($VsSwitchCsvCheckBox) -$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VssPnicCsvCheckBox) -$TabCapture.Controls.Add($VssPnicCsvValidationComplete) -$TabCapture.Controls.Add($VdSwitchCsvCheckBox) -$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) -$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) -$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) -$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) -$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) -$TabCapture.Controls.Add($VdsPnicCsvCheckBox) -$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) -$TabCapture.Controls.Add($FolderCsvCheckBox) -$TabCapture.Controls.Add($FolderCsvValidationComplete) -$TabCapture.Controls.Add($RdmCsvCheckBox) -$TabCapture.Controls.Add($RdmCsvValidationComplete) -$TabCapture.Controls.Add($DrsRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) -$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) -$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) -$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) -$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) -$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) -$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) -$TabCapture.Controls.Add($CaptureUncheckButton) -$TabCapture.Controls.Add($CaptureCheckButton) -$TabCapture.Controls.Add($CaptureButton) -#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TabDraw = New-Object System.Windows.Forms.TabPage -$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D -$TabDraw.Location = New-Object System.Drawing.Point(4, 22) -$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) -$TabDraw.Size = New-Object System.Drawing.Size(982, 486) -$TabDraw.TabIndex = 2 -$TabDraw.Text = "Draw Visio" -$TabDraw.UseVisualStyleBackColor = $true -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton = New-Object System.Windows.Forms.Button -$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) -$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) -$OpenVisioButton.TabIndex = 83 -$OpenVisioButton.Text = "Open Visio Drawing" -$OpenVisioButton.UseVisualStyleBackColor = $false -$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton = New-Object System.Windows.Forms.Button -$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) -$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawCheckButton.TabIndex = 82 -$DrawCheckButton.Text = "Check All" -$DrawCheckButton.UseVisualStyleBackColor = $false -$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton = New-Object System.Windows.Forms.Button -$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawButton.Location = New-Object System.Drawing.Point(448, 450) -$DrawButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawButton.TabIndex = 81 -$DrawButton.Text = "Draw Visio" -$DrawButton.UseVisualStyleBackColor = $false -$DrawButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton = New-Object System.Windows.Forms.Button -$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) -$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) -$DrawUncheckButton.TabIndex = 80 -$DrawUncheckButton.Text = "Uncheck All" -$DrawUncheckButton.UseVisualStyleBackColor = $false -$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOutputLabel = New-Object System.Windows.Forms.Label -$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) -$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) -$VisioOutputLabel.TabIndex = 46 -$VisioOutputLabel.Text = "Visio Output Folder:" -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton = New-Object System.Windows.Forms.Button -$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) -$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) -$VisioOpenOutputButton.TabIndex = 47 -$VisioOpenOutputButton.Text = "Select Visio Output Folder" -$VisioOpenOutputButton.UseVisualStyleBackColor = $false -$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputLabel = New-Object System.Windows.Forms.Label -$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) -$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) -$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) -$DrawCsvInputLabel.TabIndex = 0 -$DrawCsvInputLabel.Text = "CSV Input Folder:" -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton = New-Object System.Windows.Forms.Button -$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) -$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) -$DrawCsvInputButton.TabIndex = 1 -$DrawCsvInputButton.Text = "Select CSV Input Folder" -$DrawCsvInputButton.UseVisualStyleBackColor = $false -$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray -#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidation = New-Object System.Windows.Forms.Label -$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) -$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$vCenterCsvValidation.TabIndex = 2 -$vCenterCsvValidation.Text = "vCenter CSV File:" -#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) -$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$vCenterCsvValidationCheck.TabIndex = 3 -$vCenterCsvValidationCheck.Text = "" -#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidation = New-Object System.Windows.Forms.Label -$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) -$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatacenterCsvValidation.TabIndex = 4 -$DatacenterCsvValidation.Text = "Datacenter CSV File:" -#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) -$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatacenterCsvValidationCheck.TabIndex = 5 -$DatacenterCsvValidationCheck.Text = "" -#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidation = New-Object System.Windows.Forms.Label -$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) -$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ClusterCsvValidation.TabIndex = 6 -$ClusterCsvValidation.Text = "Cluster CSV File:" -#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) -$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ClusterCsvValidationCheck.TabIndex = 7 -$ClusterCsvValidationCheck.Text = "" -#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidation = New-Object System.Windows.Forms.Label -$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) -$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmHostCsvValidation.TabIndex = 8 -$VmHostCsvValidation.Text = "VmHost CSV File:" -#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) -$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmHostCsvValidationCheck.TabIndex = 9 -$VmHostCsvValidationCheck.Text = "" -#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidation = New-Object System.Windows.Forms.Label -$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) -$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VmCsvValidation.TabIndex = 10 -$VmCsvValidation.Text = "VM CSV File:" -#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VmCsvValidationCheck = New-Object System.Windows.Forms.Label -$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) -$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VmCsvValidationCheck.TabIndex = 11 -$VmCsvValidationCheck.Text = "" -#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidation = New-Object System.Windows.Forms.Label -$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) -$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$TemplateCsvValidation.TabIndex = 12 -$TemplateCsvValidation.Text = "Template CSV File:" -#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label -$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) -$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$TemplateCsvValidationCheck.TabIndex = 13 -$TemplateCsvValidationCheck.Text = "" -#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) -$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreClusterCsvValidation.TabIndex = 14 -$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" -#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) -$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreClusterCsvValidationCheck.TabIndex = 15 -$DatastoreClusterCsvValidationCheck.Text = "" -#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidation = New-Object System.Windows.Forms.Label -$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) -$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DatastoreCsvValidation.TabIndex = 16 -$DatastoreCsvValidation.Text = "Datastore CSV File:" -#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label -$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) -$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DatastoreCsvValidationCheck.TabIndex = 17 -$DatastoreCsvValidationCheck.Text = "" -#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) -$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VsSwitchCsvValidation.TabIndex = 18 -$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" -#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) -$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VsSwitchCsvValidationCheck.TabIndex = 19 -$VsSwitchCsvValidationCheck.Text = "" -#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) -$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPortGroupCsvValidation.TabIndex = 20 -$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" -#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) -$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPortGroupCsvValidationCheck.TabIndex = 21 -$VssPortGroupCsvValidationCheck.Text = "" -#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) -$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssVmkernelCsvValidation.TabIndex = 22 -$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" -#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) -$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssVmkernelCsvValidationCheck.TabIndex = 23 -$VssVmkernelCsvValidationCheck.Text = "" -#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidation = New-Object System.Windows.Forms.Label -$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) -$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VssPnicCsvValidation.TabIndex = 24 -$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" -#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) -$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VssPnicCsvValidationCheck.TabIndex = 25 -$VssPnicCsvValidationCheck.Text = "" -#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) -$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdSwitchCsvValidation.TabIndex = 26 -$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" -#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) -$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdSwitchCsvValidationCheck.TabIndex = 27 -$VdSwitchCsvValidationCheck.Text = "" -#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) -$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPortGroupCsvValidation.TabIndex = 28 -$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" -#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) -$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPortGroupCsvValidationCheck.TabIndex = 29 -$VdsPortGroupCsvValidationCheck.Text = "" -#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) -$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsVmkernelCsvValidation.TabIndex = 30 -$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" -#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) -$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsVmkernelCsvValidationCheck.TabIndex = 31 -$VdsVmkernelCsvValidationCheck.Text = "" -#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) -$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$VdsPnicCsvValidation.TabIndex = 32 -$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" -#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label -$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) -$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$VdsPnicCsvValidationCheck.TabIndex = 33 -$VdsPnicCsvValidationCheck.Text = "" -#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidation = New-Object System.Windows.Forms.Label -$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) -$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$FolderCsvValidation.TabIndex = 34 -$FolderCsvValidation.Text = "Folder CSV File:" -#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label -$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) -$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$FolderCsvValidationCheck.TabIndex = 35 -$FolderCsvValidationCheck.Text = "" -#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidation = New-Object System.Windows.Forms.Label -$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) -$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$RdmCsvValidation.TabIndex = 36 -$RdmCsvValidation.Text = "RDM CSV File:" -#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label -$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) -$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$RdmCsvValidationCheck.TabIndex = 37 -$RdmCsvValidationCheck.Text = "" -#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) -$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsRuleCsvValidation.TabIndex = 38 -$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" -#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) -$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsRuleCsvValidationCheck.TabIndex = 39 -$DrsRuleCsvValidationCheck.Text = "" -#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) -$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsClusterGroupCsvValidation.TabIndex = 40 -$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" -#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) -$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsClusterGroupCsvValidationCheck.TabIndex = 41 -$DrsClusterGroupCsvValidationCheck.Text = "" -#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) -$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$DrsVmHostRuleCsvValidation.TabIndex = 42 -$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" -#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label -$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) -$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 -$DrsVmHostRuleCsvValidationCheck.Text = "" -#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) -$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) -$ResourcePoolCsvValidation.TabIndex = 44 -$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" -#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label -$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) -$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) -$ResourcePoolCsvValidationCheck.TabIndex = 45 -$ResourcePoolCsvValidationCheck.Text = "" -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton = New-Object System.Windows.Forms.Button -$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup -$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) -$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) -$CsvValidationButton.TabIndex = 2 -$CsvValidationButton.Text = "Check for CSVs" -$CsvValidationButton.UseVisualStyleBackColor = $false -$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray -#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Host_DrawCheckBox.Checked = $true -$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) -$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Host_DrawCheckBox.TabIndex = 48 -$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" -$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Host_Complete = New-Object System.Windows.Forms.Label -$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) -$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Host_Complete.TabIndex = 49 -$VM_to_Host_Complete.Text = "" -#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Folder_DrawCheckBox.Checked = $true -$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) -$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Folder_DrawCheckBox.TabIndex = 50 -$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" -$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label -$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) -$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Folder_Complete.TabIndex = 51 -$VM_to_Folder_Complete.Text = "" -#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMs_with_RDMs_DrawCheckBox.Checked = $true -$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) -$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 -$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" -$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label -$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) -$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMs_with_RDMs_Complete.TabIndex = 53 -$VMs_with_RDMs_Complete.Text = "" -#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$SRM_Protected_VMs_DrawCheckBox.Checked = $true -$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) -$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 -$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" -$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label -$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) -$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) -$SRM_Protected_VMs_Complete.TabIndex = 55 -$SRM_Protected_VMs_Complete.Text = "" -#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_Datastore_DrawCheckBox.Checked = $true -$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) -$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_Datastore_DrawCheckBox.TabIndex = 56 -$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" -$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label -$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) -$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_Datastore_Complete.TabIndex = 57 -$VM_to_Datastore_Complete.Text = "" -#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VM_to_ResourcePool_DrawCheckBox.Checked = $true -$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) -$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 -$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" -$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label -$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) -$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VM_to_ResourcePool_Complete.TabIndex = 59 -$VM_to_ResourcePool_Complete.Text = "" -#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Datastore_to_Host_DrawCheckBox.Checked = $true -$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) -$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$Datastore_to_Host_DrawCheckBox.TabIndex = 60 -$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" -$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label -$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) -$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Datastore_to_Host_Complete.TabIndex = 61 -$Datastore_to_Host_Complete.Text = "" -#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true -$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) -$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) -$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 -$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" -$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label -$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) -$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) -$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 -$PhysicalNIC_to_vSwitch_Complete.Text = "" -#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSS_to_Host_DrawCheckBox.Checked = $true -$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) -$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSS_to_Host_DrawCheckBox.TabIndex = 64 -$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" -$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) -$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSS_to_Host_Complete.TabIndex = 65 -$VSS_to_Host_Complete.Text = "" -#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VSS_DrawCheckBox.Checked = $true -$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) -$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VSS_DrawCheckBox.TabIndex = 66 -$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" -$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) -$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VSS_Complete.TabIndex = 67 -$VMK_to_VSS_Complete.Text = "" -#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) -$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 -$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" -$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) -$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VSSPortGroup_to_VM_Complete.TabIndex = 69 -$VSSPortGroup_to_VM_Complete.Text = "" -#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDS_to_Host_DrawCheckBox.Checked = $true -$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) -$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDS_to_Host_DrawCheckBox.TabIndex = 70 -$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" -$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label -$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) -$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDS_to_Host_Complete.TabIndex = 71 -$VDS_to_Host_Complete.Text = "" -#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VMK_to_VDS_DrawCheckBox.Checked = $true -$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) -$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VMK_to_VDS_DrawCheckBox.TabIndex = 72 -$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" -$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label -$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) -$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VMK_to_VDS_Complete.TabIndex = 73 -$VMK_to_VDS_Complete.Text = "" -#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true -$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) -$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 -$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" -$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label -$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) -$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) -$VDSPortGroup_to_VM_Complete.TabIndex = 75 -$VDSPortGroup_to_VM_Complete.Text = "" -#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox -$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true -$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked -$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) -$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) -$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 -$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" -$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true -#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label -$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) -$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) -$Cluster_to_DRS_Rule_Complete.TabIndex = 77 -$Cluster_to_DRS_Rule_Complete.Text = "" - -$TabDraw.Controls.Add($OpenVisioButton) -$TabDraw.Controls.Add($DrawCheckButton) -$TabDraw.Controls.Add($DrawButton) -$TabDraw.Controls.Add($DrawUncheckButton) -$TabDraw.Controls.Add($VisioOutputLabel) -$TabDraw.Controls.Add($VisioOpenOutputButton) -$TabDraw.Controls.Add($DrawCsvInputLabel) -$TabDraw.Controls.Add($DrawCsvInputButton) -$TabDraw.Controls.Add($vCenterCsvValidation) -$TabDraw.Controls.Add($vCenterCsvValidationCheck) -$TabDraw.Controls.Add($DatacenterCsvValidation) -$TabDraw.Controls.Add($DatacenterCsvValidationCheck) -$TabDraw.Controls.Add($ClusterCsvValidation) -$TabDraw.Controls.Add($ClusterCsvValidationCheck) -$TabDraw.Controls.Add($VmHostCsvValidation) -$TabDraw.Controls.Add($VmHostCsvValidationCheck) -$TabDraw.Controls.Add($VmCsvValidation) -$TabDraw.Controls.Add($VmCsvValidationCheck) -$TabDraw.Controls.Add($TemplateCsvValidation) -$TabDraw.Controls.Add($TemplateCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreClusterCsvValidation) -$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) -$TabDraw.Controls.Add($DatastoreCsvValidation) -$TabDraw.Controls.Add($DatastoreCsvValidationCheck) -$TabDraw.Controls.Add($VsSwitchCsvValidation) -$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VssPortGroupCsvValidation) -$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VssVmkernelCsvValidation) -$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VssPnicCsvValidation) -$TabDraw.Controls.Add($VssPnicCsvValidationCheck) -$TabDraw.Controls.Add($VdSwitchCsvValidation) -$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) -$TabDraw.Controls.Add($VdsPortGroupCsvValidation) -$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) -$TabDraw.Controls.Add($VdsVmkernelCsvValidation) -$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) -$TabDraw.Controls.Add($VdsPnicCsvValidation) -$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) -$TabDraw.Controls.Add($FolderCsvValidation) -$TabDraw.Controls.Add($FolderCsvValidationCheck) -$TabDraw.Controls.Add($RdmCsvValidation) -$TabDraw.Controls.Add($RdmCsvValidationCheck) -$TabDraw.Controls.Add($DrsRuleCsvValidation) -$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) -$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) -$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) -$TabDraw.Controls.Add($ResourcePoolCsvValidation) -$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) -$TabDraw.Controls.Add($CsvValidationButton) -$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Host_Complete) -$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Folder_Complete) -$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) -$TabDraw.Controls.Add($VMs_with_RDMs_Complete) -$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) -$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) -$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_Datastore_Complete) -$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) -$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) -$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($Datastore_to_Host_Complete) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) -$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) -$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VSS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VSS_Complete) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) -$TabDraw.Controls.Add($VDS_to_Host_Complete) -$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) -$TabDraw.Controls.Add($VMK_to_VDS_Complete) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) -$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) -$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) -$SubTab.Controls.Add($TabDirections) -$SubTab.Controls.Add($TabCapture) -$SubTab.Controls.Add($TabDraw) -$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText -$SubTab.SelectedIndex = 0 -$vDiagram.Controls.Add($MainMenu) -$vDiagram.Controls.Add($MainTab) -$vDiagram.Controls.Add($SubTab) -#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$VisioBrowse.Description = "Select a directory" -$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$DrawCsvBrowse.Description = "Select a directory" -$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer -#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog -$CaptureCsvBrowse.Description = "Select a directory" -$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - -#endregion - -#region Custom Code -#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowershellCheck = $PSVersionTable.PSVersion -if ($PowershellCheck.Major -ge 4) -{ - $PowershellInstalled.Forecolor = "Green" - $PowershellInstalled.Text = "Installed Version $PowershellCheck" -} -else -{ - $PowershellInstalled.Forecolor = "Red" - $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" -} -#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) -$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) -if ($PowerCliModuleCheck -ne $null) -{ - $PowerCliModuleInstalled.Forecolor = "Green" - $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" -} -else -{ - $PowerCliModuleInstalled.Forecolor = "Red" - $PowerCliModuleInstalled.Text = "Not Installed" -} -#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerClI Installed" -} -elseif ($PowerCliModuleCheck -ne $null) -{ - $PowerCliInstalled.Forecolor = "Green" - $PowerCliInstalled.Text = "PowerCLI Module Installed" -} -else -{ - $PowerCliInstalled.Forecolor = "Red" - $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" -} -#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) -{ - $VisioInstalled.Forecolor = "Green" - $VisioInstalled.Text = "Installed" -} -else -{ - $VisioInstalled.Forecolor = "Red" - $VisioInstalled.Text = "Visio is Not Installed" -} -#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) -$ConnectButton.Add_Click({ Connect_vCenter_Main }) -#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } -Check_CaptureCsvFolder } ) -#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) -#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) -#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) -#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CaptureButton.Add_Click({ - if($CaptureCsvFolder -eq $null) - { - $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" - } - else - { - if ($vCenterCsvCheckBox.Checked -eq "True") - { - $vCenterCsvValidationComplete.Forecolor = "Blue" - $vCenterCsvValidationComplete.Text = "Processing ....." - vCenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" - $vCenterCsvComplete = Test-Path $vCenterExportFileComplete - if ($vCenterCsvComplete -eq $True) - { - $vCenterCsvValidationComplete.Forecolor = "Green" - $vCenterCsvValidationComplete.Text = "Complete" - } - else - { - $vCenterCsvValidationComplete.Forecolor = "Red" - $vCenterCsvValidationComplete.Text = "Not Complete" - } - } - Connect_vCenter - $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager - if ($Connected -eq $null) { Connect_vCenter_Main } - $ConnectButton.Forecolor = [System.Drawing.Color]::Green - $ConnectButton.Text = "Connected to $DefaultViserver" - if ($DatacenterCsvCheckBox.Checked -eq "True") - { - $DatacenterCsvValidationComplete.Forecolor = "Blue" - $DatacenterCsvValidationComplete.Text = "Processing ....." - Datacenter_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" - $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete - if ($DatacenterCsvComplete -eq $True) - { - $DatacenterCsvValidationComplete.Forecolor = "Green" - $DatacenterCsvValidationComplete.Text = "Complete" - } - else - { - $DatacenterCsvValidationComplete.Forecolor = "Red" - $DatacenterCsvValidationComplete.Text = "Not Complete" - } - } - if ($ClusterCsvCheckBox.Checked -eq "True") - { - $ClusterCsvValidationComplete.Forecolor = "Blue" - $ClusterCsvValidationComplete.Text = "Processing ....." - Cluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" - $ClusterCsvComplete = Test-Path $ClusterExportFileComplete - if ($ClusterCsvComplete -eq $True) - { - $ClusterCsvValidationComplete.Forecolor = "Green" - $ClusterCsvValidationComplete.Text = "Complete" - } - else - { - $ClusterCsvValidationComplete.Forecolor = "Red" - $ClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmHostCsvCheckBox.Checked -eq "True") - { - $VmHostCsvValidationComplete.Forecolor = "Blue" - $VmHostCsvValidationComplete.Text = "Processing ....." - VmHost_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" - $VmHostCsvComplete = Test-Path $VmHostExportFileComplete - if ($VmHostCsvComplete -eq $True) - { - $VmHostCsvValidationComplete.Forecolor = "Green" - $VmHostCsvValidationComplete.Text = "Complete" - } - else - { - $VmHostCsvValidationComplete.Forecolor = "Red" - $VmHostCsvValidationComplete.Text = "Not Complete" - } - } - if ($VmCsvCheckBox.Checked -eq "True") - { - $VmCsvValidationComplete.Forecolor = "Blue" - $VmCsvValidationComplete.Text = "Processing ....." - Vm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" - $VmCsvComplete = Test-Path $VmExportFileComplete - if ($VmCsvComplete -eq $True) - { - $VmCsvValidationComplete.Forecolor = "Green" - $VmCsvValidationComplete.Text = "Complete" - } - else - { - $VmCsvValidationComplete.Forecolor = "Red" - $VmCsvValidationComplete.Text = "Not Complete" - } - } - if ($TemplateCsvCheckBox.Checked -eq "True") - { - $TemplateCsvValidationComplete.Forecolor = "Blue" - $TemplateCsvValidationComplete.Text = "Processing ....." - Template_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" - $TemplateCsvComplete = Test-Path $TemplateExportFileComplete - if ($TemplateCsvComplete -eq $True) - { - $TemplateCsvValidationComplete.Forecolor = "Green" - $TemplateCsvValidationComplete.Text = "Complete" - } - else - { - $TemplateCsvValidationComplete.Forecolor = "Red" - $TemplateCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreClusterCsvCheckBox.Checked -eq "True") - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" - $DatastoreClusterCsvValidationComplete.Text = "Processing ....." - DatastoreCluster_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete - if ($DatastoreClusterCsvComplete -eq $True) - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Green" - $DatastoreClusterCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreClusterCsvValidationComplete.Forecolor = "Red" - $DatastoreClusterCsvValidationComplete.Text = "Not Complete" - } - } - if ($DatastoreCsvCheckBox.Checked -eq "True") - { - $DatastoreCsvValidationComplete.Forecolor = "Blue" - $DatastoreCsvValidationComplete.Text = "Processing ....." - Datastore_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" - $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete - if ($DatastoreCsvComplete -eq $True) - { - $DatastoreCsvValidationComplete.Forecolor = "Green" - $DatastoreCsvValidationComplete.Text = "Complete" - } - else - { - $DatastoreCsvValidationComplete.Forecolor = "Red" - $DatastoreCsvValidationComplete.Text = "Not Complete" - } - } - if ($VsSwitchCsvCheckBox.Checked -eq "True") - { - $VsSwitchCsvValidationComplete.Forecolor = "Blue" - $VsSwitchCsvValidationComplete.Text = "Processing ....." - VsSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" - $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete - if ($vSSwitchCsvComplete -eq $True) - { - $vSSwitchCsvValidationComplete.Forecolor = "Green" - $vSSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $vSSwitchCsvValidationComplete.Forecolor = "Red" - $vSSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPortGroupCsvCheckBox.Checked -eq "True") - { - $VssPortGroupCsvValidationComplete.Forecolor = "Blue" - $VssPortGroupCsvValidationComplete.Text = "Processing ....." - VssPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete - if ($VssPortGroupCsvComplete -eq $True) - { - $VssPortGroupCsvValidationComplete.Forecolor = "Green" - $VssPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VssPortGroupCsvValidationComplete.Forecolor = "Red" - $VssPortGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssVmkernelCsvCheckBox.Checked -eq "True") - { - $VssVmkernelCsvValidationComplete.Forecolor = "Blue" - $VssVmkernelCsvValidationComplete.Text = "Processing ....." - VssVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete - if ($VssVmkernelCsvComplete -eq $True) - { - $VssVmkernelCsvValidationComplete.Forecolor = "Green" - $VssVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VssVmkernelCsvValidationComplete.Forecolor = "Red" - $VssVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VssPnicCsvCheckBox.Checked -eq "True") - { - $VssPnicCsvValidationComplete.Forecolor = "Blue" - $VssPnicCsvValidationComplete.Text = "Processing ....." - VssPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" - $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete - if ($VssPnicCsvComplete -eq $True) - { - $VssPnicCsvValidationComplete.Forecolor = "Green" - $VssPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VssPnicCsvValidationComplete.Forecolor = "Red" - $VssPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdSwitchCsvCheckBox.Checked -eq "True") - { - $VdSwitchCsvValidationComplete.Forecolor = "Blue" - $VdSwitchCsvValidationComplete.Text = "Processing ....." - VdSwitch_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" - $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete - if ($VdSwitchCsvComplete -eq $True) - { - $VdSwitchCsvValidationComplete.Forecolor = "Green" - $VdSwitchCsvValidationComplete.Text = "Complete" - } - else - { - $VdSwitchCsvValidationComplete.Forecolor = "Red" - $VdSwitchCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPortGroupCsvCheckBox.Checked -eq "True") - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" - $VdsPortGroupCsvValidationComplete.Text = "Processing ....." - VdsPort_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete - if ($VdsPortGroupCsvComplete -eq $True) - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Green" - $VdsPortGroupCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPortGroupCsvValidationComplete.Forecolor = "Red" - $VdsPortGroupCsvValidationComplete.Text = "Not Complete" - - } - } - if ($VdsVmkernelCsvCheckBox.Checked -eq "True") - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" - $VdsVmkernelCsvValidationComplete.Text = "Processing ....." - VdsVmk_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete - if ($VdsVmkernelCsvComplete -eq $True) - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Green" - $VdsVmkernelCsvValidationComplete.Text = "Complete" - } - else - { - $VdsVmkernelCsvValidationComplete.Forecolor = "Red" - $VdsVmkernelCsvValidationComplete.Text = "Not Complete" - } - } - if ($VdsPnicCsvCheckBox.Checked -eq "True") - { - $VdsPnicCsvValidationComplete.Forecolor = "Blue" - $VdsPnicCsvValidationComplete.Text = "Processing ....." - VdsPnic_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" - $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete - if ($VdsPnicCsvComplete -eq $True) - { - $VdsPnicCsvValidationComplete.Forecolor = "Green" - $VdsPnicCsvValidationComplete.Text = "Complete" - } - else - { - $VdsPnicCsvValidationComplete.Forecolor = "Red" - $VdsPnicCsvValidationComplete.Text = "Not Complete" - } - } - if ($FolderCsvCheckBox.Checked -eq "True") - { - $FolderCsvValidationComplete.Forecolor = "Blue" - $FolderCsvValidationComplete.Text = "Processing ....." - Folder_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" - $FolderCsvComplete = Test-Path $FolderExportFileComplete - if ($FolderCsvComplete -eq $True) - { - $FolderCsvValidationComplete.Forecolor = "Green" - $FolderCsvValidationComplete.Text = "Complete" - } - else - { - $FolderCsvValidationComplete.Forecolor = "Red" - $FolderCsvValidationComplete.Text = "Not Complete" - } - } - if ($RdmCsvCheckBox.Checked -eq "True") - { - $RdmCsvValidationComplete.Forecolor = "Blue" - $RdmCsvValidationComplete.Text = "Processing ....." - Rdm_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" - $RdmCsvComplete = Test-Path $RdmExportFileComplete - if ($RdmCsvComplete -eq $True) - { - $RdmCsvValidationComplete.Forecolor = "Green" - $RdmCsvValidationComplete.Text = "Complete" - } - else - { - $RdmCsvValidationComplete.Forecolor = "Red" - $RdmCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsRuleCsvCheckBox.Checked -eq "True") - { - $DrsRuleCsvValidationComplete.Forecolor = "Blue" - $DrsRuleCsvValidationComplete.Text = "Processing ....." - Drs_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" - $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete - if ($DrsRuleCsvComplete -eq $True) - { - $DrsRuleCsvValidationComplete.Forecolor = "Green" - $DrsRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsRuleCsvValidationComplete.Forecolor = "Red" - $DrsRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" - $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." - Drs_Cluster_Group_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete - if ($DrsClusterGroupCsvComplete -eq $True) - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" - $DrsClusterGroupCsvValidationComplete.Text = "Complete" - } - else - { - $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" - $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" - } - } - if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" - $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." - Drs_VmHost_Rule_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete - if ($DrsVmHostRuleCsvComplete -eq $True) - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" - $DrsVmHostRuleCsvValidationComplete.Text = "Complete" - } - else - { - $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" - $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" - } - } - if ($ResourcePoolCsvCheckBox.Checked -eq "True") - { - $ResourcePoolCsvValidationComplete.Forecolor = "Blue" - $ResourcePoolCsvValidationComplete.Text = "Processing ....." - Resource_Pool_Export - $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete - if ($ResourcePoolCsvComplete -eq $True) - { - $ResourcePoolCsvValidationComplete.Forecolor = "Green" - $ResourcePoolCsvValidationComplete.Text = "Complete" - } - else - { - $ResourcePoolCsvValidationComplete.Forecolor = "Red" - $ResourcePoolCsvValidationComplete.Text = "Not Complete" - } - } - Disconnect_vCenter - $ConnectButton.Forecolor = [System.Drawing.Color]::Red - $ConnectButton.Text = "Disconnected" - $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" - } -}) -#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) -$TabDraw.Controls.Add($DrawCsvInputButton) -#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$CsvValidationButton.Add_Click( -{ - $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text - $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" - $vCenterCsvExists = Test-Path $vCenterExportFile - $TabDraw.Controls.Add($vCenterCsvValidationCheck) - if ($vCenterCsvExists -eq $True) - { - - $vCenterCsvValidationCheck.Forecolor = "Green" - $vCenterCsvValidationCheck.Text = "Present" - } - else - { - $vCenterCsvValidationCheck.Forecolor = "Red" - $vCenterCsvValidationCheck.Text = "Not Present" - } - - $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" - $DatacenterCsvExists = Test-Path $DatacenterExportFile - $TabDraw.Controls.Add($DatacenterCsvValidationCheck) - - if ($DatacenterCsvExists -eq $True) - { - $DatacenterCsvValidationCheck.Forecolor = "Green" - $DatacenterCsvValidationCheck.Text = "Present" - } - else - { - $DatacenterCsvValidationCheck.Forecolor = "Red" - $DatacenterCsvValidationCheck.Text = "Not Present" - } - - $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" - $ClusterCsvExists = Test-Path $ClusterExportFile - $TabDraw.Controls.Add($ClusterCsvValidationCheck) - - if ($ClusterCsvExists -eq $True) - { - $ClusterCsvValidationCheck.Forecolor = "Green" - $ClusterCsvValidationCheck.Text = "Present" - } - else - { - $ClusterCsvValidationCheck.Forecolor = "Red" - $ClusterCsvValidationCheck.Text = "Not Present" - } - - $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" - $VmHostCsvExists = Test-Path $VmHostExportFile - $TabDraw.Controls.Add($VmHostCsvValidationCheck) - - if ($VmHostCsvExists -eq $True) - { - $VmHostCsvValidationCheck.Forecolor = "Green" - $VmHostCsvValidationCheck.Text = "Present" - } - else - { - $VmHostCsvValidationCheck.Forecolor = "Red" - $VmHostCsvValidationCheck.Text = "Not Present" - } - - $VmExportFile = $CsvInputDir + "-VmExport.csv" - $VmCsvExists = Test-Path $VmExportFile - $TabDraw.Controls.Add($VmCsvValidationCheck) - - if ($VmCsvExists -eq $True) - { - $VmCsvValidationCheck.Forecolor = "Green" - $VmCsvValidationCheck.Text = "Present" - } - else - { - $VmCsvValidationCheck.Forecolor = "Red" - $VmCsvValidationCheck.Text = "Not Present" - } - - $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" - $TemplateCsvExists = Test-Path $TemplateExportFile - $TabDraw.Controls.Add($TemplateCsvValidationCheck) - - if ($TemplateCsvExists -eq $True) - { - $TemplateCsvValidationCheck.Forecolor = "Green" - $TemplateCsvValidationCheck.Text = "Present" - } - else - { - $TemplateCsvValidationCheck.Forecolor = "Red" - $TemplateCsvValidationCheck.Text = "Not Present" - } - - $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" - $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile - $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) - - if ($DatastoreClusterCsvExists -eq $True) - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Green" - $DatastoreClusterCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreClusterCsvValidationCheck.Forecolor = "Red" - $DatastoreClusterCsvValidationCheck.Text = "Not Present" - } - - $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" - $DatastoreCsvExists = Test-Path $DatastoreExportFile - $TabDraw.Controls.Add($DatastoreCsvValidationCheck) - - if ($DatastoreCsvExists -eq $True) - { - $DatastoreCsvValidationCheck.Forecolor = "Green" - $DatastoreCsvValidationCheck.Text = "Present" - } - else - { - $DatastoreCsvValidationCheck.Forecolor = "Red" - $DatastoreCsvValidationCheck.Text = "Not Present" - } - - $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" - $VsSwitchCsvExists = Test-Path $VsSwitchExportFile - $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) - - if ($VsSwitchCsvExists -eq $True) - { - $VsSwitchCsvValidationCheck.Forecolor = "Green" - $VsSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VsSwitchCsvValidationCheck.Forecolor = "Red" - $VsSwitchCsvValidationCheck.Text = "Not Present" - $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" - $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile - $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) - - if ($VssPortGroupCsvExists -eq $True) - { - $VssPortGroupCsvValidationCheck.Forecolor = "Green" - $VssPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VssPortGroupCsvValidationCheck.Forecolor = "Red" - $VssPortGroupCsvValidationCheck.Text = "Not Present" - $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" - $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile - $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) - - if ($VssVmkernelCsvExists -eq $True) - { - $VssVmkernelCsvValidationCheck.Forecolor = "Green" - $VssVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VssVmkernelCsvValidationCheck.Forecolor = "Red" - $VssVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" - } - - $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" - $VssPnicCsvExists = Test-Path $VssPnicExportFile - $TabDraw.Controls.Add($VssPnicCsvValidationCheck) - - if ($VssPnicCsvExists -eq $True) - { - $VssPnicCsvValidationCheck.Forecolor = "Green" - $VssPnicCsvValidationCheck.Text = "Present" - } - else - { - $VssPnicCsvValidationCheck.Forecolor = "Red" - $VssPnicCsvValidationCheck.Text = "Not Present" - } - - $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" - $VdSwitchCsvExists = Test-Path $VdSwitchExportFile - $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) - - if ($VdSwitchCsvExists -eq $True) - { - $VdSwitchCsvValidationCheck.Forecolor = "Green" - $VdSwitchCsvValidationCheck.Text = "Present" - } - else - { - $VdSwitchCsvValidationCheck.Forecolor = "Red" - $VdSwitchCsvValidationCheck.Text = "Not Present" - $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" - $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile - $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) - - if ($VdsPortGroupCsvExists -eq $True) - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Green" - $VdsPortGroupCsvValidationCheck.Text = "Present" - } - else - { - $VdsPortGroupCsvValidationCheck.Forecolor = "Red" - $VdsPortGroupCsvValidationCheck.Text = "Not Present" - $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" - $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile - $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) - - if ($VdsVmkernelCsvExists -eq $True) - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Green" - $VdsVmkernelCsvValidationCheck.Text = "Present" - } - else - { - $VdsVmkernelCsvValidationCheck.Forecolor = "Red" - $VdsVmkernelCsvValidationCheck.Text = "Not Present" - $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" - } - - $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" - $VdsPnicCsvExists = Test-Path $VdsPnicExportFile - $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) - - if ($VdsPnicCsvExists -eq $True) - { - $VdsPnicCsvValidationCheck.Forecolor = "Green" - $VdsPnicCsvValidationCheck.Text = "Present" - } - else - { - $VdsPnicCsvValidationCheck.Forecolor = "Red" - $VdsPnicCsvValidationCheck.Text = "Not Present" - } - - $FolderExportFile = $CsvInputDir + "-FolderExport.csv" - $FolderCsvExists = Test-Path $FolderExportFile - $TabDraw.Controls.Add($FolderCsvValidationCheck) - - if ($FolderCsvExists -eq $True) - { - $FolderCsvValidationCheck.Forecolor = "Green" - $FolderCsvValidationCheck.Text = "Present" - } - else - { - $FolderCsvValidationCheck.Forecolor = "Red" - $FolderCsvValidationCheck.Text = "Not Present" - } - - $RdmExportFile = $CsvInputDir + "-RdmExport.csv" - $RdmCsvExists = Test-Path $RdmExportFile - $TabDraw.Controls.Add($RdmCsvValidationCheck) - - if ($RdmCsvExists -eq $True) - { - $RdmCsvValidationCheck.Forecolor = "Green" - $RdmCsvValidationCheck.Text = "Present" - } - else - { - $RdmCsvValidationCheck.Forecolor = "Red" - $RdmCsvValidationCheck.Text = "Not Present" - $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" - $DrsRuleCsvExists = Test-Path $DrsRuleExportFile - $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) - - if ($DrsRuleCsvExists -eq $True) - { - $DrsRuleCsvValidationCheck.Forecolor = "Green" - $DrsRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsRuleCsvValidationCheck.Forecolor = "Red" - $DrsRuleCsvValidationCheck.Text = "Not Present" - $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" - } - - $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" - $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile - $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) - - if ($DrsClusterGroupCsvExists -eq $True) - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" - $DrsClusterGroupCsvValidationCheck.Text = "Present" - } - else - { - $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" - $DrsClusterGroupCsvValidationCheck.Text = "Not Present" - } - - $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" - $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile - $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) - - if ($DrsVmHostRuleCsvExists -eq $True) - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" - $DrsVmHostRuleCsvValidationCheck.Text = "Present" - } - else - { - $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" - $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" - } - - $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" - $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile - $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) - - if ($ResourcePoolCsvExists -eq $True) - { - $ResourcePoolCsvValidationCheck.Forecolor = "Green" - $ResourcePoolCsvValidationCheck.Text = "Present" - } - else - { - $ResourcePoolCsvValidationCheck.Forecolor = "Red" - $ResourcePoolCsvValidationCheck.Text = "Not Present" - $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" - } -} ) -$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) -$TabDraw.Controls.Add($CsvValidationButton) -#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) -$TabDraw.Controls.Add($VisioOpenOutputButton) -#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) -$TabDraw.Controls.Add($DrawUncheckButton) -#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) -$TabDraw.Controls.Add($DrawCheckButton) -#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; -if ($VM_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Host_Complete.Forecolor = "Blue" - $VM_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Host_Complete) - VM_to_Host - $VM_to_Host_Complete.Forecolor = "Green" - $VM_to_Host_Complete.Text = "Complete" - $TabDraw.Controls.Add($VM_to_Host_Complete) -} -if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Folder_Complete.Forecolor = "Blue" - $VM_to_Folder_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Folder_Complete) - VM_to_Folder - $VM_to_Folder_Complete.Forecolor = "Green" - $VM_to_Folder_Complete.Text = "Complete" -} -if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") -{ - $VMs_with_RDMs_Complete.Forecolor = "Blue" - $VMs_with_RDMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMs_with_RDMs_Complete) - VMs_with_RDMs - $VMs_with_RDMs_Complete.Forecolor = "Green" - $VMs_with_RDMs_Complete.Text = "Complete" -} -if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") -{ - $SRM_Protected_VMs_Complete.Forecolor = "Blue" - $SRM_Protected_VMs_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) - SRM_Protected_VMs - $SRM_Protected_VMs_Complete.Forecolor = "Green" - $SRM_Protected_VMs_Complete.Text = "Complete" -} -if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") -{ - $VM_to_Datastore_Complete.Forecolor = "Blue" - $VM_to_Datastore_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_Datastore_Complete) - VM_to_Datastore - $VM_to_Datastore_Complete.Forecolor = "Green" - $VM_to_Datastore_Complete.Text = "Complete" -} -if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") -{ - $VM_to_ResourcePool_Complete.Forecolor = "Blue" - $VM_to_ResourcePool_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) - VM_to_ResourcePool - $VM_to_ResourcePool_Complete.Forecolor = "Green" - $VM_to_ResourcePool_Complete.Text = "Complete" -} -if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") -{ - $Datastore_to_Host_Complete.Forecolor = "Blue" - $Datastore_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Datastore_to_Host_Complete) - Datastore_to_Host - $Datastore_to_Host_Complete.Forecolor = "Green" - $Datastore_to_Host_Complete.Text = "Complete" -} -if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") -{ - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" - $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) - PhysicalNIC_to_vSwitch - $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" - $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" -} -if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VSS_to_Host_Complete.Forecolor = "Blue" - $VSS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSS_to_Host_Complete) - VSS_to_Host - $VSS_to_Host_Complete.Forecolor = "Green" - $VSS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VSS_Complete.Forecolor = "Blue" - $VMK_to_VSS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VSS_Complete) - VMK_to_VSS - $VMK_to_VSS_Complete.Forecolor = "Green" - $VMK_to_VSS_Complete.Text = "Complete" -} -if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VSSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) - VSSPortGroup_to_VM - $VSSPortGroup_to_VM_Complete.Forecolor = "Green" - $VSSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") -{ - $VDS_to_Host_Complete.Forecolor = "Blue" - $VDS_to_Host_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDS_to_Host_Complete) - VDS_to_Host - $VDS_to_Host_Complete.Forecolor = "Green" - $VDS_to_Host_Complete.Text = "Complete" -} -if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") -{ - $VMK_to_VDS_Complete.Forecolor = "Blue" - $VMK_to_VDS_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VMK_to_VDS_Complete) - VMK_to_VDS - $VMK_to_VDS_Complete.Forecolor = "Green" - $VMK_to_VDS_Complete.Text = "Complete" -} -if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") -{ - $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" - $VDSPortGroup_to_VM_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) - VDSPortGroup_to_VM - $VDSPortGroup_to_VM_Complete.Forecolor = "Green" - $VDSPortGroup_to_VM_Complete.Text = "Complete" -} -if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") -{ - $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" - $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." - $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) - Cluster_to_DRS_Rule - $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" - $Cluster_to_DRS_Rule_Complete.Text = "Complete" -}; -$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) -$TabDraw.Controls.Add($DrawButton) -#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -$OpenVisioButton.Add_Click({Open_Final_Visio}) -$TabDraw.Controls.Add($OpenVisioButton) - -#endregion - -#region Event Loop - -function Main{ - [System.Windows.Forms.Application]::EnableVisualStyles() - [System.Windows.Forms.Application]::Run($vDiagram) -} - -#endregion - -#endregion - -#region Event Handlers - -#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect_vCenter_Main -{ - $MainVC = $MainVcenterTextBox.Text - $MainUser = $UserNameTextBox.Text - $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text -} - -function Connect_vCenter -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $User = $UserNameTextBox.Text - $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text -} - -function Disconnect_vCenter -{ - $Disconnect = Disconnect-ViServer * -Confirm:$false -} -#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Find_CaptureCsvFolder -{ - $CaptureCsvBrowseLoop = $True - while ($CaptureCsvBrowseLoop) - { - if ($CaptureCsvBrowse.ShowDialog() -eq "OK") - { - $CaptureCsvBrowseLoop = $False - } - else - { - $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($CaptureCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath -} - -function Check_CaptureCsvFolder -{ - $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text - $CheckContentDir = $CheckContentPath + "*.csv" - $CheckContent = Test-Path $CheckContentDir - if ($CheckContent -eq "True") - { - $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") - switch ($CheckContents_CaptureCsvFolder) { - 'Yes' - { - del $CheckContentDir - } - - 'No' - { - $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog - $CheckContentCsvBrowse.Description = "Select a directory to copy files to" - $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer - $CheckContentCsvBrowse.ShowDialog() - $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath - copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder - del $CheckContentDir - } - } - } -} - -function Find_DrawCsvFolder -{ - $DrawCsvBrowseLoop = $True - while ($DrawCsvBrowseLoop) - { - if ($DrawCsvBrowse.ShowDialog() -eq "OK") - { - $DrawCsvBrowseLoop = $False - } - else - { - $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if ($DrawCsvBrowseRes -eq "Cancel") - { - return - } - } - } - $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath -} - -function Find_DrawVisioFolder -{ - $VisioBrowseLoop = $True - while($VisioBrowseLoop) - { - if ($VisioBrowse.ShowDialog() -eq "OK") - { - $VisioBrowseLoop = $False - } - else - { - $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) - if($VisioBrowseRes -eq "Cancel") - { - return - } - } - } - $global:VisioFolder = $VisioBrowse.SelectedPath -} -#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function vCenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, - @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation - - if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) - { - $null - } - else - { - Disconnect_vCenter - } -} - -function Datacenter_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort-Object Name | - Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation -} - -function Cluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, - @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, - @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, - @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, - @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, - @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, - @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, - @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, - @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, - @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, - @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation -} - -function VmHost_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent - while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent - } - if ($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name } } }, - @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent - while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent - } - if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, - @{ N = "Version" ; E = { $_.Config.Product.Version } }, - @{ N = "Build" ; E = { $_.Config.Product.Build } }, - @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, - @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, - @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, - @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, - @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, - @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, - @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, - @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, - @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, - @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, - @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, - @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation -} - -function Vm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select-Object Name , - @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, - @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, - @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, - @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, - @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, - @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, - @{ N = "OS" ; E = { $_.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.Config.Version } }, - @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, - @{ N = 'Folder' ; E = { $Folder.Name } }, - @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, - @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, - @{ N = "IP" ; E = { $_.Guest.IpAddress } }, - @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, - @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, - @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, - @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation - } -} - -function Template_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - foreach ($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { $VmHost.name } }, - @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, - @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, - @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, - @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, - @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, - @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, - @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, - @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, - @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, - @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, - @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, - @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, - @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, - @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, - @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, - @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation - } -} - -function DatastoreCluster_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, - @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, - @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, - @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation -} - -function Datastore_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, - @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, - @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, - @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, - @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, - @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, - @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, - @{ N = "Accessible" ; E = { $_.State } }, - @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation -} - -function VsSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "Nic" ; E = { $_.Nic } }, - @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, - @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, - @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, - @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, - @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation -} - -function VssPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "VLanId" ; E = { $_.VLanId } }, - @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, - @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VssVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation - } - } - } -} - -function VssPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - foreach ($VMHost in Get-VMHost) - { - foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, - @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, - @{ N = "VmHost" ; E = { $_.VmHost } }, - @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, - @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation - } - } -} - -function VdSwitch_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - foreach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $_.Datacenter } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "Vendor" ; E = { $_.Vendor } }, - @{ N = "Version" ; E = { $_.Version } }, - @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, - @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation - } -} - -function VdsPort_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, - @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, - @{ N = "NumPorts" ; E = { $_.NumPorts } }, - @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, - @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, - @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, - @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, - @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, - @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation - } - } -} - -function VdsVmk_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, - @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, - @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, - @{ N = "IP" ; E = { $_.IP } }, - @{ N = "Mac" ; E = { $_.Mac } }, - @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, - @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, - @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, - @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, - @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation - - } - } -} - -function VdsPnic_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - foreach ($VmHost in Get-VmHost) - { - foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | - Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, - @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, - @{ N = "VmHost" ; E = { $VMHost.Name } }, - @{ N = "VdSwitch" ; E = { $VdSwitch } }, - @{ N = "Portgroup" ; E = { $_.Portgroup } }, - @{ N = "ConnectedEntity" ; E = { $_.Name } }, - @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation - } - } -} - -function Folder_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - foreach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -type VM | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation - } -} - -function Rdm_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | - Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, - @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, - @{ N = "Vm" ; E = { $_.Parent } }, - @{ N = "Label" ; E = { $_.Name } }, - @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, - @{ N = "DiskType" ; E = { $_.DiskType } }, - @{ N = "Persistence" ; E = { $_.Persistence } }, - @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, - @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, - @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation -} - -function Drs_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation - } -} - -function Drs_Cluster_Group_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - foreach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "GroupType" ; E = { $_.GroupType } }, - @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation - } -} - -function Drs_VmHost_Rule_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) - { - Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, - @{ N = "Cluster" ; E = { $_.Cluster } }, - @{ N = "Enabled" ; E = { $_.Enabled } }, - @{ N = "Type" ; E = { $_.Type } }, - @{ N = "VMGroup" ; E = { $_.VMGroup } }, - @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, - @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, - @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation - } - } -} - -function Resource_Pool_Export -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $CaptureCsvFolder - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - foreach ($Cluster in Get-Cluster) - { - foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) - { - Get-ResourcePool $ResourcePool | Sort-Object Name | - Select-Object @{ N = "Name" ; E = { $_.Name } }, - @{ N = "Cluster" ; E = { $Cluster.Name } }, - @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, - @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, - @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, - @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, - @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, - @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, - @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, - @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, - @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, - @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation - } - } -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Connect-VisioObject($firstObj, $secondObj) -{ - $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) - $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) - $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) -} - -function Add-VisioObjectVC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectCluster($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHost($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectTemplate($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectSRM($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDatastore($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectHardDisk($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.ScsiCanonicalName - return $shpObj -} - -function Add-VisioObjectFolder($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVsSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVssPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVMK($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdSwitch($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPG($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectVdsPNIC($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDrsClusterGroup($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectDRSVMHostRule($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -function Add-VisioObjectResourcePool($mastObj, $item) -{ - $shpObj = $pagObj.Drop($mastObj, $x, $y) - $shpObj.Text = $item.name - return $shpObj -} - -#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -function Create_Visio_Base -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $DocObj = $docsObj.Add("") - $DocObj.SaveAs($Savefile) - $AppVisio.Quit() -} - -function VM_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Host" - $Page = $DocsObj.Pages('VM to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Folder -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Folder - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - $FolderImport = Import-Csv $FolderExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Folder" - $Page = $DocsObj.Pages('VM to Folder') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Folder') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Folder Object - $FolderObj = $stnObj.Masters.Item("Folder") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $FolderObject = Add-VisioObjectFolder $FolderObj $Folder - $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' - Connect-VisioObject $DatacenterObject $FolderObject - $y += 1.50 - - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $FolderObject $TemplateObject - $FolderObject = $TemplateObject - } - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $FolderObject $VMObject - $FolderObject = $VMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMs_with_RDMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - # RDM's - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - $RdmImport = Import-Csv $RdmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" - $Page = $DocsObj.Pages('VM w/ RDMs') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM w/ RDMs') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # RDM Object - $RDMObj = $stnObj.Masters.Item("RDM") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ClusterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 3.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) - { - $x = 6.00 - $y += 1.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatacenterObject $VMObject - $y += 1.50 - - foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) - { - $x += 2.50 - $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk - # ScsiCanonicalName - $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' - # CapacityGB - $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' - # DiskType - $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' - # CompatibilityMode - $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' - # DeviceName - $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' - # Sharing - $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' - # HardDisk - $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' - #Persistence - $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' - Connect-VisioObject $VMObject $RDMObject - $VMObject = $RDMObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function SRM_Protected_VMs -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "SRM VM" - $Page = $DocsObj.Pages('SRM VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('SRM VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # SRM Protected VM Object - $SRMObj = $stnObj.Masters.Item("SRM Protected Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) - { - $x += 2.50 - $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM - # Name - $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' - # OS - $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' - # Version - $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' - # Folder - $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' - # NumCPU - $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' - # CoresPerSocket - $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' - # MemoryGB - $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' - Connect-VisioObject $HostObject $SrmObject - $HostObject = $SrmObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_Datastore -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Datastore" - $Page = $DocsObj.Pages('VM to Datastore') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Datastore') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $ClusterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $ClusterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster - # Name - $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' - # SdrsAutomationLevel - $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' - # IOLoadBalanceEnabled - $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' - # CapacityGB - $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreClusObject - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatastoreClusObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $HostObject $VMObject - $HostObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $HostObject $TemplateObject - $HostObject = $TemplateObject - } - } - } - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) - { - $x = 8.00 - $y += 1.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $DatacenterObject $DatastoreObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $DatastoreObject $VMObject - $DatastoreObject = $VMObject - } - foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) - { - $x += 2.50 - $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template - # Name - $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' - # OS - $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' - # Version - $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' - # ToolsVersion - $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' - # ToolsVersionStatus - $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' - # ToolsStatus - $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' - # ToolsRunningStatus - $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' - # NumCPU - $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' - # NumCoresPerSocket - $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' - # MemoryGB - $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' - # MacAddress - $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' - # NumEthernetCards - $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' - # NumVirtualDisks - $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' - # CpuReservation - $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' - # MemoryReservation - $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' - Connect-VisioObject $DatastoreObject $TemplateObject - $DatastoreObject = $TemplateObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VM_to_ResourcePool -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # ResourcePool - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - $ResourcePoolImport = Import-Csv $ResourcePoolExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" - $Page = $DocsObj.Pages('VM to Resource Pool') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VM to Resource Pool') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - # Resource Pool Object - $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool - # Name - $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' - # Cluster - $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' - # CpuSharesLevel - $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' - # NumCpuShares - $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' - # CpuReservationMHz - $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' - # CpuExpandableReservation - $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' - # CpuLimitMHz - $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' - # MemSharesLevel - $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' - # NumMemShares - $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' - # MemReservationGB - $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' - # MemExpandableReservation - $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' - # MemLimitGB - $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' - Connect-VisioObject $ClusterObject $ResourcePoolObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Linux") -eq $True) - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $ResourcePoolObject $VMObject - $ResourcePoolObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Datastore_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Datastore Cluster - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile - # Datastore - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - $DatastoreImport = Import-Csv $DatastoreExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Datastore to Host" - $Page = $DocsObj.Pages('Datastore to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Datastore to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # Datastore Cluster Object - $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") - # Datastore Object - $DatastoreObj = $stnObj.Masters.Item("Datastore") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - $y += 1.50 - - foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x += 2.50 - $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore - # Name - $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' - # Type - $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' - # FileSystemVersion - $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' - # DiskName - $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' - # StorageIOControlEnabled - $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' - # CapacityGB - $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' - # FreeSpaceGB - $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' - Connect-VisioObject $HostObject $DatastoreObject - $HostObject = $DatastoreObject - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function PhysicalNIC_to_vSwitch -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "PNIC to switch" - $Page = $DocsObj.Pages('PNIC to Switch') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('PNIC to Switch') - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - $y += 1.50 - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VSSObject - - foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) - { - $x += 2.50 - $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic - # Name - $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' - # ConnectedEntity - $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' - # VlanConfiguration - $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' - Connect-VisioObject $VSSObject $VssPNICObject - $VSSObject = $VssPNICObject - } - } - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic - # Name - $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' - # ConnectedEntity - $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' - # VlanConfiguration - $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' - Connect-VisioObject $VdSwitchObject $VdsPNICObject - $VdSwitchObject = $VdsPNICObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSS to Host" - $Page = $DocsObj.Pages('VSS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 2.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $VssObject = $VssNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VSS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VSS" - $Page = $DocsObj.Pages('VMK to VSS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VSS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - $y += 1.50 - - foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' - Connect-VisioObject $VssObject $VmkNicObject - $VssObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VSSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vss Switch - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - $VsSwitchImport = Import-Csv $VsSwitchExportFile - # Vss Port Group - $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - $VssPortImport = Import-Csv $VssPortExportFile - # Vss VMKernel - $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - $VssVmkImport = Import-Csv $VssVmkExportFile - # Vss Pnic - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - $VssPnicImport = Import-Csv $VssPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" - $Page = $DocsObj.Pages('VSSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VSSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VSS Object - $VSSObj = $stnObj.Masters.Item("VSS") - # VSS PNIC Object - $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") - # VSSNIC Object - $VssNicObj = $stnObj.Masters.Item("VSS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch - # Name - $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' - # NIC - $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' - # NumPorts - $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' - # SecurityAllowPromiscuous - $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' - # SecurityMacChanges - $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' - # SecurityForgedTransmits - $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' - # NicTeamingPolicy - $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' - # NicTeamingReversePolicy - $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' - # NicTeamingNotifySwitches - $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' - # NicTeamingRollingOrder - $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' - # NicTeamingNicOrderActiveNic - $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' - # NicTeamingNicOrderStandbyNic - $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' - Connect-VisioObject $HostObject $VssObject - - foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) - { - $x = 10.00 - $y += 1.50 - $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort - # Name - $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' - # VLanId - $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' - # ActiveNic - $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' - # StandbyNic - $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' - Connect-VisioObject $VssObject $VssNicObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VssNicObject $VMObject - $VssNicObject = $VMObject - } - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDS_to_Host -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDS to Host" - $Page = $DocsObj.Pages('VDS to Host') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDS to Host') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 2.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $VdSwitchObject = $VPGObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VMK_to_VDS -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VMK to VDS" - $Page = $DocsObj.Pages('VMK to VDS') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VMK to VDS') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VMK NIC Object - $VmkNicObj = $stnObj.Masters.Item("VMKernel") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $ClusterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) - { - $x = 6.00 - $y += 1.50 - $HostObject = Add-VisioObjectHost $HostObj $VMHost - # Name - $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' - # Version - $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' - # Build - $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' - # Manufacturer - $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' - # Model - $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' - # ProcessorType - $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' - # MaxEVCMode - $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' - # CpuMhz - $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' - # NumCpuPkgs - $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' - # NumCpuCores - $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' - # NumCpuThreads - $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' - # Memory - $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' - # NumNics - $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' - # IP - $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' - # NumHBAs - $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' - Connect-VisioObject $DatacenterObject $HostObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) - { - $x = 8.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $HostObject $VdSwitchObject - $y += 1.50 - - foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x += 1.50 - $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk - # Name - $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' - # PortGroupName - $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' - # DhcpEnabled - $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' - # IP - $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' - # Mac - $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' - # ManagementTrafficEnabled - $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' - # VMotionEnabled - $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' - # FaultToleranceLoggingEnabled - $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' - # VsanTrafficEnabled - $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' - # Mtu - $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' - Connect-VisioObject $VdSwitchObject $VmkNicObject - $VdSwitchObject = $VmkNicObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function VDSPortGroup_to_VM -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # VmHost - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - $VmHostImport = Import-Csv $VmHostExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # Vds Switch - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - $VdSwitchImport = Import-Csv $VdSwitchExportFile - # Vds Port Group - $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - $VdsPortImport = Import-Csv $VdsPortExportFile - # Vds VMKernel - $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - $VdsVmkImport = Import-Csv $VdsVmkExportFile - # Vds Pnic - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - $VdsPnicImport = Import-Csv $VdsPnicExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" - $Page = $DocsObj.Pages('VDSPortGroup to VM') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('VDSPortGroup to VM') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # Host Object - $HostObj = $stnObj.Masters.Item("ESX Host") - # VDS Object - $VDSObj = $stnObj.Masters.Item("VDS") - # VDS PNIC Object - $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") - # VDSNIC Object - $VdsNicObj = $stnObj.Masters.Item("VDS NIC") - # Microsoft VM Object - $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LinuxObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.00 - $y += 1.50 - $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch - # Name - $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' - # Vendor - $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' - # Version - $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' - # NumUplinkPorts - $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' - # UplinkPortName - $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' - # Mtu - $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' - Connect-VisioObject $DatacenterObject $VdSwitchObject - - foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) - { - $x = 6.00 - $y += 1.50 - $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort - # Name - $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' - # VlanConfiguration - $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' - # NumPorts - $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' - # ActiveUplinkPort - $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' - # StandbyUplinkPort - $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' - # UplinkTeamingPolicy.Policy - $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' - # UplinkTeamingPolicy.ReversePolicy - $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' - #UplinkTeamingPolicy.NotifySwitches - $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' - # PortBinding - $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' - Connect-VisioObject $VdSwitchObject $VPGObject - $y += 1.50 - - foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) - { - $x += 2.50 - if ($VM.OS -eq "") - { - $VMObject = Add-VisioObjectVM $OtherObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - if ($VM.OS.contains("Microsoft") -eq $True) - { - $VMObject = Add-VisioObjectVM $MicrosoftObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - else - { - $VMObject = Add-VisioObjectVM $LinuxObj $VM - # Name - $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' - # OS - $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' - # Version - $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' - # VMToolsVersion - $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' - # ToolsVersionStatus - $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' - # ToolsStatus - $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' - # ToolsRunningStatus - $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' - # Folder - $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' - # NumCPU - $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' - # CoresPerSocket - $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' - # MemoryGB - $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' - # IP - $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' - # MacAddress - $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' - # ProvisionedSpaceGB - $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' - # NumEthernetCards - $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' - # NumVirtualDisks - $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' - # CpuReservation - $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' - # MemoryReservation - $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' - } - } - Connect-VisioObject $VPGObject $VMObject - $VPGObject = $VMObject - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Cluster_to_DRS_Rule -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - # vCenter - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - $vCenterImport = Import-Csv $vCenterExportFile - # Datacenter - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - $DatacenterImport = Import-Csv $DatacenterExportFile - # Cluster - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - $ClusterImport = Import-Csv $ClusterExportFile - # Vm - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - $VmImport = Import-Csv $VmExportFile - #Template - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - $TemplateImport = Import-Csv $TemplateExportFile - # DRS Rule - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - $DrsRuleImport = Import-Csv $DrsRuleExportFile - # DRS Cluster Group - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile - # DRS VmHost Rule - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile - - $AppVisio = New-Object -ComObject Visio.InvisibleApp - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Add() | Out-Null - $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" - $Page = $DocsObj.Pages('Cluster to DRS Rule') - $pagsObj = $AppVisio.ActiveDocument.Pages - $pagObj = $pagsObj.Item('Cluster to DRS Rule') - $AppVisio.ScreenUpdating = $False - $AppVisio.EventsEnabled = $False - - # Load a set of stencils and select one to drop - $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" - $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) - # vCenter Object - $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") - # Datacenter Object - $DatacenterObj = $stnObj.Masters.Item("Datacenter") - # Cluster Object - $ClusterObj = $stnObj.Masters.Item("Cluster") - # DRS Rule - $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") - # DRS Cluster Group - $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") - # DRS Host Rule - $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") - # Microsoft VM Object - $MSObj = $stnObj.Masters.Item("Microsoft Server") - # Linux VM Object - $LXObj = $stnObj.Masters.Item("Linux Server") - # Other VM Object - $OtherObj = $stnObj.Masters.Item("Other Server") - # Template VM Object - $TemplateObj = $stnObj.Masters.Item("Template") - - # Draw Objects - $x = 0 - $y = 1.50 - - $VCObject = Add-VisioObjectVC $VCObj $vCenterImport - # Name - $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' - # Version - $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' - # Build - $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' - - - foreach ($Datacenter in $DatacenterImport) - { - $x = 1.50 - $y += 1.50 - $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter - # Name - $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' - Connect-VisioObject $VCObject $DatacenterObject - - foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) - { - $x = 3.50 - $y += 1.50 - $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster - # Name - $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' - # HAEnabled - $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' - # HAAdmissionControlEnabled - $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' - # AdmissionControlPolicyCpuFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' - # AdmissionControlPolicyMemoryFailoverResourcesPercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' - # AdmissionControlPolicyFailoverLevel - $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' - # AdmissionControlPolicyAutoComputePercentages - $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' - # AdmissionControlPolicyResourceReductionToToleratePercent - $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' - # DrsEnabled - $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' - # DrsAutomationLevel - $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' - # VmMonitoring - $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' - # HostMonitoring - $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' - Connect-VisioObject $DatacenterObject $ClusterObject - $y += 1.50 - - foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule - # Name - $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' - # VM Affinity - $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' - # DRS Rule Enabled - $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' - # DRS Rule Mandatory - $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' - Connect-VisioObject $ClusterObject $DRSObject - #$ClusterObject = $DRSObject - $y += 1.50 - } - foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) - { - $x = 6.00 - $y += 1.50 - $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule - # Name - $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' - # Enabled - $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' - # Type - $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' - # VMGroup - $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' - # VMHostGroup - $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' - # AffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' - # AntiAffineHostGroupName - $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' - Connect-VisioObject $ClusterObject $DRSVMHostRuleObject - $y += 1.50 - #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject - #$DrsClusterGroupObject = $DRSVMHostRuleObject - - foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) - { - $x += 2.50 - $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup - # Name - $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' - # GroupType - $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' - # Members - $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' - Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject - $DRSVMHostRuleObject = $DrsClusterGroupObject - - } - } - } - } - - # Resize to fit page - $pagObj.ResizeToFitContents() - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null - $AppVisio.Quit() -} - -function Open_Final_Visio -{ - $vCenterShortName = $TargetVcenterTextBox.Text - $CsvDir = $DrawCsvFolder - $SaveDir = $VisioFolder - $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" - $AppVisio = New-Object -ComObject Visio.Application - $docsObj = $AppVisio.Documents - $docsObj.Open($Savefile) | Out-Null - $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null - $AppVisio.Documents.SaveAs($SaveFile) | Out-Null -} - -Main - +<# +.SYNOPSIS + vDiagram Visio Drawing Tool + +.DESCRIPTION + vDiagram Visio Drawing Tool + +.NOTES + File Name : vDiagram2.0.1.ps1 + Author : Tony Gonzalez + Author : Jason Hopkins + Based on : vDiagram by Alan Renouf + Version : 2.0.0 + +.USAGE NOTES + Ensure to unblock files before unzipping + Ensure to run as administrator + Required Files: + PowerCLI or PowerShell 5.0 with PowerCLI Modules installed + Active connection to vCenter to capture data + MS Visio + +.CHANGE LOG + - 04/12/2018 - v2.0.1 + Added MAC Addresses to VMs & Templates + Added a check to see if prior CSVs are still present + Added option to copy prior CSVs to new folder + + - 04/11/2018 - v2.0.0 + Presented as a Community Theater Session at South Florida VMUG + Feature enhancement requests collected +#> + +#region ScriptForm Designer + +#region Constructor + +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") +[void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") +[void][System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") +#endregion + +#region Post-Constructor Custom Code +$MyVer = "2.0.1" +$LastUpdated = "April 12, 2018" +$About = +@" + + vDiagram $MyVer + + Contributors: Tony Gonzalez of RoundTower Technologies LLC + Jason Hopkins of RoundTower Technologies LLC + + Description: vDiagram $MyVer - Based off of Alan Renouf's vDiagram + + Created: February 13, 2018 + + Last Updated: $LastUpdated + +"@ +#~~< TestShapes >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TestShapes = [System.Environment]::GetFolderPath('MyDocuments') + "\My Shapes\vDiagram.vssx" +if (!(Test-Path $TestShapes)) +{ + $CurrentLocation = Get-Location + copy $CurrentLocation\vDiagram.vssx $TestShapes + Write-Host "Copying Shapes File to My Shapes" +} +$shpFile = "\vDiagram.vssx" +#~~< Set_WindowStyle >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Set_WindowStyle { +param( + [Parameter()] + [ValidateSet('FORCEMINIMIZE', 'HIDE', 'MAXIMIZE', 'MINIMIZE', 'RESTORE', + 'SHOW', 'SHOWDEFAULT', 'SHOWMAXIMIZED', 'SHOWMINIMIZED', + 'SHOWMINNOACTIVE', 'SHOWNA', 'SHOWNOACTIVATE', 'SHOWNORMAL')] + $Style = 'SHOW', + [Parameter()] + $MainWindowHandle = (Get-Process -Id $pid).MainWindowHandle +) + $WindowStates = @{ + FORCEMINIMIZE = 11; HIDE = 0 + MAXIMIZE = 3; MINIMIZE = 6 + RESTORE = 9; SHOW = 5 + SHOWDEFAULT = 10; SHOWMAXIMIZED = 3 + SHOWMINIMIZED = 2; SHOWMINNOACTIVE = 7 + SHOWNA = 8; SHOWNOACTIVATE = 4 + SHOWNORMAL = 1 + } + Write-Verbose ("Set Window Style {1} on handle {0}" -f $MainWindowHandle, $($WindowStates[$style])) + + $Win32ShowWindowAsync = Add-Type –memberDefinition @” + [DllImport("user32.dll")] + public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); +“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru + + $Win32ShowWindowAsync::ShowWindowAsync($MainWindowHandle, $WindowStates[$Style]) | Out-Null +} +Set_WindowStyle MINIMIZE +#~~< About_Config >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function About_Config +{ + + $About + + #Add objects for About + $AboutForm = New-Object System.Windows.Forms.Form + $AboutTextBox = New-Object System.Windows.Forms.RichTextBox + + #About Form + $AboutForm.Icon = $Icon + $AboutForm.AutoScroll = $True + $AboutForm.ClientSize = New-Object System.Drawing.Size(464,500) + $AboutForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutForm.Name = "About" + $AboutForm.StartPosition = 1 + $AboutForm.Text = "About vDiagram $MyVer" + + $AboutTextBox.Anchor = 15 + $AboutTextBox.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) + $AboutTextBox.BorderStyle = 0 + $AboutTextBox.Font = "Tahoma" + $AboutTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $AboutTextBox.Location = New-Object System.Drawing.Point(13,13) + $AboutTextBox.Name = "AboutTextBox" + $AboutTextBox.ReadOnly = $True + $AboutTextBox.Size = New-Object System.Drawing.Size(440,500) + $AboutTextBox.Text = $About + + $AboutForm.Controls.Add($AboutTextBox) + + $AboutForm.Show() | Out-Null +} +#endregion + +#region Form Creation +#~~< vDiagram >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vDiagram = New-Object System.Windows.Forms.Form +$vDiagram.ClientSize = New-Object System.Drawing.Size(1008, 661) +$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") +$vDiagram.Icon = $Icon +$vDiagram.Text = "vDiagram 2.0" +$vDiagram.BackColor = [System.Drawing.Color]::DarkCyan +#~~< MainMenu >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainMenu = New-Object System.Windows.Forms.MenuStrip +$MainMenu.Location = New-Object System.Drawing.Point(0, 0) +$MainMenu.Size = New-Object System.Drawing.Size(1008, 24) +$MainMenu.TabIndex = 1 +$MainMenu.Text = "MainMenu" +#~~< FileToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FileToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$FileToolStripMenuItem.Size = New-Object System.Drawing.Size(37, 20) +$FileToolStripMenuItem.Text = "File" +#~~< ExitToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ExitToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$ExitToolStripMenuItem.Size = New-Object System.Drawing.Size(92, 22) +$ExitToolStripMenuItem.Text = "Exit" +$FileToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($ExitToolStripMenuItem))) +$ExitToolStripMenuItem.Add_Click({$vDiagram.Close()}) +#~~< HelpToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$HelpToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$HelpToolStripMenuItem.Size = New-Object System.Drawing.Size(44, 20) +$HelpToolStripMenuItem.Text = "Help" +#~~< AboutToolStripMenuItem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$AboutToolStripMenuItem = New-Object System.Windows.Forms.ToolStripMenuItem +$AboutToolStripMenuItem.Size = New-Object System.Drawing.Size(107, 22) +$AboutToolStripMenuItem.Text = "About" +$HelpToolStripMenuItem.DropDownItems.AddRange([System.Windows.Forms.ToolStripItem[]](@($AboutToolStripMenuItem))) +$MainMenu.Items.AddRange([System.Windows.Forms.ToolStripItem[]](@($FileToolStripMenuItem, $HelpToolStripMenuItem))) +$AboutToolStripMenuItem.Add_Click({About_Config}) +#~~< MainTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainTab = New-Object System.Windows.Forms.TabControl +$MainTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$MainTab.ItemSize = New-Object System.Drawing.Size(85, 20) +$MainTab.Location = New-Object System.Drawing.Point(10, 30) +$MainTab.Size = New-Object System.Drawing.Size(990, 98) +$MainTab.TabIndex = 0 +$MainTab.Text = "MainTabs" +#~~< Prerequisites >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Prerequisites = New-Object System.Windows.Forms.TabPage +$Prerequisites.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$Prerequisites.Location = New-Object System.Drawing.Point(4, 24) +$Prerequisites.Padding = New-Object System.Windows.Forms.Padding(3) +$Prerequisites.Size = New-Object System.Drawing.Size(982, 70) +$Prerequisites.TabIndex = 0 +$Prerequisites.Text = "Prerequisites" +$Prerequisites.BackColor = [System.Drawing.Color]::LightGray +#~~< PowershellLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellLabel = New-Object System.Windows.Forms.Label +$PowershellLabel.Location = New-Object System.Drawing.Point(10, 15) +$PowershellLabel.Size = New-Object System.Drawing.Size(75, 20) +$PowershellLabel.TabIndex = 1 +$PowershellLabel.Text = "Powershell:" +#~~< PowershellInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellInstalled = New-Object System.Windows.Forms.Label +$PowershellInstalled.Location = New-Object System.Drawing.Point(96, 15) +$PowershellInstalled.Size = New-Object System.Drawing.Size(350, 20) +$PowershellInstalled.TabIndex = 2 +$PowershellInstalled.Text = "" +$PowershellInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliModuleLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleLabel = New-Object System.Windows.Forms.Label +$PowerCliModuleLabel.Location = New-Object System.Drawing.Point(10, 40) +$PowerCliModuleLabel.Size = New-Object System.Drawing.Size(110, 20) +$PowerCliModuleLabel.TabIndex = 3 +$PowerCliModuleLabel.Text = "PowerCLI Module:" +#~~< PowerCliModuleInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleInstalled = New-Object System.Windows.Forms.Label +$PowerCliModuleInstalled.Location = New-Object System.Drawing.Point(128, 40) +$PowerCliModuleInstalled.Size = New-Object System.Drawing.Size(320, 20) +$PowerCliModuleInstalled.TabIndex = 4 +$PowerCliModuleInstalled.Text = "" +$PowerCliModuleInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< PowerCliLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliLabel = New-Object System.Windows.Forms.Label +$PowerCliLabel.Location = New-Object System.Drawing.Point(450, 15) +$PowerCliLabel.Size = New-Object System.Drawing.Size(64, 20) +$PowerCliLabel.TabIndex = 5 +$PowerCliLabel.Text = "PowerCLI:" +#~~< PowerCliInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliInstalled = New-Object System.Windows.Forms.Label +$PowerCliInstalled.Location = New-Object System.Drawing.Point(520, 15) +$PowerCliInstalled.Size = New-Object System.Drawing.Size(400, 20) +$PowerCliInstalled.TabIndex = 6 +$PowerCliInstalled.Text = "" +$PowerCliInstalled.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioLabel = New-Object System.Windows.Forms.Label +$VisioLabel.Location = New-Object System.Drawing.Point(450, 40) +$VisioLabel.Size = New-Object System.Drawing.Size(40, 20) +$VisioLabel.TabIndex = 7 +$VisioLabel.Text = "Visio:" +#~~< VisioInstalled >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioInstalled = New-Object System.Windows.Forms.Label +$VisioInstalled.Location = New-Object System.Drawing.Point(490, 40) +$VisioInstalled.Size = New-Object System.Drawing.Size(320, 20) +$VisioInstalled.TabIndex = 8 +$VisioInstalled.Text = "" +$VisioInstalled.BackColor = [System.Drawing.Color]::LightGray +$Prerequisites.Controls.Add($PowershellLabel) +$Prerequisites.Controls.Add($PowershellInstalled) +$Prerequisites.Controls.Add($PowerCliModuleLabel) +$Prerequisites.Controls.Add($PowerCliModuleInstalled) +$Prerequisites.Controls.Add($PowerCliLabel) +$Prerequisites.Controls.Add($PowerCliInstalled) +$Prerequisites.Controls.Add($VisioLabel) +$Prerequisites.Controls.Add($VisioInstalled) +#~~< vCenterInfo >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfo = New-Object System.Windows.Forms.TabPage +$vCenterInfo.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$vCenterInfo.Location = New-Object System.Drawing.Point(4, 24) +$vCenterInfo.Padding = New-Object System.Windows.Forms.Padding(3) +$vCenterInfo.Size = New-Object System.Drawing.Size(982, 70) +$vCenterInfo.TabIndex = 0 +$vCenterInfo.Text = "vCenter Info" +$vCenterInfo.BackColor = [System.Drawing.Color]::LightGray +#~~< MainVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterLabel = New-Object System.Windows.Forms.Label +$MainVcenterLabel.Location = New-Object System.Drawing.Point(8, 11) +$MainVcenterLabel.Size = New-Object System.Drawing.Size(288, 20) +$MainVcenterLabel.TabIndex = 1 +$MainVcenterLabel.Text = "Name of vCenter where target vCenter is located:" +#~~< MainVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$MainVcenterTextBox = New-Object System.Windows.Forms.TextBox +$MainVcenterTextBox.Location = New-Object System.Drawing.Point(298, 8) +$MainVcenterTextBox.Size = New-Object System.Drawing.Size(304, 21) +$MainVcenterTextBox.TabIndex = 2 +$MainVcenterTextBox.Text = "" +#~~< TargetVcenterLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterLabel = New-Object System.Windows.Forms.Label +$TargetVcenterLabel.Location = New-Object System.Drawing.Point(8, 37) +$TargetVcenterLabel.Size = New-Object System.Drawing.Size(148, 20) +$TargetVcenterLabel.TabIndex = 3 +$TargetVcenterLabel.Text = "Name of target vCenter:" +#~~< TargetVcenterTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TargetVcenterTextBox = New-Object System.Windows.Forms.TextBox +$TargetVcenterTextBox.Location = New-Object System.Drawing.Point(159, 34) +$TargetVcenterTextBox.Size = New-Object System.Drawing.Size(202, 21) +$TargetVcenterTextBox.TabIndex = 4 +$TargetVcenterTextBox.Text = "" +#~~< UserNameLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameLabel = New-Object System.Windows.Forms.Label +$UserNameLabel.Location = New-Object System.Drawing.Point(372, 37) +$UserNameLabel.Size = New-Object System.Drawing.Size(122, 20) +$UserNameLabel.TabIndex = 5 +$UserNameLabel.Text = "vCenter User Name:" +#~~< UserNameTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$UserNameTextBox = New-Object System.Windows.Forms.TextBox +$UserNameTextBox.Location = New-Object System.Drawing.Point(502, 34) +$UserNameTextBox.Size = New-Object System.Drawing.Size(202, 21) +$UserNameTextBox.TabIndex = 6 +$UserNameTextBox.Text = "" +#~~< PasswordLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordLabel = New-Object System.Windows.Forms.Label +$PasswordLabel.Location = New-Object System.Drawing.Point(711, 37) +$PasswordLabel.Size = New-Object System.Drawing.Size(68, 20) +$PasswordLabel.TabIndex = 7 +$PasswordLabel.Text = "Password:" +#~~< PasswordTextBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PasswordTextBox = New-Object System.Windows.Forms.TextBox +$PasswordTextBox.Location = New-Object System.Drawing.Point(786, 35) +$PasswordTextBox.Size = New-Object System.Drawing.Size(190, 21) +$PasswordTextBox.TabIndex = 8 +$PasswordTextBox.Text = "" +$PasswordTextBox.UseSystemPasswordChar = $true +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton = New-Object System.Windows.Forms.Button +$ConnectButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$ConnectButton.Location = New-Object System.Drawing.Point(615, 5) +$ConnectButton.Size = New-Object System.Drawing.Size(345, 25) +$ConnectButton.TabIndex = 9 +$ConnectButton.Text = "Connect to vCenter" +$ConnectButton.UseVisualStyleBackColor = $true +$vCenterInfo.Controls.Add($MainVcenterLabel) +$vCenterInfo.Controls.Add($MainVcenterTextBox) +$vCenterInfo.Controls.Add($TargetVcenterLabel) +$vCenterInfo.Controls.Add($TargetVcenterTextBox) +$vCenterInfo.Controls.Add($UserNameLabel) +$vCenterInfo.Controls.Add($UserNameTextBox) +$vCenterInfo.Controls.Add($PasswordLabel) +$vCenterInfo.Controls.Add($PasswordTextBox) +$vCenterInfo.Controls.Add($ConnectButton) +$MainTab.Controls.Add($Prerequisites) +$MainTab.Controls.Add($vCenterInfo) +$MainTab.SelectedIndex = 0 +#~~< SubTab >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SubTab = New-Object System.Windows.Forms.TabControl +$SubTab.Font = New-Object System.Drawing.Font("Tahoma", 8.25, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$SubTab.Location = New-Object System.Drawing.Point(10, 136) +$SubTab.Size = New-Object System.Drawing.Size(990, 512) +$SubTab.TabIndex = 0 +$SubTab.Text = "SubTabs" +#~~< TabDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDirections = New-Object System.Windows.Forms.TabPage +$TabDirections.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDirections.Location = New-Object System.Drawing.Point(4, 22) +$TabDirections.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDirections.Size = New-Object System.Drawing.Size(982, 486) +$TabDirections.TabIndex = 0 +$TabDirections.Text = "Directions" +$TabDirections.UseVisualStyleBackColor = $true +#~~< PrerequisitesHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesHeading = New-Object System.Windows.Forms.Label +$PrerequisitesHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$PrerequisitesHeading.Location = New-Object System.Drawing.Point(8, 8) +$PrerequisitesHeading.Size = New-Object System.Drawing.Size(149, 23) +$PrerequisitesHeading.TabIndex = 0 +$PrerequisitesHeading.Text = "Prerequisites Tab" +#~~< PrerequisitesDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PrerequisitesDirections = New-Object System.Windows.Forms.Label +$PrerequisitesDirections.Location = New-Object System.Drawing.Point(8, 32) +$PrerequisitesDirections.Size = New-Object System.Drawing.Size(900, 30) +$PrerequisitesDirections.TabIndex = 1 +$PrerequisitesDirections.Text = "1. Verify that prerequisites are met on the "+[char]34+"Prerequisites"+[char]34+" tab."+[char]13+[char]10+"2. If not please install needed requirements." +#~~< vCenterInfoHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoHeading = New-Object System.Windows.Forms.Label +$vCenterInfoHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$vCenterInfoHeading.Location = New-Object System.Drawing.Point(8, 72) +$vCenterInfoHeading.Size = New-Object System.Drawing.Size(149, 23) +$vCenterInfoHeading.TabIndex = 2 +$vCenterInfoHeading.Text = "vCenter Info Tab" +#~~< vCenterInfoDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterInfoDirections = New-Object System.Windows.Forms.Label +$vCenterInfoDirections.Location = New-Object System.Drawing.Point(8, 96) +$vCenterInfoDirections.Size = New-Object System.Drawing.Size(900, 70) +$vCenterInfoDirections.TabIndex = 3 +$vCenterInfoDirections.Text = "1. Click on "+[char]34+"vCenter Info"+[char]34+" tab."+[char]13+[char]10+"2. Enter name of main vCenter where target vCenter is located."+[char]13+[char]10+"3. Enter target vCenter name as seen in vCenter management console in the main vCenter (this is required even if the names are the same)."+[char]13+[char]10+"4. Enter User Name and Password (password will be hashed and not plain text)."+[char]13+[char]10+"5. Click on "+[char]34+"Connect to vCenter"+[char]34+" button." +#~~< CaptureCsvHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvHeading = New-Object System.Windows.Forms.Label +$CaptureCsvHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvHeading.Location = New-Object System.Drawing.Point(8, 176) +$CaptureCsvHeading.Size = New-Object System.Drawing.Size(216, 23) +$CaptureCsvHeading.TabIndex = 4 +$CaptureCsvHeading.Text = "Capture CSVs for Visio Tab" +#~~< CaptureDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureDirections = New-Object System.Windows.Forms.Label +$CaptureDirections.Location = New-Object System.Drawing.Point(8, 200) +$CaptureDirections.Size = New-Object System.Drawing.Size(900, 65) +$CaptureDirections.TabIndex = 5 +$CaptureDirections.Text = "1. Click on "+[char]34+"Capture CSVs for Visio"+[char]34+" tab."+[char]13+[char]10+"2. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select folder where you would like to output the CSVs to."+[char]13+[char]10+"3. Select items you wish to grab data on."+[char]13+[char]10+"4. Click on "+[char]34+"Collect CSV Data"+[char]34+" button." +#~~< DrawHeading >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawHeading = New-Object System.Windows.Forms.Label +$DrawHeading.Font = New-Object System.Drawing.Font("Tahoma", 11.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawHeading.Location = New-Object System.Drawing.Point(8, 264) +$DrawHeading.Size = New-Object System.Drawing.Size(149, 23) +$DrawHeading.TabIndex = 6 +$DrawHeading.Text = "Draw Visio Tab" +#~~< DrawDirections >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawDirections = New-Object System.Windows.Forms.Label +$DrawDirections.Location = New-Object System.Drawing.Point(8, 288) +$DrawDirections.Size = New-Object System.Drawing.Size(900, 130) +$DrawDirections.TabIndex = 7 +$DrawDirections.Text = "***Note*** If you are drawing the Visio on a different machine from where you captured the CSVs you must put vCenter info into both vCenter boxes on the "+[char]34+"vCenter Info"+[char]34+" Tab."+[char]13+[char]10+"1. Click on "+[char]34+"Select Input Folder"+[char]34+" button and select location where CSVs can be found."+[char]13+[char]10+"2. Click on "+[char]34+"Check for CSVs"+[char]39+" button to validate presence of required files."+[char]13+[char]10+"3. Click on "+[char]34+"Select Output Folder"+[char]34+" button and select where location where you would like to save the Visio drawing."+[char]13+[char]10+"4. Select drawing that you would like to produce."+[char]13+[char]10+"5. Click on "+[char]34+"Draw Visio"+[char]34+" button."+[char]13+[char]10+"6. Click on "+[char]34+"Open Visio Drawing"+[char]34+" button once "+[char]34+"Draw Visio"+[char]34+" button says it has completed." +$TabDirections.Controls.Add($PrerequisitesHeading) +$TabDirections.Controls.Add($PrerequisitesDirections) +$TabDirections.Controls.Add($vCenterInfoHeading) +$TabDirections.Controls.Add($vCenterInfoDirections) +$TabDirections.Controls.Add($CaptureCsvHeading) +$TabDirections.Controls.Add($CaptureDirections) +$TabDirections.Controls.Add($DrawHeading) +$TabDirections.Controls.Add($DrawDirections) +#~~< TabCapture >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabCapture = New-Object System.Windows.Forms.TabPage +$TabCapture.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabCapture.Location = New-Object System.Drawing.Point(4, 22) +$TabCapture.Padding = New-Object System.Windows.Forms.Padding(3) +$TabCapture.Size = New-Object System.Drawing.Size(982, 486) +$TabCapture.TabIndex = 3 +$TabCapture.Text = "Capture CSVs for Visio" +$TabCapture.UseVisualStyleBackColor = $true +#~~< CaptureCsvOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputLabel = New-Object System.Windows.Forms.Label +$CaptureCsvOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$CaptureCsvOutputLabel.Location = New-Object System.Drawing.Point(10, 10) +$CaptureCsvOutputLabel.Size = New-Object System.Drawing.Size(210, 25) +$CaptureCsvOutputLabel.TabIndex = 0 +$CaptureCsvOutputLabel.Text = "CSV Output Folder:" +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton = New-Object System.Windows.Forms.Button +$CaptureCsvOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCsvOutputButton.Location = New-Object System.Drawing.Point(220, 10) +$CaptureCsvOutputButton.Size = New-Object System.Drawing.Size(750, 25) +$CaptureCsvOutputButton.TabIndex = 0 +$CaptureCsvOutputButton.Text = "Select Output Folder" +$CaptureCsvOutputButton.UseVisualStyleBackColor = $false +$CaptureCsvOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$vCenterCsvCheckBox.Checked = $true +$vCenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$vCenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$vCenterCsvCheckBox.TabIndex = 1 +$vCenterCsvCheckBox.Text = "Export vCenter Info" +$vCenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< vCenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$vCenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 40) +$vCenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationComplete.TabIndex = 26 +$vCenterCsvValidationComplete.Text = "" +#~~< DatacenterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatacenterCsvCheckBox.Checked = $true +$DatacenterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatacenterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatacenterCsvCheckBox.TabIndex = 2 +$DatacenterCsvCheckBox.Text = "Export Datacenter Info" +$DatacenterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatacenterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 60) +$DatacenterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationComplete.TabIndex = 27 +$DatacenterCsvValidationComplete.Text = "" +#~~< ClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ClusterCsvCheckBox.Checked = $true +$ClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ClusterCsvCheckBox.TabIndex = 3 +$ClusterCsvCheckBox.Text = "Export Cluster Info" +$ClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$ClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 80) +$ClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationComplete.TabIndex = 28 +$ClusterCsvValidationComplete.Text = "" +#~~< VmHostCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmHostCsvCheckBox.Checked = $true +$VmHostCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmHostCsvCheckBox.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmHostCsvCheckBox.TabIndex = 4 +$VmHostCsvCheckBox.Text = "Export VmHost Info" +$VmHostCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmHostCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmHostCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 100) +$VmHostCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationComplete.TabIndex = 29 +$VmHostCsvValidationComplete.Text = "" +#~~< VmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VmCsvCheckBox.Checked = $true +$VmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VmCsvCheckBox.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VmCsvCheckBox.TabIndex = 5 +$VmCsvCheckBox.Text = "Export Vm Info" +$VmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationComplete = New-Object System.Windows.Forms.Label +$VmCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 120) +$VmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationComplete.TabIndex = 30 +$VmCsvValidationComplete.Text = "" +#~~< TemplateCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$TemplateCsvCheckBox.Checked = $true +$TemplateCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$TemplateCsvCheckBox.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$TemplateCsvCheckBox.TabIndex = 6 +$TemplateCsvCheckBox.Text = "Export Template Info" +$TemplateCsvCheckBox.UseVisualStyleBackColor = $true +#~~< TemplateCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationComplete = New-Object System.Windows.Forms.Label +$TemplateCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 140) +$TemplateCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationComplete.TabIndex = 31 +$TemplateCsvValidationComplete.Text = "" +#~~< DatastoreClusterCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreClusterCsvCheckBox.Checked = $true +$DatastoreClusterCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreClusterCsvCheckBox.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreClusterCsvCheckBox.TabIndex = 7 +$DatastoreClusterCsvCheckBox.Text = "Export Datastore Cluster Info" +$DatastoreClusterCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreClusterCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 160) +$DatastoreClusterCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationComplete.TabIndex = 32 +$DatastoreClusterCsvValidationComplete.Text = "" +#~~< DatastoreCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DatastoreCsvCheckBox.Checked = $true +$DatastoreCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DatastoreCsvCheckBox.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DatastoreCsvCheckBox.TabIndex = 8 +$DatastoreCsvCheckBox.Text = "Export Datastore Info" +$DatastoreCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DatastoreCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationComplete = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationComplete.Location = New-Object System.Drawing.Point(210, 180) +$DatastoreCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationComplete.TabIndex = 33 +$DatastoreCsvValidationComplete.Text = "" +#~~< VsSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VsSwitchCsvCheckBox.Checked = $true +$VsSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VsSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 40) +$VsSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VsSwitchCsvCheckBox.TabIndex = 9 +$VsSwitchCsvCheckBox.Text = "Export VsSwitch Info" +$VsSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VsSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 40) +$VsSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationComplete.TabIndex = 34 +$VsSwitchCsvValidationComplete.Text = "" +#~~< VssPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPortGroupCsvCheckBox.Checked = $true +$VssPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 60) +$VssPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPortGroupCsvCheckBox.TabIndex = 10 +$VssPortGroupCsvCheckBox.Text = "Export VSS Port Group Info" +$VssPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 60) +$VssPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationComplete.TabIndex = 35 +$VssPortGroupCsvValidationComplete.Text = "" +#~~< VssVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssVmkernelCsvCheckBox.Checked = $true +$VssVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 80) +$VssVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssVmkernelCsvCheckBox.TabIndex = 11 +$VssVmkernelCsvCheckBox.Text = "Export VSS Vmkernel Info" +$VssVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 80) +$VssVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationComplete.TabIndex = 36 +$VssVmkernelCsvValidationComplete.Text = "" +#~~< VssPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VssPnicCsvCheckBox.Checked = $true +$VssPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VssPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 100) +$VssPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VssPnicCsvCheckBox.TabIndex = 12 +$VssPnicCsvCheckBox.Text = "Export VSS Pnic Info" +$VssPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VssPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 100) +$VssPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationComplete.TabIndex = 37 +$VssPnicCsvValidationComplete.Text = "" +#~~< VdSwitchCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdSwitchCsvCheckBox.Checked = $true +$VdSwitchCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdSwitchCsvCheckBox.Location = New-Object System.Drawing.Point(310, 120) +$VdSwitchCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdSwitchCsvCheckBox.TabIndex = 13 +$VdSwitchCsvCheckBox.Text = "Export VdSwitch Info" +$VdSwitchCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdSwitchCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 120) +$VdSwitchCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationComplete.TabIndex = 38 +$VdSwitchCsvValidationComplete.Text = "" +#~~< VdsPortGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPortGroupCsvCheckBox.Checked = $true +$VdsPortGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPortGroupCsvCheckBox.Location = New-Object System.Drawing.Point(310, 140) +$VdsPortGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPortGroupCsvCheckBox.TabIndex = 14 +$VdsPortGroupCsvCheckBox.Text = "Export VDS Port Group Info" +$VdsPortGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPortGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 140) +$VdsPortGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationComplete.TabIndex = 39 +$VdsPortGroupCsvValidationComplete.Text = "" +#~~< VdsVmkernelCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsVmkernelCsvCheckBox.Checked = $true +$VdsVmkernelCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsVmkernelCsvCheckBox.Location = New-Object System.Drawing.Point(310, 160) +$VdsVmkernelCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsVmkernelCsvCheckBox.TabIndex = 15 +$VdsVmkernelCsvCheckBox.Text = "Export VDS Vmkernel Info" +$VdsVmkernelCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsVmkernelCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 160) +$VdsVmkernelCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationComplete.TabIndex = 40 +$VdsVmkernelCsvValidationComplete.Text = "" +#~~< VdsPnicCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$VdsPnicCsvCheckBox.Checked = $true +$VdsPnicCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VdsPnicCsvCheckBox.Location = New-Object System.Drawing.Point(310, 180) +$VdsPnicCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$VdsPnicCsvCheckBox.TabIndex = 16 +$VdsPnicCsvCheckBox.Text = "Export VDS Pnic Info" +$VdsPnicCsvCheckBox.UseVisualStyleBackColor = $true +#~~< VdsPnicCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationComplete = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationComplete.Location = New-Object System.Drawing.Point(520, 180) +$VdsPnicCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationComplete.TabIndex = 41 +$VdsPnicCsvValidationComplete.Text = "" +#~~< FolderCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$FolderCsvCheckBox.Checked = $true +$FolderCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$FolderCsvCheckBox.Location = New-Object System.Drawing.Point(620, 40) +$FolderCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$FolderCsvCheckBox.TabIndex = 17 +$FolderCsvCheckBox.Text = "Export Folder Info" +$FolderCsvCheckBox.UseVisualStyleBackColor = $true +#~~< FolderCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationComplete = New-Object System.Windows.Forms.Label +$FolderCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 40) +$FolderCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationComplete.TabIndex = 42 +$FolderCsvValidationComplete.Text = "" +#~~< RdmCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$RdmCsvCheckBox.Checked = $true +$RdmCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$RdmCsvCheckBox.Location = New-Object System.Drawing.Point(620, 60) +$RdmCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$RdmCsvCheckBox.TabIndex = 18 +$RdmCsvCheckBox.Text = "Export RDM Info" +$RdmCsvCheckBox.UseVisualStyleBackColor = $true +#~~< RdmCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationComplete = New-Object System.Windows.Forms.Label +$RdmCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 60) +$RdmCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationComplete.TabIndex = 43 +$RdmCsvValidationComplete.Text = "" +#~~< DrsRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsRuleCsvCheckBox.Checked = $true +$DrsRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 80) +$DrsRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsRuleCsvCheckBox.TabIndex = 19 +$DrsRuleCsvCheckBox.Text = "Export DRS Rule Info" +$DrsRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 80) +$DrsRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationComplete.TabIndex = 44 +$DrsRuleCsvValidationComplete.Text = "" +#~~< DrsClusterGroupCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsClusterGroupCsvCheckBox.Checked = $true +$DrsClusterGroupCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsClusterGroupCsvCheckBox.Location = New-Object System.Drawing.Point(620, 100) +$DrsClusterGroupCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsClusterGroupCsvCheckBox.TabIndex = 20 +$DrsClusterGroupCsvCheckBox.Text = "Export DRS Cluster Group Info" +$DrsClusterGroupCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsClusterGroupCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 100) +$DrsClusterGroupCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationComplete.TabIndex = 45 +$DrsClusterGroupCsvValidationComplete.Text = "" +#~~< DrsVmHostRuleCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$DrsVmHostRuleCsvCheckBox.Checked = $true +$DrsVmHostRuleCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$DrsVmHostRuleCsvCheckBox.Location = New-Object System.Drawing.Point(620, 120) +$DrsVmHostRuleCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$DrsVmHostRuleCsvCheckBox.TabIndex = 21 +$DrsVmHostRuleCsvCheckBox.Text = "Export DRS VmHost Rule Info" +$DrsVmHostRuleCsvCheckBox.UseVisualStyleBackColor = $true +#~~< DrsVmHostRuleCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationComplete = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 120) +$DrsVmHostRuleCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationComplete.TabIndex = 46 +$DrsVmHostRuleCsvValidationComplete.Text = "" +#~~< ResourcePoolCsvCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvCheckBox = New-Object System.Windows.Forms.CheckBox +$ResourcePoolCsvCheckBox.Checked = $true +$ResourcePoolCsvCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$ResourcePoolCsvCheckBox.Location = New-Object System.Drawing.Point(620, 140) +$ResourcePoolCsvCheckBox.Size = New-Object System.Drawing.Size(200, 20) +$ResourcePoolCsvCheckBox.TabIndex = 22 +$ResourcePoolCsvCheckBox.Text = "Export Resource Pool Info" +$ResourcePoolCsvCheckBox.UseVisualStyleBackColor = $true +#~~< ResourcePoolCsvValidationComplete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationComplete = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationComplete.Location = New-Object System.Drawing.Point(830, 140) +$ResourcePoolCsvValidationComplete.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationComplete.TabIndex = 47 +$ResourcePoolCsvValidationComplete.Text = "" +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton = New-Object System.Windows.Forms.Button +$CaptureUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureUncheckButton.Location = New-Object System.Drawing.Point(8, 215) +$CaptureUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureUncheckButton.TabIndex = 23 +$CaptureUncheckButton.Text = "Uncheck All" +$CaptureUncheckButton.UseVisualStyleBackColor = $false +$CaptureUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton = New-Object System.Windows.Forms.Button +$CaptureCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureCheckButton.Location = New-Object System.Drawing.Point(228, 215) +$CaptureCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureCheckButton.TabIndex = 24 +$CaptureCheckButton.Text = "Check All" +$CaptureCheckButton.UseVisualStyleBackColor = $false +$CaptureCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton = New-Object System.Windows.Forms.Button +$CaptureButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CaptureButton.Location = New-Object System.Drawing.Point(448, 215) +$CaptureButton.Size = New-Object System.Drawing.Size(200, 25) +$CaptureButton.TabIndex = 25 +$CaptureButton.Text = "Collect CSV Data" +$CaptureButton.UseVisualStyleBackColor = $false +$CaptureButton.BackColor = [System.Drawing.Color]::LightGray +$TabCapture.Controls.Add($CaptureCsvOutputLabel) +$TabCapture.Controls.Add($CaptureCsvOutputButton) +$TabCapture.Controls.Add($vCenterCsvCheckBox) +$TabCapture.Controls.Add($vCenterCsvValidationComplete) +$TabCapture.Controls.Add($DatacenterCsvCheckBox) +$TabCapture.Controls.Add($DatacenterCsvValidationComplete) +$TabCapture.Controls.Add($ClusterCsvCheckBox) +$TabCapture.Controls.Add($ClusterCsvValidationComplete) +$TabCapture.Controls.Add($VmHostCsvCheckBox) +$TabCapture.Controls.Add($VmHostCsvValidationComplete) +$TabCapture.Controls.Add($VmCsvCheckBox) +$TabCapture.Controls.Add($VmCsvValidationComplete) +$TabCapture.Controls.Add($TemplateCsvCheckBox) +$TabCapture.Controls.Add($TemplateCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreClusterCsvCheckBox) +$TabCapture.Controls.Add($DatastoreClusterCsvValidationComplete) +$TabCapture.Controls.Add($DatastoreCsvCheckBox) +$TabCapture.Controls.Add($DatastoreCsvValidationComplete) +$TabCapture.Controls.Add($VsSwitchCsvCheckBox) +$TabCapture.Controls.Add($VsSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VssPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VssPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VssVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VssVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VssPnicCsvCheckBox) +$TabCapture.Controls.Add($VssPnicCsvValidationComplete) +$TabCapture.Controls.Add($VdSwitchCsvCheckBox) +$TabCapture.Controls.Add($VdSwitchCsvValidationComplete) +$TabCapture.Controls.Add($VdsPortGroupCsvCheckBox) +$TabCapture.Controls.Add($VdsPortGroupCsvValidationComplete) +$TabCapture.Controls.Add($VdsVmkernelCsvCheckBox) +$TabCapture.Controls.Add($VdsVmkernelCsvValidationComplete) +$TabCapture.Controls.Add($VdsPnicCsvCheckBox) +$TabCapture.Controls.Add($VdsPnicCsvValidationComplete) +$TabCapture.Controls.Add($FolderCsvCheckBox) +$TabCapture.Controls.Add($FolderCsvValidationComplete) +$TabCapture.Controls.Add($RdmCsvCheckBox) +$TabCapture.Controls.Add($RdmCsvValidationComplete) +$TabCapture.Controls.Add($DrsRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsRuleCsvValidationComplete) +$TabCapture.Controls.Add($DrsClusterGroupCsvCheckBox) +$TabCapture.Controls.Add($DrsClusterGroupCsvValidationComplete) +$TabCapture.Controls.Add($DrsVmHostRuleCsvCheckBox) +$TabCapture.Controls.Add($DrsVmHostRuleCsvValidationComplete) +$TabCapture.Controls.Add($ResourcePoolCsvCheckBox) +$TabCapture.Controls.Add($ResourcePoolCsvValidationComplete) +$TabCapture.Controls.Add($CaptureUncheckButton) +$TabCapture.Controls.Add($CaptureCheckButton) +$TabCapture.Controls.Add($CaptureButton) +#~~< TabDraw >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TabDraw = New-Object System.Windows.Forms.TabPage +$TabDraw.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D +$TabDraw.Location = New-Object System.Drawing.Point(4, 22) +$TabDraw.Padding = New-Object System.Windows.Forms.Padding(3) +$TabDraw.Size = New-Object System.Drawing.Size(982, 486) +$TabDraw.TabIndex = 2 +$TabDraw.Text = "Draw Visio" +$TabDraw.UseVisualStyleBackColor = $true +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton = New-Object System.Windows.Forms.Button +$OpenVisioButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$OpenVisioButton.Location = New-Object System.Drawing.Point(668, 450) +$OpenVisioButton.Size = New-Object System.Drawing.Size(200, 25) +$OpenVisioButton.TabIndex = 83 +$OpenVisioButton.Text = "Open Visio Drawing" +$OpenVisioButton.UseVisualStyleBackColor = $false +$OpenVisioButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton = New-Object System.Windows.Forms.Button +$DrawCheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCheckButton.Location = New-Object System.Drawing.Point(228, 450) +$DrawCheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawCheckButton.TabIndex = 82 +$DrawCheckButton.Text = "Check All" +$DrawCheckButton.UseVisualStyleBackColor = $false +$DrawCheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton = New-Object System.Windows.Forms.Button +$DrawButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawButton.Location = New-Object System.Drawing.Point(448, 450) +$DrawButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawButton.TabIndex = 81 +$DrawButton.Text = "Draw Visio" +$DrawButton.UseVisualStyleBackColor = $false +$DrawButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton = New-Object System.Windows.Forms.Button +$DrawUncheckButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawUncheckButton.Location = New-Object System.Drawing.Point(8, 450) +$DrawUncheckButton.Size = New-Object System.Drawing.Size(200, 25) +$DrawUncheckButton.TabIndex = 80 +$DrawUncheckButton.Text = "Uncheck All" +$DrawUncheckButton.UseVisualStyleBackColor = $false +$DrawUncheckButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VisioOutputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOutputLabel = New-Object System.Windows.Forms.Label +$VisioOutputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$VisioOutputLabel.Location = New-Object System.Drawing.Point(10, 230) +$VisioOutputLabel.Size = New-Object System.Drawing.Size(215, 25) +$VisioOutputLabel.TabIndex = 46 +$VisioOutputLabel.Text = "Visio Output Folder:" +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton = New-Object System.Windows.Forms.Button +$VisioOpenOutputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$VisioOpenOutputButton.Location = New-Object System.Drawing.Point(230, 230) +$VisioOpenOutputButton.Size = New-Object System.Drawing.Size(740, 25) +$VisioOpenOutputButton.TabIndex = 47 +$VisioOpenOutputButton.Text = "Select Visio Output Folder" +$VisioOpenOutputButton.UseVisualStyleBackColor = $false +$VisioOpenOutputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< DrawCsvInputLabel >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputLabel = New-Object System.Windows.Forms.Label +$DrawCsvInputLabel.Font = New-Object System.Drawing.Font("Tahoma", 15.0, [System.Drawing.FontStyle]::Bold, [System.Drawing.GraphicsUnit]::Point, ([System.Byte](0))) +$DrawCsvInputLabel.Location = New-Object System.Drawing.Point(10, 10) +$DrawCsvInputLabel.Size = New-Object System.Drawing.Size(190, 25) +$DrawCsvInputLabel.TabIndex = 0 +$DrawCsvInputLabel.Text = "CSV Input Folder:" +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton = New-Object System.Windows.Forms.Button +$DrawCsvInputButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$DrawCsvInputButton.Location = New-Object System.Drawing.Point(220, 10) +$DrawCsvInputButton.Size = New-Object System.Drawing.Size(750, 25) +$DrawCsvInputButton.TabIndex = 1 +$DrawCsvInputButton.Text = "Select CSV Input Folder" +$DrawCsvInputButton.UseVisualStyleBackColor = $false +$DrawCsvInputButton.BackColor = [System.Drawing.Color]::LightGray +#~~< vCenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidation = New-Object System.Windows.Forms.Label +$vCenterCsvValidation.Location = New-Object System.Drawing.Point(10, 40) +$vCenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$vCenterCsvValidation.TabIndex = 2 +$vCenterCsvValidation.Text = "vCenter CSV File:" +#~~< vCenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$vCenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$vCenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 40) +$vCenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$vCenterCsvValidationCheck.TabIndex = 3 +$vCenterCsvValidationCheck.Text = "" +#~~< DatacenterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidation = New-Object System.Windows.Forms.Label +$DatacenterCsvValidation.Location = New-Object System.Drawing.Point(10, 60) +$DatacenterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatacenterCsvValidation.TabIndex = 4 +$DatacenterCsvValidation.Text = "Datacenter CSV File:" +#~~< DatacenterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatacenterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatacenterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 60) +$DatacenterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatacenterCsvValidationCheck.TabIndex = 5 +$DatacenterCsvValidationCheck.Text = "" +#~~< ClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidation = New-Object System.Windows.Forms.Label +$ClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 80) +$ClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ClusterCsvValidation.TabIndex = 6 +$ClusterCsvValidation.Text = "Cluster CSV File:" +#~~< ClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$ClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 80) +$ClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ClusterCsvValidationCheck.TabIndex = 7 +$ClusterCsvValidationCheck.Text = "" +#~~< VmHostCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidation = New-Object System.Windows.Forms.Label +$VmHostCsvValidation.Location = New-Object System.Drawing.Point(10, 100) +$VmHostCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmHostCsvValidation.TabIndex = 8 +$VmHostCsvValidation.Text = "VmHost CSV File:" +#~~< VmHostCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmHostCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmHostCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 100) +$VmHostCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmHostCsvValidationCheck.TabIndex = 9 +$VmHostCsvValidationCheck.Text = "" +#~~< VmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidation = New-Object System.Windows.Forms.Label +$VmCsvValidation.Location = New-Object System.Drawing.Point(10, 120) +$VmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VmCsvValidation.TabIndex = 10 +$VmCsvValidation.Text = "VM CSV File:" +#~~< VmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VmCsvValidationCheck = New-Object System.Windows.Forms.Label +$VmCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 120) +$VmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VmCsvValidationCheck.TabIndex = 11 +$VmCsvValidationCheck.Text = "" +#~~< TemplateCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidation = New-Object System.Windows.Forms.Label +$TemplateCsvValidation.Location = New-Object System.Drawing.Point(10, 140) +$TemplateCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$TemplateCsvValidation.TabIndex = 12 +$TemplateCsvValidation.Text = "Template CSV File:" +#~~< TemplateCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$TemplateCsvValidationCheck = New-Object System.Windows.Forms.Label +$TemplateCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 140) +$TemplateCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$TemplateCsvValidationCheck.TabIndex = 13 +$TemplateCsvValidationCheck.Text = "" +#~~< DatastoreClusterCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidation.Location = New-Object System.Drawing.Point(10, 160) +$DatastoreClusterCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreClusterCsvValidation.TabIndex = 14 +$DatastoreClusterCsvValidation.Text = "Datastore Cluster CSV File:" +#~~< DatastoreClusterCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreClusterCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreClusterCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 160) +$DatastoreClusterCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreClusterCsvValidationCheck.TabIndex = 15 +$DatastoreClusterCsvValidationCheck.Text = "" +#~~< DatastoreCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidation = New-Object System.Windows.Forms.Label +$DatastoreCsvValidation.Location = New-Object System.Drawing.Point(10, 180) +$DatastoreCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DatastoreCsvValidation.TabIndex = 16 +$DatastoreCsvValidation.Text = "Datastore CSV File:" +#~~< DatastoreCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DatastoreCsvValidationCheck = New-Object System.Windows.Forms.Label +$DatastoreCsvValidationCheck.Location = New-Object System.Drawing.Point(180, 180) +$DatastoreCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DatastoreCsvValidationCheck.TabIndex = 17 +$DatastoreCsvValidationCheck.Text = "" +#~~< VsSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 40) +$VsSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VsSwitchCsvValidation.TabIndex = 18 +$VsSwitchCsvValidation.Text = "VsSwitch CSV File:" +#~~< VsSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VsSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VsSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 40) +$VsSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VsSwitchCsvValidationCheck.TabIndex = 19 +$VsSwitchCsvValidationCheck.Text = "" +#~~< VssPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 60) +$VssPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPortGroupCsvValidation.TabIndex = 20 +$VssPortGroupCsvValidation.Text = "Vss Port Group CSV File:" +#~~< VssPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 60) +$VssPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPortGroupCsvValidationCheck.TabIndex = 21 +$VssPortGroupCsvValidationCheck.Text = "" +#~~< VssVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 80) +$VssVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssVmkernelCsvValidation.TabIndex = 22 +$VssVmkernelCsvValidation.Text = "Vss Vmkernel CSV File:" +#~~< VssVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 80) +$VssVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssVmkernelCsvValidationCheck.TabIndex = 23 +$VssVmkernelCsvValidationCheck.Text = "" +#~~< VssPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidation = New-Object System.Windows.Forms.Label +$VssPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 100) +$VssPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VssPnicCsvValidation.TabIndex = 24 +$VssPnicCsvValidation.Text = "Vss Pnic CSV File:" +#~~< VssPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VssPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VssPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 100) +$VssPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VssPnicCsvValidationCheck.TabIndex = 25 +$VssPnicCsvValidationCheck.Text = "" +#~~< VdSwitchCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidation = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidation.Location = New-Object System.Drawing.Point(270, 120) +$VdSwitchCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdSwitchCsvValidation.TabIndex = 26 +$VdSwitchCsvValidation.Text = "VdSwitch CSV File:" +#~~< VdSwitchCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdSwitchCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdSwitchCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 120) +$VdSwitchCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdSwitchCsvValidationCheck.TabIndex = 27 +$VdSwitchCsvValidationCheck.Text = "" +#~~< VdsPortGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidation = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidation.Location = New-Object System.Drawing.Point(270, 140) +$VdsPortGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPortGroupCsvValidation.TabIndex = 28 +$VdsPortGroupCsvValidation.Text = "Vds Port Group CSV File:" +#~~< VdsPortGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPortGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPortGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 140) +$VdsPortGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPortGroupCsvValidationCheck.TabIndex = 29 +$VdsPortGroupCsvValidationCheck.Text = "" +#~~< VdsVmkernelCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidation = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidation.Location = New-Object System.Drawing.Point(270, 160) +$VdsVmkernelCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsVmkernelCsvValidation.TabIndex = 30 +$VdsVmkernelCsvValidation.Text = "Vds Vmkernel CSV File:" +#~~< VdsVmkernelCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsVmkernelCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsVmkernelCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 160) +$VdsVmkernelCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsVmkernelCsvValidationCheck.TabIndex = 31 +$VdsVmkernelCsvValidationCheck.Text = "" +#~~< VdsPnicCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidation = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidation.Location = New-Object System.Drawing.Point(270, 180) +$VdsPnicCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$VdsPnicCsvValidation.TabIndex = 32 +$VdsPnicCsvValidation.Text = "Vds Pnic CSV File:" +#~~< VdsPnicCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VdsPnicCsvValidationCheck = New-Object System.Windows.Forms.Label +$VdsPnicCsvValidationCheck.Location = New-Object System.Drawing.Point(440, 180) +$VdsPnicCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$VdsPnicCsvValidationCheck.TabIndex = 33 +$VdsPnicCsvValidationCheck.Text = "" +#~~< FolderCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidation = New-Object System.Windows.Forms.Label +$FolderCsvValidation.Location = New-Object System.Drawing.Point(530, 40) +$FolderCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$FolderCsvValidation.TabIndex = 34 +$FolderCsvValidation.Text = "Folder CSV File:" +#~~< FolderCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$FolderCsvValidationCheck = New-Object System.Windows.Forms.Label +$FolderCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 40) +$FolderCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$FolderCsvValidationCheck.TabIndex = 35 +$FolderCsvValidationCheck.Text = "" +#~~< RdmCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidation = New-Object System.Windows.Forms.Label +$RdmCsvValidation.Location = New-Object System.Drawing.Point(530, 60) +$RdmCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$RdmCsvValidation.TabIndex = 36 +$RdmCsvValidation.Text = "RDM CSV File:" +#~~< RdmCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$RdmCsvValidationCheck = New-Object System.Windows.Forms.Label +$RdmCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 60) +$RdmCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$RdmCsvValidationCheck.TabIndex = 37 +$RdmCsvValidationCheck.Text = "" +#~~< DrsRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 80) +$DrsRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsRuleCsvValidation.TabIndex = 38 +$DrsRuleCsvValidation.Text = "DRS Rule CSV File:" +#~~< DrsRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 80) +$DrsRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsRuleCsvValidationCheck.TabIndex = 39 +$DrsRuleCsvValidationCheck.Text = "" +#~~< DrsClusterGroupCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidation = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidation.Location = New-Object System.Drawing.Point(530, 100) +$DrsClusterGroupCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsClusterGroupCsvValidation.TabIndex = 40 +$DrsClusterGroupCsvValidation.Text = "DRS Cluster Group CSV File:" +#~~< DrsClusterGroupCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsClusterGroupCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsClusterGroupCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 100) +$DrsClusterGroupCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsClusterGroupCsvValidationCheck.TabIndex = 41 +$DrsClusterGroupCsvValidationCheck.Text = "" +#~~< DrsVmHostRuleCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidation = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidation.Location = New-Object System.Drawing.Point(530, 120) +$DrsVmHostRuleCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$DrsVmHostRuleCsvValidation.TabIndex = 42 +$DrsVmHostRuleCsvValidation.Text = "DRS VmHost Rule CSV File:" +#~~< DrsVmHostRuleCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrsVmHostRuleCsvValidationCheck = New-Object System.Windows.Forms.Label +$DrsVmHostRuleCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 120) +$DrsVmHostRuleCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$DrsVmHostRuleCsvValidationCheck.TabIndex = 43 +$DrsVmHostRuleCsvValidationCheck.Text = "" +#~~< ResourcePoolCsvValidation >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidation = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidation.Location = New-Object System.Drawing.Point(530, 140) +$ResourcePoolCsvValidation.Size = New-Object System.Drawing.Size(165, 20) +$ResourcePoolCsvValidation.TabIndex = 44 +$ResourcePoolCsvValidation.Text = "Resource Pool CSV File:" +#~~< ResourcePoolCsvValidationCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ResourcePoolCsvValidationCheck = New-Object System.Windows.Forms.Label +$ResourcePoolCsvValidationCheck.Location = New-Object System.Drawing.Point(700, 140) +$ResourcePoolCsvValidationCheck.Size = New-Object System.Drawing.Size(90, 20) +$ResourcePoolCsvValidationCheck.TabIndex = 45 +$ResourcePoolCsvValidationCheck.Text = "" +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton = New-Object System.Windows.Forms.Button +$CsvValidationButton.FlatStyle = [System.Windows.Forms.FlatStyle]::Popup +$CsvValidationButton.Location = New-Object System.Drawing.Point(8, 200) +$CsvValidationButton.Size = New-Object System.Drawing.Size(200, 25) +$CsvValidationButton.TabIndex = 2 +$CsvValidationButton.Text = "Check for CSVs" +$CsvValidationButton.UseVisualStyleBackColor = $false +$CsvValidationButton.BackColor = [System.Drawing.Color]::LightGray +#~~< VM_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Host_DrawCheckBox.Checked = $true +$VM_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 260) +$VM_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Host_DrawCheckBox.TabIndex = 48 +$VM_to_Host_DrawCheckBox.Text = "Create VM to Host Visio Drawing" +$VM_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Host_Complete = New-Object System.Windows.Forms.Label +$VM_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 260) +$VM_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Host_Complete.TabIndex = 49 +$VM_to_Host_Complete.Text = "" +#~~< VM_to_Folder_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Folder_DrawCheckBox.Checked = $true +$VM_to_Folder_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Folder_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 280) +$VM_to_Folder_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Folder_DrawCheckBox.TabIndex = 50 +$VM_to_Folder_DrawCheckBox.Text = "Create VM to Folder Visio Drawing" +$VM_to_Folder_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Folder_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Folder_Complete = New-Object System.Windows.Forms.Label +$VM_to_Folder_Complete.Location = New-Object System.Drawing.Point(315, 280) +$VM_to_Folder_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Folder_Complete.TabIndex = 51 +$VM_to_Folder_Complete.Text = "" +#~~< VMs_with_RDMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMs_with_RDMs_DrawCheckBox.Checked = $true +$VMs_with_RDMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMs_with_RDMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 300) +$VMs_with_RDMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VMs_with_RDMs_DrawCheckBox.TabIndex = 52 +$VMs_with_RDMs_DrawCheckBox.Text = "Create VMs with RDMs Visio Drawing" +$VMs_with_RDMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMs_with_RDMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMs_with_RDMs_Complete = New-Object System.Windows.Forms.Label +$VMs_with_RDMs_Complete.Location = New-Object System.Drawing.Point(315, 300) +$VMs_with_RDMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMs_with_RDMs_Complete.TabIndex = 53 +$VMs_with_RDMs_Complete.Text = "" +#~~< SRM_Protected_VMs_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$SRM_Protected_VMs_DrawCheckBox.Checked = $true +$SRM_Protected_VMs_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$SRM_Protected_VMs_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 320) +$SRM_Protected_VMs_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$SRM_Protected_VMs_DrawCheckBox.TabIndex = 54 +$SRM_Protected_VMs_DrawCheckBox.Text = "Create SRM Protected VMs Visio Drawing" +$SRM_Protected_VMs_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< SRM_Protected_VMs_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$SRM_Protected_VMs_Complete = New-Object System.Windows.Forms.Label +$SRM_Protected_VMs_Complete.Location = New-Object System.Drawing.Point(315, 320) +$SRM_Protected_VMs_Complete.Size = New-Object System.Drawing.Size(90, 20) +$SRM_Protected_VMs_Complete.TabIndex = 55 +$SRM_Protected_VMs_Complete.Text = "" +#~~< VM_to_Datastore_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_Datastore_DrawCheckBox.Checked = $true +$VM_to_Datastore_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_Datastore_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 340) +$VM_to_Datastore_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_Datastore_DrawCheckBox.TabIndex = 56 +$VM_to_Datastore_DrawCheckBox.Text = "Create VM to Datastore Visio Drawing" +$VM_to_Datastore_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_Datastore_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_Datastore_Complete = New-Object System.Windows.Forms.Label +$VM_to_Datastore_Complete.Location = New-Object System.Drawing.Point(315, 340) +$VM_to_Datastore_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_Datastore_Complete.TabIndex = 57 +$VM_to_Datastore_Complete.Text = "" +#~~< VM_to_ResourcePool_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VM_to_ResourcePool_DrawCheckBox.Checked = $true +$VM_to_ResourcePool_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VM_to_ResourcePool_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 360) +$VM_to_ResourcePool_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$VM_to_ResourcePool_DrawCheckBox.TabIndex = 58 +$VM_to_ResourcePool_DrawCheckBox.Text = "Create VM to ResourcePool Visio Drawing" +$VM_to_ResourcePool_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VM_to_ResourcePool_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VM_to_ResourcePool_Complete = New-Object System.Windows.Forms.Label +$VM_to_ResourcePool_Complete.Location = New-Object System.Drawing.Point(315, 360) +$VM_to_ResourcePool_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VM_to_ResourcePool_Complete.TabIndex = 59 +$VM_to_ResourcePool_Complete.Text = "" +#~~< Datastore_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Datastore_to_Host_DrawCheckBox.Checked = $true +$Datastore_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Datastore_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 380) +$Datastore_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$Datastore_to_Host_DrawCheckBox.TabIndex = 60 +$Datastore_to_Host_DrawCheckBox.Text = "Create Datastore to Host Visio Drawing" +$Datastore_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Datastore_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Datastore_to_Host_Complete = New-Object System.Windows.Forms.Label +$Datastore_to_Host_Complete.Location = New-Object System.Drawing.Point(315, 380) +$Datastore_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Datastore_to_Host_Complete.TabIndex = 61 +$Datastore_to_Host_Complete.Text = "" +#~~< PhysicalNIC_to_vSwitch_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$PhysicalNIC_to_vSwitch_DrawCheckBox.Checked = $true +$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$PhysicalNIC_to_vSwitch_DrawCheckBox.Location = New-Object System.Drawing.Point(10, 400) +$PhysicalNIC_to_vSwitch_DrawCheckBox.Size = New-Object System.Drawing.Size(300, 20) +$PhysicalNIC_to_vSwitch_DrawCheckBox.TabIndex = 62 +$PhysicalNIC_to_vSwitch_DrawCheckBox.Text = "Create PhysicalNIC to vSwitch Visio Drawing" +$PhysicalNIC_to_vSwitch_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< PhysicalNIC_to_vSwitch_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PhysicalNIC_to_vSwitch_Complete = New-Object System.Windows.Forms.Label +$PhysicalNIC_to_vSwitch_Complete.Location = New-Object System.Drawing.Point(315, 400) +$PhysicalNIC_to_vSwitch_Complete.Size = New-Object System.Drawing.Size(90, 20) +$PhysicalNIC_to_vSwitch_Complete.TabIndex = 63 +$PhysicalNIC_to_vSwitch_Complete.Text = "" +#~~< VSS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSS_to_Host_DrawCheckBox.Checked = $true +$VSS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 260) +$VSS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSS_to_Host_DrawCheckBox.TabIndex = 64 +$VSS_to_Host_DrawCheckBox.Text = "Create VSS to Host Visio Drawing" +$VSS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VSS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 260) +$VSS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSS_to_Host_Complete.TabIndex = 65 +$VSS_to_Host_Complete.Text = "" +#~~< VMK_to_VSS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VSS_DrawCheckBox.Checked = $true +$VMK_to_VSS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VSS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 280) +$VMK_to_VSS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VSS_DrawCheckBox.TabIndex = 66 +$VMK_to_VSS_DrawCheckBox.Text = "Create Vmkernel to VSS Visio Drawing" +$VMK_to_VSS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VSS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VSS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VSS_Complete.Location = New-Object System.Drawing.Point(760, 280) +$VMK_to_VSS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VSS_Complete.TabIndex = 67 +$VMK_to_VSS_Complete.Text = "" +#~~< VSSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VSSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VSSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VSSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 300) +$VSSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VSSPortGroup_to_VM_DrawCheckBox.TabIndex = 68 +$VSSPortGroup_to_VM_DrawCheckBox.Text = "Create Vss Port Group to VM Visio Drawing" +$VSSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VSSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VSSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VSSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 300) +$VSSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VSSPortGroup_to_VM_Complete.TabIndex = 69 +$VSSPortGroup_to_VM_Complete.Text = "" +#~~< VDS_to_Host_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDS_to_Host_DrawCheckBox.Checked = $true +$VDS_to_Host_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDS_to_Host_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 320) +$VDS_to_Host_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDS_to_Host_DrawCheckBox.TabIndex = 70 +$VDS_to_Host_DrawCheckBox.Text = "Create VDS to Host Visio Drawing" +$VDS_to_Host_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDS_to_Host_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDS_to_Host_Complete = New-Object System.Windows.Forms.Label +$VDS_to_Host_Complete.Location = New-Object System.Drawing.Point(760, 320) +$VDS_to_Host_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDS_to_Host_Complete.TabIndex = 71 +$VDS_to_Host_Complete.Text = "" +#~~< VMK_to_VDS_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VMK_to_VDS_DrawCheckBox.Checked = $true +$VMK_to_VDS_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VMK_to_VDS_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 340) +$VMK_to_VDS_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VMK_to_VDS_DrawCheckBox.TabIndex = 72 +$VMK_to_VDS_DrawCheckBox.Text = "Create Vmkernel to VDS Visio Drawing" +$VMK_to_VDS_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VMK_to_VDS_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VMK_to_VDS_Complete = New-Object System.Windows.Forms.Label +$VMK_to_VDS_Complete.Location = New-Object System.Drawing.Point(760, 340) +$VMK_to_VDS_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VMK_to_VDS_Complete.TabIndex = 73 +$VMK_to_VDS_Complete.Text = "" +#~~< VDSPortGroup_to_VM_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$VDSPortGroup_to_VM_DrawCheckBox.Checked = $true +$VDSPortGroup_to_VM_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$VDSPortGroup_to_VM_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 360) +$VDSPortGroup_to_VM_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$VDSPortGroup_to_VM_DrawCheckBox.TabIndex = 74 +$VDSPortGroup_to_VM_DrawCheckBox.Text = "Create Vds Port Group to VM Visio Drawing" +$VDSPortGroup_to_VM_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< VDSPortGroup_to_VM_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VDSPortGroup_to_VM_Complete = New-Object System.Windows.Forms.Label +$VDSPortGroup_to_VM_Complete.Location = New-Object System.Drawing.Point(760, 360) +$VDSPortGroup_to_VM_Complete.Size = New-Object System.Drawing.Size(90, 20) +$VDSPortGroup_to_VM_Complete.TabIndex = 75 +$VDSPortGroup_to_VM_Complete.Text = "" +#~~< Cluster_to_DRS_Rule_DrawCheckBox >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_DrawCheckBox = New-Object System.Windows.Forms.CheckBox +$Cluster_to_DRS_Rule_DrawCheckBox.Checked = $true +$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = [System.Windows.Forms.CheckState]::Checked +$Cluster_to_DRS_Rule_DrawCheckBox.Location = New-Object System.Drawing.Point(425, 380) +$Cluster_to_DRS_Rule_DrawCheckBox.Size = New-Object System.Drawing.Size(330, 20) +$Cluster_to_DRS_Rule_DrawCheckBox.TabIndex = 76 +$Cluster_to_DRS_Rule_DrawCheckBox.Text = "Create Cluster to DRS Rule Visio Drawing" +$Cluster_to_DRS_Rule_DrawCheckBox.UseVisualStyleBackColor = $true +#~~< Cluster_to_DRS_Rule_Complete >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$Cluster_to_DRS_Rule_Complete = New-Object System.Windows.Forms.Label +$Cluster_to_DRS_Rule_Complete.Location = New-Object System.Drawing.Point(760, 380) +$Cluster_to_DRS_Rule_Complete.Size = New-Object System.Drawing.Size(90, 20) +$Cluster_to_DRS_Rule_Complete.TabIndex = 77 +$Cluster_to_DRS_Rule_Complete.Text = "" + +$TabDraw.Controls.Add($OpenVisioButton) +$TabDraw.Controls.Add($DrawCheckButton) +$TabDraw.Controls.Add($DrawButton) +$TabDraw.Controls.Add($DrawUncheckButton) +$TabDraw.Controls.Add($VisioOutputLabel) +$TabDraw.Controls.Add($VisioOpenOutputButton) +$TabDraw.Controls.Add($DrawCsvInputLabel) +$TabDraw.Controls.Add($DrawCsvInputButton) +$TabDraw.Controls.Add($vCenterCsvValidation) +$TabDraw.Controls.Add($vCenterCsvValidationCheck) +$TabDraw.Controls.Add($DatacenterCsvValidation) +$TabDraw.Controls.Add($DatacenterCsvValidationCheck) +$TabDraw.Controls.Add($ClusterCsvValidation) +$TabDraw.Controls.Add($ClusterCsvValidationCheck) +$TabDraw.Controls.Add($VmHostCsvValidation) +$TabDraw.Controls.Add($VmHostCsvValidationCheck) +$TabDraw.Controls.Add($VmCsvValidation) +$TabDraw.Controls.Add($VmCsvValidationCheck) +$TabDraw.Controls.Add($TemplateCsvValidation) +$TabDraw.Controls.Add($TemplateCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreClusterCsvValidation) +$TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) +$TabDraw.Controls.Add($DatastoreCsvValidation) +$TabDraw.Controls.Add($DatastoreCsvValidationCheck) +$TabDraw.Controls.Add($VsSwitchCsvValidation) +$TabDraw.Controls.Add($VsSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VssPortGroupCsvValidation) +$TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VssVmkernelCsvValidation) +$TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VssPnicCsvValidation) +$TabDraw.Controls.Add($VssPnicCsvValidationCheck) +$TabDraw.Controls.Add($VdSwitchCsvValidation) +$TabDraw.Controls.Add($VdSwitchCsvValidationCheck) +$TabDraw.Controls.Add($VdsPortGroupCsvValidation) +$TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) +$TabDraw.Controls.Add($VdsVmkernelCsvValidation) +$TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) +$TabDraw.Controls.Add($VdsPnicCsvValidation) +$TabDraw.Controls.Add($VdsPnicCsvValidationCheck) +$TabDraw.Controls.Add($FolderCsvValidation) +$TabDraw.Controls.Add($FolderCsvValidationCheck) +$TabDraw.Controls.Add($RdmCsvValidation) +$TabDraw.Controls.Add($RdmCsvValidationCheck) +$TabDraw.Controls.Add($DrsRuleCsvValidation) +$TabDraw.Controls.Add($DrsRuleCsvValidationCheck) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidation) +$TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidation) +$TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) +$TabDraw.Controls.Add($ResourcePoolCsvValidation) +$TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) +$TabDraw.Controls.Add($CsvValidationButton) +$TabDraw.Controls.Add($VM_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Host_Complete) +$TabDraw.Controls.Add($VM_to_Folder_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Folder_Complete) +$TabDraw.Controls.Add($VMs_with_RDMs_DrawCheckBox) +$TabDraw.Controls.Add($VMs_with_RDMs_Complete) +$TabDraw.Controls.Add($SRM_Protected_VMs_DrawCheckBox) +$TabDraw.Controls.Add($SRM_Protected_VMs_Complete) +$TabDraw.Controls.Add($VM_to_Datastore_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_Datastore_Complete) +$TabDraw.Controls.Add($VM_to_ResourcePool_DrawCheckBox) +$TabDraw.Controls.Add($VM_to_ResourcePool_Complete) +$TabDraw.Controls.Add($Datastore_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($Datastore_to_Host_Complete) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_DrawCheckBox) +$TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) +$TabDraw.Controls.Add($VSS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VSS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VSS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VSS_Complete) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($VDS_to_Host_DrawCheckBox) +$TabDraw.Controls.Add($VDS_to_Host_Complete) +$TabDraw.Controls.Add($VMK_to_VDS_DrawCheckBox) +$TabDraw.Controls.Add($VMK_to_VDS_Complete) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_DrawCheckBox) +$TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_DrawCheckBox) +$TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) +$SubTab.Controls.Add($TabDirections) +$SubTab.Controls.Add($TabCapture) +$SubTab.Controls.Add($TabDraw) +$SubTab.ForeColor = [System.Drawing.SystemColors]::ControlText +$SubTab.SelectedIndex = 0 +$vDiagram.Controls.Add($MainMenu) +$vDiagram.Controls.Add($MainTab) +$vDiagram.Controls.Add($SubTab) +#~~< VisioBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$VisioBrowse.Description = "Select a directory" +$VisioBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< DrawCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$DrawCsvBrowse.Description = "Select a directory" +$DrawCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer +#~~< CaptureCsvBrowse >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog +$CaptureCsvBrowse.Description = "Select a directory" +$CaptureCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + +#endregion + +#region Custom Code +#~~< PowershellCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowershellCheck = $PSVersionTable.PSVersion +if ($PowershellCheck.Major -ge 4) +{ + $PowershellInstalled.Forecolor = "Green" + $PowershellInstalled.Text = "Installed Version $PowershellCheck" +} +else +{ + $PowershellInstalled.Forecolor = "Red" + $PowershellInstalled.Text = "Not installed or Powershell version lower than 4" +} +#~~< PowerCliModuleCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$PowerCliModuleCheck = (Get-Module VMware.PowerCLI -ListAvailable | Where-Object { $_.Name -eq "VMware.PowerCLI" }) +$PowerCliModuleVersion = ($PowerCliModuleCheck.Version) +if ($PowerCliModuleCheck -ne $null) +{ + $PowerCliModuleInstalled.Forecolor = "Green" + $PowerCliModuleInstalled.Text = "Installed Version $PowerCliModuleVersion" +} +else +{ + $PowerCliModuleInstalled.Forecolor = "Red" + $PowerCliModuleInstalled.Text = "Not Installed" +} +#~~< PowerCliCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-PSSnapin -registered | Where-Object { $_.Name -eq "VMware.VimAutomation.Core" }) -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerClI Installed" +} +elseif ($PowerCliModuleCheck -ne $null) +{ + $PowerCliInstalled.Forecolor = "Green" + $PowerCliInstalled.Text = "PowerCLI Module Installed" +} +else +{ + $PowerCliInstalled.Forecolor = "Red" + $PowerCliInstalled.Text = "PowerCLI or PowerCli Module not installed" +} +#~~< VisioCheck >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +if ((Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -or (Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object {$_.DisplayName -like "*Visio*" -and $_.DisplayName -notlike "*Visio View*"} | Select-Object DisplayName) -ne $null) +{ + $VisioInstalled.Forecolor = "Green" + $VisioInstalled.Text = "Installed" +} +else +{ + $VisioInstalled.Forecolor = "Red" + $VisioInstalled.Text = "Visio is Not Installed" +} +#~~< ConnectButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$ConnectButton.Add_MouseClick({ $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager ; if ($Connected -eq $null) { $ConnectButton.Forecolor = [System.Drawing.Color]::Red ; $ConnectButton.Text = "Unable to Connect" } else { $ConnectButton.Forecolor = [System.Drawing.Color]::Green ; $ConnectButton.Text = "Connected to $DefaultViserver" } }) +$ConnectButton.Add_Click({ Connect_vCenter_Main }) +#~~< CaptureCsvOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCsvOutputButton.Add_Click( { Find_CaptureCsvFolder ; if ($CaptureCsvFolder -eq $null) { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Red ; $CaptureCsvOutputButton.Text = "Folder Not Selected" } else { $CaptureCsvOutputButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureCsvOutputButton.Text = $CaptureCsvFolder } +Check_CaptureCsvFolder } ) +#$CaptureCsvOutputButton.Add_Click({ Check_CaptureCsvFolder }) +#~~< CaptureUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureUncheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "UnChecked" ; $DatacenterCsvCheckBox.CheckState = "UnChecked" ; $ClusterCsvCheckBox.CheckState = "UnChecked" ; $VmHostCsvCheckBox.CheckState = "UnChecked" ; $VmCsvCheckBox.CheckState = "UnChecked" ; $TemplateCsvCheckBox.CheckState = "UnChecked" ; $DatastoreClusterCsvCheckBox.CheckState = "UnChecked" ; $DatastoreCsvCheckBox.CheckState = "UnChecked" ; $VsSwitchCsvCheckBox.CheckState = "UnChecked" ; $VssPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VssVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VssPnicCsvCheckBox.CheckState = "UnChecked" ; $VdSwitchCsvCheckBox.CheckState = "UnChecked" ; $VdsPortGroupCsvCheckBox.CheckState = "UnChecked" ; $VdsVmkernelCsvCheckBox.CheckState = "UnChecked" ; $VdsPnicCsvCheckBox.CheckState = "UnChecked" ; $FolderCsvCheckBox.CheckState = "UnChecked" ; $RdmCsvCheckBox.CheckState = "UnChecked" ; $DrsRuleCsvCheckBox.CheckState = "UnChecked" ; $DrsClusterGroupCsvCheckBox.CheckState = "UnChecked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "UnChecked" ; $ResourcePoolCsvCheckBox.CheckState = "UnChecked" }) +#~~< CaptureCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureCheckButton.Add_Click({ $vCenterCsvCheckBox.CheckState = "Checked" ; $DatacenterCsvCheckBox.CheckState = "Checked" ; $ClusterCsvCheckBox.CheckState = "Checked" ; $VmHostCsvCheckBox.CheckState = "Checked" ; $VmCsvCheckBox.CheckState = "Checked" ; $TemplateCsvCheckBox.CheckState = "Checked" ; $DatastoreClusterCsvCheckBox.CheckState = "Checked" ; $DatastoreCsvCheckBox.CheckState = "Checked" ; $VsSwitchCsvCheckBox.CheckState = "Checked" ; $VssPortGroupCsvCheckBox.CheckState = "Checked" ; $VssVmkernelCsvCheckBox.CheckState = "Checked" ; $VssPnicCsvCheckBox.CheckState = "Checked" ; $VdSwitchCsvCheckBox.CheckState = "Checked" ; $VdsPortGroupCsvCheckBox.CheckState = "Checked" ; $VdsVmkernelCsvCheckBox.CheckState = "Checked" ; $VdsPnicCsvCheckBox.CheckState = "Checked" ; $FolderCsvCheckBox.CheckState = "Checked" ; $RdmCsvCheckBox.CheckState = "Checked" ; $DrsRuleCsvCheckBox.CheckState = "Checked" ; $DrsClusterGroupCsvCheckBox.CheckState = "Checked" ; $DrsVmHostRuleCsvCheckBox.CheckState = "Checked" ; $ResourcePoolCsvCheckBox.CheckState = "Checked" }) +#~~< CaptureButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CaptureButton.Add_Click({ + if($CaptureCsvFolder -eq $null) + { + $CaptureButton.Forecolor = [System.Drawing.Color]::Red; $CaptureButton.Text = "Folder Not Selected" + } + else + { + if ($vCenterCsvCheckBox.Checked -eq "True") + { + $vCenterCsvValidationComplete.Forecolor = "Blue" + $vCenterCsvValidationComplete.Text = "Processing ....." + vCenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vCenterExportFileComplete = $CsvCompleteDir + "-vCenterExport.csv" + $vCenterCsvComplete = Test-Path $vCenterExportFileComplete + if ($vCenterCsvComplete -eq $True) + { + $vCenterCsvValidationComplete.Forecolor = "Green" + $vCenterCsvValidationComplete.Text = "Complete" + } + else + { + $vCenterCsvValidationComplete.Forecolor = "Red" + $vCenterCsvValidationComplete.Text = "Not Complete" + } + } + Connect_vCenter + $Connected = Get-View $DefaultViserver.ExtensionData.Client.ServiceContent.SessionManager + if ($Connected -eq $null) { Connect_vCenter_Main } + $ConnectButton.Forecolor = [System.Drawing.Color]::Green + $ConnectButton.Text = "Connected to $DefaultViserver" + if ($DatacenterCsvCheckBox.Checked -eq "True") + { + $DatacenterCsvValidationComplete.Forecolor = "Blue" + $DatacenterCsvValidationComplete.Text = "Processing ....." + Datacenter_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatacenterExportFileComplete = $CsvCompleteDir + "-DatacenterExport.csv" + $DatacenterCsvComplete = Test-Path $DatacenterExportFileComplete + if ($DatacenterCsvComplete -eq $True) + { + $DatacenterCsvValidationComplete.Forecolor = "Green" + $DatacenterCsvValidationComplete.Text = "Complete" + } + else + { + $DatacenterCsvValidationComplete.Forecolor = "Red" + $DatacenterCsvValidationComplete.Text = "Not Complete" + } + } + if ($ClusterCsvCheckBox.Checked -eq "True") + { + $ClusterCsvValidationComplete.Forecolor = "Blue" + $ClusterCsvValidationComplete.Text = "Processing ....." + Cluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ClusterExportFileComplete = $CsvCompleteDir + "-ClusterExport.csv" + $ClusterCsvComplete = Test-Path $ClusterExportFileComplete + if ($ClusterCsvComplete -eq $True) + { + $ClusterCsvValidationComplete.Forecolor = "Green" + $ClusterCsvValidationComplete.Text = "Complete" + } + else + { + $ClusterCsvValidationComplete.Forecolor = "Red" + $ClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmHostCsvCheckBox.Checked -eq "True") + { + $VmHostCsvValidationComplete.Forecolor = "Blue" + $VmHostCsvValidationComplete.Text = "Processing ....." + VmHost_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmHostExportFileComplete = $CsvCompleteDir + "-VmHostExport.csv" + $VmHostCsvComplete = Test-Path $VmHostExportFileComplete + if ($VmHostCsvComplete -eq $True) + { + $VmHostCsvValidationComplete.Forecolor = "Green" + $VmHostCsvValidationComplete.Text = "Complete" + } + else + { + $VmHostCsvValidationComplete.Forecolor = "Red" + $VmHostCsvValidationComplete.Text = "Not Complete" + } + } + if ($VmCsvCheckBox.Checked -eq "True") + { + $VmCsvValidationComplete.Forecolor = "Blue" + $VmCsvValidationComplete.Text = "Processing ....." + Vm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VmExportFileComplete = $CsvCompleteDir + "-VmExport.csv" + $VmCsvComplete = Test-Path $VmExportFileComplete + if ($VmCsvComplete -eq $True) + { + $VmCsvValidationComplete.Forecolor = "Green" + $VmCsvValidationComplete.Text = "Complete" + } + else + { + $VmCsvValidationComplete.Forecolor = "Red" + $VmCsvValidationComplete.Text = "Not Complete" + } + } + if ($TemplateCsvCheckBox.Checked -eq "True") + { + $TemplateCsvValidationComplete.Forecolor = "Blue" + $TemplateCsvValidationComplete.Text = "Processing ....." + Template_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $TemplateExportFileComplete = $CsvCompleteDir + "-TemplateExport.csv" + $TemplateCsvComplete = Test-Path $TemplateExportFileComplete + if ($TemplateCsvComplete -eq $True) + { + $TemplateCsvValidationComplete.Forecolor = "Green" + $TemplateCsvValidationComplete.Text = "Complete" + } + else + { + $TemplateCsvValidationComplete.Forecolor = "Red" + $TemplateCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreClusterCsvCheckBox.Checked -eq "True") + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Blue" + $DatastoreClusterCsvValidationComplete.Text = "Processing ....." + DatastoreCluster_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreClusterExportFileComplete = $CsvCompleteDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvComplete = Test-Path $DatastoreClusterExportFileComplete + if ($DatastoreClusterCsvComplete -eq $True) + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Green" + $DatastoreClusterCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreClusterCsvValidationComplete.Forecolor = "Red" + $DatastoreClusterCsvValidationComplete.Text = "Not Complete" + } + } + if ($DatastoreCsvCheckBox.Checked -eq "True") + { + $DatastoreCsvValidationComplete.Forecolor = "Blue" + $DatastoreCsvValidationComplete.Text = "Processing ....." + Datastore_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DatastoreExportFileComplete = $CsvCompleteDir + "-DatastoreExport.csv" + $DatastoreCsvComplete = Test-Path $DatastoreExportFileComplete + if ($DatastoreCsvComplete -eq $True) + { + $DatastoreCsvValidationComplete.Forecolor = "Green" + $DatastoreCsvValidationComplete.Text = "Complete" + } + else + { + $DatastoreCsvValidationComplete.Forecolor = "Red" + $DatastoreCsvValidationComplete.Text = "Not Complete" + } + } + if ($VsSwitchCsvCheckBox.Checked -eq "True") + { + $VsSwitchCsvValidationComplete.Forecolor = "Blue" + $VsSwitchCsvValidationComplete.Text = "Processing ....." + VsSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $vSSwitchExportFileComplete = $CsvCompleteDir + "-vSSwitchExport.csv" + $vSSwitchCsvComplete = Test-Path $vSSwitchExportFileComplete + if ($vSSwitchCsvComplete -eq $True) + { + $vSSwitchCsvValidationComplete.Forecolor = "Green" + $vSSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $vSSwitchCsvValidationComplete.Forecolor = "Red" + $vSSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPortGroupCsvCheckBox.Checked -eq "True") + { + $VssPortGroupCsvValidationComplete.Forecolor = "Blue" + $VssPortGroupCsvValidationComplete.Text = "Processing ....." + VssPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPortGroupExportFileComplete = $CsvCompleteDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvComplete = Test-Path $VssPortGroupExportFileComplete + if ($VssPortGroupCsvComplete -eq $True) + { + $VssPortGroupCsvValidationComplete.Forecolor = "Green" + $VssPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VssPortGroupCsvValidationComplete.Forecolor = "Red" + $VssPortGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssVmkernelCsvCheckBox.Checked -eq "True") + { + $VssVmkernelCsvValidationComplete.Forecolor = "Blue" + $VssVmkernelCsvValidationComplete.Text = "Processing ....." + VssVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssVmkernelExportFileComplete = $CsvCompleteDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvComplete = Test-Path $VssVmkernelExportFileComplete + if ($VssVmkernelCsvComplete -eq $True) + { + $VssVmkernelCsvValidationComplete.Forecolor = "Green" + $VssVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VssVmkernelCsvValidationComplete.Forecolor = "Red" + $VssVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VssPnicCsvCheckBox.Checked -eq "True") + { + $VssPnicCsvValidationComplete.Forecolor = "Blue" + $VssPnicCsvValidationComplete.Text = "Processing ....." + VssPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VssPnicExportFileComplete = $CsvCompleteDir + "-VssPnicExport.csv" + $VssPnicCsvComplete = Test-Path $VssPnicExportFileComplete + if ($VssPnicCsvComplete -eq $True) + { + $VssPnicCsvValidationComplete.Forecolor = "Green" + $VssPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VssPnicCsvValidationComplete.Forecolor = "Red" + $VssPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdSwitchCsvCheckBox.Checked -eq "True") + { + $VdSwitchCsvValidationComplete.Forecolor = "Blue" + $VdSwitchCsvValidationComplete.Text = "Processing ....." + VdSwitch_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdSwitchExportFileComplete = $CsvCompleteDir + "-VdSwitchExport.csv" + $VdSwitchCsvComplete = Test-Path $VdSwitchExportFileComplete + if ($VdSwitchCsvComplete -eq $True) + { + $VdSwitchCsvValidationComplete.Forecolor = "Green" + $VdSwitchCsvValidationComplete.Text = "Complete" + } + else + { + $VdSwitchCsvValidationComplete.Forecolor = "Red" + $VdSwitchCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPortGroupCsvCheckBox.Checked -eq "True") + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Blue" + $VdsPortGroupCsvValidationComplete.Text = "Processing ....." + VdsPort_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPortGroupExportFileComplete = $CsvCompleteDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvComplete = Test-Path $VdsPortGroupExportFileComplete + if ($VdsPortGroupCsvComplete -eq $True) + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Green" + $VdsPortGroupCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPortGroupCsvValidationComplete.Forecolor = "Red" + $VdsPortGroupCsvValidationComplete.Text = "Not Complete" + + } + } + if ($VdsVmkernelCsvCheckBox.Checked -eq "True") + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Blue" + $VdsVmkernelCsvValidationComplete.Text = "Processing ....." + VdsVmk_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsVmkernelExportFileComplete = $CsvCompleteDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvComplete = Test-Path $VdsVmkernelExportFileComplete + if ($VdsVmkernelCsvComplete -eq $True) + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Green" + $VdsVmkernelCsvValidationComplete.Text = "Complete" + } + else + { + $VdsVmkernelCsvValidationComplete.Forecolor = "Red" + $VdsVmkernelCsvValidationComplete.Text = "Not Complete" + } + } + if ($VdsPnicCsvCheckBox.Checked -eq "True") + { + $VdsPnicCsvValidationComplete.Forecolor = "Blue" + $VdsPnicCsvValidationComplete.Text = "Processing ....." + VdsPnic_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $VdsPnicExportFileComplete = $CsvCompleteDir + "-VdsPnicExport.csv" + $VdsPnicCsvComplete = Test-Path $VdsPnicExportFileComplete + if ($VdsPnicCsvComplete -eq $True) + { + $VdsPnicCsvValidationComplete.Forecolor = "Green" + $VdsPnicCsvValidationComplete.Text = "Complete" + } + else + { + $VdsPnicCsvValidationComplete.Forecolor = "Red" + $VdsPnicCsvValidationComplete.Text = "Not Complete" + } + } + if ($FolderCsvCheckBox.Checked -eq "True") + { + $FolderCsvValidationComplete.Forecolor = "Blue" + $FolderCsvValidationComplete.Text = "Processing ....." + Folder_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $FolderExportFileComplete = $CsvCompleteDir + "-FolderExport.csv" + $FolderCsvComplete = Test-Path $FolderExportFileComplete + if ($FolderCsvComplete -eq $True) + { + $FolderCsvValidationComplete.Forecolor = "Green" + $FolderCsvValidationComplete.Text = "Complete" + } + else + { + $FolderCsvValidationComplete.Forecolor = "Red" + $FolderCsvValidationComplete.Text = "Not Complete" + } + } + if ($RdmCsvCheckBox.Checked -eq "True") + { + $RdmCsvValidationComplete.Forecolor = "Blue" + $RdmCsvValidationComplete.Text = "Processing ....." + Rdm_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $RdmExportFileComplete = $CsvCompleteDir + "-RdmExport.csv" + $RdmCsvComplete = Test-Path $RdmExportFileComplete + if ($RdmCsvComplete -eq $True) + { + $RdmCsvValidationComplete.Forecolor = "Green" + $RdmCsvValidationComplete.Text = "Complete" + } + else + { + $RdmCsvValidationComplete.Forecolor = "Red" + $RdmCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsRuleCsvCheckBox.Checked -eq "True") + { + $DrsRuleCsvValidationComplete.Forecolor = "Blue" + $DrsRuleCsvValidationComplete.Text = "Processing ....." + Drs_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsRuleExportFileComplete = $CsvCompleteDir + "-DrsRuleExport.csv" + $DrsRuleCsvComplete = Test-Path $DrsRuleExportFileComplete + if ($DrsRuleCsvComplete -eq $True) + { + $DrsRuleCsvValidationComplete.Forecolor = "Green" + $DrsRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsRuleCsvValidationComplete.Forecolor = "Red" + $DrsRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsClusterGroupCsvCheckBox.Checked -eq "True") + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Blue" + $DrsClusterGroupCsvValidationComplete.Text = "Processing ....." + Drs_Cluster_Group_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsClusterGroupExportFileComplete = $CsvCompleteDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvComplete = Test-Path $DrsClusterGroupExportFileComplete + if ($DrsClusterGroupCsvComplete -eq $True) + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Green" + $DrsClusterGroupCsvValidationComplete.Text = "Complete" + } + else + { + $DrsClusterGroupCsvValidationComplete.Forecolor = "Red" + $DrsClusterGroupCsvValidationComplete.Text = "Not Complete" + } + } + if ($DrsVmHostRuleCsvCheckBox.Checked -eq "True") + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Blue" + $DrsVmHostRuleCsvValidationComplete.Text = "Processing ....." + Drs_VmHost_Rule_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $DrsVmHostRuleExportFileComplete = $CsvCompleteDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvComplete = Test-Path $DrsVmHostRuleExportFileComplete + if ($DrsVmHostRuleCsvComplete -eq $True) + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Green" + $DrsVmHostRuleCsvValidationComplete.Text = "Complete" + } + else + { + $DrsVmHostRuleCsvValidationComplete.Forecolor = "Red" + $DrsVmHostRuleCsvValidationComplete.Text = "Not Complete" + } + } + if ($ResourcePoolCsvCheckBox.Checked -eq "True") + { + $ResourcePoolCsvValidationComplete.Forecolor = "Blue" + $ResourcePoolCsvValidationComplete.Text = "Processing ....." + Resource_Pool_Export + $CsvCompleteDir = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $ResourcePoolExportFileComplete = $CsvCompleteDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvComplete = Test-Path $ResourcePoolExportFileComplete + if ($ResourcePoolCsvComplete -eq $True) + { + $ResourcePoolCsvValidationComplete.Forecolor = "Green" + $ResourcePoolCsvValidationComplete.Text = "Complete" + } + else + { + $ResourcePoolCsvValidationComplete.Forecolor = "Red" + $ResourcePoolCsvValidationComplete.Text = "Not Complete" + } + } + Disconnect_vCenter + $ConnectButton.Forecolor = [System.Drawing.Color]::Red + $ConnectButton.Text = "Disconnected" + $CaptureButton.Forecolor = [System.Drawing.Color]::Green ; $CaptureButton.Text = "CSV Collection Complete" + } +}) +#~~< DrawCsvInputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCsvInputButton.Add_MouseClick({ Find_DrawCsvFolder ; if ($DrawCsvFolder -eq $null) { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Red ; $DrawCsvInputButton.Text = "Folder Not Selected" } else { $DrawCsvInputButton.Forecolor = [System.Drawing.Color]::Green ; $DrawCsvInputButton.Text = $DrawCsvFolder } }) +$TabDraw.Controls.Add($DrawCsvInputButton) +#~~< CsvValidationButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$CsvValidationButton.Add_Click( +{ + $CsvInputDir = $DrawCsvFolder+"\"+$TargetVcenterTextBox.Text + $vCenterExportFile = $CsvInputDir + "-vCenterExport.csv" + $vCenterCsvExists = Test-Path $vCenterExportFile + $TabDraw.Controls.Add($vCenterCsvValidationCheck) + if ($vCenterCsvExists -eq $True) + { + + $vCenterCsvValidationCheck.Forecolor = "Green" + $vCenterCsvValidationCheck.Text = "Present" + } + else + { + $vCenterCsvValidationCheck.Forecolor = "Red" + $vCenterCsvValidationCheck.Text = "Not Present" + } + + $DatacenterExportFile = $CsvInputDir + "-DatacenterExport.csv" + $DatacenterCsvExists = Test-Path $DatacenterExportFile + $TabDraw.Controls.Add($DatacenterCsvValidationCheck) + + if ($DatacenterCsvExists -eq $True) + { + $DatacenterCsvValidationCheck.Forecolor = "Green" + $DatacenterCsvValidationCheck.Text = "Present" + } + else + { + $DatacenterCsvValidationCheck.Forecolor = "Red" + $DatacenterCsvValidationCheck.Text = "Not Present" + } + + $ClusterExportFile = $CsvInputDir + "-ClusterExport.csv" + $ClusterCsvExists = Test-Path $ClusterExportFile + $TabDraw.Controls.Add($ClusterCsvValidationCheck) + + if ($ClusterCsvExists -eq $True) + { + $ClusterCsvValidationCheck.Forecolor = "Green" + $ClusterCsvValidationCheck.Text = "Present" + } + else + { + $ClusterCsvValidationCheck.Forecolor = "Red" + $ClusterCsvValidationCheck.Text = "Not Present" + } + + $VmHostExportFile = $CsvInputDir + "-VmHostExport.csv" + $VmHostCsvExists = Test-Path $VmHostExportFile + $TabDraw.Controls.Add($VmHostCsvValidationCheck) + + if ($VmHostCsvExists -eq $True) + { + $VmHostCsvValidationCheck.Forecolor = "Green" + $VmHostCsvValidationCheck.Text = "Present" + } + else + { + $VmHostCsvValidationCheck.Forecolor = "Red" + $VmHostCsvValidationCheck.Text = "Not Present" + } + + $VmExportFile = $CsvInputDir + "-VmExport.csv" + $VmCsvExists = Test-Path $VmExportFile + $TabDraw.Controls.Add($VmCsvValidationCheck) + + if ($VmCsvExists -eq $True) + { + $VmCsvValidationCheck.Forecolor = "Green" + $VmCsvValidationCheck.Text = "Present" + } + else + { + $VmCsvValidationCheck.Forecolor = "Red" + $VmCsvValidationCheck.Text = "Not Present" + } + + $TemplateExportFile = $CsvInputDir + "-ClusterExport.csv" + $TemplateCsvExists = Test-Path $TemplateExportFile + $TabDraw.Controls.Add($TemplateCsvValidationCheck) + + if ($TemplateCsvExists -eq $True) + { + $TemplateCsvValidationCheck.Forecolor = "Green" + $TemplateCsvValidationCheck.Text = "Present" + } + else + { + $TemplateCsvValidationCheck.Forecolor = "Red" + $TemplateCsvValidationCheck.Text = "Not Present" + } + + $DatastoreClusterExportFile = $CsvInputDir + "-DatastoreClusterExport.csv" + $DatastoreClusterCsvExists = Test-Path $DatastoreClusterExportFile + $TabDraw.Controls.Add($DatastoreClusterCsvValidationCheck) + + if ($DatastoreClusterCsvExists -eq $True) + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Green" + $DatastoreClusterCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreClusterCsvValidationCheck.Forecolor = "Red" + $DatastoreClusterCsvValidationCheck.Text = "Not Present" + } + + $DatastoreExportFile = $CsvInputDir + "-DatastoreExport.csv" + $DatastoreCsvExists = Test-Path $DatastoreExportFile + $TabDraw.Controls.Add($DatastoreCsvValidationCheck) + + if ($DatastoreCsvExists -eq $True) + { + $DatastoreCsvValidationCheck.Forecolor = "Green" + $DatastoreCsvValidationCheck.Text = "Present" + } + else + { + $DatastoreCsvValidationCheck.Forecolor = "Red" + $DatastoreCsvValidationCheck.Text = "Not Present" + } + + $VsSwitchExportFile = $CsvInputDir + "-VsSwitchExport.csv" + $VsSwitchCsvExists = Test-Path $VsSwitchExportFile + $TabDraw.Controls.Add($VsSwitchCsvValidationCheck) + + if ($VsSwitchCsvExists -eq $True) + { + $VsSwitchCsvValidationCheck.Forecolor = "Green" + $VsSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VsSwitchCsvValidationCheck.Forecolor = "Red" + $VsSwitchCsvValidationCheck.Text = "Not Present" + $VSS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPortGroupExportFile = $CsvInputDir + "-VssPortGroupExport.csv" + $VssPortGroupCsvExists = Test-Path $VssPortGroupExportFile + $TabDraw.Controls.Add($VssPortGroupCsvValidationCheck) + + if ($VssPortGroupCsvExists -eq $True) + { + $VssPortGroupCsvValidationCheck.Forecolor = "Green" + $VssPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VssPortGroupCsvValidationCheck.Forecolor = "Red" + $VssPortGroupCsvValidationCheck.Text = "Not Present" + $VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VssVmkernelExportFile = $CsvInputDir + "-VssVmkernelExport.csv" + $VssVmkernelCsvExists = Test-Path $VssVmkernelExportFile + $TabDraw.Controls.Add($VssVmkernelCsvValidationCheck) + + if ($VssVmkernelCsvExists -eq $True) + { + $VssVmkernelCsvValidationCheck.Forecolor = "Green" + $VssVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VssVmkernelCsvValidationCheck.Forecolor = "Red" + $VssVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked" + } + + $VssPnicExportFile = $CsvInputDir + "-VssPnicExport.csv" + $VssPnicCsvExists = Test-Path $VssPnicExportFile + $TabDraw.Controls.Add($VssPnicCsvValidationCheck) + + if ($VssPnicCsvExists -eq $True) + { + $VssPnicCsvValidationCheck.Forecolor = "Green" + $VssPnicCsvValidationCheck.Text = "Present" + } + else + { + $VssPnicCsvValidationCheck.Forecolor = "Red" + $VssPnicCsvValidationCheck.Text = "Not Present" + } + + $VdSwitchExportFile = $CsvInputDir + "-VdSwitchExport.csv" + $VdSwitchCsvExists = Test-Path $VdSwitchExportFile + $TabDraw.Controls.Add($VdSwitchCsvValidationCheck) + + if ($VdSwitchCsvExists -eq $True) + { + $VdSwitchCsvValidationCheck.Forecolor = "Green" + $VdSwitchCsvValidationCheck.Text = "Present" + } + else + { + $VdSwitchCsvValidationCheck.Forecolor = "Red" + $VdSwitchCsvValidationCheck.Text = "Not Present" + $VDS_to_Host_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPortGroupExportFile = $CsvInputDir + "-VdsPortGroupExport.csv" + $VdsPortGroupCsvExists = Test-Path $VdsPortGroupExportFile + $TabDraw.Controls.Add($VdsPortGroupCsvValidationCheck) + + if ($VdsPortGroupCsvExists -eq $True) + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Green" + $VdsPortGroupCsvValidationCheck.Text = "Present" + } + else + { + $VdsPortGroupCsvValidationCheck.Forecolor = "Red" + $VdsPortGroupCsvValidationCheck.Text = "Not Present" + $VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsVmkernelExportFile = $CsvInputDir + "-VdsVmkernelExport.csv" + $VdsVmkernelCsvExists = Test-Path $VdsVmkernelExportFile + $TabDraw.Controls.Add($VdsVmkernelCsvValidationCheck) + + if ($VdsVmkernelCsvExists -eq $True) + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Green" + $VdsVmkernelCsvValidationCheck.Text = "Present" + } + else + { + $VdsVmkernelCsvValidationCheck.Forecolor = "Red" + $VdsVmkernelCsvValidationCheck.Text = "Not Present" + $VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked" + } + + $VdsPnicExportFile = $CsvInputDir + "-VdsPnicExport.csv" + $VdsPnicCsvExists = Test-Path $VdsPnicExportFile + $TabDraw.Controls.Add($VdsPnicCsvValidationCheck) + + if ($VdsPnicCsvExists -eq $True) + { + $VdsPnicCsvValidationCheck.Forecolor = "Green" + $VdsPnicCsvValidationCheck.Text = "Present" + } + else + { + $VdsPnicCsvValidationCheck.Forecolor = "Red" + $VdsPnicCsvValidationCheck.Text = "Not Present" + } + + $FolderExportFile = $CsvInputDir + "-FolderExport.csv" + $FolderCsvExists = Test-Path $FolderExportFile + $TabDraw.Controls.Add($FolderCsvValidationCheck) + + if ($FolderCsvExists -eq $True) + { + $FolderCsvValidationCheck.Forecolor = "Green" + $FolderCsvValidationCheck.Text = "Present" + } + else + { + $FolderCsvValidationCheck.Forecolor = "Red" + $FolderCsvValidationCheck.Text = "Not Present" + } + + $RdmExportFile = $CsvInputDir + "-RdmExport.csv" + $RdmCsvExists = Test-Path $RdmExportFile + $TabDraw.Controls.Add($RdmCsvValidationCheck) + + if ($RdmCsvExists -eq $True) + { + $RdmCsvValidationCheck.Forecolor = "Green" + $RdmCsvValidationCheck.Text = "Present" + } + else + { + $RdmCsvValidationCheck.Forecolor = "Red" + $RdmCsvValidationCheck.Text = "Not Present" + $VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsRuleExportFile = $CsvInputDir + "-DrsRuleExport.csv" + $DrsRuleCsvExists = Test-Path $DrsRuleExportFile + $TabDraw.Controls.Add($DrsRuleCsvValidationCheck) + + if ($DrsRuleCsvExists -eq $True) + { + $DrsRuleCsvValidationCheck.Forecolor = "Green" + $DrsRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsRuleCsvValidationCheck.Forecolor = "Red" + $DrsRuleCsvValidationCheck.Text = "Not Present" + $Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked" + } + + $DrsClusterGroupExportFile = $CsvInputDir + "-DrsClusterGroupExport.csv" + $DrsClusterGroupCsvExists = Test-Path $DrsClusterGroupExportFile + $TabDraw.Controls.Add($DrsClusterGroupCsvValidationCheck) + + if ($DrsClusterGroupCsvExists -eq $True) + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Green" + $DrsClusterGroupCsvValidationCheck.Text = "Present" + } + else + { + $DrsClusterGroupCsvValidationCheck.Forecolor = "Red" + $DrsClusterGroupCsvValidationCheck.Text = "Not Present" + } + + $DrsVmHostRuleExportFile = $CsvInputDir + "-DrsVmHostRuleExport.csv" + $DrsVmHostRuleCsvExists = Test-Path $DrsVmHostRuleExportFile + $TabDraw.Controls.Add($DrsVmHostRuleCsvValidationCheck) + + if ($DrsVmHostRuleCsvExists -eq $True) + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Green" + $DrsVmHostRuleCsvValidationCheck.Text = "Present" + } + else + { + $DrsVmHostRuleCsvValidationCheck.Forecolor = "Red" + $DrsVmHostRuleCsvValidationCheck.Text = "Not Present" + } + + $ResourcePoolExportFile = $CsvInputDir + "-ResourcePoolExport.csv" + $ResourcePoolCsvExists = Test-Path $ResourcePoolExportFile + $TabDraw.Controls.Add($ResourcePoolCsvValidationCheck) + + if ($ResourcePoolCsvExists -eq $True) + { + $ResourcePoolCsvValidationCheck.Forecolor = "Green" + $ResourcePoolCsvValidationCheck.Text = "Present" + } + else + { + $ResourcePoolCsvValidationCheck.Forecolor = "Red" + $ResourcePoolCsvValidationCheck.Text = "Not Present" + $VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked" + } +} ) +$CsvValidationButton.Add_MouseClick({ $CsvValidationButton.Forecolor = [System.Drawing.Color]::Green ; $CsvValidationButton.Text = "CSV Validation Complete" }) +$TabDraw.Controls.Add($CsvValidationButton) +#~~< VisioOpenOutputButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$VisioOpenOutputButton.Add_MouseClick({Find_DrawVisioFolder; if($VisioFolder -eq $null){$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Red; $VisioOpenOutputButton.Text = "Folder Not Selected"}else{$VisioOpenOutputButton.Forecolor = [System.Drawing.Color]::Green; $VisioOpenOutputButton.Text = $VisioFolder}}) +$TabDraw.Controls.Add($VisioOpenOutputButton) +#~~< DrawUncheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawUncheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "UnChecked";$VM_to_Folder_DrawCheckBox.CheckState = "UnChecked";$VMs_with_RDMs_DrawCheckBox.CheckState = "UnChecked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "UnChecked";$VM_to_Datastore_DrawCheckBox.CheckState = "UnChecked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "UnChecked";$Datastore_to_Host_DrawCheckBox.CheckState = "UnChecked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "UnChecked";$VSS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VSS_DrawCheckBox.CheckState = "UnChecked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$VDS_to_Host_DrawCheckBox.CheckState = "UnChecked";$VMK_to_VDS_DrawCheckBox.CheckState = "UnChecked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "UnChecked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "UnChecked"}) +$TabDraw.Controls.Add($DrawUncheckButton) +#~~< DrawCheckButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawCheckButton.Add_Click({$VM_to_Host_DrawCheckBox.CheckState = "Checked";$VM_to_Folder_DrawCheckBox.CheckState = "Checked";$VMs_with_RDMs_DrawCheckBox.CheckState = "Checked";$SRM_Protected_VMs_DrawCheckBox.CheckState = "Checked";$VM_to_Datastore_DrawCheckBox.CheckState = "Checked";$VM_to_ResourcePool_DrawCheckBox.CheckState = "Checked";$Datastore_to_Host_DrawCheckBox.CheckState = "Checked";$PhysicalNIC_to_vSwitch_DrawCheckBox.CheckState = "Checked";$VSS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VSS_DrawCheckBox.CheckState = "Checked";$VSSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VDS_to_Host_DrawCheckBox.CheckState = "Checked";$VMK_to_VDS_DrawCheckBox.CheckState = "Checked";$VDSPortGroup_to_VM_DrawCheckBox.CheckState = "Checked";$VdsVmkernelCsvCheckBox.CheckState = "Checked";$Cluster_to_DRS_Rule_DrawCheckBox.CheckState = "Checked"}) +$TabDraw.Controls.Add($DrawCheckButton) +#~~< DrawButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$DrawButton.Add_Click({if($VisioFolder -eq $null){$DrawButton.Forecolor = [System.Drawing.Color]::Red; $DrawButton.Text = "Folder Not Selected"}else{$DrawButton.Forecolor = [System.Drawing.Color]::Blue; $DrawButton.Text = "Drawing Please Wait"; Create_Visio_Base; +if ($VM_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Host_Complete.Forecolor = "Blue" + $VM_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Host_Complete) + VM_to_Host + $VM_to_Host_Complete.Forecolor = "Green" + $VM_to_Host_Complete.Text = "Complete" + $TabDraw.Controls.Add($VM_to_Host_Complete) +} +if ($VM_to_Folder_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Folder_Complete.Forecolor = "Blue" + $VM_to_Folder_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Folder_Complete) + VM_to_Folder + $VM_to_Folder_Complete.Forecolor = "Green" + $VM_to_Folder_Complete.Text = "Complete" +} +if ($VMs_with_RDMs_DrawCheckBox.Checked -eq "True") +{ + $VMs_with_RDMs_Complete.Forecolor = "Blue" + $VMs_with_RDMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMs_with_RDMs_Complete) + VMs_with_RDMs + $VMs_with_RDMs_Complete.Forecolor = "Green" + $VMs_with_RDMs_Complete.Text = "Complete" +} +if ($SRM_Protected_VMs_DrawCheckBox.Checked -eq "True") +{ + $SRM_Protected_VMs_Complete.Forecolor = "Blue" + $SRM_Protected_VMs_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($SRM_Protected_VMs_Complete) + SRM_Protected_VMs + $SRM_Protected_VMs_Complete.Forecolor = "Green" + $SRM_Protected_VMs_Complete.Text = "Complete" +} +if ($VM_to_Datastore_DrawCheckBox.Checked -eq "True") +{ + $VM_to_Datastore_Complete.Forecolor = "Blue" + $VM_to_Datastore_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_Datastore_Complete) + VM_to_Datastore + $VM_to_Datastore_Complete.Forecolor = "Green" + $VM_to_Datastore_Complete.Text = "Complete" +} +if ($VM_to_ResourcePool_DrawCheckBox.Checked -eq "True") +{ + $VM_to_ResourcePool_Complete.Forecolor = "Blue" + $VM_to_ResourcePool_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VM_to_ResourcePool_Complete) + VM_to_ResourcePool + $VM_to_ResourcePool_Complete.Forecolor = "Green" + $VM_to_ResourcePool_Complete.Text = "Complete" +} +if ($Datastore_to_Host_DrawCheckBox.Checked -eq "True") +{ + $Datastore_to_Host_Complete.Forecolor = "Blue" + $Datastore_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Datastore_to_Host_Complete) + Datastore_to_Host + $Datastore_to_Host_Complete.Forecolor = "Green" + $Datastore_to_Host_Complete.Text = "Complete" +} +if ($PhysicalNIC_to_vSwitch_DrawCheckBox.Checked -eq "True") +{ + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Blue" + $PhysicalNIC_to_vSwitch_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($PhysicalNIC_to_vSwitch_Complete) + PhysicalNIC_to_vSwitch + $PhysicalNIC_to_vSwitch_Complete.Forecolor = "Green" + $PhysicalNIC_to_vSwitch_Complete.Text = "Complete" +} +if ($VSS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VSS_to_Host_Complete.Forecolor = "Blue" + $VSS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSS_to_Host_Complete) + VSS_to_Host + $VSS_to_Host_Complete.Forecolor = "Green" + $VSS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VSS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VSS_Complete.Forecolor = "Blue" + $VMK_to_VSS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VSS_Complete) + VMK_to_VSS + $VMK_to_VSS_Complete.Forecolor = "Green" + $VMK_to_VSS_Complete.Text = "Complete" +} +if ($VSSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VSSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VSSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VSSPortGroup_to_VM_Complete) + VSSPortGroup_to_VM + $VSSPortGroup_to_VM_Complete.Forecolor = "Green" + $VSSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($VDS_to_Host_DrawCheckBox.Checked -eq "True") +{ + $VDS_to_Host_Complete.Forecolor = "Blue" + $VDS_to_Host_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDS_to_Host_Complete) + VDS_to_Host + $VDS_to_Host_Complete.Forecolor = "Green" + $VDS_to_Host_Complete.Text = "Complete" +} +if ($VMK_to_VDS_DrawCheckBox.Checked -eq "True") +{ + $VMK_to_VDS_Complete.Forecolor = "Blue" + $VMK_to_VDS_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VMK_to_VDS_Complete) + VMK_to_VDS + $VMK_to_VDS_Complete.Forecolor = "Green" + $VMK_to_VDS_Complete.Text = "Complete" +} +if ($VDSPortGroup_to_VM_DrawCheckBox.Checked -eq "True") +{ + $VDSPortGroup_to_VM_Complete.Forecolor = "Blue" + $VDSPortGroup_to_VM_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($VDSPortGroup_to_VM_Complete) + VDSPortGroup_to_VM + $VDSPortGroup_to_VM_Complete.Forecolor = "Green" + $VDSPortGroup_to_VM_Complete.Text = "Complete" +} +if ($Cluster_to_DRS_Rule_DrawCheckBox.Checked -eq "True") +{ + $Cluster_to_DRS_Rule_Complete.Forecolor = "Blue" + $Cluster_to_DRS_Rule_Complete.Text = "Processing ..." + $TabDraw.Controls.Add($Cluster_to_DRS_Rule_Complete) + Cluster_to_DRS_Rule + $Cluster_to_DRS_Rule_Complete.Forecolor = "Green" + $Cluster_to_DRS_Rule_Complete.Text = "Complete" +}; +$DrawButton.Forecolor = [System.Drawing.Color]::Green; $DrawButton.Text = "Visio Drawings Complete"}}) +$TabDraw.Controls.Add($DrawButton) +#~~< OpenVisioButton >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +$OpenVisioButton.Add_Click({Open_Final_Visio}) +$TabDraw.Controls.Add($OpenVisioButton) + +#endregion + +#region Event Loop + +function Main{ + [System.Windows.Forms.Application]::EnableVisualStyles() + [System.Windows.Forms.Application]::Run($vDiagram) +} + +#endregion + +#endregion + +#region Event Handlers + +#~~< vCenter Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect_vCenter_Main +{ + $MainVC = $MainVcenterTextBox.Text + $MainUser = $UserNameTextBox.Text + $MainvCenter = Connect-VIServer $MainVC -user $MainUser -password $PasswordTextBox.Text +} + +function Connect_vCenter +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $User = $UserNameTextBox.Text + $vCenter = Connect-VIServer $vCenterShortName -user $User -password $PasswordTextBox.Text +} + +function Disconnect_vCenter +{ + $Disconnect = Disconnect-ViServer * -Confirm:$false +} +#~~< Folder Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Find_CaptureCsvFolder +{ + $CaptureCsvBrowseLoop = $True + while ($CaptureCsvBrowseLoop) + { + if ($CaptureCsvBrowse.ShowDialog() -eq "OK") + { + $CaptureCsvBrowseLoop = $False + } + else + { + $CaptureCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($CaptureCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:CaptureCsvFolder = $CaptureCsvBrowse.SelectedPath +} + +function Check_CaptureCsvFolder +{ + $CheckContentPath = $CaptureCsvFolder + "\" + $TargetVcenterTextBox.Text + $CheckContentDir = $CheckContentPath + "*.csv" + $CheckContent = Test-Path $CheckContentDir + if ($CheckContent -eq "True") + { + $CheckContents_CaptureCsvFolder = [System.Windows.MessageBox]::Show("Files where found in the folder. Would you like to delete these files? Click 'Yes' to delete and 'No' move files to a new folder.","Warning!","YesNo","Error") + switch ($CheckContents_CaptureCsvFolder) { + 'Yes' + { + del $CheckContentDir + } + + 'No' + { + $CheckContentCsvBrowse = New-Object System.Windows.Forms.FolderBrowserDialog + $CheckContentCsvBrowse.Description = "Select a directory to copy files to" + $CheckContentCsvBrowse.RootFolder = [System.Environment+SpecialFolder]::MyComputer + $CheckContentCsvBrowse.ShowDialog() + $global:NewContentCsvFolder = $CheckContentCsvBrowse.SelectedPath + copy-item -Path $CheckContentDir -Destination $NewContentCsvFolder + del $CheckContentDir + } + } + } +} + +function Find_DrawCsvFolder +{ + $DrawCsvBrowseLoop = $True + while ($DrawCsvBrowseLoop) + { + if ($DrawCsvBrowse.ShowDialog() -eq "OK") + { + $DrawCsvBrowseLoop = $False + } + else + { + $DrawCsvBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if ($DrawCsvBrowseRes -eq "Cancel") + { + return + } + } + } + $global:DrawCsvFolder = $DrawCsvBrowse.SelectedPath +} + +function Find_DrawVisioFolder +{ + $VisioBrowseLoop = $True + while($VisioBrowseLoop) + { + if ($VisioBrowse.ShowDialog() -eq "OK") + { + $VisioBrowseLoop = $False + } + else + { + $VisioBrowseRes = [System.Windows.Forms.MessageBox]::Show("You clicked Cancel. Would you like to try again or exit?", "Select a location", [System.Windows.Forms.MessageBoxButtons]::RetryCancel) + if($VisioBrowseRes -eq "Cancel") + { + return + } + } + } + $global:VisioFolder = $VisioBrowse.SelectedPath +} +#~~< Export Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function vCenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Version" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Version } }, + @{ N = "Build" ; E = { $global:DefaultVIServer.ExtensionData.Content.About.Build } } | Export-Csv $vCenterExportFile -Append -NoTypeInformation + + if ($MainVcenterTextBox.Text -eq $TargetVcenterTextBox.Text) + { + $null + } + else + { + Disconnect_vCenter + } +} + +function Datacenter_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort-Object Name | + Select-Object Name | Export-Csv $DatacenterExportFile -Append -NoTypeInformation +} + +function Cluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Cluster $_.Name | Get-Datacenter } }, + @{ N = "HAEnabled" ; E = { $_.HAEnabled } }, + @{ N = "HAAdmissionControlEnabled" ; E = { $_.HAAdmissionControlEnabled } }, + @{ N = "AdmissionControlPolicyCpuFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyMemoryFailoverResourcesPercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent } }, + @{ N = "AdmissionControlPolicyFailoverLevel" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel } }, + @{ N = "AdmissionControlPolicyAutoComputePercentages" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages } }, + @{ N = "AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent" ; E = { $_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent } }, + @{ N = "DrsEnabled" ; E = { $_.DrsEnabled } }, + @{ N = "DrsAutomationLevel" ; E = { $_.DrsAutomationLevel } }, + @{ N = "VmMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.VmMonitoring } }, + @{ N = "HostMonitoring" ; E = { $_.ExtensionData.configuration.dasconfig.HostMonitoring } } | Export-Csv $ClusterExportFile -Append -NoTypeInformation +} + +function VmHost_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter = Get-View -Id $_.Parent -Property Name, Parent + while ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name, Parent + } + if ($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name } } }, + @{ N = "Cluster" ; E = { $Cluster = Get-View -Id $_.Parent -Property Name, Parent + while ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name, Parent + } + if ($Cluster -is [VMware.Vim.ClusterComputeResource]) { $Cluster.Name } } }, + @{ N = "Version" ; E = { $_.Config.Product.Version } }, + @{ N = "Build" ; E = { $_.Config.Product.Build } }, + @{ N = "Manufacturer" ; E = { $_.Summary.Hardware.Vendor } }, + @{ N = "Model" ; E = { $_.Summary.Hardware.Model } }, + @{ N = "ProcessorType" ; E = { $_.Summary.Hardware.CpuModel } }, + @{ N = "CpuMhz" ; E = { $_.Summary.Hardware.CpuMhz } }, + @{ N = "NumCpuPkgs" ; E = { $_.Summary.Hardware.NumCpuPkgs } }, + @{ N = "NumCpuCores" ; E = { $_.Summary.Hardware.NumCpuCores } }, + @{ N = "NumCpuThreads" ; E = { $_.Summary.Hardware.NumCpuThreads } }, + @{ N = "Memory" ; E = { [math]::Round([decimal]$_.Summary.Hardware.MemorySize / 1073741824) } }, + @{ N = "MaxEVCMode" ; E = { $_.Summary.MaxEVCModeKey } }, + @{ N = "NumNics" ; E = { $_.Summary.Hardware.NumNics } }, + @{ N = "IP" ; E = { $_.Config.Network.Vnic.Spec.Ip.IpAddress } }, + @{ N = "NumHBAs" ; E = { $_.Summary.Hardware.NumHBAs } } | Export-Csv $VmHostExportFile -Append -NoTypeInformation +} + +function Vm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + foreach ($Vm in(Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort-Object Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select-Object Name , + @{ N = "Datacenter" ; E = { Get-Datacenter -VM $_.Name -Server $vCenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Name -Server $vCenter } }, + @{ N = "VmHost" ; E = { Get-VmHost -VM $_.Name -Server $vCenter } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -VM $_.Name } }, + @{ N = "Datastore" ; E = { $_.Config.DatastoreUrl.Name } }, + @{ N = "ResourcePool" ; E = { Get-Vm $_.Name | Get-ResourcePool | Where-Object { $_ -notlike "Resources" } } }, + @{ N = "VsSwitch" ; E = { Get-VirtualSwitch -VM $_.Name -Server $vCenter } }, + @{ N = "PortGroup" ; E = { Get-VirtualPortGroup -VM $_.Name -Server $vCenter } }, + @{ N = "OS" ; E = { $_.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.Config.Version } }, + @{ N = "VMToolsVersion" ; E = { $_.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.Guest.ToolsRunningStatus } }, + @{ N = 'Folder' ; E = { $Folder.Name } }, + @{ N = "NumCPU" ; E = { $_.Config.Hardware.NumCPU } }, + @{ N = "CoresPerSocket" ; E = { $_.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal] ( $_.Config.Hardware.MemoryMB / 1024 ), 0) } }, + @{ N = "IP" ; E = { $_.Guest.IpAddress } }, + @{ N = "MacAddress" ; E = { $_.Config.Hardware.Device.MacAddress } }, + @{ N = "ProvisionedSpaceGB" ; E = { [math]::Round([decimal] ( $_.ProvisionedSpaceGB - $_.MemoryGB ), 0) } }, + @{ N = "NumEthernetCards" ; E = { $_.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.Summary.Config.MemoryReservation } }, + @{ N = "SRM" ; E = { $_.Summary.Config.ManagedBy.Type } } | Export-Csv $VmExportFile -Append -NoTypeInformation + } +} + +function Template_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + foreach ($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { $VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { $VmHost.name } }, + @{ N = "Datastore" ; E = { Get-Datastore -Id $_.DatastoreIdList } }, + @{ N = "Folder" ; E = { Get-Folder -Id $_.FolderId } }, + @{ N = "OS" ; E = { $_.ExtensionData.Config.GuestFullName } }, + @{ N = "Version" ; E = { $_.ExtensionData.Config.Version } }, + @{ N = "ToolsVersion" ; E = { $_.ExtensionData.Guest.ToolsVersion } }, + @{ N = "ToolsVersionStatus" ; E = { $_.ExtensionData.Guest.ToolsVersionStatus } }, + @{ N = "ToolsStatus" ; E = { $_.ExtensionData.Guest.ToolsStatus } }, + @{ N = "ToolsRunningStatus" ; E = { $_.ExtensionData.Guest.ToolsRunningStatus } }, + @{ N = "NumCPU" ; E = { $_.ExtensionData.Config.Hardware.NumCPU } }, + @{ N = "NumCoresPerSocket" ; E = { $_.ExtensionData.Config.Hardware.NumCoresPerSocket } }, + @{ N = "MemoryGB" ; E = { [math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB / 1024, 0) } }, + @{ N = "MacAddress" ; E = { $_.ExtensionData.Config.Hardware.Device.MacAddress } }, + @{ N = "NumEthernetCards" ; E = { $_.ExtensionData.Summary.Config.NumEthernetCards } }, + @{ N = "NumVirtualDisks" ; E = { $_.ExtensionData.Summary.Config.NumVirtualDisks } }, + @{ N = "CpuReservation" ; E = { $_.ExtensionData.Summary.Config.CpuReservation } }, + @{ N = "MemoryReservation" ; E = { $_.ExtensionData.Summary.Config.MemoryReservation } } | Export-Csv $TemplateExportFile -Append -NoTypeInformation + } +} + +function DatastoreCluster_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter } }, + @{ N = "Cluster" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "VmHost" ; E = { Get-DatastoreCluster $_.Name | Get-VmHost } }, + @{ N = "SdrsAutomationLevel" ; E = { $_.SdrsAutomationLevel } }, + @{ N = "IOLoadBalanceEnabled" ; E = { $_.IoLoadBalanceEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } } | Export-Csv $DatastoreClusterExportFile -Append -NoTypeInformation +} + +function Datastore_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Datastore $_.Name | Get-VmHost | Get-Cluster } }, + @{ N = "DatastoreCluster" ; E = { Get-DatastoreCluster -Datastore $_.Name } }, + @{ N = "VmHost" ; E = { Get-VmHost -Datastore $_.Name } }, + @{ N = "Vm" ; E = { Get-Datastore $_.Name | Get-Vm } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "FileSystemVersion" ; E = { $_.FileSystemVersion } }, + @{ N = "DiskName" ; E = { $_.ExtensionData.Info.VMFS.Extent.DiskName } }, + @{ N = "StorageIOControlEnabled" ; E = { $_.StorageIOControlEnabled } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 0) } }, + @{ N = "FreeSpaceGB" ; E = { [math]::Round([decimal]$_.FreeSpaceGB, 0) } }, + @{ N = "Accessible" ; E = { $_.State } }, + @{ N = "CongestionThresholdMillisecond" ; E = { $_.CongestionThresholdMillisecond } } | Export-Csv $DatastoreExportFile -Append -NoTypeInformation +} + +function VsSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $_.VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "Nic" ; E = { $_.Nic } }, + @{ N = "NumPorts" ; E = { $_.ExtensionData.Spec.NumPorts } }, + @{ N = "AllowPromiscuous" ; E = { $_.ExtensionData.Spec.Policy.Security.AllowPromiscuous } }, + @{ N = "MacChanges" ; E = { $_.ExtensionData.Spec.Policy.Security.MacChanges } }, + @{ N = "ForgedTransmits" ; E = { $_.ExtensionData.Spec.Policy.Security.ForgedTransmits } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.Policy } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches } }, + @{ N = "RollingOrder" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VsSwitchExportFile -Append -NoTypeInformation +} + +function VssPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "VLanId" ; E = { $_.VLanId } }, + @{ N = "ActiveNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic } }, + @{ N = "StandbyNic" ; E = { $_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic } } | Export-Csv $VssPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VssVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + foreach ($VssPort in(Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort-Object Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.Name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.Name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VssVmkernelExportFile -Append -NoTypeInformation + } + } + } +} + +function VssPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + foreach ($VMHost in Get-VMHost) + { + foreach ($VsSwitch in(Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VmHost $VmHost } }, + @{ N = "Cluster" ; E = { Get-Cluster -VmHost $_.VmHost } }, + @{ N = "VmHost" ; E = { $_.VmHost } }, + @{ N = "VsSwitch" ; E = { $VsSwitch.Name } }, + @{ N = "Mac" ; E = { $_.Mac } } | Export-Csv $VssPnicExportFile -Append -NoTypeInformation + } + } +} + +function VdSwitch_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + foreach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $_.Datacenter } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "Vendor" ; E = { $_.Vendor } }, + @{ N = "Version" ; E = { $_.Version } }, + @{ N = "NumUplinkPorts" ; E = { $_.NumUplinkPorts } }, + @{ N = "UplinkPortName" ; E = { $_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdSwitchExportFile -Append -NoTypeInformation + } +} + +function VdsPort_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost | Sort-Object -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort-Object Name | Where-Object { $_.Name -notlike "*DVUplinks*" } | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } }, + @{ N = "VdSwitch" ; E = { $_.VdSwitch } }, + @{ N = "NumPorts" ; E = { $_.NumPorts } }, + @{ N = "ActiveUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort } }, + @{ N = "StandbyUplinkPort" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort } }, + @{ N = "Policy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value } }, + @{ N = "ReversePolicy" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value } }, + @{ N = "NotifySwitches" ; E = { $_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value } }, + @{ N = "PortBinding" ; E = { $_.PortBinding } } | Export-Csv $VdsPortGroupExportFile -Append -NoTypeInformation + } + } +} + +function VdsVmk_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort-Object -Property Name -Unique | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch.Name } }, + @{ N = "PortGroupName" ; E = { $_.PortGroupName } }, + @{ N = "DhcpEnabled" ; E = { $_.DhcpEnabled } }, + @{ N = "IP" ; E = { $_.IP } }, + @{ N = "Mac" ; E = { $_.Mac } }, + @{ N = "ManagementTrafficEnabled" ; E = { $_.ManagementTrafficEnabled } }, + @{ N = "VMotionEnabled" ; E = { $_.VMotionEnabled } }, + @{ N = "FaultToleranceLoggingEnabled" ; E = { $_.FaultToleranceLoggingEnabled } }, + @{ N = "VsanTrafficEnabled" ; E = { $_.VsanTrafficEnabled } }, + @{ N = "Mtu" ; E = { $_.Mtu } } | Export-Csv $VdsVmkernelExportFile -Append -NoTypeInformation + + } + } +} + +function VdsPnic_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + foreach ($VmHost in Get-VmHost) + { + foreach ($VdSwitch in(Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort-Object -Property ConnectedEntity -Unique | + Select-Object @{ N = "Name" ; E = { $_.ConnectedEntity } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -VMHost $VMHost.name } }, + @{ N = "Cluster" ; E = { Get-Cluster -VMHost $VMHost.name } }, + @{ N = "VmHost" ; E = { $VMHost.Name } }, + @{ N = "VdSwitch" ; E = { $VdSwitch } }, + @{ N = "Portgroup" ; E = { $_.Portgroup } }, + @{ N = "ConnectedEntity" ; E = { $_.Name } }, + @{ N = "VlanConfiguration" ; E = { $_.VlanConfiguration } } | Export-Csv $VdsPnicExportFile -Append -NoTypeInformation + } + } +} + +function Folder_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + foreach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -type VM | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { $Datacenter.Name } } | Export-Csv $FolderExportFile -Append -NoTypeInformation + } +} + +function Rdm_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | Where-Object { $_.DiskType -like "Raw*" } | Sort-Object Parent | + Select-Object @{ N = "ScsiCanonicalName" ; E = { $_.ScsiCanonicalName } }, + @{ N = "Cluster" ; E = { Get-Cluster -VM $_.Parent } }, + @{ N = "Vm" ; E = { $_.Parent } }, + @{ N = "Label" ; E = { $_.Name } }, + @{ N = "CapacityGB" ; E = { [math]::Round([decimal]$_.CapacityGB, 2) } }, + @{ N = "DiskType" ; E = { $_.DiskType } }, + @{ N = "Persistence" ; E = { $_.Persistence } }, + @{ N = "CompatibilityMode" ; E = { $_.ExtensionData.Backing.CompatibilityMode } }, + @{ N = "DeviceName" ; E = { $_.ExtensionData.Backing.DeviceName } }, + @{ N = "Sharing" ; E = { $_.ExtensionData.Backing.Sharing } } | Export-Csv $RdmExportFile -Append -NoTypeInformation +} + +function Drs_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Mandatory" ; E = { $_.Mandatory } } | Export-Csv $DrsRuleExportFile -Append -NoTypeInformation + } +} + +function Drs_Cluster_Group_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + foreach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "GroupType" ; E = { $_.GroupType } }, + @{ N = "Member" ; E = { $_.Member } } | Export-Csv $DrsClusterGroupExportFile -Append -NoTypeInformation + } +} + +function Drs_VmHost_Rule_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort-Object Name)) + { + Get-DrsVmHostRule -VMHostGroup $DRSClusterGroup | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Datacenter" ; E = { Get-Datacenter -Cluster $Cluster.Name } }, + @{ N = "Cluster" ; E = { $_.Cluster } }, + @{ N = "Enabled" ; E = { $_.Enabled } }, + @{ N = "Type" ; E = { $_.Type } }, + @{ N = "VMGroup" ; E = { $_.VMGroup } }, + @{ N = "VMHostGroup" ; E = { $_.VMHostGroup } }, + @{ N = "AffineHostGroupName" ; E = { $_.ExtensionData.AffineHostGroupName } }, + @{ N = "AntiAffineHostGroupName" ; E = { $_.ExtensionData.AntiAffineHostGroupName } } | Export-Csv $DrsVmHostRuleExportFile -Append -NoTypeInformation + } + } +} + +function Resource_Pool_Export +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $CaptureCsvFolder + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + foreach ($Cluster in Get-Cluster) + { + foreach ($ResourcePool in(Get-Cluster $Cluster | Get-ResourcePool | Where-Object { $_.Name -ne "Resources" } | Sort-Object Name)) + { + Get-ResourcePool $ResourcePool | Sort-Object Name | + Select-Object @{ N = "Name" ; E = { $_.Name } }, + @{ N = "Cluster" ; E = { $Cluster.Name } }, + @{ N = "CpuSharesLevel" ; E = { $_.CpuSharesLevel } }, + @{ N = "NumCpuShares" ; E = { $_.NumCpuShares } }, + @{ N = "CpuReservationMHz" ; E = { $_.CpuReservationMHz } }, + @{ N = "CpuExpandableReservation" ; E = { $_.CpuExpandableReservation } }, + @{ N = "CpuLimitMHz" ; E = { $_.CpuLimitMHz } }, + @{ N = "MemSharesLevel" ; E = { $_.MemSharesLevel } }, + @{ N = "NumMemShares" ; E = { $_.NumMemShares } }, + @{ N = "MemReservationGB" ; E = { $_.MemReservationGB } }, + @{ N = "MemExpandableReservation" ; E = { $_.MemExpandableReservation } }, + @{ N = "MemLimitGB" ; E = { $_.MemLimitGB } } | Export-Csv $ResourcePoolExportFile -Append -NoTypeInformation + } + } +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Connect-VisioObject($firstObj, $secondObj) +{ + $shpConn = $pagObj.Drop($pagObj.Application.ConnectorToolDataObject, 0, 0) + $ConnectBegin = $shpConn.CellsU("BeginX").GlueTo($firstObj.CellsU("PinX")) + $ConnectEnd = $shpConn.CellsU("EndX").GlueTo($secondObj.CellsU("PinX")) +} + +function Add-VisioObjectVC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectCluster($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHost($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectTemplate($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectSRM($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDatastore($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectHardDisk($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.ScsiCanonicalName + return $shpObj +} + +function Add-VisioObjectFolder($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVsSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVssPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVMK($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdSwitch($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPG($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectVdsPNIC($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDrsClusterGroup($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectDRSVMHostRule($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +function Add-VisioObjectResourcePool($mastObj, $item) +{ + $shpObj = $pagObj.Drop($mastObj, $x, $y) + $shpObj.Text = $item.name + return $shpObj +} + +#~~< Visio Object Functions >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function Create_Visio_Base +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $DocObj = $docsObj.Add("") + $DocObj.SaveAs($Savefile) + $AppVisio.Quit() +} + +function VM_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Host" + $Page = $DocsObj.Pages('VM to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.VMToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Folder +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Folder + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + $FolderImport = Import-Csv $FolderExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Folder" + $Page = $DocsObj.Pages('VM to Folder') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Folder') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Folder Object + $FolderObj = $stnObj.Masters.Item("Folder") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Folder in($FolderImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $FolderObject = Add-VisioObjectFolder $FolderObj $Folder + $FolderObject.Cells("Prop.Name").Formula = '"' + $Folder.Name + '"' + Connect-VisioObject $DatacenterObject $FolderObject + $y += 1.50 + + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $FolderObject $TemplateObject + $FolderObject = $TemplateObject + } + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Folder.contains($Folder.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $FolderObject $VMObject + $FolderObject = $VMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMs_with_RDMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + # RDM's + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + $RdmImport = Import-Csv $RdmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM w/ RDMs" + $Page = $DocsObj.Pages('VM w/ RDMs') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM w/ RDMs') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # RDM Object + $RDMObj = $stnObj.Masters.Item("RDM") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.name) -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ClusterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 3.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $RdmImport.Vm.contains($_.name) })) + { + $x = 6.00 + $y += 1.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatacenterObject $VMObject + $y += 1.50 + + foreach ($HardDisk in($RdmImport | Sort-Object Label | Where-Object { $_.Vm.contains($Vm.Name) })) + { + $x += 2.50 + $RDMObject = Add-VisioObjectHardDisk $RDMObj $HardDisk + # ScsiCanonicalName + $RDMObject.Cells("Prop.ScsiCanonicalName").Formula = '"' + $HardDisk.ScsiCanonicalName + '"' + # CapacityGB + $RDMObject.Cells("Prop.CapacityGB").Formula = '"' + [math]::Round([decimal]$HardDisk.CapacityGB, 2) + '"' + # DiskType + $RDMObject.Cells("Prop.DiskType").Formula = '"' + $HardDisk.DiskType + '"' + # CompatibilityMode + $RDMObject.Cells("Prop.CompatibilityMode").Formula = '"' + $HardDisk.CompatibilityMode + '"' + # DeviceName + $RDMObject.Cells("Prop.DeviceName").Formula = '"' + $HardDisk.DeviceName + '"' + # Sharing + $RDMObject.Cells("Prop.Sharing").Formula = '"' + $HardDisk.Sharing + '"' + # HardDisk + $RDMObject.Cells("Prop.Label").Formula = '"' + $HardDisk.Label + '"' + #Persistence + $RDMObject.Cells("Prop.Persistence").Formula = '"' + $HardDisk.Persistence + '"' + Connect-VisioObject $VMObject $RDMObject + $VMObject = $RDMObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function SRM_Protected_VMs +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "SRM VM" + $Page = $DocsObj.Pages('SRM VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('SRM VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # SRM Protected VM Object + $SRMObj = $stnObj.Masters.Item("SRM Protected Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($SrmVM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.SRM.contains("placeholderVm") })) + { + $x += 2.50 + $SrmObject = Add-VisioObjectSRM $SRMObj $SrmVM + # Name + $SrmObject.Cells("Prop.Name").Formula = '"' + $SrmVM.Name + '"' + # OS + $SrmObject.Cells("Prop.OS").Formula = '"' + $SrmVM.OS + '"' + # Version + $SrmObject.Cells("Prop.Version").Formula = '"' + $SrmVM.Version + '"' + # Folder + $SrmObject.Cells("Prop.Folder").Formula = '"' + $SrmVM.Folder + '"' + # NumCPU + $SrmObject.Cells("Prop.NumCPU").Formula = '"' + $SrmVM.NumCPU + '"' + # CoresPerSocket + $SrmObject.Cells("Prop.CoresPerSocket").Formula = '"' + $SrmVM.CoresPerSocket + '"' + # MemoryGB + $SrmObject.Cells("Prop.MemoryGB").Formula = '"' + $SrmVM.MemoryGB + '"' + Connect-VisioObject $HostObject $SrmObject + $HostObject = $SrmObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_Datastore +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Datastore" + $Page = $DocsObj.Pages('VM to Datastore') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Datastore') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $ClusterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster.contains($DatastoreCluster.Name) -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $ClusterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster.contains($Cluster.Name) -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + foreach ($DatastoreCluster in($DatastoreClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $DatastoreClusObject = Add-VisioObjectDatastore $DatastoreClusObj $DatastoreCluster + # Name + $DatastoreClusObject.Cells("Prop.Name").Formula = '"' + $DatastoreCluster.Name + '"' + # SdrsAutomationLevel + $DatastoreClusObject.Cells("Prop.SdrsAutomationLevel").Formula = '"' + $DatastoreCluster.SdrsAutomationLevel + '"' + # IOLoadBalanceEnabled + $DatastoreClusObject.Cells("Prop.IOLoadBalanceEnabled").Formula = '"' + $DatastoreCluster.IOLoadBalanceEnabled + '"' + # CapacityGB + $DatastoreClusObject.Cells("Prop.CapacityGB").Formula = '"' + $DatastoreCluster.CapacityGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreClusObject + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster.contains($DatastoreCluster) })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatastoreClusObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $HostObject $VMObject + $HostObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $HostObject $TemplateObject + $HostObject = $TemplateObject + } + } + } + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" })) + { + $x = 8.00 + $y += 1.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $DatacenterObject $DatastoreObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $DatastoreObject $VMObject + $DatastoreObject = $VMObject + } + foreach ($Template in($TemplateImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" -and $_.DatastoreCluster -eq "" -and $_.Datastore.contains($Datastore.Name) })) + { + $x += 2.50 + $TemplateObject = Add-VisioObjectTemplate $TemplateObj $Template + # Name + $TemplateObject.Cells("Prop.Name").Formula = '"' + $Template.Name + '"' + # OS + $TemplateObject.Cells("Prop.OS").Formula = '"' + $Template.OS + '"' + # Version + $TemplateObject.Cells("Prop.Version").Formula = '"' + $Template.Version + '"' + # ToolsVersion + $TemplateObject.Cells("Prop.ToolsVersion").Formula = '"' + $Template.ToolsVersion + '"' + # ToolsVersionStatus + $TemplateObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $Template.ToolsVersionStatus + '"' + # ToolsStatus + $TemplateObject.Cells("Prop.ToolsStatus").Formula = '"' + $Template.ToolsStatus + '"' + # ToolsRunningStatus + $TemplateObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $Template.ToolsRunningStatus + '"' + # NumCPU + $TemplateObject.Cells("Prop.NumCPU").Formula = '"' + $Template.NumCPU + '"' + # NumCoresPerSocket + $TemplateObject.Cells("Prop.NumCoresPerSocket").Formula = '"' + $Template.NumCoresPerSocket + '"' + # MemoryGB + $TemplateObject.Cells("Prop.MemoryGB").Formula = '"' + $Template.MemoryGB + '"' + # MacAddress + $TemplateObject.Cells("Prop.MacAddress").Formula = '"' + $Template.MacAddress + '"' + # NumEthernetCards + $TemplateObject.Cells("Prop.NumEthernetCards").Formula = '"' + $Template.NumEthernetCards + '"' + # NumVirtualDisks + $TemplateObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $Template.NumVirtualDisks + '"' + # CpuReservation + $TemplateObject.Cells("Prop.CpuReservation").Formula = '"' + $Template.CpuReservation + '"' + # MemoryReservation + $TemplateObject.Cells("Prop.MemoryReservation").Formula = '"' + $Template.MemoryReservation + '"' + Connect-VisioObject $DatastoreObject $TemplateObject + $DatastoreObject = $TemplateObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VM_to_ResourcePool +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # ResourcePool + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + $ResourcePoolImport = Import-Csv $ResourcePoolExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VM to Resource Pool" + $Page = $DocsObj.Pages('VM to Resource Pool') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VM to Resource Pool') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + # Resource Pool Object + $ResourcePoolObj = $stnObj.Masters.Item("Resource Pool") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($ResourcePool in($ResourcePoolImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $ResourcePoolObject = Add-VisioObjectResourcePool $ResourcePoolObj $ResourcePool + # Name + $ResourcePoolObject.Cells("Prop.Name").Formula = '"' + $ResourcePool.Name + '"' + # Cluster + $ResourcePoolObject.Cells("Prop.Cluster").Formula = '"' + $ResourcePool.Cluster + '"' + # CpuSharesLevel + $ResourcePoolObject.Cells("Prop.CpuSharesLevel").Formula = '"' + $ResourcePool.CpuSharesLevel + '"' + # NumCpuShares + $ResourcePoolObject.Cells("Prop.NumCpuShares").Formula = '"' + $ResourcePool.NumCpuShares + '"' + # CpuReservationMHz + $ResourcePoolObject.Cells("Prop.CpuReservationMHz").Formula = '"' + $ResourcePool.CpuReservationMHz + '"' + # CpuExpandableReservation + $ResourcePoolObject.Cells("Prop.CpuExpandableReservation").Formula = '"' + $ResourcePool.CpuExpandableReservation + '"' + # CpuLimitMHz + $ResourcePoolObject.Cells("Prop.CpuLimitMHz").Formula = '"' + $ResourcePool.CpuLimitMHz + '"' + # MemSharesLevel + $ResourcePoolObject.Cells("Prop.MemSharesLevel").Formula = '"' + $ResourcePool.MemSharesLevel + '"' + # NumMemShares + $ResourcePoolObject.Cells("Prop.NumMemShares").Formula = '"' + $ResourcePool.NumMemShares + '"' + # MemReservationGB + $ResourcePoolObject.Cells("Prop.MemReservationGB").Formula = '"' + $ResourcePool.MemReservationGB + '"' + # MemExpandableReservation + $ResourcePoolObject.Cells("Prop.MemExpandableReservation").Formula = '"' + $ResourcePool.MemExpandableReservation + '"' + # MemLimitGB + $ResourcePoolObject.Cells("Prop.MemLimitGB").Formula = '"' + $ResourcePool.MemLimitGB + '"' + Connect-VisioObject $ClusterObject $ResourcePoolObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.ResourcePool.contains($ResourcePool.Name) -and $_.Cluster.contains($Cluster.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Linux") -eq $True) + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $ResourcePoolObject $VMObject + $ResourcePoolObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Datastore_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Datastore Cluster + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + $DatastoreClusterImport = Import-Csv $DatastoreClusterExportFile + # Datastore + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + $DatastoreImport = Import-Csv $DatastoreExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Datastore to Host" + $Page = $DocsObj.Pages('Datastore to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Datastore to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # Datastore Cluster Object + $DatastoreClusObj = $stnObj.Masters.Item("Datastore Cluster") + # Datastore Object + $DatastoreObj = $stnObj.Masters.Item("Datastore") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + $y += 1.50 + + foreach ($Datastore in($DatastoreImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x += 2.50 + $DatastoreObject = Add-VisioObjectDatastore $DatastoreObj $Datastore + # Name + $DatastoreObject.Cells("Prop.Name").Formula = '"' + $Datastore.Name + '"' + # Type + $DatastoreObject.Cells("Prop.Type").Formula = '"' + $Datastore.Type + '"' + # FileSystemVersion + $DatastoreObject.Cells("Prop.FileSystemVersion").Formula = '"' + $Datastore.FileSystemVersion + '"' + # DiskName + $DatastoreObject.Cells("Prop.DiskName").Formula = '"' + $Datastore.DiskName + '"' + # StorageIOControlEnabled + $DatastoreObject.Cells("Prop.StorageIOControlEnabled").Formula = '"' + $Datastore.StorageIOControlEnabled + '"' + # CapacityGB + $DatastoreObject.Cells("Prop.CapacityGB").Formula = '"' + $Datastore.CapacityGB + '"' + # FreeSpaceGB + $DatastoreObject.Cells("Prop.FreeSpaceGB").Formula = '"' + $Datastore.FreeSpaceGB + '"' + Connect-VisioObject $HostObject $DatastoreObject + $HostObject = $DatastoreObject + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function PhysicalNIC_to_vSwitch +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "PNIC to switch" + $Page = $DocsObj.Pages('PNIC to Switch') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('PNIC to Switch') + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + $y += 1.50 + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VSSObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VSSObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VSSObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VSSObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VSSObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VSSObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VSSObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VSSObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VSSObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VSSObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VSSObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VSSObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VSSObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VSSObject + + foreach ($VssPnic in($VssPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch -eq $VsSwitch.Name })) + { + $x += 2.50 + $VssPNICObject = Add-VisioObjectVssPNIC $VssPNICObj $VssPnic + # Name + $VssPNICObject.Cells("Prop.Name").Formula = '"' + $VssPnic.Name + '"' + # ConnectedEntity + $VssPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VssPnic.ConnectedEntity + '"' + # VlanConfiguration + $VssPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VssPnic.VlanConfiguration + '"' + Connect-VisioObject $VSSObject $VssPNICObject + $VSSObject = $VssPNICObject + } + } + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPnic in($VdsPnicImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VdsPNICObject = Add-VisioObjectVdsPNIC $VdsPNICObj $VdsPnic + # Name + $VdsPNICObject.Cells("Prop.Name").Formula = '"' + $VdsPnic.Name + '"' + # ConnectedEntity + $VdsPNICObject.Cells("Prop.ConnectedEntity").Formula = '"' + $VdsPnic.ConnectedEntity + '"' + # VlanConfiguration + $VdsPNICObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPnic.VlanConfiguration + '"' + Connect-VisioObject $VdSwitchObject $VdsPNICObject + $VdSwitchObject = $VdsPNICObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSS to Host" + $Page = $DocsObj.Pages('VSS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 2.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $VssObject = $VssNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VSS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VSS" + $Page = $DocsObj.Pages('VMK to VSS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VSS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + $y += 1.50 + + foreach ($VssVmk in($VssVmkImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VssVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VssVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VssVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VssVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VssVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VssVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VssVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VssVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VssVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VssVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VssVmk.Mtu + '"' + Connect-VisioObject $VssObject $VmkNicObject + $VssObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VSSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vss Switch + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + $VsSwitchImport = Import-Csv $VsSwitchExportFile + # Vss Port Group + $VssPortExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + $VssPortImport = Import-Csv $VssPortExportFile + # Vss VMKernel + $VssVmkExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + $VssVmkImport = Import-Csv $VssVmkExportFile + # Vss Pnic + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + $VssPnicImport = Import-Csv $VssPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VSSPortGroup to VM" + $Page = $DocsObj.Pages('VSSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VSSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VSS Object + $VSSObj = $stnObj.Masters.Item("VSS") + # VSS PNIC Object + $VssPNICObj = $stnObj.Masters.Item("VSS Physical NIC") + # VSSNIC Object + $VssNicObj = $stnObj.Masters.Item("VSS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VsSwitch in($VsSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VssObject = Add-VisioObjectVsSwitch $VSSObj $VsSwitch + # Name + $VssObject.Cells("Prop.Name").Formula = '"' + $VsSwitch.Name + '"' + # NIC + $VssObject.Cells("Prop.NIC").Formula = '"' + $VsSwitch.Nic + '"' + # NumPorts + $VssObject.Cells("Prop.NumPorts").Formula = '"' + $VsSwitch.NumPorts + '"' + # SecurityAllowPromiscuous + $VssObject.Cells("Prop.AllowPromiscuous").Formula = '"' + $VsSwitch.AllowPromiscuous + '"' + # SecurityMacChanges + $VssObject.Cells("Prop.MacChanges").Formula = '"' + $VsSwitch.MacChanges + '"' + # SecurityForgedTransmits + $VssObject.Cells("Prop.ForgedTransmits").Formula = '"' + $VsSwitch.ForgedTransmits + '"' + # NicTeamingPolicy + $VssObject.Cells("Prop.Policy").Formula = '"' + $VsSwitch.Policy + '"' + # NicTeamingReversePolicy + $VssObject.Cells("Prop.ReversePolicy").Formula = '"' + $VsSwitch.ReversePolicy + '"' + # NicTeamingNotifySwitches + $VssObject.Cells("Prop.NotifySwitches").Formula = '"' + $VsSwitch.NotifySwitches + '"' + # NicTeamingRollingOrder + $VssObject.Cells("Prop.RollingOrder").Formula = '"' + $VsSwitch.RollingOrder + '"' + # NicTeamingNicOrderActiveNic + $VssObject.Cells("Prop.ActiveNic").Formula = '"' + $VsSwitch.ActiveNic + '"' + # NicTeamingNicOrderStandbyNic + $VssObject.Cells("Prop.StandbyNic").Formula = '"' + $VsSwitch.StandbyNic + '"' + Connect-VisioObject $HostObject $VssObject + + foreach ($VssPort in($VssPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) })) + { + $x = 10.00 + $y += 1.50 + $VssNicObject = Add-VisioObjectPG $VssNicObj $VssPort + # Name + $VssNicObject.Cells("Prop.Name").Formula = '"' + $VssPort.Name + '"' + # VLanId + $VssNicObject.Cells("Prop.VLanId").Formula = '"' + $VssPort.VLanId + '"' + # ActiveNic + $VssNicObject.Cells("Prop.ActiveNic").Formula = '"' + $VssPort.ExtensionData.omputedPolicy.NicTeaming.NicOrder.ActiveNic + '"' + # StandbyNic + $VssNicObject.Cells("Prop.StandbyNic").Formula = '"' + $VssPort.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic + '"' + Connect-VisioObject $VssObject $VssNicObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) -and $_.VsSwitch.contains($VsSwitch.Name) -and $_.PortGroup.contains($VssPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VssNicObject $VMObject + $VssNicObject = $VMObject + } + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDS_to_Host +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDS to Host" + $Page = $DocsObj.Pages('VDS to Host') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDS to Host') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VdSwitch.VmHost) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 2.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $VdSwitchObject = $VPGObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VMK_to_VDS +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VMK to VDS" + $Page = $DocsObj.Pages('VMK to VDS') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VMK to VDS') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VMK NIC Object + $VmkNicObj = $stnObj.Masters.Item("VMKernel") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $ClusterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + foreach ($VmHost in($VmHostImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) -and $_.Cluster -eq "" })) + { + $x = 6.00 + $y += 1.50 + $HostObject = Add-VisioObjectHost $HostObj $VMHost + # Name + $HostObject.Cells("Prop.Name").Formula = '"' + $VMHost.Name + '"' + # Version + $HostObject.Cells("Prop.Version").Formula = '"' + $VMHost.Version + '"' + # Build + $HostObject.Cells("Prop.Build").Formula = '"' + $VMHost.Build + '"' + # Manufacturer + $HostObject.Cells("Prop.Manufacturer").Formula = '"' + $VMHost.Manufacturer + '"' + # Model + $HostObject.Cells("Prop.Model").Formula = '"' + $VMHost.Model + '"' + # ProcessorType + $HostObject.Cells("Prop.ProcessorType").Formula = '"' + $VMHost.ProcessorType + '"' + # MaxEVCMode + $HostObject.Cells("Prop.MaxEVCMode").Formula = '"' + $VMHost.MaxEVCMode + '"' + # CpuMhz + $HostObject.Cells("Prop.CpuMhz").Formula = '"' + $VMHost.CpuMhz + '"' + # NumCpuPkgs + $HostObject.Cells("Prop.NumCpuPkgs").Formula = '"' + $VMHost.NumCpuPkgs + '"' + # NumCpuCores + $HostObject.Cells("Prop.NumCpuCores").Formula = '"' + $VMHost.NumCpuCores + '"' + # NumCpuThreads + $HostObject.Cells("Prop.NumCpuThreads").Formula = '"' + $VMHost.NumCpuThreads + '"' + # Memory + $HostObject.Cells("Prop.Memory").Formula = '"' + $VMHost.Memory + '"' + # NumNics + $HostObject.Cells("Prop.NumNics").Formula = '"' + $VMHost.NumNics + '"' + # IP + $HostObject.Cells("Prop.IP").Formula = '"' + $VMHost.IP + '"' + # NumHBAs + $HostObject.Cells("Prop.NumHBAs").Formula = '"' + $VMHost.NumHBAs + '"' + Connect-VisioObject $DatacenterObject $HostObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name | Where-Object { $_.Cluster -eq "" -and $_.VmHost.contains($VmHost.Name) })) + { + $x = 8.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $HostObject $VdSwitchObject + $y += 1.50 + + foreach ($VdsVmk in($VdsVmkImport | Sort-Object Name | Where-Object { $_.VmHost.contains($VmHost.Name) -and $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x += 1.50 + $VmkNicObject = Add-VisioObjectVMK $VmkNicObj $VdsVmk + # Name + $VmkNicObject.Cells("Prop.Name").Formula = '"' + $VdsVmk.Name + '"' + # PortGroupName + $VmkNicObject.Cells("Prop.PortGroupName").Formula = '"' + $VdsVmk.PortGroupName + '"' + # DhcpEnabled + $VmkNicObject.Cells("Prop.DhcpEnabled").Formula = '"' + $VdsVmk.DhcpEnabled + '"' + # IP + $VmkNicObject.Cells("Prop.IP").Formula = '"' + $VdsVmk.IP + '"' + # Mac + $VmkNicObject.Cells("Prop.Mac").Formula = '"' + $VdsVmk.Mac + '"' + # ManagementTrafficEnabled + $VmkNicObject.Cells("Prop.ManagementTrafficEnabled").Formula = '"' + $VdsVmk.ManagementTrafficEnabled + '"' + # VMotionEnabled + $VmkNicObject.Cells("Prop.VMotionEnabled").Formula = '"' + $VdsVmk.VMotionEnabled + '"' + # FaultToleranceLoggingEnabled + $VmkNicObject.Cells("Prop.FaultToleranceLoggingEnabled").Formula = '"' + $VdsVmk.FaultToleranceLoggingEnabled + '"' + # VsanTrafficEnabled + $VmkNicObject.Cells("Prop.VsanTrafficEnabled").Formula = '"' + $VdsVmk.VsanTrafficEnabled + '"' + # Mtu + $VmkNicObject.Cells("Prop.Mtu").Formula = '"' + $VdsVmk.Mtu + '"' + Connect-VisioObject $VdSwitchObject $VmkNicObject + $VdSwitchObject = $VmkNicObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function VDSPortGroup_to_VM +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # VmHost + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + $VmHostImport = Import-Csv $VmHostExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # Vds Switch + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + $VdSwitchImport = Import-Csv $VdSwitchExportFile + # Vds Port Group + $VdsPortExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + $VdsPortImport = Import-Csv $VdsPortExportFile + # Vds VMKernel + $VdsVmkExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + $VdsVmkImport = Import-Csv $VdsVmkExportFile + # Vds Pnic + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + $VdsPnicImport = Import-Csv $VdsPnicExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "VDSPortGroup to VM" + $Page = $DocsObj.Pages('VDSPortGroup to VM') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('VDSPortGroup to VM') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # Host Object + $HostObj = $stnObj.Masters.Item("ESX Host") + # VDS Object + $VDSObj = $stnObj.Masters.Item("VDS") + # VDS PNIC Object + $VdsPNICObj = $stnObj.Masters.Item("VDS Physical NIC") + # VDSNIC Object + $VdsNicObj = $stnObj.Masters.Item("VDS NIC") + # Microsoft VM Object + $MicrosoftObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LinuxObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($VdSwitch in($VdSwitchImport | Sort-Object Name -Unique | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.00 + $y += 1.50 + $VdSwitchObject = Add-VisioObjectVdSwitch $VDSObj $VdSwitch + # Name + $VdSwitchObject.Cells("Prop.Name").Formula = '"' + $VdSwitch.Name + '"' + # Vendor + $VdSwitchObject.Cells("Prop.Vendor").Formula = '"' + $VdSwitch.Vendor + '"' + # Version + $VdSwitchObject.Cells("Prop.Version").Formula = '"' + $VdSwitch.Version + '"' + # NumUplinkPorts + $VdSwitchObject.Cells("Prop.NumUplinkPorts").Formula = '"' + $VdSwitch.NumUplinkPorts + '"' + # UplinkPortName + $VdSwitchObject.Cells("Prop.UplinkPortName").Formula = '"' + $VdSwitch.UplinkPortName + '"' + # Mtu + $VdSwitchObject.Cells("Prop.Mtu").Formula = '"' + $VdSwitch.Mtu + '"' + Connect-VisioObject $DatacenterObject $VdSwitchObject + + foreach ($VdsPort in($VdsPortImport | Sort-Object Name -Unique | Where-Object { $_.VdSwitch.contains($VdSwitch.Name) })) + { + $x = 6.00 + $y += 1.50 + $VPGObject = Add-VisioObjectVdsPG $VdsNicObj $VdsPort + # Name + $VPGObject.Cells("Prop.Name").Formula = '"' + $VdsPort.Name + '"' + # VlanConfiguration + $VPGObject.Cells("Prop.VlanConfiguration").Formula = '"' + $VdsPort.VlanConfiguration + '"' + # NumPorts + $VPGObject.Cells("Prop.NumPorts").Formula = '"' + $VdsPort.NumPorts + '"' + # ActiveUplinkPort + $VPGObject.Cells("Prop.ActiveUplinkPort").Formula = '"' + $VdsPort.ActiveUplinkPort + '"' + # StandbyUplinkPort + $VPGObject.Cells("Prop.StandbyUplinkPort").Formula = '"' + $VdsPort.StandbyUplinkPort + '"' + # UplinkTeamingPolicy.Policy + $VPGObject.Cells("Prop.Policy").Formula = '"' + $VdsPort.Policy + '"' + # UplinkTeamingPolicy.ReversePolicy + $VPGObject.Cells("Prop.ReversePolicy").Formula = '"' + $VdsPort.ReversePolicy + '"' + #UplinkTeamingPolicy.NotifySwitches + $VPGObject.Cells("Prop.NotifySwitches").Formula = '"' + $VdsPort.NotifySwitches + '"' + # PortBinding + $VPGObject.Cells("Prop.PortBinding").Formula = '"' + $VdsPort.PortBinding + '"' + Connect-VisioObject $VdSwitchObject $VPGObject + $y += 1.50 + + foreach ($VM in($VmImport | Sort-Object Name | Where-Object { $_.VsSwitch.contains($VdSwitch.Name) -and $_.PortGroup.contains($VdsPort.Name) -and ($_.SRM.contains("placeholderVm") -eq $False) })) + { + $x += 2.50 + if ($VM.OS -eq "") + { + $VMObject = Add-VisioObjectVM $OtherObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + if ($VM.OS.contains("Microsoft") -eq $True) + { + $VMObject = Add-VisioObjectVM $MicrosoftObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + else + { + $VMObject = Add-VisioObjectVM $LinuxObj $VM + # Name + $VMObject.Cells("Prop.Name").Formula = '"' + $VM.Name + '"' + # OS + $VMObject.Cells("Prop.OS").Formula = '"' + $VM.OS + '"' + # Version + $VMObject.Cells("Prop.Version").Formula = '"' + $VM.Version + '"' + # VMToolsVersion + $VMObject.Cells("Prop.VMToolsVersion").Formula = '"' + $VM.VMToolsVersion + '"' + # ToolsVersionStatus + $VMObject.Cells("Prop.ToolsVersionStatus").Formula = '"' + $VM.ToolsVersionStatus + '"' + # ToolsStatus + $VMObject.Cells("Prop.ToolsStatus").Formula = '"' + $VM.ToolsStatus + '"' + # ToolsRunningStatus + $VMObject.Cells("Prop.ToolsRunningStatus").Formula = '"' + $VM.ToolsRunningStatus + '"' + # Folder + $VMObject.Cells("Prop.Folder").Formula = '"' + $VM.Folder + '"' + # NumCPU + $VMObject.Cells("Prop.NumCPU").Formula = '"' + $VM.NumCPU + '"' + # CoresPerSocket + $VMObject.Cells("Prop.CoresPerSocket").Formula = '"' + $VM.CoresPerSocket + '"' + # MemoryGB + $VMObject.Cells("Prop.MemoryGB").Formula = '"' + $VM.MemoryGB + '"' + # IP + $VMObject.Cells("Prop.IP").Formula = '"' + $VM.Ip + '"' + # MacAddress + $VMObject.Cells("Prop.MacAddress").Formula = '"' + $VM.MacAddress + '"' + # ProvisionedSpaceGB + $VMObject.Cells("Prop.ProvisionedSpaceGB").Formula = '"' + $VM.ProvisionedSpaceGB + '"' + # NumEthernetCards + $VMObject.Cells("Prop.NumEthernetCards").Formula = '"' + $VM.NumEthernetCards + '"' + # NumVirtualDisks + $VMObject.Cells("Prop.NumVirtualDisks").Formula = '"' + $VM.NumVirtualDisks + '"' + # CpuReservation + $VMObject.Cells("Prop.CpuReservation").Formula = '"' + $VM.CpuReservation + '"' + # MemoryReservation + $VMObject.Cells("Prop.MemoryReservation").Formula = '"' + $VM.MemoryReservation + '"' + } + } + Connect-VisioObject $VPGObject $VMObject + $VPGObject = $VMObject + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Cluster_to_DRS_Rule +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + # vCenter + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + $vCenterImport = Import-Csv $vCenterExportFile + # Datacenter + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + $DatacenterImport = Import-Csv $DatacenterExportFile + # Cluster + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + $ClusterImport = Import-Csv $ClusterExportFile + # Vm + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + $VmImport = Import-Csv $VmExportFile + #Template + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + $TemplateImport = Import-Csv $TemplateExportFile + # DRS Rule + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + $DrsRuleImport = Import-Csv $DrsRuleExportFile + # DRS Cluster Group + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + $DrsClusterGroupImport = Import-Csv $DrsClusterGroupExportFile + # DRS VmHost Rule + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + $DrsVmHostImport = Import-Csv $DrsVmHostRuleExportFile + + $AppVisio = New-Object -ComObject Visio.InvisibleApp + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Add() | Out-Null + $Page = $AppVisio.ActivePage.Name = "Cluster to DRS Rule" + $Page = $DocsObj.Pages('Cluster to DRS Rule') + $pagsObj = $AppVisio.ActiveDocument.Pages + $pagObj = $pagsObj.Item('Cluster to DRS Rule') + $AppVisio.ScreenUpdating = $False + $AppVisio.EventsEnabled = $False + + # Load a set of stencils and select one to drop + $stnPath = [system.Environment]::GetFolderPath('MyDocuments') + "\My Shapes" + $stnObj = $AppVisio.Documents.Add($stnPath + $shpFile) + # vCenter Object + $VCObj = $stnObj.Masters.Item("Virtual Center Management Console") + # Datacenter Object + $DatacenterObj = $stnObj.Masters.Item("Datacenter") + # Cluster Object + $ClusterObj = $stnObj.Masters.Item("Cluster") + # DRS Rule + $DRSRuleObj = $stnObj.Masters.Item("DRS Rule") + # DRS Cluster Group + $DRSClusterGroupObj = $stnObj.Masters.Item("DRS Cluster group") + # DRS Host Rule + $DRSVMHostRuleObj = $stnObj.Masters.Item("DRS Host Rule") + # Microsoft VM Object + $MSObj = $stnObj.Masters.Item("Microsoft Server") + # Linux VM Object + $LXObj = $stnObj.Masters.Item("Linux Server") + # Other VM Object + $OtherObj = $stnObj.Masters.Item("Other Server") + # Template VM Object + $TemplateObj = $stnObj.Masters.Item("Template") + + # Draw Objects + $x = 0 + $y = 1.50 + + $VCObject = Add-VisioObjectVC $VCObj $vCenterImport + # Name + $VCObject.Cells("Prop.Name").Formula = '"' + $vCenterImport.Name + '"' + # Version + $VCObject.Cells("Prop.Version").Formula = '"' + $vCenterImport.Version + '"' + # Build + $VCObject.Cells("Prop.Build").Formula = '"' + $vCenterImport.Build + '"' + + + foreach ($Datacenter in $DatacenterImport) + { + $x = 1.50 + $y += 1.50 + $DatacenterObject = Add-VisioObjectDC $DatacenterObj $Datacenter + # Name + $DatacenterObject.Cells("Prop.Name").Formula = '"' + $Datacenter.Name + '"' + Connect-VisioObject $VCObject $DatacenterObject + + foreach ($Cluster in($ClusterImport | Sort-Object Name | Where-Object { $_.Datacenter.contains($Datacenter.Name) })) + { + $x = 3.50 + $y += 1.50 + $ClusterObject = Add-VisioObjectCluster $ClusterObj $Cluster + # Name + $ClusterObject.Cells("Prop.Name").Formula = '"' + $Cluster.Name + '"' + # HAEnabled + $ClusterObject.Cells("Prop.HAEnabled").Formula = '"' + $Cluster.HAEnabled + '"' + # HAAdmissionControlEnabled + $ClusterObject.Cells("Prop.HAAdmissionControlEnabled").Formula = '"' + $Cluster.HAAdmissionControlEnabled + '"' + # AdmissionControlPolicyCpuFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyCpuFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyCpuFailoverResourcesPercent + '"' + # AdmissionControlPolicyMemoryFailoverResourcesPercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyMemoryFailoverResourcesPercent").Formula = '"' + $Cluster.AdmissionControlPolicyMemoryFailoverResourcesPercent + '"' + # AdmissionControlPolicyFailoverLevel + $ClusterObject.Cells("Prop.AdmissionControlPolicyFailoverLevel").Formula = '"' + $Cluster.AdmissionControlPolicyFailoverLevel + '"' + # AdmissionControlPolicyAutoComputePercentages + $ClusterObject.Cells("Prop.AdmissionControlPolicyAutoComputePercentages").Formula = '"' + $Cluster.AdmissionControlPolicyAutoComputePercentages + '"' + # AdmissionControlPolicyResourceReductionToToleratePercent + $ClusterObject.Cells("Prop.AdmissionControlPolicyResourceReductionToToleratePercent").Formula = '"' + $Cluster.AdmissionControlPolicyResourceReductionToToleratePercent + '"' + # DrsEnabled + $ClusterObject.Cells("Prop.DrsEnabled").Formula = '"' + $Cluster.DrsEnabled + '"' + # DrsAutomationLevel + $ClusterObject.Cells("Prop.DrsAutomationLevel").Formula = '"' + $Cluster.DrsAutomationLevel + '"' + # VmMonitoring + $ClusterObject.Cells("Prop.VmMonitoring").Formula = '"' + $Cluster.VmMonitoring + '"' + # HostMonitoring + $ClusterObject.Cells("Prop.HostMonitoring").Formula = '"' + $Cluster.HostMonitoring + '"' + Connect-VisioObject $DatacenterObject $ClusterObject + $y += 1.50 + + foreach ($DRSRule in($DrsRuleImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSObject = Add-VisioObjectDrsRule $DRSRuleObj $DRSRule + # Name + $DRSObject.Cells("Prop.Name").Formula = '"' + $DRSRule.Name + '"' + # VM Affinity + $DRSObject.Cells("Prop.Type").Formula = '"' + $DRSRule.Type + '"' + # DRS Rule Enabled + $DRSObject.Cells("Prop.Enabled").Formula = '"' + $DRSRule.Enabled + '"' + # DRS Rule Mandatory + $DRSObject.Cells("Prop.Mandatory").Formula = '"' + $DRSRule.Mandatory + '"' + Connect-VisioObject $ClusterObject $DRSObject + #$ClusterObject = $DRSObject + $y += 1.50 + } + foreach ($DrsVmHostRule in($DrsVmHostImport | Where-Object { $_.Cluster.contains($Cluster.Name) })) + { + $x = 6.00 + $y += 1.50 + $DRSVMHostRuleObject = Add-VisioObjectDRSVMHostRule $DRSVMHostRuleObj $DrsVmHostRule + # Name + $DRSVMHostRuleObject.Cells("Prop.Name").Formula = '"' + $DrsVmHostRule.Name + '"' + # Enabled + $DRSVMHostRuleObject.Cells("Prop.Enabled").Formula = '"' + $DrsVmHostRule.Enabled + '"' + # Type + $DRSVMHostRuleObject.Cells("Prop.Type").Formula = '"' + $DrsVmHostRule.Type + '"' + # VMGroup + $DRSVMHostRuleObject.Cells("Prop.VMGroup").Formula = '"' + $DrsVmHostRule.VMGroup + '"' + # VMHostGroup + $DRSVMHostRuleObject.Cells("Prop.VMHostGroup").Formula = '"' + $DrsVmHostRule.VMHostGroup + '"' + # AffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AffineHostGroupName + '"' + # AntiAffineHostGroupName + $DRSVMHostRuleObject.Cells("Prop.AntiAffineHostGroupName").Formula = '"' + $DrsVmHostRule.ExtensionData.AntiAffineHostGroupName + '"' + Connect-VisioObject $ClusterObject $DRSVMHostRuleObject + $y += 1.50 + #Connect-VisioObject $DrsClusterGroupObject $DRSVMHostRuleObject + #$DrsClusterGroupObject = $DRSVMHostRuleObject + + foreach ($DrsClusterGroup in($DrsClusterGroupImport | Where-Object { $_.Name.contains($DrsVmHostRule.VMHostGroup) })) + { + $x += 2.50 + $DrsClusterGroupObject = Add-VisioObjectDrsClusterGroup $DRSClusterGroupObj $DrsClusterGroup + # Name + $DrsClusterGroupObject.Cells("Prop.Name").Formula = '"' + $DrsClusterGroup.Name + '"' + # GroupType + $DrsClusterGroupObject.Cells("Prop.GroupType").Formula = '"' + $DrsClusterGroup.GroupType + '"' + # Members + $DrsClusterGroupObject.Cells("Prop.Member").Formula = '"' + $DrsClusterGroup.Member + '"' + Connect-VisioObject $DRSVMHostRuleObject $DrsClusterGroupObject + $DRSVMHostRuleObject = $DrsClusterGroupObject + + } + } + } + } + + # Resize to fit page + $pagObj.ResizeToFitContents() + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null + $AppVisio.Quit() +} + +function Open_Final_Visio +{ + $vCenterShortName = $TargetVcenterTextBox.Text + $CsvDir = $DrawCsvFolder + $SaveDir = $VisioFolder + $SaveFile = "$SaveDir" + "\" + "$vCenterShortName" + " VMware vDiagram" + "$DateTime" + ".vsd" + $AppVisio = New-Object -ComObject Visio.Application + $docsObj = $AppVisio.Documents + $docsObj.Open($Savefile) | Out-Null + $AppVisio.ActiveDocument.Pages.Item(1).Delete(1) | Out-Null + $AppVisio.Documents.SaveAs($SaveFile) | Out-Null +} + +Main + #endregion \ No newline at end of file diff --git a/vDiagram_Scheduled_Task 2.0.1.ps1 b/vDiagram_2.0.1/vDiagram_Scheduled_Task 2.0.1.ps1 similarity index 97% rename from vDiagram_Scheduled_Task 2.0.1.ps1 rename to vDiagram_2.0.1/vDiagram_Scheduled_Task 2.0.1.ps1 index 751c2de..13421ae 100644 --- a/vDiagram_Scheduled_Task 2.0.1.ps1 +++ b/vDiagram_2.0.1/vDiagram_Scheduled_Task 2.0.1.ps1 @@ -1,593 +1,593 @@ -$Date = (Get-Date -format "yyyy_MM_dd") -$7zip = "C:\Program Files\7-Zip\7z.exe" - -# Variables -$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." -$vCenterShortName = "Replace with vCenter name." -$CsvDir = "C:\vDiagram\Capture" -$SMTPserver = "SMTP Server" -$Mailfrom = "outbound@email.com" -$Mailto = "you@email.com" -$Subject = "vDiagram 2.0 Files" -$ReportFile = "C:\vDiagram\Zip" -$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" -$AttachmentFile = $ZipFile -$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" - - -#region Functions -#region PsCreds -#region Export-PSCredential -Function Export-PSCredential { - param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) - - # Look at the object type of the $Credential parameter to determine how to handle it - switch ( $Credential.GetType().Name ) { - # It is a credential, so continue - PSCredential { continue } - # It is a string, so use that as the username and prompt for the password - String { $Credential = Get-Credential -credential $Credential } - # In all other caess, throw an error and exit - default { Throw "You must specify a credential object to export to disk." } - } - - # Create temporary object to be serialized to disk - $export = "" | Select-Object Username, EncryptedPassword - - # Give object a type name which can be identified later - #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) - - $export.Username = $Credential.Username - - # Encrypt SecureString password using Data Protection API - # Only the current user account can decrypt this cipher - $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString - - # Export using the Export-Clixml cmdlet - $export | Export-Clixml $Path - Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine - - # Return FileInfo object referring to saved credentials - Get-Item $Path -} -Export-PSCredential -#endregion Export-PSCredential - -#region Import-PSCredential -Function Import-PSCredential { - param ( $Path = "credentials.xml" ) - - # Import credential file - $import = Import-Clixml $Path - - # Test for valid import - if ( !$import.UserName -or !$import.EncryptedPassword ) { - Throw "Input is not a valid ExportedPSCredential object, exiting." - } - $Username = $import.Username - - # Decrypt the password and store as a SecureString object for safekeeping - $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString - - # Build the new credential object - $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass - Write-Output $Credential -} -#endregion Import-PSCredential - -#endregion PsCreds - -#region vCenterFunctions -#region Connect_vCenter_Main -Function Connect_vCenter_Main -{ - $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter_Main - -#region Connect_vCenter -Function Connect_vCenter -{ - $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) -} -#endregion Connect_vCenter - -#region Disconnect_vCenter -Function Disconnect_vCenter -{ - Disconnect-ViServer * -Confirm:$False -} -#endregion Disconnect_vCenter -#endregion vCenterFunctions - -#region CsvExportFunctions -#region vCenter_Export -Function vCenter_Export -{ - $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" - Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, - @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, - @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo - Disconnect_vCenter -} -#endregion vCenter_Export - -#region Datacenter_Export -Function Datacenter_Export -{ - $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" - Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo -} -#endregion Datacenter_Export - -#region Cluster_Export -Function Cluster_Export -{ - $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" - Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, - @{N="HAEnabled";E={$_.HAEnabled}}, - @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, - @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, - @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, - @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, - @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, - @{N="DrsEnabled";E={$_.DrsEnabled}}, - @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, - @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, - @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo -} -#endregion Cluster_Export - -#region VmHost_Export -Function VmHost_Export -{ - $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" - Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | - Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={ - $Datacenter = Get-View -Id $_.Parent -Property Name,Parent - While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) - { - $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent - } - If($Datacenter -is [VMware.Vim.Datacenter]) - { - $Datacenter.Name}}}, - @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent - While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) - { - $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent - } - If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, - @{N="Version";E={$_.Config.Product.Version}}, - @{N="Build";E={$_.Config.Product.Build}}, - @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, - @{N="Model";E={$_.Summary.Hardware.Model}}, - @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, - @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, - @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, - @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, - @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, - @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, - @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, - @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, - @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, - @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo -} -#endregion VmHost_Export - -#region Vm_Export -Function Vm_Export -{ - $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" - ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) - { - $Folder = Get-View -Id $Vm.Parent -Property Name - $Vm | - Select Name, - @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, - @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, - @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, - @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, - @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, - @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, - @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, - @{N="OS";E={$_.Config.GuestFullName}}, - @{N="Version";E={$_.Config.Version}}, - @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, - @{N='Folder';E={$Folder.Name}}, - @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, - @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, - @{N="IP";E={$_.Guest.IpAddress}}, - @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, - @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, - @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, - @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo - } -} -#endregion Vm_Export - -#region Template_Export -Function Template_Export -{ - $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" - ForEach($VmHost in Get-Cluster | Get-VmHost) - { - Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$VmHost | Get-Datacenter}}, - @{N="Cluster";E={$VmHost | Get-Cluster}}, - @{N="VmHost";E={$VmHost.name}}, - @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, - @{N="Folder";E={Get-Folder -Id $_.FolderId}}, - @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, - @{N="Version";E={$_.ExtensionData.Config.Version}}, - @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, - @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, - @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, - @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, - @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, - @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, - @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, - @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, - @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, - @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, - @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, - @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo - } -} -#endregion Template_Export - -#region DatastoreCluster_Export -Function DatastoreCluster_Export -{ - $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" - Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, - @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, - @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, - @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, - @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo -} -#endregion DatastoreCluster_Export - -#region Datastore_Export -Function Datastore_Export -{ - $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" - Get-Datastore | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, - @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, - @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, - @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, - @{N="Type";E={$_.Type}}, - @{N="FileSystemVersion";E={$_.FileSystemVersion}}, - @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, - @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, - @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, - @{N="Accessible";E={$_.State}}, - @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo -} -#endregion Datastore_Export - -#region VsSwitch_Export -Function VsSwitch_Export -{ - $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" - Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="Nic";E={$_.Nic}}, - @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, - @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, - @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, - @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, - @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, - @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, - @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, - @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, - @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo -} -#endregion VsSwitch_Export - -#region VssPort_Export -Function VssPort_Export -{ - $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="VLanId";E={$_.VLanId}}, - @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, - @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPort_Export - -#region VssVmk_Export -Function VssVmk_Export -{ - $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) - { - ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo - } - } - } -} -#endregion VssVmk_Export - -#region VssPnic_Export -Function VssPnic_Export -{ - $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" - ForEach ($VMHost in Get-VMHost) - { - ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, - @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, - @{N="VmHost";E={$_.VmHost}}, - @{N="VsSwitch";E={$VsSwitch.Name}}, - @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VssPnic_Export - -#region VdSwitch_Export -Function VdSwitch_Export -{ - $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" - ForEach ($VmHost in Get-VmHost) - { - Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$_.Datacenter}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="Vendor";E={$_.Vendor}}, - @{N="Version";E={$_.Version}}, - @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, - @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo - } -} -#endregion VdSwitch_Export - -#region VdsPort_Export -Function VdsPort_Export -{ - $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) - { - Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}}, - @{N="VdSwitch";E={$_.VdSwitch}}, - @{N="NumPorts";E={$_.NumPorts}}, - @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, - @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, - @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, - @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, - @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, - @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPort_Export - -#region VdsVmk_Export -Function VdsVmk_Export -{ - $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch.Name}}, - @{N="PortGroupName";E={$_.PortGroupName}}, - @{N="DhcpEnabled";E={$_.DhcpEnabled}}, - @{N="IP";E={$_.IP}}, - @{N="Mac";E={$_.Mac}}, - @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, - @{N="VMotionEnabled";E={$_.VMotionEnabled}}, - @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, - @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, - @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo - - } - } -} -#endregion VdsVmk_Export - -#region VdsPnic_Export -Function VdsPnic_Export -{ - $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" - ForEach ($VmHost in Get-VmHost) - { - ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) - { - Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, - @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, - @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, - @{N="VmHost";E={$VMHost.Name}}, - @{N="VdSwitch";E={$VdSwitch}}, - @{N="Portgroup";E={$_.Portgroup}}, - @{N="ConnectedEntity";E={$_.Name}}, - @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo - } - } -} -#endregion VdsPnic_Export - -#region Folder_Export -Function Folder_Export -{ - $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" - ForEach ($Datacenter in Get-Datacenter) - { - Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo - } -} -#endregion Folder_Export - -#region Rdm_Export -Function Rdm_Export -{ - $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" - Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, - @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, - @{N="Vm";E={$_.Parent}}, - @{N="Label";E={$_.Name}}, - @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, - @{N="DiskType";E={$_.DiskType}}, - @{N="Persistence";E={$_.Persistence}}, - @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, - @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, - @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo -} -#endregion Rdm_Export - -#region Drs_Rule_Export -Function Drs_Rule_Export -{ - $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Type";E={$_.Type}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Rule_Export - -#region Drs_Cluster_Group_Export -Function Drs_Cluster_Group_Export -{ - $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" - ForEach ($Cluster in Get-Cluster) - { - Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="GroupType";E={$_.GroupType}}, - @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo - } -} -#endregion Drs_Cluster_Group_Export - -#region Drs_VmHost_Rule_Export -Function Drs_VmHost_Rule_Export -{ - $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) - { - Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, - @{N="Cluster";E={$_.Cluster}}, - @{N="Enabled";E={$_.Enabled}}, - @{N="Type";E={$_.Type}}, - @{N="VMGroup";E={$_.VMGroup}}, - @{N="VMHostGroup";E={$_.VMHostGroup}}, - @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, - @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo - } - } -} -#endregion Drs_VmHost_Rule_Export - -#region Resource_Pool_Export -Function Resource_Pool_Export -{ - $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" - ForEach ($Cluster in Get-Cluster) - { - ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) - { - Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, - @{N="Cluster";E={$Cluster.Name}}, - @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, - @{N="NumCpuShares";E={$_.NumCpuShares}}, - @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, - @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, - @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, - @{N="MemSharesLevel";E={$_.MemSharesLevel}}, - @{N="NumMemShares";E={$_.NumMemShares}}, - @{N="MemReservationGB";E={$_.MemReservationGB}}, - @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, - @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo - } - } -} -#endregion Resource_Pool_Export - -#endregion CsvExportFunctions - -#endregion Functions - -Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter - -#Zip Files -cd $CsvDir -dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } - -#Send E-mail -Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile - -#Clear CSV Folder -cd $CsvDir +$Date = (Get-Date -format "yyyy_MM_dd") +$7zip = "C:\Program Files\7-Zip\7z.exe" + +# Variables +$MainVC = "Replace with vCenter name where the vCenter you want to collect from is located." +$vCenterShortName = "Replace with vCenter name." +$CsvDir = "C:\vDiagram\Capture" +$SMTPserver = "SMTP Server" +$Mailfrom = "outbound@email.com" +$Mailto = "you@email.com" +$Subject = "vDiagram 2.0 Files" +$ReportFile = "C:\vDiagram\Zip" +$ZipFile = "$ReportFile"+"\vDiagram Files"+" "+"$Date.zip" +$AttachmentFile = $ZipFile +$VC_XMLFile = "C:\vDiagram\XML\credentials.xml" + + +#region Functions +#region PsCreds +#region Export-PSCredential +Function Export-PSCredential { + param ( $Credential = (Get-Credential), $Path = "credentials.xml" ) + + # Look at the object type of the $Credential parameter to determine how to handle it + switch ( $Credential.GetType().Name ) { + # It is a credential, so continue + PSCredential { continue } + # It is a string, so use that as the username and prompt for the password + String { $Credential = Get-Credential -credential $Credential } + # In all other caess, throw an error and exit + default { Throw "You must specify a credential object to export to disk." } + } + + # Create temporary object to be serialized to disk + $export = "" | Select-Object Username, EncryptedPassword + + # Give object a type name which can be identified later + #$export.PSObject.TypeNames.Insert(0,’ExportedPSCredential’) + + $export.Username = $Credential.Username + + # Encrypt SecureString password using Data Protection API + # Only the current user account can decrypt this cipher + $export.EncryptedPassword = $Credential.Password | ConvertFrom-SecureString + + # Export using the Export-Clixml cmdlet + $export | Export-Clixml $Path + Write-Host -foregroundcolor Green "Credentials saved to: " -noNewLine + + # Return FileInfo object referring to saved credentials + Get-Item $Path +} +Export-PSCredential +#endregion Export-PSCredential + +#region Import-PSCredential +Function Import-PSCredential { + param ( $Path = "credentials.xml" ) + + # Import credential file + $import = Import-Clixml $Path + + # Test for valid import + if ( !$import.UserName -or !$import.EncryptedPassword ) { + Throw "Input is not a valid ExportedPSCredential object, exiting." + } + $Username = $import.Username + + # Decrypt the password and store as a SecureString object for safekeeping + $SecurePass = $import.EncryptedPassword | ConvertTo-SecureString + + # Build the new credential object + $Credential = New-Object System.Management.Automation.PSCredential $Username, $SecurePass + Write-Output $Credential +} +#endregion Import-PSCredential + +#endregion PsCreds + +#region vCenterFunctions +#region Connect_vCenter_Main +Function Connect_vCenter_Main +{ + $MainvCenter = Connect-VIServer $MainVC -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter_Main + +#region Connect_vCenter +Function Connect_vCenter +{ + $vCenter = Connect-VIServer $vCenterShortName -Credential (Import-PSCredential -path $VC_XMLFile) +} +#endregion Connect_vCenter + +#region Disconnect_vCenter +Function Disconnect_vCenter +{ + Disconnect-ViServer * -Confirm:$False +} +#endregion Disconnect_vCenter +#endregion vCenterFunctions + +#region CsvExportFunctions +#region vCenter_Export +Function vCenter_Export +{ + $vCenterExportFile = "$CsvDir\$vCenterShortName-vCenterExport.csv" + Get-VM $vCenterShortName | Select @{N="Name";E={$_.Name}}, + @{N="Version";E={$global:DefaultVIServer.ExtensionData.Content.About.Version}}, + @{N="Build";E={$global:DefaultVIServer.ExtensionData.Content.About.Build}} | Export-CSV $vCenterExportFile -Append -NoTypeInfo + Disconnect_vCenter +} +#endregion vCenter_Export + +#region Datacenter_Export +Function Datacenter_Export +{ + $DatacenterExportFile = "$CsvDir\$vCenterShortName-DatacenterExport.csv" + Get-Datacenter | Sort Name | Select Name | Export-CSV $DatacenterExportFile -Append -NoTypeInfo +} +#endregion Datacenter_Export + +#region Cluster_Export +Function Cluster_Export +{ + $ClusterExportFile = "$CsvDir\$vCenterShortName-ClusterExport.csv" + Get-Cluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Cluster $_.Name | Get-Datacenter}}, + @{N="HAEnabled";E={$_.HAEnabled}}, + @{N="HAAdmissionControlEnabled";E={$_.HAAdmissionControlEnabled}}, + @{N="AdmissionControlPolicyCpuFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.CpuFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyMemoryFailoverResourcesPercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.MemoryFailoverResourcesPercent}}, + @{N="AdmissionControlPolicyFailoverLevel";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.FailoverLevel}}, + @{N="AdmissionControlPolicyAutoComputePercentages";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.AutoComputePercentages}}, + @{N="AdmissionControlPolicyResourceDarkCyanuctionToToleratePercent";E={$_.ExtensionData.configuration.dasconfig.AdmissionControlPolicy.ResourceDarkCyanuctionToToleratePercent}}, + @{N="DrsEnabled";E={$_.DrsEnabled}}, + @{N="DrsAutomationLevel";E={$_.DrsAutomationLevel}}, + @{N="VmMonitoring";E={$_.ExtensionData.configuration.dasconfig.VmMonitoring}}, + @{N="HostMonitoring";E={$_.ExtensionData.configuration.dasconfig.HostMonitoring}} | Export-CSV $ClusterExportFile -Append -NoTypeInfo +} +#endregion Cluster_Export + +#region VmHost_Export +Function VmHost_Export +{ + $VmHostExportFile = "$CsvDir\$vCenterShortName-VmHostExport.csv" + Get-View -ViewType HostSystem -Property Name, Config.Product, Summary.Hardware, Summary, Parent | + Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={ + $Datacenter = Get-View -Id $_.Parent -Property Name,Parent + While ($Datacenter -isnot [VMware.Vim.Datacenter] -and $Datacenter.Parent) + { + $Datacenter = Get-View -Id $Datacenter.Parent -Property Name,Parent + } + If($Datacenter -is [VMware.Vim.Datacenter]) + { + $Datacenter.Name}}}, + @{N="Cluster";E={$Cluster = Get-View -Id $_.Parent -Property Name,Parent + While ($Cluster -isnot [VMware.Vim.ClusterComputeResource] -and $Cluster.Parent) + { + $Cluster = Get-View -Id $Cluster.Parent -Property Name,Parent + } + If($Cluster -is [VMware.Vim.ClusterComputeResource]){$Cluster.Name}}}, + @{N="Version";E={$_.Config.Product.Version}}, + @{N="Build";E={$_.Config.Product.Build}}, + @{N="Manufacturer";E={$_.Summary.Hardware.Vendor}}, + @{N="Model";E={$_.Summary.Hardware.Model}}, + @{N="ProcessorType";E={$_.Summary.Hardware.CpuModel}}, + @{N="CpuMhz";E={$_.Summary.Hardware.CpuMhz}}, + @{N="NumCpuPkgs";E={$_.Summary.Hardware.NumCpuPkgs}}, + @{N="NumCpuCores";E={$_.Summary.Hardware.NumCpuCores}}, + @{N="NumCpuThreads";E={$_.Summary.Hardware.NumCpuThreads}}, + @{N="Memory";E={[math]::Round([decimal]$_.Summary.Hardware.MemorySize/1073741824)}}, + @{N="MaxEVCMode";E={$_.Summary.MaxEVCModeKey}}, + @{N="NumNics";E={$_.Summary.Hardware.NumNics}}, + @{N="IP";E={$_.Config.Network.Vnic.Spec.Ip.IpAddress}}, + @{N="NumHBAs";E={$_.Summary.Hardware.NumHBAs}} | Export-CSV $VmHostExportFile -Append -NoTypeInfo +} +#endregion VmHost_Export + +#region Vm_Export +Function Vm_Export +{ + $VmExportFile = "$CsvDir\$vCenterShortName-VmExport.csv" + ForEach($Vm in (Get-View -ViewType VirtualMachine -Property Name, Config, Config.Tools, Guest, Config.Hardware, Summary.Config, Config.DatastoreUrl, Parent, Runtime.Host -Server $vCenter | Sort Name)) + { + $Folder = Get-View -Id $Vm.Parent -Property Name + $Vm | + Select Name, + @{N="Datacenter";E={Get-Datacenter -VM $_.Name -Server $vCenter}}, + @{N="Cluster";E={Get-Cluster -VM $_.Name -Server $vCenter}}, + @{N="VmHost";E={Get-VmHost -VM $_.Name -Server $vCenter}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -VM $_.Name}}, + @{N="Datastore";E={$_.Config.DatastoreUrl.Name}}, + @{N="ResourcePool";E={Get-Vm $_.Name | Get-ResourcePool | ? {$_ -NotLike "Resources"}}}, + @{N="VsSwitch";E={Get-VirtualSwitch -VM $_.Name -Server $vCenter}}, + @{N="PortGroup";E={Get-VirtualPortGroup -VM $_.Name -Server $vCenter}}, + @{N="OS";E={$_.Config.GuestFullName}}, + @{N="Version";E={$_.Config.Version}}, + @{N="VMToolsVersion";E={$_.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.Guest.ToolsRunningStatus}}, + @{N='Folder';E={$Folder.Name}}, + @{N="NumCPU";E={$_.Config.Hardware.NumCPU}}, + @{N="CoresPerSocket";E={$_.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]($_.Config.Hardware.MemoryMB/1024),0)}}, + @{N="IP";E={$_.Guest.IpAddress}}, + @{N="MacAddress";E={$_.Config.Hardware.Device.MacAddress}}, + @{N="ProvisionedSpaceGB";E={[math]::Round([decimal]($_.ProvisionedSpaceGB - $_.MemoryGB),0)}}, + @{N="NumEthernetCards";E={$_.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.Summary.Config.MemoryReservation}}, + @{N="SRM";E={$_.Summary.Config.ManagedBy.Type}} | Export-CSV $VmExportFile -Append -NoTypeInfo + } +} +#endregion Vm_Export + +#region Template_Export +Function Template_Export +{ + $TemplateExportFile = "$CsvDir\$vCenterShortName-TemplateExport.csv" + ForEach($VmHost in Get-Cluster | Get-VmHost) + { + Get-Template -Location $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$VmHost | Get-Datacenter}}, + @{N="Cluster";E={$VmHost | Get-Cluster}}, + @{N="VmHost";E={$VmHost.name}}, + @{N="Datastore";E={Get-Datastore -Id $_.DatastoreIdList}}, + @{N="Folder";E={Get-Folder -Id $_.FolderId}}, + @{N="OS";E={$_.ExtensionData.Config.GuestFullName}}, + @{N="Version";E={$_.ExtensionData.Config.Version}}, + @{N="ToolsVersion";E={$_.ExtensionData.Guest.ToolsVersion}}, + @{N="ToolsVersionStatus";E={$_.ExtensionData.Guest.ToolsVersionStatus}}, + @{N="ToolsStatus";E={$_.ExtensionData.Guest.ToolsStatus}}, + @{N="ToolsRunningStatus";E={$_.ExtensionData.Guest.ToolsRunningStatus}}, + @{N="NumCPU";E={$_.ExtensionData.Config.Hardware.NumCPU}}, + @{N="NumCoresPerSocket";E={$_.ExtensionData.Config.Hardware.NumCoresPerSocket}}, + @{N="MemoryGB";E={[math]::Round([decimal]$_.ExtensionData.Config.Hardware.MemoryMB/1024,0)}}, + @{N="MacAddress";E={$_.ExtensionData.Config.Hardware.Device.MacAddress}}, + @{N="NumEthernetCards";E={$_.ExtensionData.Summary.Config.NumEthernetCards}}, + @{N="NumVirtualDisks";E={$_.ExtensionData.Summary.Config.NumVirtualDisks}}, + @{N="CpuReservation";E={$_.ExtensionData.Summary.Config.CpuReservation}}, + @{N="MemoryReservation";E={$_.ExtensionData.Summary.Config.MemoryReservation}} | Export-CSV $TemplateExportFile -Append -NoTypeInfo + } +} +#endregion Template_Export + +#region DatastoreCluster_Export +Function DatastoreCluster_Export +{ + $DatastoreClusterExportFile = "$CsvDir\$vCenterShortName-DatastoreClusterExport.csv" + Get-DatastoreCluster | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Datacenter}}, + @{N="Cluster";E={Get-DatastoreCluster $_.Name | Get-VmHost | Get-Cluster}}, + @{N="VmHost";E={Get-DatastoreCluster $_.Name | Get-VmHost}}, + @{N="SdrsAutomationLevel";E={$_.SdrsAutomationLevel}}, + @{N="IOLoadBalanceEnabled";E={$_.IoLoadBalanceEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}} | Export-CSV $DatastoreClusterExportFile -Append -NoTypeInfo +} +#endregion DatastoreCluster_Export + +#region Datastore_Export +Function Datastore_Export +{ + $DatastoreExportFile = "$CsvDir\$vCenterShortName-DatastoreExport.csv" + Get-Datastore | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Datastore $_.Name | Get-VmHost | Get-Cluster}}, + @{N="DatastoreCluster";E={Get-DatastoreCluster -Datastore $_.Name}}, + @{N="VmHost";E={Get-VmHost -Datastore $_.Name}}, + @{N="Vm";E={Get-Datastore $_.Name | Get-Vm}}, + @{N="Type";E={$_.Type}}, + @{N="FileSystemVersion";E={$_.FileSystemVersion}}, + @{N="DiskName";E={$_.ExtensionData.Info.VMFS.Extent.DiskName}}, + @{N="StorageIOControlEnabled";E={$_.StorageIOControlEnabled}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,0)}}, + @{N="FreeSpaceGB";E={[math]::Round([decimal]$_.FreeSpaceGB,0)}}, + @{N="Accessible";E={$_.State}}, + @{N="CongestionThresholdMillisecond";E={$_.CongestionThresholdMillisecond}} | Export-CSV $DatastoreExportFile -Append -NoTypeInfo +} +#endregion Datastore_Export + +#region VsSwitch_Export +Function VsSwitch_Export +{ + $VsSwitchExportFile = "$CsvDir\$vCenterShortName-VsSwitchExport.csv" + Get-VirtualSwitch -Standard | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $_.VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="Nic";E={$_.Nic}}, + @{N="NumPorts";E={$_.ExtensionData.Spec.NumPorts}}, + @{N="AllowPromiscuous";E={$_.ExtensionData.Spec.Policy.Security.AllowPromiscuous}}, + @{N="MacChanges";E={$_.ExtensionData.Spec.Policy.Security.MacChanges}}, + @{N="ForgedTransmits";E={$_.ExtensionData.Spec.Policy.Security.ForgedTransmits}}, + @{N="Policy";E={$_.ExtensionData.Spec.Policy.NicTeaming.Policy}}, + @{N="ReversePolicy";E={$_.ExtensionData.Spec.Policy.NicTeaming.ReversePolicy}}, + @{N="NotifySwitches";E={$_.ExtensionData.Spec.Policy.NicTeaming.NotifySwitches}}, + @{N="RollingOrder";E={$_.ExtensionData.Spec.Policy.NicTeaming.RollingOrder}}, + @{N="ActiveNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.Spec.Policy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VsSwitchExportFile -Append -NoTypeInfo +} +#endregion VsSwitch_Export + +#region VssPort_Export +Function VssPort_Export +{ + $VssPortGroupExportFile = "$CsvDir\$vCenterShortName-VssPortGroupExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VirtualPortGroup -Standard -VirtualSwitch $VsSwitch | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="VLanId";E={$_.VLanId}}, + @{N="ActiveNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.ActiveNic}}, + @{N="StandbyNic";E={$_.ExtensionData.ComputedPolicy.NicTeaming.NicOrder.StandbyNic}} | Export-CSV $VssPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPort_Export + +#region VssVmk_Export +Function VssVmk_Export +{ + $VssVmkernelExportFile = "$CsvDir\$vCenterShortName-VssVmkernelExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -VMHost $VmHost -Standard)) + { + ForEach($VssPort in (Get-VirtualPortGroup -Standard -VMHost $VmHost | Sort Name)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VsSwitch -PortGroup $VssPort | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.Name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.Name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VssVmkernelExportFile -Append -NoTypeInfo + } + } + } +} +#endregion VssVmk_Export + +#region VssPnic_Export +Function VssPnic_Export +{ + $VssPnicExportFile = "$CsvDir\$vCenterShortName-VssPnicExport.csv" + ForEach ($VMHost in Get-VMHost) + { + ForEach($VsSwitch in (Get-VirtualSwitch -Standard -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -Physical -VirtualSwitch $VsSwitch -VMHost $VmHost | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VmHost $VmHost}}, + @{N="Cluster";E={Get-Cluster -VmHost $_.VmHost}}, + @{N="VmHost";E={$_.VmHost}}, + @{N="VsSwitch";E={$VsSwitch.Name}}, + @{N="Mac";E={$_.Mac}} | Export-CSV $VssPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VssPnic_Export + +#region VdSwitch_Export +Function VdSwitch_Export +{ + $VdSwitchExportFile = "$CsvDir\$vCenterShortName-VdSwitchExport.csv" + ForEach ($VmHost in Get-VmHost) + { + Get-VdSwitch -VMHost $VmHost | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$_.Datacenter}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="Vendor";E={$_.Vendor}}, + @{N="Version";E={$_.Version}}, + @{N="NumUplinkPorts";E={$_.NumUplinkPorts}}, + @{N="UplinkPortName";E={$_.ExtensionData.Config.UplinkPortPolicy.UplinkPortName}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdSwitchExportFile -Append -NoTypeInfo + } +} +#endregion VdSwitch_Export + +#region VdsPort_Export +Function VdsPort_Export +{ + $VdsPortGroupExportFile = "$CsvDir\$vCenterShortName-VdsPortGroupExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost | Sort -Property ConnectedEntity -Unique)) + { + Get-VDPortGroup | Sort Name | ? {$_.Name -NotLike "*DVUplinks*"} | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}}, + @{N="VdSwitch";E={$_.VdSwitch}}, + @{N="NumPorts";E={$_.NumPorts}}, + @{N="ActiveUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.ActiveUplinkPort}}, + @{N="StandbyUplinkPort";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.UplinkPortOrder.StandbyUplinkPort}}, + @{N="Policy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.Policy.Value}}, + @{N="ReversePolicy";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.ReversePolicy.Value}}, + @{N="NotifySwitches";E={$_.ExtensionData.Config.DefaultPortConfig.UplinkTeamingPolicy.NotifySwitches.Value}}, + @{N="PortBinding";E={$_.PortBinding}} | Export-CSV $VdsPortGroupExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPort_Export + +#region VdsVmk_Export +Function VdsVmk_Export +{ + $VdsVmkernelExportFile = "$CsvDir\$vCenterShortName-VdsVmkernelExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VMHostNetworkAdapter -VMKernel -VirtualSwitch $VdSwitch -VMHost $VmHost | Sort -Property Name -Unique | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch.Name}}, + @{N="PortGroupName";E={$_.PortGroupName}}, + @{N="DhcpEnabled";E={$_.DhcpEnabled}}, + @{N="IP";E={$_.IP}}, + @{N="Mac";E={$_.Mac}}, + @{N="ManagementTrafficEnabled";E={$_.ManagementTrafficEnabled}}, + @{N="VMotionEnabled";E={$_.VMotionEnabled}}, + @{N="FaultToleranceLoggingEnabled";E={$_.FaultToleranceLoggingEnabled}}, + @{N="VsanTrafficEnabled";E={$_.VsanTrafficEnabled}}, + @{N="Mtu";E={$_.Mtu}} | Export-CSV $VdsVmkernelExportFile -Append -NoTypeInfo + + } + } +} +#endregion VdsVmk_Export + +#region VdsPnic_Export +Function VdsPnic_Export +{ + $VdsPnicExportFile = "$CsvDir\$vCenterShortName-VdsPnicExport.csv" + ForEach ($VmHost in Get-VmHost) + { + ForEach ($VdSwitch in (Get-VdSwitch -VMHost $VmHost)) + { + Get-VDPort -VdSwitch $VdSwitch -Uplink | Sort -Property ConnectedEntity -Unique | Select @{N="Name";E={$_.ConnectedEntity}}, + @{N="Datacenter";E={Get-Datacenter -VMHost $VMHost.name}}, + @{N="Cluster";E={Get-Cluster -VMHost $VMHost.name}}, + @{N="VmHost";E={$VMHost.Name}}, + @{N="VdSwitch";E={$VdSwitch}}, + @{N="Portgroup";E={$_.Portgroup}}, + @{N="ConnectedEntity";E={$_.Name}}, + @{N="VlanConfiguration";E={$_.VlanConfiguration}} | Export-CSV $VdsPnicExportFile -Append -NoTypeInfo + } + } +} +#endregion VdsPnic_Export + +#region Folder_Export +Function Folder_Export +{ + $FolderExportFile = "$CsvDir\$vCenterShortName-FolderExport.csv" + ForEach ($Datacenter in Get-Datacenter) + { + Get-Folder -Location $Datacenter -Type VM | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={$Datacenter.Name}} | Export-CSV $FolderExportFile -Append -NoTypeInfo + } +} +#endregion Folder_Export + +#region Rdm_Export +Function Rdm_Export +{ + $RdmExportFile = "$CsvDir\$vCenterShortName-RdmExport.csv" + Get-VM | Get-HardDisk | ? {$_.DiskType -Like "Raw*"}| Sort Parent | Select @{N="ScsiCanonicalName";E={$_.ScsiCanonicalName}}, + @{N="Cluster";E={Get-Cluster -VM $_.Parent}}, + @{N="Vm";E={$_.Parent}}, + @{N="Label";E={$_.Name}}, + @{N="CapacityGB";E={[math]::Round([decimal]$_.CapacityGB,2)}}, + @{N="DiskType";E={$_.DiskType}}, + @{N="Persistence";E={$_.Persistence}}, + @{N="CompatibilityMode";E={$_.ExtensionData.Backing.CompatibilityMode}}, + @{N="DeviceName";E={$_.ExtensionData.Backing.DeviceName}}, + @{N="Sharing";E={$_.ExtensionData.Backing.Sharing}} | Export-CSV $RdmExportFile -Append -NoTypeInfo +} +#endregion Rdm_Export + +#region Drs_Rule_Export +Function Drs_Rule_Export +{ + $DrsRuleExportFile = "$CsvDir\$vCenterShortName-DrsRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Type";E={$_.Type}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Mandatory";E={$_.Mandatory}} | Export-CSV $DrsRuleExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Rule_Export + +#region Drs_Cluster_Group_Export +Function Drs_Cluster_Group_Export +{ + $DrsClusterGroupExportFile = "$CsvDir\$vCenterShortName-DrsClusterGroupExport.csv" + ForEach ($Cluster in Get-Cluster) + { + Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="GroupType";E={$_.GroupType}}, + @{N="Member";E={$_.Member}} | Export-CSV $DrsClusterGroupExportFile -Append -NoTypeInfo + } +} +#endregion Drs_Cluster_Group_Export + +#region Drs_VmHost_Rule_Export +Function Drs_VmHost_Rule_Export +{ + $DrsVmHostRuleExportFile = "$CsvDir\$vCenterShortName-DrsVmHostRuleExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($DrsClusterGroup in (Get-Cluster $Cluster | Get-DrsClusterGroup | Sort Name)) + { + Get-Cluster $Cluster | Get-DrsVmHostRule | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Datacenter";E={Get-Datacenter -Cluster $Cluster.Name}}, + @{N="Cluster";E={$_.Cluster}}, + @{N="Enabled";E={$_.Enabled}}, + @{N="Type";E={$_.Type}}, + @{N="VMGroup";E={$_.VMGroup}}, + @{N="VMHostGroup";E={$_.VMHostGroup}}, + @{N="AffineHostGroupName";E={$_.ExtensionData.AffineHostGroupName}}, + @{N="AntiAffineHostGroupName";E={$_.ExtensionData.AntiAffineHostGroupName}} | Export-CSV $DrsVmHostRuleExportFile -Append -NoTypeInfo + } + } +} +#endregion Drs_VmHost_Rule_Export + +#region Resource_Pool_Export +Function Resource_Pool_Export +{ + $ResourcePoolExportFile = "$CsvDir\$vCenterShortName-ResourcePoolExport.csv" + ForEach ($Cluster in Get-Cluster) + { + ForEach ($ResourcePool in (Get-Cluster $Cluster | Get-ResourcePool | ?{$_.Name -ne "Resources"} | Sort Name)) + { + Get-ResourcePool $ResourcePool | Sort Name | Select @{N="Name";E={$_.Name}}, + @{N="Cluster";E={$Cluster.Name}}, + @{N="CpuSharesLevel";E={$_.CpuSharesLevel}}, + @{N="NumCpuShares";E={$_.NumCpuShares}}, + @{N="CpuReservationMHz";E={$_.CpuReservationMHz}}, + @{N="CpuExpandableReservation";E={$_.CpuExpandableReservation}}, + @{N="CpuLimitMHz";E={$_.CpuLimitMHz}}, + @{N="MemSharesLevel";E={$_.MemSharesLevel}}, + @{N="NumMemShares";E={$_.NumMemShares}}, + @{N="MemReservationGB";E={$_.MemReservationGB}}, + @{N="MemExpandableReservation";E={$_.MemExpandableReservation}}, + @{N="MemLimitGB";E={$_.MemLimitGB}} | Export-CSV $ResourcePoolExportFile -Append -NoTypeInfo + } + } +} +#endregion Resource_Pool_Export + +#endregion CsvExportFunctions + +#endregion Functions + +Connect_vCenter_Main; vCenter_Export; Connect_vCenter; Datacenter_Export; Cluster_Export; VmHost_Export; Vm_Export; Template_Export; DatastoreCluster_Export; Datastore_Export; VsSwitch_Export; VssPort_Export; VssVmk_Export; VssPnic_Export; VdSwitch_Export; VdsPort_Export; VdsVmk_Export; VdsPnic_Export; Folder_Export; Rdm_Export; Drs_Rule_Export; Drs_Cluster_Group_Export; Drs_VmHost_Rule_Export; Resource_Pool_Export; Disconnect_vCenter + +#Zip Files +cd $CsvDir +dir *.csv | ForEach-Object { & $7zip a -tzip ($ZipFile) $CsvDir\*.csv } + +#Send E-mail +Send-MailMessage -To $Mailto -Subject $Subject -SmtpServer $SMTPserver -From $Mailfrom -Attachments $AttachmentFile + +#Clear CSV Folder +cd $CsvDir del *.csv \ No newline at end of file From 505b0e2c03995cab23f158649bad33cdf6464ce1 Mon Sep 17 00:00:00 2001 From: "Jesus \"Tony\" Gonzalez Jr" <38351533+Tony-SouthFLVMUG@users.noreply.github.com> Date: Fri, 13 Apr 2018 08:33:57 -0400 Subject: [PATCH 03/19] Delete --- vDiagram_2.0.1/vDiagram.vssx | Bin 811190 -> 0 bytes vDiagram_2.0.1/vDiagram2.0.1.ps1 | 8807 ----------------- .../vDiagram_Scheduled_Task 2.0.1.ps1 | 593 -- 3 files changed, 9400 deletions(-) delete mode 100644 vDiagram_2.0.1/vDiagram.vssx delete mode 100644 vDiagram_2.0.1/vDiagram2.0.1.ps1 delete mode 100644 vDiagram_2.0.1/vDiagram_Scheduled_Task 2.0.1.ps1 diff --git a/vDiagram_2.0.1/vDiagram.vssx b/vDiagram_2.0.1/vDiagram.vssx deleted file mode 100644 index 5acb6e696e4a8a05619143b83a6350e21f0b8af7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 811190 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 z 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%0AW#|s-_LSUe?VI^wixa*f&e-XqC*?O|B%(C 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 w>+;fF& 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⪻j=$~evfD3|ZEan5f63xkm!R5c zXR3X`+sx-(*GJ~2R3V`k1}e7=ZJ=8e=648AMH77&l3W<9pnD;DA|PP>yN5PJpFT{P ztgRIcRF3|mMdI$J6V01l_@f|)E>Mv%))0!dMbnvves9}v2BKKQ)OXcqa3qH!s-mK;Nw%@6p&|UIrM3S@M@dUbL@?5Cx+cT9{`|PE_b*>yX%F@> zmr%;^zc;tz`rfFWv?7gTkvjyYWN1lASazG5Vjv;G`mEH7PL^sR_r`lj&1~<#%T)bQ z_2o>F95Bu%TRq=j(Cf+kTlY7W%_x|iD|Z8s^%|?xit@&_q?j7aej=)6AKJTq*62C` zHadX=@}*2}t)ZWh-fUbzU2a4#o}a{r%M|l+~V{SxA1&_u1Eq z_?TG;Q|pA&1J4uF^lycGEh@24a2Wa5tfp9chRY3?zDvR;(;9khENEu9_&;9Yp@jwe zqqN|)zB02hvnX$_m*Kp{HKTMk(IFKrEgAOr)OuP`(#~L}8X6b#1267V8;tQT@(IOtLBi!|H4TaPR zwfr9A-lsD8HkzlWr+-#!Rb#HNiEnRn{9NIPSWo2j_eaBWKA$NV*b==~roOrd{Z!8w|u}698LQXnwi*2QK|V(QCF0lg$!N@cMqcQfRj= z;_l+4!3C#CK*EE7C(|$XwxBQZ`l>$M5gX%W%N$PKWD)7FW;KPV#lxVw)ZU%L{QQ16 zXl+{Ycr)46Wx1QgZm2qQH99{s(j&9Htf*xf;h)Q;{ChS8zS$PRu%n2`z+QhPjV1L7 zQWmPF`}C~AQ;c)}gGOgL)qp(eO1g8>kP*!lN_WEcX}=bTb}yr}DTgg$CQs7<%bZh7 z#N5wuFJQeRCx8Z4RJ4D`S!)qhFsln%wzg0VPvin%M{Y7wVt5g_q%Q6`RNYlM41cVL z02K5QdX<@$AJE7|l3*O29P<2(!om}cOiJ=wsa_&+MEEV<(%($Sll8=BE8b6j4I*X& zDN4iTIw*(-nHVf_=h(T6lIiD*8u4a$9M_!`6vNmDP4+i-Hyt!+5V60# zZk5eY<8*n5xq-5b?7l!!>Ck2DqhS1KN9?NlsB))g|C|Qy>)tzDJBEj@=j3wh8;Mh` zg0=f~>dhR@NmF2Kja2e`1X4>}BLl{)MAu_Unl^kb}5SR@>T? zXRCL1Oio&!x-V?mPV(&kjF*o)wDE1G1ate##M_k|$%^#sztq>)AGGX=P$UrPXJag` zh$!2Xx}k!Z?C#;USZdmK1n*p%5qT{v$-8wN9<9^Kk9)5^OOy2+%IIJQrv-+JiHGm( zaOGaLf~~8*`2UT3GA?Wpn>#MF5?~HhEbVNxnpD%|~y6feHicj=#;-#8fukW|rezqQFNJ?BOJKRdx z&1P-$r;y5%$pIgLOo@{6Y}@!p&l>d$B}EJ@$JaG#<*Blz1uFZO${!nn=vFOwh^64g zS+!&B?S0NnGIjA%<5dG+F|LOB!t3Z};iAnk3kIs>fj)Ei&zrdx* zuv+uiif;##zNhf3P5wC~ei6pP-^QhD5f#Z}eMyO@W!dLI{%;dymC}l`D?$)8J8zh7 z`?WWo;u(ajf`OXUsQQ1Dl~Jn9(-kU}LV!jc((#Ff)XjpSPZJo@*L%LwmG3Yq`_ZzZ zG~x2$PtL7Pz_Ct+Y4n~9_S9OuZ~{-88a};wY%C`3i|B8cDqEEq{F_Rus-mFm++2S~ zCLD-@pUKNI@FrnD64$J`?=?QWR!Cd@Y4tCT5iG`@|?+;~^QJH^b^V?a-erSWUZys5!u=VXNr z{T*Ckk+Z+DMh^lkE&j^*(GW{vQVR^*P?fp-Y-jao;!>3a|J!n8Eha^-%$3hVZvq$q`mZ;p~w1yF5rGiudgLeYqtJ;Mc(e^ZX?V1x+=(qET3s5-b2!k zrNK$rxRj)~tE@>1Swvx9-!LhKXj{M}y&67%hdXJ=+q+AX;IfSPO%XcC@&MHOVxy7? zMnXglm9X{I<{fT!pmqu8nVFsu!SYM@2;c3^F&OrjwE*Vg>XPXQ*XKCAdnnirrKwsTRmCDJULyudvCK^GPu^XJVl&e_DS z@Fx`>Bf^xuiqF2_qVuZ9ztUYn#Jj4*+2T(8frl8D^EePyU&HDTO(XBRQsHqLSp%KL z!h_mntFu+ZWC_^}I}V)RO7rRi^dr>u4UkJ<@bF2nH0$7xuo`Wli@%uTUIuygZ|N%w zIr_R&V>C9P)%Bz2x(b<@t?Ti&J5Z2ipu4@HMq)-=#`JodSd8vR{sv`3yhk90oEo!Q zTSeAKqy>HFD?zWeC*(W6{h9o2=DxxQc7B4N$@BiA<=c6Tiq0LWXvfa4cf z?owxGBomGwCza>T4*_-PQcIA$ zL|LSTvA?0 zQ5#wJ%;mtd#ME-0JV~-wMdGQ~#6}%Pc2C$XvvX>tK`vtN7(QfcyrBr0VC}d_r_4}@ zJR($BsH2-#363#!XI5CC|CoWlsM`oLrS7UEg6OAf_;}m*&ALwSn6JyC4IvYicwMh} zT$Cqu0tF=L4&>Day&O+XC80Wm4A~u|m9HA)r?7-$|7r;jm-p<*(DUi4tdX(?E*G374IS)fnrT1wTkTRTKN6mtM3l^IRP^EW?5u} zT7=8xnfLvzUz^gCXM!B9nnrG;36a!oFP(Npd^CyCJu&F^3^*qDR`&QJ@|!+1=3$u$SZJ2L_+$m4++(}IAGnLyZ|QS*MD%OCXK&7uVS)`2QG%0`v#2+} zva)iw?$m~XPKYLB$M@EWGAX*+KRZ15r+2QF&dtS=yDGP3sO#4!d!Ov*gqN=!@aa@W zWEn!$G(f<4z!^4KqegxJBI^AX+<;9=*|BmDN@Dr7Hs8&ln+>rH`TDUsbiVGcz1CUO zXn+{zw61;3O5!fV6_EwbLd5CnvnTg;S(cO>hcaRNTYRYm-v&)j*+oqh_Q<^fK;eM9 zWk^GRf`)WxE~TEBY|_xhFttpn+xrRRf#1K7>@Q}IRH5ba^X z+;mVS{OD6fTy5<4T@(rmm^vNkd4elQf%-n*mAtlm{VwAn!%%|ws=cr$29Vq=grB?` z-&5Eo1aSHXJIwnHBn3tO0hDm`_FDN9&LAVry3@lJcK*uW=DZ$*5Ce+b)0o?7{+=cm zM0$UsM#anHReT^2kbSzfE7{ms#jdVtrr4V$6pgGV&`8C~T61HLf#zH3xMSZeZ$O}^ z^^D=3!=G8l4vdP7@gwagO`>IFJk?ZPRUS{#)`D$qB5pfv3;nt~4>9|fEh`7MB5VjV z1tOG{GNDhS(*Aq?=4@YMCf-Oju5Pz1fvCbkQ31g0WJ^tMC8Z?Gb0y%~%$rF&5&j!4EY zre+Gll$Dhn0xbn92BVT&w^BMs=^RhTFXoW+UGz*tl{|YS>XB7BVPd7gSt501RrFn9w2Yadw=7U_E5Aak{OYi{)SXK`h->cw;z!+hCOOOO0(F3anDt6N~{J#Y7D`bfJ z&QDVyc*}+$Qjpf^8`AVzdPnq4@UDi=>6G$$tjXGvIA7?5#A#mGsSM|M@a_jN@*)X8l${3i##@^ibmQNL3(rdgRE4YKl(3P>$#^ zDk~%V9z*E=@&y)Yi5WOWBI(WeH_seq-e8gh0I(u7PB8<^MC@z|F< zjnzF=V8=d8FJ8OYXeAi6M&gZ2lHC4%#=D6D&9bqvVZ8AhA=9Ar46CM7c|Epzh&?jc zX4yagN6PJvT6k8!e~r-=Os3s2~Ne#PI5OALcA54G;UE=mt6)Kc;Ez#{Vp!)2Fd@(qQ8_K)Cu311kKkDAoM`+Ag7m76DfP9lu1EiQ=Xh0 zCj|$)_$>daF$hSp0%EiWyAd#S&oh~dEZzmPipgMnq1mIZ-s+s^*&Q&tj7m7=aw+;J z-A)$iobN1OXSuxA09pK5j7t)h8nLCADoNOYinpVsqt~b=f*^KBjmDwT(-*F;_LAu3 z*HHu*xi4r3VODjOlP2JX8uYc2bg}WPTq`!PFYz z-*x5SOBV?x;kL`F$~|Y+RfOeUkjV!h6Bc+`CiG3!)=GH`iBU}Q`In7+<`^x`&Ojh$ z-*~GOigCe|XdYKcBi$OR1g6WX6B#4L9(}pT3zZqP04(gw%jY(ID{G|FqNouO?_X{D zAg7~471ChNtwnIhORWDt7bW4>WbL&L6XAO$&=239Q)Aspb)C`;zflveHel*g%6#`& znz(k%Y;*eGMtZ5VW+2g>v*VnI3Nx`-{dD0W)~$`r({W@+$Njn6soaZxR!n{GZ+8fB ztWqp~c#LeGe9)Du!dQb6;S6o5vQn4Rfpy8YQxkF{F2E|MZC}21REI=tE7=HcFsV{; zL@K7bx*bN{bb?*l*VERPcsb6^Dh@jU^QNsjF9h3|MUyqVQ7Y^Zqt&dX1+mmmYdRE3 zAW(UB@n4vyi}Lip%U@Cp4d;nyX?S{BwFtbfU@1&h$U3f&KqrE+4;mgGhI1~@kjIHF zHs}i&5_E0{en%)XJ_zLH${0VT*K1BPwdR92`#)0NJ)Q(c9ZdA|*$tO2bICRu5@?A-Km`Xx*sd&XBKu*?W`Ty(ult7GL7q zrz^jhtRvT7U74LVDZ0Y2v5@;=Vz$IhBvoW`R!-Si_%2lIinXs{Kw3xzVJ09jcWkzj zKbLcI2=Ry)VM$hayF|#ucNLsk=B}R9U+24ED!3|=z9VurmOcD3vni+ErCWntpw^Py zjy-*`D3;rQmCtk=d-jMqy}Zt6ZKgcLwKA_Yk>H_Iz%jf4^pCL-NL~{Z`&vH zaBCU}rpXWq)yWJ~IBkc`uxkT$f*v*J=^bXPTJkBXR&7Gxn*=Az_|Dv|IOJeSsIzlz ze^w9IRQdFU=wsL3vPCpC*T!E@z+@{>s`mOHe>En^EgZt3*)F;>o+0kiM_8<=z>a(r zjTk&HQ@M5C?pdcL7Q|M1ys+hwg6F29u2|lT4SuC44ZJ?7D$(J_x-NF5hr2d~V3PA@ z1=uxek+;?0QJ#z<%GP5O5R^KmrcfAF-4sR#VV|rNb`QKeR&AlvailiLIW?sWLoO{iJ%i zG;nXIQ2-G%Gfg2^O#|IRBlMkO7NC><5+pnh<3AL`MfOyMK5uQZi+!G*r9 zcsw!g99}fi(z{@sYCcXfhn36Czd-oJD#S+Rt`FGnEmDn9oKs2~-i{3XRk{D%{|uUk zWph`@4k=*s7b!IV6BS^`Yo8fnJo{+UE444Ryb2Y~u5LA0*_tPDq8m`%!!+Yh5D1FG ze$Zx3c>~wLilJn)F5A;|e-OpynXF%I7>xH13v}N@9H}roKwD)syJb_q_<1<=F;Q!A z%;q3W7=Ws5%z`pmes{4rFv=Z(XJW6V;LvU;tMRQYk56!fg;DgZgmF8hK701TTkD&)YzHs)_4p)yD`qL^0(u1fKcTF_x{BaO^9`e;2iR#l^`9y%RQFOM4qza1<|KKPtsce1>ylV#@WdpCG z#e~qs&aA7%7`&EOF-$Cif?7J1B=`3{>7&lpG`55j=qnc7!OYvVh83%6`e8Lmj&j%CteUfh~8FUCIHKf^IRfFcgc1{BJdh9zQr=($y}VCOMgb7qQ3s7U!sT(AD{nsRBCy z3ZcibVI^9i(T@WO+I^t(^4^c$nq~|;cZUBi7v0un6L%8bb&Nj|_4_E|$Nh-il_!7# zq|Dt?uihxti3j1EsL3n-;BA^5G8G8-Fq%rFnGZgAhpU75IrYQV2fn&Whk0E0 zNx_vT?O$#7p|2xw=x9k`F@eg*DPm?jnp1UcBjXa7FB?XbM{R7A%--st9Utj6;VP`2 zk>DBN6uQq|iP_JpU%{Y)8cfHcc%n9`jHKk$-iB+gw6XN77qzU5LuuG1&_uB|23PdB z2OXi$D`rp*(nMEPB1c!qlDIZMYrHSA6)qb*{#d*a$Z&Ie`j9UHFv9jdk#InyOwG7~ zi%{ocN4iX2Ws5Bg{2;o%#%L@gLL+#}?!n0Fypm&wS+YG_*)JUCDdd-q6G2 z>G#9BSFJ3k%hP#+KrF)pi5HzPh)~zN8-+kwplx0W5(gyR6`(5~-_fap&j6+tyu!kF z7zG3cUsSamM{)K)dn!*f!mvxxNDa;cS^f;IKYMnK26Qllu;vO?decZuO!B$b`I__Q zw6tmnaMKc`wnoW;Z+31}dY@sJfv~%STv7ty3Y?nsM zBPFXxdfPGgPLoZo^WnvMpMkEW|6H0ywhT|=W$mo;lU`0Vi|wCCxq}8SxKkhVf*IBtHc=zA}=}{x0>H3Rd@s|1uw3wtGR8sWj$qp^8$@A zqg%#060<&ZGrj{etaT^t)Io~u$lU~Ee+-B!n3B{Uw>VimD~8gV5QcE}Q$;^zfq&Qq zuzh;a_h_5J$n)G^Yxq({KIO|XajRiMh$ZxWe9k@hv$T}y%*y0fSWH;MyQTHTN5CHe z{=p{LZ>6;;S@%nq-qHUL&1T`y&$T(&YD+jg@3jtTeQ@ zWl^j$+PV`nR(`eoW`ACs)^ok!b|U(IbQ7$I2D&L;;}g*_O*qO~BQfo(QoZZe3l<)K zpbH#t(fPMFIY18<*5{Q;iw*nWERXr=8%SpGc~0$;8&^j?J3TxB580WP0@Kvdn}_Y6 z@ACV!IzLxe&tVd)?*F^t!w+j+j1{?jxVv|-$p6$|Sa0d|>l0S3S7mX3?Ktv8mhOES z4!S>>cSqC0eK3f&PQUu+&&UU=^us6wbiB%i^J1~rPD4|Z%B`!&zb5+uy_B!G#6@}9 z6|rYRE36hK`0h>bqs}hZ9{W4BKk8^{dxul?Erx9&e7#eM7W;{y9o{^&wjol^AtLg% zIx6ymjx9||_Me#S#CX9asChC;j_!|JUI@nfZ7bX&~+g*=m8+f=C<38$#& zzTPea=53(wXVXahSwbga#bxMs(M3$yF3s$Aq%WhXuC=(yGV1_tBc67L#aEpYwFx7b)V@ZvCvLD-&G z{+WVS778f?rT=ws)1TU8ujjCqer_Rg9Bt=!W?;m14I*T=Mnj)HDV&*#LZJZTdR_PW zRmJ-`VqZvCt?;o7^{K{xCC`&=O8S}oP`9(WRIVL871i^_8)n*|1(kcPp+Pw!^$P}r z;SCR?zaY|>!MVlG5@K1VNJ%F}xGPE+sV5LBJfwKA^t1{0olm__k8}#-;MTP~1yKC( z3btEzrC>{B&s9_wmWh39cJr;_9cF_=+dsHU+XaS{u|XhtEu>4uC<(0vt8}BD?Bdqp%p*nm)$o z2vgy>_&j+XGWS6Jn@a!V{__hE$@)GC@no8|45)UvgV=QSED3Bj0k=u`)|Rh^4(A;{ z?SP+(+QHg!Tqgk#mxkA+AGW3XmYGba7JfZ|@^uR#5O!>#8xim7Z660a&MX zlRVtqpIRds3UVZ6@z+z`CJPj*n&~Zg`D@E}@l0%kKT2OM-6xRHHEf9(o?TN@6G-#T zgE={BY2QCFjA*H<3do^r%a?QOvO{kB%_-%u^4#J2*!r$E}->*N9H&b1+ zl3F&#%JcH`*Iy|gcYeAh5~%DkYq#Oo5xeTVr&_)C7m!qGDbQTaMV7?M=Oa>{mXUy_ zfc)RcM^-KY>_?QM5TVrjz7&x?cySqi zXl{I6{1R{-UJ}s+bJ;u?O1)VKuvtIfCKN*d_gO5dzkISANZf66+ zs-YE=#Ou^{$n?6G5@P<)nljY#=kc*#NDVccn*De*78|BUnUF}S{`m3QJ3Bv>CGZ+P zHd`EF)F$QJ_@dsxf*`lM$;_;t^(<;mp~4O69{@&Mo3WDK-+ik`b5A;J*^aODD5a7I z;4Q8aW?;$BME*cpa%K_5SFfz;Dj+X&;dSu&2j65X?>U79$paDN>)adI=q@4YBMG$CsK-38+t;Ovj1^o}2nyr6INs z!xVDLP!4Uqzo!h~F!%7QX9^G&$=KD6}B((iJN$T=B(~`b{L0(2i`2VOBu0y6I)Gn`;R03#R_yj~iXX347mp<4$wOhf? z26^^1qwt8}BgKZU+t%Y1@cpytOQY45B?E82&GAa{)DJz*tslRN{z4t`aB&TB;uK@3 z*yt#j5oRR42jCl3xQ&OxU+$ed*i+YnDdx&%_4Mqr-^IFd4WcaW8@^TntTi&@`}cdk zk&0*oyT%xE6~t@AUnGf3f!#Vc4xCTwA6TTV~GB7PIr68rS&(?nH&Yq$FsirNLp;A9rH z$h_r>?HN?i>3&|G#+=<)nHj$mn#-5m|7_j(^7$i9UJK=#ou`o^;+d*He>yl%H&SSx zhJE%-3*+~(j|1wMf2aN_)E2M{3@8v_1g{ph0S=H_&4O_m{n^*Cf=9M6Ucmefj)oc3f8=C&Y2VVlR zWdFokxn(fai8&-$!}4_hm2=AhDF+XakrW%m@n6|lo5l)G6Wak$LWHGdy#7>RIBq{J zt}{-JI|_A;wi=|yf$({@jj54?5o2}WUGQ0mSLetHRyWH4&Ix0tW{!E=gzI>LH!9wU z!N8N*q*L(Q_0WJPtxkDu52t0lAp7#^uDY3y4lU@gk_2>oj@Q;pR&;yC<(7L=%j@hQ zjOI5&zUS)*A9or${2q3eUlI^k4lrb0LG_LPT5On1Uj#}97?QB4Etq0MuI8rPj^_qFMFps};JilS5LnCkw3m z!Ib3&=lEJFq`bOZ3M3gO+d;)$M9g*B-`_vEe7^99ZIw;^{MS;|#-pR%?V_dM+Oyn= zAyDSlrY6Qe^w(wGCVeToQv`^J-jB#&@y-_~oxOQ=u5e+1u;%s^OpA|RJ3`w4%6(P8 zRm9wEatu4(TfaWuNF%|!EpIAFoqlfFL|Rzt2oLtG*R2;@AU9O~si(!ZMY4-` z_a7B5rJm<9v^PokOEloc~_rl!RD#OWJ&XYj#R zyS%deFJgre!8dDP$lBNx8J;yeBVkbzt-f|ufwb>9goF~ZeyId=gsm6X7c0b^l9YOE zJr<~J)i3KBKNHDbpS9ccP(ME`4iv@_JgTJg84G332h%Dpm4Z9%>pN}CIn12O%TO@{ z{Hctv2s2`}zAZDpU z36_})?F$emA$RWH+5F3>(%rP%(P>C1MFw2pfq{Yc-djFW)=P|atJ(52H%kr+Y>I5i z922cvg35B!2(Q?VC&|?7>lKuYjJZeyUSM)POznRz>U++PFw!+p7#kaV2QAmtHTDr` zJRG+M(}Ox6vBZQn8S14}&dlHZ!p;Q0!u_H{-EzsLlgrz>sR~j#M!_@zq=BsNn#b}B z9NuVtgfLf>#38I|Xw2oV*)AHGE%LpRXYUeF6nI3?1w|d=G@s#@BfHn>ueXW~-Ffwo zX)Q4QKg5sHUu1colmv~9tBiEr80}!Xe%?o^5*-sG*X^3L&Zd^qKA26cZyzUUJE;g< z9wt#k>Lgx=wiSw$TJp!)u|o5R6w4*vbjf4wUD z)=jW%YM>10fkP&P+@C)`i`~_h7moHxAEe0^V6~hDitPPm@Acy8G>4uSZYMFoa;BKNt~hu&pxj(i59;y2h!jZ$&@Ni`>Owb5)2`A|g#)#bRtPyxKk1 zm~7DA^Y*qZSm_{PY0L+|%Qne(0xlrh$6KxyIT^K*64C~r) zOCaPZYUI|^WDJ*Z)T#Yd%4m=KUl+_mSo6d}t^X8i&GBfPA3+o`0lHwixs72w3UMT` z5%sz22CqFbZfcNoG%kGNvZn328z=K)yJAe!y~UYI8oEqaMcVAa#Mrzk6v_uhZ|zO_qOjcByQ{cWRHo3d{8?hgY}&F^6q5my$APRyl}k!yY<%#6_pCPw#uT$B4uSW zJL!~^9L&uxmv`8426MB~HHfB@2dcI2J}67#owd=dSJ_OwD^B?GMK*|#Vj$}P5aS%= zBomDtnQ!0!Qd6$QzoWMO2cbKV^3&}`N=!*pmX50IrX@w4PCsJKlBE13!KC}LJ2jOT zm)>=Ae0WwsWtiu6O&{@(Z%*NVq(?Cfq|A+z8oIcpaR~`e?CHn|Nyx96+t2SRv?6e1 z^eCc^eMhS$(E5WTB&4J#b?lsvvO+=#7x%2j6s}Q*_70?zYlb^G{G`bcpR1K<8}qIk z^470wEHdoTdStZ+rm3sIG#S|Y4ewMH!gQ5W3nCJNnuwVF_Nf|A*9ruKm?8H5BKXpl zZMOZ~ZhZhUu`id%U~+vGsK{`!mcBh;~gCuLcYv@8*yR|4OVzRQ42epzyjH%v^S+_CRBPcn+dK2 zNw9p{sWf8b74%m#%*2L|zkWUOkw9~bF40w4t;74DgmiK4Eiw&G*eY9$; zl;T}d@Ot~~U03k;E#qMiFSh-RkFJ%WQD3JpBJ`S;5A|f5&UZW2&J@NNj;9W2KqFq8 z0jn511(u!n9a0_|-Wt?6;kvHl3%)a)SvxJ1+jX-s{`8m6ug;E=v_UDTRlNc8z&83h&kb@fi2AkrOEb(#duz%a(4h zq_WU!zo7Xv>$durFNevT>^Rb_mBYR;@!I>}=8ni4_S*J|&VDUuXiPL%P{ZM%i^a>s zp)|VY1hTgR&X&x)(zbRV?)j7ke75~_OT})%ql0t;J$8s)_NwT+Yi@Sxk|*~RQuRsn zk&yQ&vWQiaw^MZKS}p!dVbgY#B$(Ox%rMqJ`Q6%)!k=(Qh#@f4K>iv zBpArHLZbz`C2QB0212rTRE3+?b2VZAy5cN_s9^+x&lPb;p@DPcR>Bt@F@ctOZf0uxns^9LqAay-Sr!f=Sq<<6D8vsOLj8DS?r zBb29FgiCDtsbxCxh5Y-~`PKo&rL(~v3$K~(@uR}R!psPH`L)=B-LEJa6#qlm)6fRf z_^QgoF~@J73TIb*cKjzyfheqHcc;vZadCqz(fFm8s$E5^Z>vK*P6 zto=&Th50eb!nW2%fT95TBt>;r(@$kzzAq}>gC5#YVD=e;*Mku-CNrxJlDu54 zj>l<@yWeosdvt5kv|o|=TMrugRB{6EWoZrftFrewCbMipp8J+n?@i7=ek7}(D8hWV zBrWWUOc_b)=;-9Q+z{d8r$6>oQf837J21F;`p!;F_kK~-xbX$JkFuCdtQCegiSa#S z!r+!~HPmm+N8Ly~lLKwYweV}=P#=;3=yT;pYCcLf9mv0iPFw_)z(LY6ouk>5O)=m_sy2d2>z3Mi-E zIlIk)ck}!`ue~X6;7eYmTGCJ9;Xkdu2Eb}+qt{FavsIalf?~D+ZyF};?2I`(tPUvU z^bhJ~;2UlU<$lQb!M0)N8Nka8EwqpIFf-IbuvW5!O5;>>t9}e&;pWYeudY5bcE=m0 z^?L+2WA|$PlMIqX5VI8=31ccDMX0QloT*_+mApuLfe+km*^~+2Bm*xNQ*g?+^tMgn zT9(Jjd^Kz{P49mUe|cu{)DToBL+3_ZrzDflEgl;W5)Gc;zI_FF_(Fw%&JD5&mXLV7 z(TnKfY&y+}hs&8B`x$~n@tHzopvCC(y$*Yg-cat1;@5vxv4x zI%T&>2L-m$ZIUT|KV{|gmHg%-dXumEnXG!^Gf_E2Vnf3YG~DOgywXNa-2xqzeNPpl zn6+%3*VwuEKk_7te-7e$XK4M+-j}#k$~<0Wzu|hISghY zZ}QWU*H|KAA6O-Ydgg0QMTLF*p5u2o*ki1;y3mzHhWLBBPJZJq_LZV_pde|fhx!D6 zO&QUQZQafT%)lB~L#uQ=ONN zFL~Y~nt7Ci(Z0Jf8!5J>Xu6Z@ppv!MV5NsKgj8UA~> zcV%exHB&LfuF9LGE0~`&Ot`XoEkIECtJ`;?vU2!A{!2z^m<(AZ&xA*`^{jr}C&HkC zCeM6bY4UWpZMW^L+Px*0aSBn2Zhbsu!hHTjlEI%NhHk0fqLi;Hbm;V;4m}lg#>Az5 zFH-Da((e$-@IIh*sCk5eV0-pylPyN{aJD7=(>gxdN)Pq8F*|?}v}Y}S87&Gc8)Hrj z^XqaW+-RS>hueKj>D^u;0|o-)A20v_oDhqDSr^j|P1QO^V(%GE_jH9~HdUITl3mYi!R zbDeSGKKVb?rRmAW)h6NHtSbV>l9idiH_N; zuoxG2$C?<~%Y916*^fA8qN-dQxYvW3w2gOc@&&$9#YT+TeiE(|R-)?O{%Yw1n7*(e zPrNG!j69y9*jUkR$|K5gkf~?>3j(1ZGyMCnBd_aQj(H1O4{2=Bqwv$a4e}hF_1}|1 zLFl@L-_jx%JJs;1>DAti#?#QtY{UAhJuh&)W!sJTSPLPcbbRk6&#`jAN|3LH^i<6A zaWn9HcHPP^%>Djhm*g9oyDd}t7Gd#oE)w@QEG>a*rfU^>sfT98zzI;Jz4ko;`(ACr zd#6I?N6tjf{Y`=D4`Ux#2xnNrWblObxVS1u2CV6kW1@bHB7RJmo-ZL3%xY1Rr|fCd z>?6Sp3@I(`zllq|PFHirgnFEr0pxm{$f;ZWx!a&>T)Zh#|J$PYCPol%BLm!2VftnI zRXz=KBXO+WxolFTjJrZ6P_eKJu>OOAS~d2Wl_-?jA{`}1wgI<`p3 zzTRFW5<)_}Z_!y65&ZKB1uUkN+=AmHo!F1<_N3^32iqGxxfbUS^#+2*O3_d@zE)5ybl?OVV<0La!SY?A6XN#~?o$0&Uv*O*=7K}ZH$FVRl; zx)fyDyAPL2J$bHY>Ft)o>0E?*Zu$(PF^hlhWK8X;c2-s$upU>dCTwAxgnVcUCefjc zO`K>p^_29X3jPSJ`%|0}GiIMINGn0S!Nk5cDJ)iI<1Z0&dU(tOmo+XNNG+TCz^KFg zKKY#S<*9CHB#jJ(C4!Ln!lu-r%H{@?TU&oZ_P$H^(C9#M6vb>n6Thi6doaGUglYOK zn!~VaRN5t*}6t2uV|xAtDgU%$KZA)@f|W z2h_kr?75LIBCHAf55R3p z&g#IgnC&Wqklvg$qpm+yHrM{9wLi{DEg<$h?g0$L0mil>=9YzEyz}bj(Ob~9zMc*h zx=Fx|&)Wd9VgDI(gEG*7kDJ?u2J0IDw^>frwVK1VeKHzvTOy8a!M3RCo6S zr{hIs$>wt60`w~r=14Ge)sBlDKwC+XR!%dn2h%~^qaqm@-#+rF1# zRl=t9Hv}|IeZIXg9a5oPr1`Pt1yp+ijkfR&b+@D?LBq z7Q!sYhd6XbHa}SoH{rjN7_&WAvXUKuLnuyBN7I+-3aCOcmav)7n?~*dj*gL|lRV%G z#oU|ub}3|9)cXEv`N|o^Wf%~FReHt*-B7P@=K(u|!Z#Wj(nM;P_srb@T(Fv9B=HX- zn7cTd&PlBw%4J=c7fJSu=e}9I)}SKBdu+`z3Ebncv+&-cr!YCsI}A}O*RHqYmgk7l#@Eer2IzomZkdQEbLPOVO%`gm0(ieJ@1`1 zvglyoGjKV_*Skq>Zb<4X(_Lfb=Y1|g#2=CT!&Tqvk#9M;J%WXXuFjY>ZO+~erR(y= zUNB>=OOdnUzfvV2&=S;#;ES0_f96P94BXli{c8OyXZ4`>AtdWif8M_PBZE*pIit8D zb!*hR$)}jt4pZQ({e~}=%-{y$BWp~5pM2~4gBZCmSwhOpKjg4R7tSKHKu!_>cuZhe zKpPN3&3?@dwNj^LK_lBbI2D)*U(np9?fJ9fbKyP4H?lPjNAuUwoI^S%aX{#A#D)NW zR#6o_VROR4=4ztBA|OO(Ih;RS!D`J-VMKY3iC#fpzgJtQ)v}BX{6Ct``mf3N?Zcx> zLPU^8LFw)WDW#iS(kYF==+Pi04boksTYA!rdTu}8*YnH%f$cu;>pI`Z z`xxKnfkduCFz?)u4i_>?Uq3M`OC8t+ZOoRxd{uWwg>BXnU98WP`YRTK3PQQ;3_eC*9$LXb(l&uL1~3St_A|cCBTT|h&vVe} zVAr>`EZQmyhf6gnIKso11mqDK(szlR%?OX&X|Z4z{K*nO5gk&fF6m0v91)2HD{FnZ z4U^d>u2{TNqI$NdT%J-?^-r#7Sq;B%)krb!tFLLxo2yNrjO>2#t{MhOLi43@w_m5U zO~3+mH`8qy22fxNAGdH+|1uW+tE@2UcQJPENcx>fWD6Ywu4TFtIt{sS`N^Fh}Yg)b?cMK-Fn{@h3-gcEz6l@?o#6tm5%C}_Y4f&$GqOq z{7_do!VawJYl)MsPG6t>^q>@Q$f5hQj?Z$+yZte!hoFWvb$(63|8vLTLy%Q7++pi1oAIUlOt+;0>VOoQ~;W+mN5o)ii_m8 z3{p^UjDPF!oa@##-d92a5B2%Cw_d2z><3kQmdMf|YaAqdbs@iemBS;rkpg;WfZNsB z^XS*Xx{om$#WG!4eJPTEL{b!&wR~fIFDKV!xtU|>caHOwN7^; z9Xkmk$NrRcRS&ZA8atsq2+m=D(PR z+q){m=j!)mxlahc4;1~27#l@trWd3PFXlFtNvA62KGPb_fAY$XRReY%L6~bDET#3%(eT;5TzsM4F=U?hw znGJ<8;Y@tr2yM)WeRXx&u4Q9vKdXlyd%5fx!`T7TKEDVcWEi1S$zWEiu_m!NcAEn3 ztr4UNq#lUjcn8`!gmKO=KLR@iH0-UgK);9sf&xmCIHR1Y-CjuJTYNmcdW6u(WHE<` zk^`-xygc|$N<^5Nno!+y*9XbIh(3uQ;9 z+WH^I%3XLQTFIVhIm;NSRf#!0PQwvAa~8VHqSFy@U@x`b>S-Z_`!x{F2#K$$ttg7h zIa{J z$L1i{{uJFeB?o`rXK7z(Q@Prh&EINLT+lzbhc0{U&_)9D#K}chP^rdInuO}L&1^Z$ zc0qWOvtdy-GV!H^M1Vy}EX&+PR7Ao66Z1cKqy^_+9%JC_cA0CQ_?}j!t1}>pK#8#G zh$kK;;)8?jbOs1BMD&@CkcQLxqUcVkh+zJkv)xHi`}AfpnbW)6CwnS^%4RCmIE?Lm zh*F-O>0!WB$w+4F&N?n?HMd(jI7|QfHk{2W`|}!X&RB+zmJj5R%wcbnNbPm? z;p32OtX#9>QO7Z0=GmMb-QJmmXEy(7zVuDeQhm`!seXG~q^p1MSGax}@dk^8Li$b{ zwcNE*m}2Y|Cv|h6UD`(*cL0(smv(=+bF(^3({)~PYf~bCH)g50U0;_ZeLxr_* zb7=K`9jb1Hw`Ujy7Eh_4d$~6&=#RvTc_VE7@uanW@<4fq@3UV8(Nju-<#Jz8lCH-H1)%qC&cmj3xOd`s9%rNX zes88?BAygANNo?6;6gl#GpmDea=(jv_s^Fxo?N~#w`!tRxtEfZ{1=^mFH#|Rz_qQQ z&*xTB%)vz3P5qZ))2N13_Mqg%kEq@>iM%yM4yf@XdoDc4>ex{Z$md&BcuwpXLo@7c zbLFo7;#qiK_G*}}_5+jBu@vojc#Tj`#I13{E46i2J)436nx`WXOZXCQL{3&Jd!0jisPt_)fuqDC-Ar;JW3T zABUbas-8qNJY(y}{)WEEw^WB!BOOYQ;>w+NhR#Jw(-kZ$O3ent7+1#6&Q0Ye%i!8& zkACC*{rl1MG~nX9hN<-oe+IpgS6p;5!-qju(b)Ck>K|I?l;@X|r?~a?wI$jmA&S;T z_Bkk&SP5sD_7lSNt)i}3m;7t zC!BqFILA~=<@xS&U-N<0TQP#yR=0V)({|;U;63cm9|xirIyJJGX*3V7w%nf;!C+iX zWo3IV!5FJjpZS43;mGMK=QOVUzn+J7o3QVLt1>0YitQ)bebIxDI5^SYa#1Y+YE z16lmmqKZmj$?936N=bDtwX8Qxw8L$dmsL_8>-j{`?frD-{W^*-NW`japw;xA?m-L% z4cS55Dh!~q;=JPkJ($>(c29ehp+}{JNg4qGwg*$NV1v+t@}9v&Aj#~??cCyXm9{Nd z6!q>e&*Pe7&$K8a*bUHND~K4tCt^9dJe`#;EvV~Bec9f=VJdn=EE2@0%wdbWygD;IH{bkU(%1pj`hCZS_8f=RFC<#BPiiYNk{ zHqDQ>g_oS4xZOvidiB$l9j25`xKyj)1`W}9ZvZ}L;rWY!q|6#-R|Kx=SPo%KCfcA2 z(wv|hNafaK?-NOj7twG^lSoUf_x>1~K7N{{JMnA7!fGYF=98t}?kCFHorW4c+xBpWrsoDb5Z(delhq!oAv6J~(-SK40a?wJvTKNcyPETY?Mm)~ zeRE_dS!!Tg#NWn3z#jTKvZvPP_#LG2kYVd-@;j%&g0p9=Yd+4WWl%B- zTC3B!va3=2G(o52>HWS%e?%NL?k3%kWYQpp76g)}1YR1N?ePmgE+Q=YIsUKKWUyYV z^%0_g&w(@wu<4AZ75~{1mpnI@MsEp)hV#v3{T%v5z+tNtUR+OpAF!3@o_B zkCvx}2bEPC1#+*|NbR=c1iV+4y>*QB6bYlEXp$f+IqJDH)6?3mjw4Gsi&xSYS23K% z2^9ETEDmHxJgF{r1-4jNSd*#+_CEof={hx|{@oLrclAGw0T=BYP{gVA=@L^`R?dAc zH!ei-F$okPP`d)gbr#zH7S4K*_Lu|u)xLsi6OXRER_2PBu0qe*Z84=nE+rNU z6m9}O9^6mJrs8;^AqIy^r2b>2Oa2r2*ZLaYI_1b%Zx=xJR|{e$`XLQ)nITGdejE{- z1xz;DrPw)=2qMDGS;7G$)OF-b9WA}LIF6&^+Zc^Hy0c@sOOJuQ7BlBJMW!Gvoj0>a zlrZhb$dCP0rAcNr$x=C`vph-oku&{^31m6WGby7@Ewdem@mTPvwubENw(*D=c*^rm zH9R|q+Mph5AFii=YEM2sbEqAiCS^95h|8b}z0<&&lPDZcD=5p!X@9|^zhIMdlAb3< zWNnbn>`523*^u2 zs{#k8%1KcOi){2o<<;5D%(=G|NK^TA8U zYBzTDEe}#Dpsw@$B^ewXCYidZk!)JBB5(rnC#?x`XM19C;bQ3*&;R-8|wynhWV8_ zpUur(sitWA`IZebB}@p%^v1`OLuOnT&~Vf{)3HB}=;>GD+TZ^YU=d4Q@0{wON9t+n zl(ZXQea@CpqOQ@<{A{b_PH@JUCM*!&TM$IK&xcyjL_0WDi@m6@@lrJ6|1lalE4P zaF_nxaw4C#H^0}E_80waZ46!inm)U4h{(DL@r9Z~Y-n{`%eluRC~V>R%hbo~bKnvO z`2uuD4TA1-APHl#ls)$(FyZGc;Q+1Dh*xC_)r;174&B6PAGvafRyScF%36)V;5WcU z<~g7Y2=0xcU-{fbQs>}!>~e;*#i%v4s_Jvx_D90XcXsx>r0g;BkGkq*+A5${kWsydRDMvT)~XJBxPExv40q+Z6Il zSoB{qF`Ol7AbBq%=(lVUsVu zR{wKY>Qpa-h#;UPjOEu+9?l#h*3H#F(jrkr@|O(4kB5$qf`pVV|G6UoWKhIl3p@2? zhQL$Oo6dm=-A{R?LG74?h!Se?fb>?R`F*Qrsk|PJdnCRdh$~E7C#0boA8VD&UEDx^ z|AMA~KRC0nyzf=$xGtlaSV#JHti8s3sed5$L<;*aoukCd8mzgAMt|=#SUmKMri)Ax z5n!e3{QJ%8D16d4GPa!W;H71DY06~JJO%RHJ_CpuLz(|6o})zI6Y#~Z6n!;i+! z`fMfL>FjzggU#sre3mT#k$R=I=SM&}k=VRoTe^a%bHY)}mg+jnZP#eDd!?GD+UFRp z>ElDEk@o^fKzX;58%G>|7!QIdR2g4*T;O8ik5e@7J-c!+7WS2-RrYKq78IJA%{ zM1wy%Kd=2WV<4VMpgC$^LhlhqdXDg<`~*Vp15Jt!3RD z6cNxsM9xcGQVn`8%N;;|+sOEmt)gt(FL*t|8dAd^dOC->ey9t)X3Pp$DTzVh&ug2QQPOR!&|DmjsvI%Pj|RAKj{Qq z_i>VjInn<&eI(KD+))CrUKtWY9Kw5s@cz_L+?u#_ktOWv4EqjdQk= zlHHGQDW4|mP3+NzTFs90r-Vegx{L-Uo$tW{EYXI@@S|8kGr45676t zu^gP?6u3E=C!g(T#OJBG@O&OnQ&bc-D;r7}HjWNjwFo(-)eQeMnX0Ft_Z1fn158ZI zhbR*jbQ3mp*7u-HB1>^F07dxKF??qDY^m)>;1b1K2`TM1snDf96lm!D4!=3_eE38! z_Gk{ST(*>wJ3NW_aw%%LBd|@fl}5wkz;GE=>DYlY)RMj9YrE$W{zp5pvB_)1GDP^M zw+6ltkWK^+_5LOtbwyA5h+h0_;sE=A=r|Ajtu{dhI|C7VqUpnx4-o9RQN?D+19jbf zcf=x~$C zSI64=5)Uhx2Uj(`h?#nTZ$$q!8*gH+iMunI|&EO>;_%*0&Zkg(m|9FjV3HEvxjB^e3C>JZxX8#FR zeLC$@Yr67o0O9tHs@C~H(Y;H^NvV4>zk^qAjT12UuBp`|BRuar@soL91V(Su6#SF@ z2|zpLBgrLf_r?}0lmaix$~YvaLz0^?NP-h-Ql*xDLK*+LP7dfXDy`JNY=h7^Eng2N z1t0$PCW(WgnL4TP`*I<$EG(E5v6x;Q`d7qoPtQy{BA%+Ibk1`AwuBN0bv}WgieTCO zHJYF9#B-lSkvI+J?xK{UH#KK^)g-{tl>CTt66W@qK!({P!-ciV?2P!%Nb@K~q~A5I z^*2X&ns<@P!IPi$=uy`s3sK&K^G+7mVz1MlB;IzO13x%`mnYmD6DBkKDU+moUiCZkj;}klj3TlkyF!kf z-}!>(`eTM;9j3aUe0d4R_WJOhUq)j*Aa54c8coVHwpXj-`tU2GJltt}Xm^#{BJFT_ zS)E!tUr^0fXMWBccx1eh=96D{df5oZ@xuywL$q`(K@}M8?5q_z>nF;PHs;XNRzU%w zU2WJEu`IzUf4t>3(!CVft0`cqS!hM+8Ek{zh#S|2KQiR|{wUTLb*53i3^HZlx$_=3 zme20giriJG4WG5MsBB154EvkydoJ0x+B8^rxiq*b@shE&r^%d}9J$g0rj8N+c zk~Z}*7+#K`CDJ4!Ji7i5y(Mvr{>gc_&#*m64JTEao#&C2cCjfenG8)R#&%_w-{MO^ zMk$Q1PMDEnk)uxg(%i3!&oC$mle#VPZ%E^>WJisx{4@mBFRA@+b%C56>5^z#ME-_0 z>FCirEJ9r0OW0I^wCFy@5hG3cUmQlwc{P+K(P1acim>77X;GM-C}5Oy3}f z5}Xrt%Ob&>Wxg3!iP;6}-3U*~q>tU>-tF0VjR_zqLLgm8Em*=}re4Y9b-8S?kZMYO z?Yv)s6v(~<_(qsRw7tL#Z8MgZKh`JsN^}|Q2K}F$WpmyXmsRWG2!Ek0TeKW{MyFIW z@q|@^sR*OJ_~pj!HP|eTbY|&@$x5iMTNZQx^gs*0B4{%^)?_~mJ^Q2k9`b9ACs^Q4 zSodg|*E?J&*V~;Q6mt4nrQe@OWX95z=Pt_qYai|hsv(zI$KbNRB6R(4`@O!5WgTTb z%&>vmC+0g+eyjR=oZ9PXX$|;}X7C0+Zx(Nh0f@ue3b~cVqi0o(hhcMQ;g-U1v|%y$ z5`*ziO_`n1%nc~9w;)`+Zn-#SxF?B9+U|w4qC%gxyL_$Vuwi}z^9(X|)I0tpH8C+C zRl{bcs89K$+q6J6f84B4zXb+zkd^(d{+Nqohv|QUw9K;EQTLQ6@ryT+1)>M_LaEbs z^0X36q6+8}u6Z65ZkO4P^+4Cf&03Vm&S^)!0R?b@40Uou?+o0ue_%h;wBJeP6WVe}Z|FP6 z{I5rAG;G?@Z*^TbZAYX4F6dBqwY*ov3;{p>q6KubdCfsRN+GV*O;$WOGP0`ylH-L& zcr*O+Q5`GLz7g6-#t%0;4+W+JMt{d@bIC{12scfNdl}1Y-jGL~0_?uvyTUXE3Wm@V zI|zixV26B!)pme<<*BePpe`VzA|2RCzK|-BeU|npF*Wx03YwlI;eAHq+p2mx6#C*H ztCgjAfITro)VR?HU#KqL3hIDaRmrhZ!~>{*u<<$#j> z9F`O&#{Q7i*Bd{?J^Z|=;1<4R)nPs%%XYlAeEOBf2&L+ ze+tZ*LUz)1ORq7Bk;JR0FV9G<-x(K{L`VUOZRfB_4$A@D1Ei8$)08(ySDJ^nvQz9S zljVMiQ}=3wIP=xlj#2g*=2T_t^!eFgE|rwv(ZBU<1Yvx^qtpQ;NUB>7l|lBOZ@fo# zPtO!)=){uUWLIRH$9FzkzQ$bQvBD+P8Szk=gt-%H!~7cHj+dfro3Da&pUyNSeJJ0Y zHTK$7`1&`P;#`?=yN~h^Z4QLuK}udOI%NomFf)giJEqyQ{?J;(iSWZ#;`|7~4+=x# z8grC~j`n$krt{pE%fi`Lho^9ec+B^)zuZLA*19e=+zNZGZI7n+`7*!i1{lP*3z}n+ zqN3rG{QKka2tLKW;V`1ZwWpn_d9obR9pc!{YWI2!+PSA!?3@;=o>ee9bDW>S4=eE0 zaaV~ZDxl_8$vfM81{j$9K&fCA%Jnj>cb9nI(A!Fhskf zyip~nT`bqe^8aRyCM5;Od0#7``2}076KRN>rT8lL7+wKd8H#?NmtU<@`&$gFLESVK05c_bAIP}*8r)qfQEpD(aBL3c_N5`SCPHU-GN_uhN_8d971@^`eD zPtlgGSV>=rxkR=xqesz{DUiXFgWsmopI3dZ?(S7EbDYCmZKmSHMi0S% zq)^|=N=x}WRa91RvS8_R>Pl(z^qM~nbyJ^v?$RGiZU;3#;-LEfzGS4Cyg@cDpAxFK&W}h)B+JrYt7^=;Fn6$(%W~ zeAzPIogi(&=rLpHw%c#xTt3Q%;0Jq%^W_dS1Qek98s-v*jG)Af5tJkzLyablDw==r z<_xrfgEuEo)Cg}w<0EKHvY8^oEt`P`0X?;~^;B3^N$;-QL|^6ZxB1b?bRiL9qMe;H zl&+jIN;TqCrs;s$R9TuT*b5=jlkC~Mhy6#dU2rXZ`uV5)Jn}ld^yimo(XESU&LwkP zezr^v0+_;L5e#^fEk8e>OZ33UM{dq!Su9NKh_(aFAs3gcDip4slThl)H%c~`aF;D# zLA%A6$%deZ%P+gkwy-*u(9?mf|Mm~C1E0&X(lWOY)!j>ArX6Ua$Q*4Zi_0E9%^)^2 z4Qy?~{eY@F_-?+aZ-G+d;Qt2oEhZ+`ukR{Nr=6YcT+dbd`pK?g4p_D7Yo32}h;t2Z z0SQ_NwfejvXdynq%mwS!?gN8gcS+B0!`I>DiIX&P)JWT8F?q@qKHRkp>(`6l8RbvD z;GSDmB~^izNvl7oZ(+u82DhXkBPli|UHsdmJ$S%Jc(aGWz`~m&XnLFLEiuYS=MIgt z!W(gpvRc4HT?2i*c00Yhd?P8NO(noxF?kftIcGSTqasw*H<;ky_l77=UxOBWT?ny& zL5%|hp%fSV*0E?NG=wN=-y-6&qSm{oO%bB4D$R(PB1FT8~)gBDET z&KIa}f}30D1HA3uw~r%prcIyDekv|MLtGTt#h^q=CYK6I@Y*p??d@tg=hXb*$ffes zyD(>pGBdQnTnfd_4tg{dn(q#3m4&`2k(C%7PT8quhB!ReD$Z$bT|HIR3V2(yRUF%> zp{a%J6LfadjIl##-t@7Q5^q+8Hylvi5K`|Ayajq8gvoTrjvf4S&iEXLqCIT>Jh2-Iy_BXwjlYv}DN=R^-qCj50SJe&>M) z9-s>^yik+b6yT)=-p~#oK0-To?xKeJ1_i(w=?VdG@LfbdFu!D26T0fqHZX!Yii=CQ zp029^G&Gci3K*bu`~C)8XECucc5W+;jZI>6QOO&ay?giC)Hf}uLjtYDWn>JYAN=4a z0WqD%#zu)FT7W71UF&-mTE#;5(Tskp|p|NWR6d=O%UBgUMX*Ou%zL4oS>?oRauBMhSHSGIEJ`xE080a z89_74H|5c*A1tRv2YAD8kIhJ=c{8$UTxN=$xl{>nNTGq;X3{L!mkS|420nO&MTPwD z>Ea$}ZfRx(PBti9Z@=?4n&E8}4_gc6bjaSd5!mppY+W9CF#=IC$_NyGy{d ziqFo;$*~oxclEot&n(&N!)-owp2ipV@Zlpzsie5XK@kb3OD?{I6Sqp`acq$5rRu;I z_;&onNis)Ax!q{{2WI{UJ>Wh{NQmdG3UYRWD^NAcWi>amn*r1}cU2dH4R8otxc&A! z{WhHEOnPBmc>JaA=i#ZgyWgB+V8=rke zr4=={G$HcS6U~wI&C90JxM8U-;SEmnxE@{kUiH;t2!#zmgad8P#dGLH<_X%CyUp%> zDAR=igK1Nz(S!*TRMVcQK@-$DE~OOR+BA|gNx>+>%eQs`UVe3ow*fB2Gv2I5P-2j1^RuLp#Z1&)D zXRX^prwDeetSnc+nFKfkmnu7O@CX$Z zmT*cHwOGSJ4RL`AS_lmbu~u4e3|b(+6X*I1ebG_T6g?tZ8yFhAzc~SKq2jya0)%pb zg$s*;w~2m(rM>~!U?PoA9byAFkFeC;?NhF|fmme$=|aY*$8f&4ZtFtcWGxK6<6u7h z<(;K;jB^t8_`C5YK)~CAnK^Xfgpn@c4Qdw>)5gTa^xK6HX4Tz$cH8=el5vQ9gPBIz zkY6!xcOIQ7I71V1CNKaRt@)|ksdGw@;$+YQfbb}P_V)T#^Eb8BNH$vTMeE@Wd|2+? zTG5|Qr!sPANaZkP>ST(Fisbk3eI?E-@{H-gHn949@ZcdEKwxdaCf~84R&;Opy4k4n^(Ls;b7G z1=z-E20D526dgTwf)z+<{Z`|HK?!jJ-mWK$>2#!jByFibYKkyYTx?WNvR=Q;q~6~= z0Rum8%6l0sNl@_voJ$)U8tgLLD`Cx5S)V}p#W@Bh0Nem=fVZ%4lXj)cPk3|wy#8Bd z!5C_wF#_C1r$m!cT*qCUW<$W6Sj2Z6I7a{cXeI4BblhHf6OWPMM!IZj7F|9)n_{9O zRpAZLf`A2?!M{H*i0ChT;!uUbGCtijdemrE4)gNzc=1p+EPDI*?`KEW#A8{xbA+n0Mzp_Rrga@nO-|uWLbpQYN3=LBJ5Ywl0Fj+n(UvSIl}>?XxHhMphEA5XhW7(&5^dNk|R$w1S)jH+lFI zm=Me=3*Nw+R?zge$^xFx$%vsb3~vUWL;!9$3Q8;J7q7lUI}aY~@pn_C4Y_dQNLqC1 zbc%^~4R7#!1H1*gkaRE?LO==9@*F#M%ob&f=v5^1h3`#KVUg4C;#xm*<_uL-R50iu z;?+}vVpp3P8QJLy%6wU{UHuLg57av?W`DPCR!h}N{NVhJ7%`k;VlDn}Qh~$!M~TJX zRZxl!Z2h;-xYnS=A-7+iHK@niM8APn=m2ghV#8#RC9|ye7B)*bcJ10lhYlSIXwZVI zW5b3G^wCEj@jWfa=8{WbI(^D-(MrkI3ep92#HOO*w*;faxylO97+;nu?LZEYN|P*7S< ze}8`&eg5@UMSasA0-iE9lNMb*gVGY?RHIFC0Nem@eVJ;)pT!VSmH@f@i`oswn zDRXG1m|Tyz{N4J7dQLdn(%Ql$vjDToN!HgzI8eU_-^Rki0s)-`e4m;CZsCYhRo{GC z>a!+V7SzrjlP~h>4I7qe2XK1e!NBSFp+kpRSps3By(`U@^AJ)1(tI|nH z35x6q-8|i3UBNX9^$k#kH6_^ahRxVpZ@tBVL$YOMjbnHVl<5>g58RDVEy>YrivJ%u ze2h+T~c@>3f99 zBp^1FolK#)VGLkCg|jIh7pHaHSQQmb0Z|*>jVZ$m} z56v8A*A19UQ!+$((g6Z*PJc@yyd|5%X+nA|rNo5u`*7ac z;KW{6PyhaOHT~za)l}Ee)bp*a@Rk&3rrWQWNi)Weav8J$;K4+!)gNr2EQI)82zG$a zn`0S7zNiaf*M@S)#I|q1;p1)Recj1K8pfuux-ErQ>_AGklqLCn_9`NKpz`7Zlt&0 ze%mez`Y4f>9j)uZw4Mgm`?ZYKSZS^Wj%oAD#$|qOoPNH zE^t8$25WLmBc}|Bh%mamfcqk_AP{PwmVR3RHo|5ym6H)JPNk!%yNOB-yMp zlr?TVCmK#l_OEPDV`~SsbaYWmdneU4w~NI{yDE3KRauCOG_vxR5@WJOoC4ku<@Dw! zU(ze@d_whBcvA*0M2Q9ejw>&qOQw#ugEtxdC@U>sQFoU_dY~_a_`V2kzy<|sn&WHf z>FIpHjH*kF71O zbf)kO8Nq#eX<`goj(3JOsD7h^>x7vv9Xriu<)yEZEYc?Ar${@?`Wsv`6ub{;bTq; zn_Gah{hQ8Sh!gNO*$QuS{rMa@s7684@Oz7nj!;#m`lVtPVCV}C2^AM)G+*r49pT2n z0)xn=7OVX0IB~g?|}vgD`O}!u^}F(eL>9I7&-R0=k18aoQgjL#R;5 zn+207lr!7d<9hEl@Hv9{(h~3#YD*Q;pIWE@K>%rLN($%gv&?g$E@vA=42FB5=;^@L zzxxNDtbDQYW;3P$D5$@+H8rFr>)>8Ta1M2ASuVQWf+H$>pc0Tl(XSS7A$3EFmN%$7fWyC&1hCD!<~oMA-W)cy_eYt+XoNW0I=ZN&wuP#j+RutA3xKz= zDP~R=5*`-9uq~?tY!mSI@>?JCqcYE%e9Rd&l85!ZG? zd;%|Sa3OG~ym8cTYb&1zoDYm+Z>w22he?S^l$w@CLozZfPUMRGa_Wn&rO-I~>q`Of zvk}+^+I8v*rZ#TeY*FFHkEbnLw(!qLsw-c&tC>2^|C*_|{!p+UDzbFu@9yg40Js*b z`i5MK!34n_1tjdX#qGyugTtR6|78@s|dO@_X zgf>s=Dehg9DcmV7iVkdNN8jL1u|3z46D}ubJpJ{RS7^kD5tM%{pMz{1K@L?3d|jJZ z2oY;X1bnEer+im^LmdZGU;~6ix{f8Y0(}75KKS4RPS)MCrp3_Xk3UHZ7Wi*EMWqD* zTwPr)6%>>^r3=B&r%n~no;~|H%3G_yn*s1i_VA`u?rb^Z1~SB1ll8t%eg-W_2SG@o z3GrrI(854e%>1GwmA)eimD5m&g$e+NdaE+!f~QG7S}asUM~WdSWEA(n2r zau!`abFwPD;ap=OM=eZ$;B7D@dzGcM0C9k4M}Ilj>UI?W9#pd7BZgZ_aCLODvori? zIGCXw5yWklNLKM$h_xOwfKLWFAQ3T=3mZZ#IV(dP4sA+82%Aj-?Eb==ZWisI{lj_P zymKTEgaBB+|xO z63n0le9y1G`iegP{Bye=-h1zZv}n;c17mBM%&I6x?`7y66hvlqy{6kYSWI zba>DKERYjqiaDIjrcgRn*+flkUH!Vs!mtDZZ|P>v^@b6L<2x4px`sx2@qgc@Prh7l z2W~RoTXdv}7F=>3-G22Pmx+1-7V!P@)(>j1XXgi00nDTyoK~1qYZ>Vo408ZCONE3E z-o*pn4Aw~bo}Ya)&srkQBdt{$O#O09bzloz!@Vt4xCuGqY0GAdDHXnPY6>vsa-`Ss zW?jPXAUzGIv60mT#PbzZl~h?#!3rEqr!6XZ&;ofNI0EXM(sVj?>I{13nO{;yMj#5+ z$BFM4%HPLUich8tF<2sPQ7Y@$u@lby^CJ3GnMy?UP&?249Nyxr@OGE~@Mf9BP-Q_T z>(zR(_7^j0Fx5URNPt^pcgI-aX0Sxr7+g*~^0i^3vneqpZ9q=C2!I%yYNjKl4Fcpk zH7jDiz?FrNeGRQe9Z}^nk=3PS9U3LM* z#h6v$4T>8UbSgsC# z_XQWsr01S}*0x!1cj4Cwh|{`WA%QfC*4xxK>_&Xg**%t*EHA`LJ~>*49%e&rsg(eRdJHAu9RZ zv__x0I|ht7HIP9I7-tL;91s%{qI=8@1EtzRFGRwkueh<{vj9Z_H$KvcNQvE@AKdUU z<0v6Hb-+ycYTXPK-zCcma!5_mS5+32AD-r8R>e&RwzI2$xX)Lv`jUS}4P3Zfz?2GqIG6&}(m^5VG;p zky>6>TIk1$Supw@ZZcAReH}vra#g{Mss-Rij2$0f1upn}>r#mf5g?Z)K(0iBT;Eh# zh%kmwR*IQ26D+DpTU#qN30UiBZ>ObSZKQv^`w115RXEi*#pfef;d{4ULt{q_RV|Yx z;Z4GY4s5~iH^y1|(81pjivi5wt>V1Gbc*{;mO;}}1p*O&NCRO>L~gPvsrVV6KN!YT z@0({8ZuROlHWluo3ooEgKK_J%o-knoZQ8iORufkVa#@ZloXQMqxt5KJg7w{e4a46J zYSo$3XZY`Wf-!#%q$WY3dS%Lxi!Z*E7BBu$z)YuMVFoI%C}rR9p4Hj%hKvQC~n zV>6fbjF-eOD-zh!i8$0k)uP6Qs8?<1w-9FyT7cgEyoL$&9za z8yx205Zobl(CfGDqL=>lE)`o7^*SnVqcSt-`-`rnDLG?Z!kawg`RlI>;@PeU;eG>n z;b6rzF;O2+9oPceFrTkmzkz>7K*NLyIrRJAy~zJYK+S*N%vUXcIDOi5^;ugy1)#u2 z0r^8^on@F0p}rLs7O?wGNpXoyeG5kF5SV9|EnCKGRF8T%lz#ftUvTOWe;XoB5qVlu zQ)P22vV|>J=gq^1^J)KqgB*awk)yW!Zsb&1!BJ7Oevq9>RQ|4fNm=dQ5%~ITV1qST z@9PwRpaqMJjG%=`MWuyqM|m!gf?Mx`Ul5=V3p?a>-1yi{$sAbj04^#zhB8NG1r*X8 zC&reh2I}l+7mq!)?U1=XJR*ur5s?%UW(>;p2t^JR4~~^J1_j<66+5I08J-wLBgJ71 z3t?ZCy4o7{eaky=m|lDTQ`))jP|pP;3)PFqw4`|Y*7aA?RTrP{vOv9rxL_yh)qzd# zpFXC2-*CTw@x^kR^ZliBFQG42eaT66;TPE^Hiu|!4t0Ssw@(AabvqX)!n`XtfU@cW zQso>ua+u4-A@~hyT(JD!@Lf=-e%rQfwsQfqFU+PepZeQiIz_EhR9k@Qw3|Ux32;QE zWfin*=N_u5t#y;%%|0E7y(yJkMxEN3S;@iwO__hy#r4={5Esax1u28Z#PkF$xVa;J zP|OTxCG;ULUPWaEM=BxeM#|Hka=~Se&hj|1`7-U*S65P9O(iwe)p-2;a8m?D#l}-Y zN;(n@TDgtxX(TX_l9h$ALGiBg6R z7dytll?uv;H&I<_d%)ohuVuuUXmqlfBEv&DlXt%k+qaMQ z?%ivHxL^O`mu&KMOouad+B64IB*a>2q}w)cRaI8fzWsaI&7-Qaih(W|K?~A!idv^~ zT|yf>Hk;uMsYCp22?>^J3su!stRmX2y;h*wvv)roIed(*Bi=@ok{YPFQ0=sp-?IL_ zkUlo21~O;?&1ACpy@eY?`4jkkfsZxcTK5Z)fzd!yz{&#XpGMiE{XLeX?Un@WVl1t{;CN(6K zw!PkM5D)`L{#{gBR!S|+EgXOote^$>W`FwWr#A59x!7!`?|#=3b?Ud^6BWVg8v^-? ziYl$^o?Jz{c`Yt0EvL;}wo_AMvr~Y9sv74a51jj81sAFvxiP!;WnhCfXaVpxHxQo( z=gP!H$4UzW*-Yv?^!eI%T)gmQ00gyYSHn-?E40ILk4>3?5(9q z=Wu)vOe!elQYbzzeMA;T$0Y=$f5_3+*xKYbyu~A3NQ#+aA}qHXls5oegP2f1S+Ryb zUj7v|U^m#UIGa`z>g1eky6cu}XvU-o9^p-22z6l7`#t!^6!$*n@b}(dVyD8v4{r6B ztNGvO%{Y%XZM2wK+dG^iQ>RUxW}VXvcD}yFMTL~NYbQrjH#Ri#d>f3Q1&9gj*RSWp zmP}W)`SY)(M<4wW#l*z;HMX$QrKDh85bIuXAqOV(ETtBDYHVnx+#S29prDAsN=vl` zcVXAN3_-`fp=_&hE|oeelQ?sh_mY$MCkKDD0=3Y3%W>R(xUXYWbz8LC?kPd8v zcT5pA`o^38vB6JTYO0+I$1rsDeEQx!_gEp$KBxgo7yRLDGhDYNjmGwETdBCDm;n(L z34-PKcHqDPR^Mbw6tt|YaRT0c=(p(=0Z!TAKbMx4#u>uvDoQCnEz|GMM2V}m_D+SbrM4;yNEb3X zIhvBqCO(HSnU<9laqz;LjoawGPnJ<>MWtPu5Sg^s92H5AefJJpaQVfm#p$_zW)R>_ zhYKAr^f4WHea74XGwS~R2W-#Hn|CD@oGGxWa5)olXxGl2wo+S;)f!+*Rd(^t>w$;njTSg$z+i>G%X_@J#zTa^V< zSO^VIh@`Ywi&ESuzGr!9v4G_UTDxgGz5m&ADr0!-+3`vrIKbPY>#m~PuAfiwaj~lK z7ASu=eIeB0LLbwC-)GDTP|4nX?*rR&+1Xi?l{J>0dh#hd6>jOLpYhMFir_KXZn)t_ zer#x{r;QsnaMguiRa%fKLsqX|O&hJ|U1`?6<(50>?z_M5x9Jqgh~f9v)zvOG^%f;j zQ7g;(T^q&U-$tcnWh$mk`y6ey#Z{ShM7ijy<#tm8Uq8!lQLxRa!3bK2jYZiQqqf!7 z5ID{2Y!8YkE-q$(bDVHInN<^Gqx}DR;(x6zjpE$K24uJ#`wP1ufv%xpOCd{`u#2es5EzOs7X4d4f%-{%zvnZWYT>r#926m8=Zb zwGtI@4jec_yLazX30lw=QEHb9j_d)A9P+z4S8nLh106w6vkzUMAubp}3vux%)*S8@ zObp&iDglK)|J1&|hCUPxmc@GA0i4qgC)D8V6Xrvgjiv~SpirMCE-lYTMVkYn7$TP& zj-J}`>hOlB(=c(}wzjrV3GydZRnVcM`Sj7!RdnFUF+NA#%5)*tpVP%|@r7req?zYU zv+b&->gG$Zg6&@_7a|+2y;nD`p^h&M6ie>hi{eV4%lpGup7!A(NCXv zm{MY+XzjWUEdQ64mD7hGeN5lG?;hKY+os~TqN^7=VCZA2Loi$|VDfzJ^*8OFzwyTF zIce=%|9Q(!g=u(^A0SEz}) zLjqG*70M$Z4m)4ucpIJ=$q}ol>3aIaDJm^G!?}}Iuir#puHDGjo?U%YEBQenPKq>A zVx;(t)I_@A!VBoknL;{KP{4iOw{Jf!6O--L^XKt(i``_qgV{r02z9v7`!~49RQk)l z{K~6#&~oJ!m(#Fene>aF|H1}rP~qmxokMrten*e$W}Q=%AQ$MM1xx0GQ(UMXCREwd z(=+Jdho7K}FP`i77{$d!bJ`G8b0{mTSAEan!^ddTrfp6eVtj9;OThsZ4`yk{oN(In zySXa8MGo+#qS_g}i})oa9Qp!r0^Y7COTM>}fsup5C?+^6EpePV+Cb)4w$Dc>!>E?pR?3 zT|r%enFtL6+#?gn&{AUqIe*nS09>ar+T~Dq(`#d>feshcaCL=oX);l-feKHbq=J+A ztnRMau$jIR0N32yVz0c(@6+8yw_G=$nkq}_*wLfh=U4ywDxE*`e6dTuiC+EN|Jq84 zEnBvN5)%?>=FIaL8ZpMMk}&HFp$->%{|48X0+aw8h(s+aDz-g8eE2W{Mzd-2rp>fv z^A;x+4%K+j5YV7zY7C_ER$E(3%a<>wLx&F8_5JR0I~T3@r&$Ws$8lzb0 z=}(lcsHlYDt+KMptyxvs8OT-Y1w=fCmQ|DWtWY3|;L$t8s8$ z?F@^c&d`W}O|apiA++~QC0%;Xa4x}BQh0_=9Y02GVh6l^R~{|-Y#GCw9k?lc-y#j2 z6m96B(3X07=-~(HiN~Md*Klnj3FouVJxkYLcMZM&L66h%NB{jV4IMg!GBbzr^^Es+ zb#)Dxg+}k6KBjt~1K&RY9Oi?SE5D@N+#R;(v7X&=$89`M{P7Qev^}q;!nLTlXkh-t zX9PlpTf25GZQZ)nP9dB|CUB2P6jQ6ha2xoOG~7fm?%!1 z=h&K>P)DtaDk^Hkg4XI$eM?M?<`bfAg?Bm&{16&yAJw>G*>Wl_E@8hV3>KU>QQr+Y zZ=kxZ6gz`&-g&3ph2QR_!g1C_!df$Nt6kJupbr1uakPl8zc8MvI|2k3;+%Cx#F3%1 zokBWW#ABOgkn1*tQfElGfHxC^T%hubAPTppv6YIeo47pIzHJ8uyfstqu06E;tF=^B zRZWg*LgWC)o1-{ST#Yr?(pRfj)7|&p!;|W|wd?p@*fC@0eBnhGie2kr+Ou~bKMyGU z%ge9OkDvSzy9>bI6aFN<339rVygsJ-nD(E(Nr21E-DwxdfVSw?g%o2p+nG_(9(dpZ z`e@0AHWjW5Cd792H4k|;{ZZczA3jVgR;*wZPBuW>Q%^n1{%`&^M4W;@s;jH0yu4l& z3wH0`FUBWN)tA_ta{_UvuCAV~EYZ~H||>gpQlJ zU}Iww)z{Tg&cum!?{8>qAaCP6`&g`_K$>{f3f*f-FCyF5dr#2pb4F6ExX2q?JA7B+ z9N!;eq%Qcfg>_L#cZWDSDWt2z_I0cVO7R#%T>{>^pyC-q13m#`6ii~rxAss4HMMon z^S^nKQlmmBcjs=Zs;N<}Z;Jn#BTbYwER7Ol%{-RPwKX=swtv6z20i%j!<4%{mv_x* z*g3y4<`ug3+67cnQc7jzP;^w3TeYt*nxU6I;K2Ua zCX;S?bW=ol7-bJnr<_qkDJsGeVa-w2*f7*vc8fYZ|p% zb?Xkh$k$*rD46y2jnpF60_3m_H-$TcnF_px*nrGA+B8JIH^kYu&i*q)EFc%s^H~t6 zii=9sl{f&L=;U2v$7U)@Tv=?*0HorgB0iz`QgAGU>=+jxN7r6^EhSpZC*k+9vxkcX z=p-w0=vRDPq-R;i3wT0*P6_%SF><8sx$i%4Ki%=IZ*p)0PIy;WH!qrw4fW%OW)7on zPimhRz!9*?p_jxuU(<_N{OBy##h1HJ(4>*+G$J*QI>lJGcXs>Tsct>A>zE01gU0f}fOr zW~nJD^vyeN<9P)Dr!=FYyjEvdC(kvq!56NpyUR&^liv;g;#$==RDpo+*& zP3Ege08DDZ6y%(DPOWxos1@M2-f3cDEIFD`-+lXSI(qadUr3;0_?kiOs;jM|)2B|; z=1rUEiYu?QyWhrlzLaE=H(=C?S$DWC#rzI>dpd+qs|N zrU;5pNa#DotPhnw+4mzy4%j*ATA{-3O9qMfHL36XK#9Nn>w8mlYp)Hi_J>HQc3R6pv8$D*Um;|TrPWs4^qqf(e$iXFG(xh|w^VJkNeIeB0LLbw!r++dE zRSn?q{Oz~j%In@sFTF%NcJu@}j2JP39$ow>J^#$JHeWcjrWW;$Uyp(|%cBa15>}r= z-OJ6jDS|Ma-gnN3= zgK7o;z#=JwB|YVL3vrVJ&Q{!BCJa{b!wXT=oyAzlhOr1005=(|h9`y$N#QVFWqbX# z*Ql+vjeT{R1ogAYQUH|2Y+1{7I3dZVrKc-yh%TzEtfRQNsGdNE004+=iHV7v;4d$4 z7vFr5V)2vV!K9$q>gsCRCw312xQwBh0`7+P2{`%p0f7a-;*w%MkKO_t+Udp+hB#cb zP3>J&-_l7VQ{yNl#stBN+Byc_;)2mljJEhw7T2~??&(_gg|k82_OGe2s*K@nXlfEo zoiLWtlN0O;(!25}jEIb+s>+_^%BW5Ft#9AS*Q!+G(01hRpt*DB()jV?*fjtNfR&0| zRb`bO$YCPwkBg!X7y6j$W9lEkL2)lGDRBZgG$?Rm$Bdy>D_7Yi^+kK?>8EJ_zJ2um zyYKdh7h;}hX=`<}v>0gS%$Y7B4s#%)PEm0|1}@h6pzB!&7Sp3$kv6xPKTYd9%4Z*}(U2XAw=BiPqaQDFvDrQt0z}W>qgeZLFLL4Bj z)ehn~of=uHFIXwlnQ)t%5Fk)*qfL+~1{1|)Ie0(-U5Y{xQz|B*VIhGVG>3m@4j)eG z85vYmRK!YQbyc+h$uxc=q|ZvRc%omascCfKtl5_2zglnJeq|;Ntce$DkJjJ@=jc@X z&)Q#5Nv3ckEtocv5~56G5;tXa6Xg58opiOnJ6v3!@PX?V9j{`^6uNyq zzKdJ8ZRf|EZn}|8t2l=+t@h=PRCkis$5bEFzylm|z`gpaGr(PQ&DAt+TsGzB=i8+d zLA!b3%^YR=_#=2#W(-_<~IafmvNWaUly zU1eYKclYc$z~2xK^e3if8U5MO(auB&z`OCLn*>d#+x?EsP9J0+GenFGA2EUte;0PYeB%NL ze*Q_`ey+ zYzk%ItZVC}{PIRN2|KpQm^^+rNq9WL}S)yFh=4XQrO zau6i`>H^>{ykI7ki8D5C0@}noALpW-^9{azuw$%2OYJlTUv-5G2tjGaYV{ z<33G%XPQE(jV#fU%A>lagU-~nQf6W_t8wv>Mv5?o2$1XYTa^p+v>YX_$z-!h^iN!y z;)a4r_)K*(H42bJe=SF+&79g<0F6O%zIv3pTN~^q6UT|g)ob#`!x%RyCfM9<+i214 zx3g0*{7huS1d0h@?xk~S;=~*}a`-4UDja;3QL9jvW!bqvrytQxcsgL{W7<1?#{3CC zZ&u(`OsMCcGm++9btP~1p84rBc5sD_+)sY;6Uy7Qi~jc4SM7eU9xgM~?Q))y5I1q+ zM1CG~3+kNWPzDv;bkidGUywOT{mq#+4W_n8B902Bea062Lqh1m~uG$$mzWX>hF z(m$+5Oqs%mmbPL2dalc|~+d zRx)L$n%Pu2JSmbI1mM+)qq)8BDi7eRLOUDeojtJp_=L{E(wQ*9rKI7eSyuY2M!#tB>_f5^w*@xljw>oub_MGxr_e!&)4k~ zImf6~ECASasTF|M;X?19KBoP*&sbw|Y~Q|vKKb-BRe*zg1x&3_;Gotk+x-vT&(#Is zqM>Z9?amRYYV(w(%8`LnhQNHPG@Zg^`oIH=Y3$f+zs3NjQv^&RS1j_m!41o?wY9ZU zUfzB&4m*4G8tDz_tE{NvBPKS6hGe915_eAp?$yk$QjKeAZ4u*GY4Bd*8+qiKfE9BTs>^Ro=Fgu`S1-7le*Mc|aUM$9P@RG23JvQP z*7q%2wy>X_{QHQYfAGP@?E99OnB>=(z;p`r4Jpass%7~b_We3|@CbeS=?XC)7WDgb z><{!II1~_zpf$LGp?s)gaGbjU2v}QM1?1P&*0U0)>{IB24?gsKL`0-5K`+v9goc`E z@9v#cQc}!21vp&dVsiXKIL@3tO?&t3p$!{03d$TJPJF5ZWp_|iq)~^be$?;I&JKnM ztpJA|B7#S1!vvh0qFq9qF)Wl7IOL5hu4`ol$tgo9EVK&P^-~~^NhTFxcJHv#LXR( z!cMq=5`GlWZ;G%yMw*Nq+z=fes(1{gw3rA=k2A44=lpdI3{5R!6Vcw$ZOJ(Y<*%!o zfy%ML#nNO=Mh&G87k;EMgdvdwZ#emImo0BytN4sk0hBQ50xlrBrNdJTB9Y zAO+QzU#{hI2>3&~wa`Z%dGvWmb*K-9V)ph#9nEl-nu;n8CJHk~SdOqrv2aJz@DbVK zqRODCD6=ieuUdmywXLm_Pi`RX(0WjWZw)do%-_hP=T3pc4R`wVX`ADGV`Qo(B`zH0 zNfeKK^I8=z+~`ouLKSu6jM$w5_`<`uYC>G3kyC%9#Dr67jER!P0c9=O98U4#btrl` zjN)@}VDgfm-_Gem+NiLmg$@=s(8;PM205s1M$sQ*sO2#%RGSjlT6l=MTI#*pZMm8- zjn?{m${+`v159`~+;}5T(8_W-`1?@kP<;f6tS3&KKt~QAu~X#G_U_$hmrG9W?0O?| zRfh|`-};z(Zm?(p;BddAj8^{f6J7%x0vV7G4v!Dq_dTbLS|bwsc6WQ6o8)USodVwO zz4t*fn`8X?euy}Q`qtFcz&=~bxkq-zVme*UK^%JPX~?}>TvQ^~ff|N`Xmb<;FoYAw z+;K?jmY;uuuaTsrB<8NL($aD<_$k(k2T4>~TIHn3S!BC7|J0v$$cT*;8yDd**g^9R z=MOv$=n`B0_kH~M9QLJ9PbFg6G4&K44ot%Y13&^ig$UqlZttL0YgsBN$AGtP>-%sC z;&0(qpse=I#Pzcoxiktt;tUZXqQ~HtA^faok zt+g{TtX#f=#*7_HH{E(v3IX>NmW>befzTXQ}B~T%@{Q6ciNE`t_TsqN0lQ=DNXW z?&Qf+eBMTl8cyTJjiqptsVDV_VncxX@z(QOV}m#-GccKEW~Nd}Nfp;V4RpgITvOf5 z8Jc5aOdivZ^ecEe%OYVD6B4+5i?T$E65t925a5PX0*b*9*pweIdDaO4V>2cn7Lz7S zu#L@aY<_GKhkRrSIn0vcq`tM28r!;T5nl2@^5Mt;fSWg9=WW#L(BZ=<-@&Z<>dUWi zzQu7j@2rw=~((8(Nw$kpe6{tLSA-g_u3Yb-+??&)Bf zS9Q41$5bCv^(M`yxbIi2TtzEaeyRGtYp=PQ&OiS=w*Ytl1NYN}i4*9>7hbRnWZ-$U zvy&?`xC*vXK7Y|g7t{UsKjydT6nSHjQxjqB@^5wRvlB7U{QBVIn4f>lX+l6LH8p2bHm8PrZ%%c36bDSG z2x@RNW8$%_zKu$2o2aa&fl8|C_$aEVp^Dl@su7?E@PpYDkm7iRiNj(xwU|!BtUre- zp7X|>+EVBo*r1%OJpHWpn)DrQa@b98-?m*$<}>M1u`AEpm1h^RioT%S4uTlQjT=W3 zCgf0EeZ7-u0%ii{vcOKk3|a8R9TD%IH-cF7!U@V;cB|%@Tap zr1|vEe}09^Rf3U_8VI#eaS!8nkVZre;E=QRjyvvPmy18Y^pex-P~h6FbBLN-3{0ns z7JZ8W&R_Knrc+qz+S}V$eN*O@lMSZR&p%%&z~jhS8Fd<{1}hhW)sQYqnxNILWn4!v zouZvSUEm0Cb6bFX+Fwpe5pPE3rqeHaq(;Upv_#fu$9xPYxTRbM&(Z$g;w z#Dd+{$rT=YBd44WeLW2(yn_c0@HtmT6sZBoV1_t<19H@W&nzbLYDMO433A)FZKJE^ z&2tNKXj7+7rD4M|DI+7D4j(z{G-*~6vupAi^kus>2IISS3^?m3s99QdV>>&+c2auaLA0T(B zD#-2Gvxof|XU(3)GW)o3S#;vWNvFtFOFp?>)GQ`eI7K_Ea)B<{rNf2Zx4|~1xSycD z;hutD>OcPPpOlxkNA>s4nK*&&y6f9qd>&SipFaIlI-Y;rEx`To@gFz^GT`qwG^@iB z3e`XT^w0ecT!5egYg|%N95po5F?guW7hAXHGQd?-RO*E0reQt7Jnkvj3>yLXy}{h> z&}zhSzks)&ix3t9C^XU0k?hRa&I@cukiMu`Oa;twDvB^a z9n|{}{00*Ap;+&(UAy=kyNXt2bv7)TIwRu;6~r~?Zzt+(R|PaJVf^mii!n7tL@-P> zJHQt}4(VOyT|J*Jy67TRki+D^XZIckx#Z+znlNEJ)l}E0=8`*k>J%pj&Kx?_Qu@WJ z%3;j4!i3Df__r)3DYL8ImmKhBm6IsWm_f6N)!;9+4OHm!6Z`;1h*aIXcdy%OjsesEeK&((y6x_XY)9MDh=rKGroF8jvibkQtzkb@exefxGU!8K&a5Ds`i zqDZK6j;*=5g@YcHsvORn-0=n5hed}AeN4}mF~xm@NI^V8ef#%+-l8pAwyM4tX0dO5 z^LCm#WiroED_5+f-~9SFs&J+S;F?-n?Cw>}D=?k@>Q}#~$&;t~_1z(yWMm|Bf__=3 z-r00oPoI6Zg0^nm;Zvb{_siJX1%1+V>IlJ(-`S1n6uxh_33&UvQhjp?agc;ZjT*+$ zCLJB^w&bLaR0+ifV3nGh#6bxyEv-Q_u_EvR(X2*eXi!eDU*LBZL0_EBdGeH7AZamY z3>t`QsVb({g8hC?L|P#)HZG1D#N_C>Q^RBqkh}aF-*5?Xm?XYl^EC|{K8)dPUr{UoypT|L(PE%78 z#CNIUImU4wz+94>o5uhLkn8K#pMekOx2C3s&!M|(4A)UYLIOuJJ2YHSPYHOtTfo~X zw<3%Z;@}g9By&9->0mfhtDDNXX#~t!lKmxGqgsQLiwaPQlq3KyfI{EG)7h)`4Ie(7 zjvhT?H+d*;l(4Q=YKR>IQ~I75Yp($X>xa8Om{wr*#W2vj_oh6JV_JZg<%)!{-1w!t!{SZD!oxIeH# z`s=HIr~N9Wvt+yc@=NK4>#wC4vzc>%J^hoXZTF~SyLsWw^qsrD!^P-b0URpRG`F={ z*J?98^2if(|NW2pZ8}9J3Ir~6cD8dQt*jJaHwWdPV0eS+bfC80fIfgP&NTqeon-@S z72plNkt)@$UKhta0dQ-z{7nalixfL}KwP&?S;K{o1%k^XsVH-DfsKocVG}FlRkge^ zfuUP~VyATh_97*T4t<*2gq#VKm$%Dhnvu@1Na~J^8x#;%z2gh&?r8OCGVmq+2<|U) zYz$RbI%hVQAUAX7OpaQG`gZD+^9Bt*a=Ul$X4s35i=#>Bp2J0!PoF-cI;oVFmC=Tc zn>dN`s8J(r6O4>vb^IOONnQuG!8WG27o_PF=CLJ9KH}o_YLWbCh(5jj_C+*(+El)$ zrT-ghP^&d0^1XV&)fRwT{J1K>b#`^K85Qk@8*ZUzpZy=P`I_kG_cBs?dJ>nzM5(N1 zl|Tt;I)wrkXw&K027S05FfXfFKa`&dpEm?9xG|mn$(8BUYb8#3Ghi}DGGI*bj$ck@ zXSNi;P2h_IJN;nXGFowsG!sG?>_q9fBcj7?ceV*x)6@(w=BGg=3H_y|DH6TF8zF|>iYq3&p!7o zO+05J?atdxPe1u%mjD+NA5Zt*`w)Hq`;Q3lO7iQw!E}ni1=Ko4ept2p86}@S{&=aF z2lPVq?ix0?IA@NgQ^)I5nohBMq0XB;09a3KBVEMypJ+MO4A}-p5;S^>J4;aKX zHMdgjk?qt~S3>RL+JQOK@i0*b4U6iercMJjQFzcGu6W-jsyneq6NGt_X2hG%kdCfR zDib@BGJmytHBFs1jb_Z4!M==nd3mbN($c(&nyZ*dMhQ5}${It(B_*n=94mQcW%Tve zYq?&njAE7ka(xMNIWXI{+VY~?_C5j+;q$B^w{F3{5GA!cO8Cj zMq>y^owl_(TkFcoD(Q~)ws zo1t&%($8t1HT8({LhX#rAj8<%6k&=WQ-p~hBTYt%Hic0%&V%hy9N}U1kK(mR0elUu z9aPoS#x+s*Zv2v38frB6E59>|>WoP?u#ksIT#J#$P>K|PJ5o$o5#r}4aYQJdi?se5 zFj+4)0M$+H+z&h!o;gkXKKloCwOMlJDZg_{a~Xwowo_bl4Mny#ild1ln#E&t6LpEp z8b@~r*?w*}7^yZYj;i95sUj_d8sg&ZKF{&SS9`7S%oz@La5X`^^p`)=*sLt}yLsj1 zS5(cbmJM1oefvA#rkifQ$un9=;ZP~YBs<4yYSNB?#CJBUEN>+ZYw zeth%w*TwOMvoImcFjY<@k#8`dINvsC=vFqyw3;O*xD;|f<0=Ly`@p2LI>pi^tu;oytaiUk`m7t9tJ zW#l|JxDE&M#n@j=yskj5J7Xf5Mo#k^;N+~| z#!slTwv-auYbdI{k)k>pDXyi4!o*IQ;Y>hUw*)qae>*~)d|m$B91%q)$B(CyVZ#Fk za%fNe^lA2!!{qYvpI@fj++3IMoiuq8{piUbak({oenmwEEnBvN_PL3&>kXLG{n&J1 z>+Od5Lgq^J2Hqf8%$|J_U2^ekn|~8bqA&jLMfOK^)v$?LaLod0Y-ki4uD@_SRAuYx z?xOgFB)a>a`{{xUX8XN%#mC1`LP88jvRh2G&SSn~$8OrZd7EEB3xfst0O`{2&DHgb z4FOE+Dk($IU^-na0Pa*E`{gslIX_ycUM3GksV?VTK?s@6(c&?bii;5q(;Bn^#||Va z+9+<+&_Q!i1{3-mK~A1`W7aH+95%sch%2eCr+>ftN1wXe6f=xkQ*yk9xUj;_6xLQp zokjbosq_Rjm!6`IGkdA4vCav+9Kp>Wi0ifnZPz3x)4ua(Qimei+ttLN733D)dJ8@B z*kkOc@#!a@vLfKBNmUMM4bT8!2M!#hRjXF3R(sF_b25JUV$Z8|DdV zGLwZI!1%4VVJf;5p~VSn|NS83(Sl`elr`oE1DJ&FPD2a6YTkdm?)#hN*P!S!_Q zwKu!U*sop0h%~YK*474-U#-LVTYf%srjXXG*+Avx6}`Vs4Y2hUa~eR{Q`#k*H_WXn zDML<*<1PVjYlAYLY7pm(3MU~>K3bB8hN;#6Vzmxmwz;{D%F3#PYGQ@2T(mj3Cf32C z_A$uq+iP32ZRc~?ITU}+r9MGiuGqnT_Wpl->U)r4w9*{ zkizN<$WXeEx|`};!kFsML4Y{k)y2k9-t5_SAm=K{u2ztnGIc8b&u@RjlL>s}{`$&a zslv@94L`XD9(sVrjvdSY#x8UF_FRu9RyCND_W-^FCrWN<;h%LyNC&q5(4$|+?7Yq{_JO5okg}zagR)y zejeR(&x4efmhRVjf@%w>bBdH9mMQ_xes(aOe*N`&4qg~AYg8YtuhMkt&L2{43S5{@ z(Vi!Z`7~(eN1q_hJ;3$+jIoF6h5!e(6C#r*R#l<6Ze7qyc%hjhLdC*k)Lg<#--)QV zFP1K)y?ggKP1vTi(Udx4KE;@$y@I$;Kl_xvUipR3{mD6hG^KT&pqS25GPjjbT;pL1 zZL9YR%=!Z2&??e1Xy444E;mYQ|E{U3rlNuZm*W95>Hqxpx0IEgMYUoV{_Uw*k~!zRWp zUfeGaKk`FP9pdlW0CRYX_Ce)3akop5La^!2*2Jbn32p4gMBNWw|h&er;9X zP6hotJ3`!?IT!h@!Z|)79Y{h#oZXG290=ST$p2MVR>c7j!8^f_wv7Vl!UpZd8Hl!F z!+Nm`-QaXxghjacFt7W>a-ilFNlr zZISc@a%hh{_9)%5Xc13BpM3lYE%{&x*FkjE5GnWILl1J!Dl|mPAr%RtR6Y62$u?7f z++_mjGBY!scC^^dLfz}FMPCQD!8@k1j2u)qWmMp{ZQE(v_FS&E;BnJ0es{+7Y4nY6 zTxP4%fQ21--`u$>pdtDc3is&Iqgi!(;Wxjvn=iw~q7T#Q?YDo&?>Qc(QzYzdYHH*n z>yFTYQwG!N^5uHIH!bTbHlCiUEui6=a8YgHBw764KIygZ;4Q>yRpHbgk(MMe5p}|x zO{}=-Ffgdf0GJC_2`|g;EJR%VVH9QzIcpWOVD}wr98@_q=tvlzP2*?Hqol+nj}Z6P z+i%h5AHDB$KYoAtvH=ZoQjOCR;Gq0>eQh0soV%Uk>`N}Dr+@Y{R@e#)3pslA;DLi~ z$5WbEv$C>mlUjlJJD+|2g;)#Fh~yVMXXmakxVa~HUPHh=znx^>a56cZamM~@t#XMXxKDlIAD z*E+;RaPgeWY0;uPZKhLS=WCcwQRftE8I*Gg9m?}oE9QtbYu3}TV<&W4^UyGl0)o|& zGTT|4#PtDnR;_v!^@8ctBg9RZkS&gJ8r3&#Dx4$aVe&>kI{4A3DRa`qT2s?Nm6bI? zHL)V-Au=i~U?$eV27RYbpAtLM51o7ll>7slI#-VUVHsD`tY59``qup z->_joLmb-I*Wch0*4+KvA|{+u$4|HgIRMZk{r}VO9hx7-?_6HF8X`F2QmaJechC*2sSNi*KN?` z?6Ar4z^NRzBHIkp|ZN0e{qfgZ(tL(DO|kX zE2dMQA)h#d?zHnLJA0fH#Qpv6f1|hG_@~ePc>B)X10LcK;82s4>=nq#f3s3{ z>NK@_aK61|(XDjf_rK5goK{s1ZVrfG#Q_-f73R<;iNy^tH+k|Tr`G_NFty^lD1lA~ zHXYbpEvORQl;%=go2ae;cq=L@()77fd6V!ag$4M%;T}QaUQdnHx7%)I^IA!9G5z+} zzY*}4XEB|Mb!_1+chGg$-R$?=kJ{!?-=yhOEutN!Q@vD{wubozAguJ+Rl7gjm`)L8 zcGnwk{PmN*{2opamy?qna22lSz0RM3Xqm*sctN=_P8YQ-e*zP0MMX_eQ<8*+8aTh4 z(HPRNFTDN;eNa%=Wf*zpE1=GX|hy%E|>gq37aU`TW;7}%p9z8ajcJA6mE0-mUUhy%a@ zFKGe0}E4-$rQo9a@E!KLA+RrbM3&)>d$8k)aK94dgRCv`eNzl zF8$;jf8M)yFCV_P++Q{ic!)cF&UiXL#y!NTy{7hFEddW`=^5$t(`TNgX<|Xc&VHAG zX-|3OY%rIe#;V-BdGl;$R+uI#D=TU9=B=!XxT?$Qs=?d}n42_dl3m_8+0aKUV%YEn ztJIecY<=Hn8Jr;NF{^Ig)dSt7{SB0zlt|=@jtxM!y?pcM#VbDxBJL_4SREl9EWt$?i6jZt3 zR(-IfBni`OVm0`2!Jj?QS6f@d0T0SZE>{4ubLUP52w&U&-_uzIaqfWE(`)j%cKFGi zKI73(4sHH|1@zeCi+SgX2@cgBw3t}YqRr8?aN$BbpE8^8^7yW`^N54fSB!ovCIpGPA`47a5UQ7UgM97HMp&r$x8jscJg)253wsBm2E|iwOfJQnhOv&o5oN z(klSBAV}ZS>DeqCxNF$VLV3e{=I)xrh5_)VR-AzPk?B+u#O35<^@$4SY+~);jMJk> z54V|El_wg5juKu?O|1-b@S6)(3kx$a%!Pyo`a(Oqp>Or-FDZBXcDDecL!4MpCXAs& zS?6koHLb6e78g@>WtGP<1b{vE_~W$T+G}{ytEsNxDAr}mmT5W%fH|mgfH_37;y%Ua zz|?x;3!~Bg$ zWnhB*8~_^<^7;yH(quYq+7vdK%KD~gsAK|oL)5932Jrj#UEik5FTb4o3N`2TfBlP- z_e#?#qE1JR8sitBz;v3F6ff>Y6PLuzmU~gK+6!Q;MOiu}W-Iz`> z(0BDG)2UYw=N{m+L7XotoFgbUHa0OGj~O%4rTmF9UPwt&Q4w5Fj)({qeF-H)pH+P@ z_<7;?evgrcWa-kSRHukuRr+}85J%KBDw(!Tn(c96^ptW$?cYs}jU2tI#itCp;U4?J z<1}shbOs}+An(2V9<5uuPV@P=YTi{0bW^5IQ7k?!oIn$1R$tXQG&rDVXN_g3LoPZO z;r`rr_|r+S>n{}}&IVxfw%-6B32TnfCR=4yl?B|69^-4o*9O&%Rov_>YXbRDTVIzi zUrrw``H=Dj9BPF(_`O|w?X?se7t4$N2k*T{ul@61404IdDYWp`Z@M*|YK0A$PLq@4 z#ah?EpRLyR?mZwj#cTDHAsQO)cfgw`w+j!ZQz&nL8W2Eh4{=!<0voh}n-+-k##~!o zUP&WI4(Ei#YP&m}5ZtuI#TBg11#Q4Wh!X`HjiCcTG3y`DheaHIaz~FI)gjJtkuwt2 zXKI5uUqKE~Q(RC;4fWc5XRcnbfbRL;eKcgq5S|cmjy`z*1CJ?5lx@t|F>Gp`J$p8p zV|q-jP#6#hv3vJkpM2-kR5}117H)SzY1BC4o*Z*Js^e2W))H=QS z);s8$Yi@LDI@JnqsI~xjgXt8T95s=nw6vVz?QAlg2CGTask>UXa$^C7)w<^T-7ZuL&v01=CJDXTXQcR5V4P-Qi@eZo3t%G4Mm?qZHFayI}sH%x|;3;N- z=)0$WI|e=Ad=GYrGe!~Br6<$YbG=jI)KpDRz*k#cLuDl;nj<~$x$iz&bo*^=Zh)$V z=)3pdf8Q&ZlcrVx9fB$3;)c(|WPAGb8BPu1tGU%)NgT_*beWk$?UXuK3#!umibuVQ zg!VoI&?K};aFdFLaU;pw~;=13(rql5g&Y_1Meu7d{)BIB3U^-1rO%(k$@+L;@x^Hf7(M_jb3I!NT zcmA=m#3$x6m4<;{{N|glt{rIK-3N&44HeGC=Ud;<*wjp6;wF=-p(8}V{E8h}RaKoh z>Vuk|Al&r-*?SN8IIjEN_m2)N%Ax}V0TAq+ViBn>lCmsYowD2{%NFg#u^s2dbn1P1 zFA0^Go6pO2ZX)G5H_o*k)3Ghfk|j~1s9r!yCMgz?6e*Hm1xc`g=)D8){Lai-%+Aj2 z&g{$pyNmO;M*w!0GrO}h=X}rq_brId!0KV4$D2zXGq^N&feN0|%xw#AOyJ zKi^pUP{iz0C*?=PV@P_qa_KVlSx8)fAztoFk37O*4$=d_CmNU&-nlP);R`|DIWYiZ zJ96|Wovb_M3ea&+9fLXaafJknpYYm5GE4#@#!kQ;{th>WBr320$^bJ0&;+;{NupXi zb?P+x4o}l1cAWv-03=Qg;5L^_=}Q>^m2yBAo<4jQ;dR5-c(pMqc!TE|pAYc%v!DEw zUVHUbzVAYI?8i5Li*C5#W=HS_D=5h2Wkb5VI|Io>`mbW&zJv6^2YXz(2NK=jQAeTq zNYbfjm!;2mCRI9R@b*-^o`VpGTd-hm7|+?{dEo@WjcMLYb4weQmzC0t8I>U*gB!}{ z%jWgxP$;;gquW!C$;wLMZM+h}V>S`*TZxr>g=*h>k9*^$D#YcKvw>(pfw)NE7VUFJ zk9DzC>s2<%T3z74JMsH}@J+h+{`&)-w1XcVWI(>%QjIx17y{&Oy-nHlD{2MkKB4pH z&+{@0P9#?&ZygdO0C>oJjU>ZzPf|+@pHKzN3D6VcjKRcUXhvl-CKK2MoCz=!pGA1s zBEeoSTTCNv65cg<+weQU%`MY<-1OiE>+b4iu=4>=z_FUBAWX!(t-oVEhd1tdyL^TI z^Cv&y@WvNd{522Kz4vVhE1g;aI7p}Pz6}qfOF)Og{faTMf!=<52VJ|?B>@j9GVix8a%;`oWr)PtjwSlEDTvZNFeECgQD4_?!|k@clXp&Pts3*{NpJJajBVX za4%#))He=sW{VuVAZNup2M~e0+SzV>4Aa6KCNAFgtD%9O{mrws5+H;jn-xHZ0>X0` zU}+~qT$i{;u>W)C&hw;*YfbJ?a2)6g3#qcIlK<4h9Wojbvow*0cpZa)Yf~Tz2X7by zXV0D;TME!#v~U5BTf$@d*g7tkzV^Ty$Ay8>^JPFJnIkv4w)TaKkubX!2&8>CZsj1*#|)nv-b%3&3AeJwO@SIjN?QNKNxaWL|2+M-zx<0S2XO#6fE*xh z*UCGnE7u<~fm(qvr*-9!!P<1S(UyF}VeVUhKx@~n;{zpRjfRU2^v*l)&}*;0W~t7c zA<*5X039-AwT8)0WVxc<7bLq2?09Z^=|a6HSsd`Dm6x$eI3unH`Uf6(Ang6$&~S-E zbHgR|r~3D4i`kq`ylqw04BX}@$tj3$6UBbD?-$_4HwJEzye~$EI&b&fdk@|5sXGF) zFg$NR{mG95@P@ghu(*`I`$vC5ix)4mFvf)+FP0!~BD`>xA-ovExjZ%jP`D=1} z+9|WIhjKdGDZi!362$qdmFEF*$WCo5D2WQIZraX=cz?T~$T1X3gYrN=hf5U`R%(4K27uYlwGSw|*U6 zcinXXj~)v3qIAw{+qVbcEz6fpci+2#zWBwjIEFV!r_-htv-_Zz1E*1&$n)nf(krjL z!N*}c`<|+X>%oe2Dy}C3+e(UbdOp$4O$fv-STH9hy>J0s32IGdV>3#fUtfCk3W z=_-{)1x(>GLQ{tZskrGfm0zqUe^Zko#HHsDWwS#M_X&u*jX_+oZSacp8oR)!NUV+2 z)nPA81TeRjO_tyM*0*?!5%vqns;jG0;^y}4kIFkI_AOuzKSj$U?Ft>93@y}Myl|2K z?uPtYQBg)&#uG!_*qO7FGj~BA1+bNtmIR;;z=lnq&59C4NSc9EiiC)0O-QEjy5U+8 zW8g;z4$x13{1aX>MA#^sFm7LWCw<`yUvVs*qU;pn-te=%J-AW5xXn<=_wBc9>Euaw z;5pHu5BD{^Z;`sPV2pr#Y7l}@PYEQQMg?*4;)M&mTJspF)01@p4{DtmyinNUTW{5*x>*py?IkgE(7pZ~57Os`d0z*=HT00S>#}T%v+E?$7`7 zF9Wad?&+bcSFc6%_PK43edQ~(ckhReA?{*t8C@GFq^7|F4sR_Zg_h#S>;RLM*A`v9 zMDsq{M=AY7K@gYAzM9mmafmxIcNJZ(sE*2;7Ajkkjx zN|M-@Snb0T5*SbnRoL<4$LXJc@K2PHnL#PZDKyH6VsK!PdqoAA?{SwLOM5lp)2n<62#f@N9o>sH#i2LoSZBwDaq&87mhQ2AC2EnkWRO43zbe| z9u6i6`f!~fjxb#Ob_D6PR`tFmoOEg%;;h$$i#;!#{wK08A+au6G@k=q=tYsNR{Ks? zyFPd;v1VkVs(HAZ#NiFZAPobn*1rG8-{TV~R*s6?HAMXk*3d@mUw`;Rnmcd2?jEY@ z_w`4+Vs!T2?^wTtKr;{NB>cKKJlYTo3g58mZo@VUqOw^MYWlqGB4Ct;E6?9uNSV z(e(p)6dOv>xZ!CNCgf649z=NgF!}Fzua?)LJZMn12=DOr^>@vArOZk-bC@j1w)>)547*X0CfHJ z%Y!6Vas6RXLKZ7pcR^wu8uG3^54t^MW+ii|a_Q>~{5Ci^Kn3}JKFDe9_19jb4|cv! zon4(Y!UmpMvuDwlA9;i-G+sM+D^P^Dw5)uhF2kU|{_qdKP4B$@wxxf$apOkYo+r0~ z&niG&|JtjR$v~xSDT4EZA?{rHY&toAnW;z3>HCkikg)!5^uUE@ZaB*OVj6>h`yY6K zZ{nK6^@hz0po1Yv0zfx+-dqlMC}m<)dH|CUyoI7gmjKOw{KtQ!6DLl@^*}#s_PmhC zAb-L$@8_`Q4|v!L3i7GAxHwSP4v>U%lNly15Q{#vrQ*?A;I{hu)wJ%8 zbzDvdIEvn=C+q6yH@|*{cGT7y9ursb!o^FubXrq0%MpkG9106_DL+4l1HZ_W)ZQw% zW+0os|Nd^07Wq8mp2NAcBAsGkVbacRGb!?E$CNvlW)PQ1UO4@}uxe^*ZlRLmB3ij} znW5yTWU;1ETU!_J{NQ!hhxGI$*WK5s0XA>mJSr(IF`cOOhCvAl5VPjYvwOr*L57RBE&eOjZDD>5d&#k=(?yQUPvSh->y0(?@G=cl`d{ z@-9Yt3^3Q;+D3y8;(Oqg1I(>kzn*gQa{2Wy5)=f`9Xoc+70ERm*a7OMl~3bwp+@%I z?|#=&LF!nrAN=5-_)kDvwVJ>rAWhqi!Kk04{yKnX4Ykz(Yy#Ze1U6xiO0QpiJ*~N6 z4gaq29z~5iK;!mpudr(r=GJx)_y-D!I3 zt@q+iI-M+oY>IOkZf?SL33xN9hgeHfNIEsLD5G_)dEp}NB^XlrYu zc(&VgoiQR^H>XaXqOR^P{u3>&0BV3Gw^e#v5-8NTphE+wtCe^a_JF zlnDv@dDvKkk|Ce}{3DJV)kCoR2k@E$ zFPw>IE|M2c{}a~O*u+<$t5+{qyFLWp z*owrO#lUWe$IE#wu>$7s)0Hon?FMz>E;U@Fg8Tw1D=!Pg6yS4Sxq5{sHlT)7HhX+F z1EbWmG`B7NH_!24$8 ziF4{fv+FUmyFau21LnFqI{CHa)Btqr@3@0Q9Dojn!5$vE*49?qvwIKs(77$Un%Skx zm#DA5FRlmrYuCmz&Efd~lnGda7Y%>}Sepn?(|g+%Em}m2mMr2~r6SHwNTmw6)iQ9~ z77^UUkh5^{GWy!%-wZ3AT7fr!13YiJxmhMfX2FwnmKJk~b;pj~Z1q=8ix)2likHI#f`Jb)BeQ2u zr{?Ak&m>mVuIuX^;YkmGIj0gU&TDZ=Dc^c}x~a9TovsOaYD_ur{(L{JxPG+2QPJ!6tb-o+Y#AB6;p2dG(Bd#^`k^YyzmsGtYp`Z*8{howMUX zGxIJ2ehwWzMDym(<87wQ_F;AZS!~6Ot)RGwI@;Pe&_#QHpr0t-gE8t%KSoWtAd)i*kVH<*x4dwYA>c;95GJRCm!3BB>gyS7V) zOx1$ER-{v$n+Vb=yl;m|nlZ%r{kdViaFKx_viHp@c|`QWS%SPUUO2r6EH#Bos_0hm z`s?q|b=NInE4iwGHwz}>b@KAEcwHb!tX_3}7#bSm{a({E7|f+xDHI%eV1TR;DJx6k zptR-fb7HwUIh4Zy4%x#e*=qZfPd*6?aChH*H#`4@5#`Tt0AlsIXaP$9TzUIt@)apw zH>PWkh>E^oGf}xU`fC7#Q|+byG)s8!u%OtqIBXpZ>@H;PM)P z?)ufMIn-gGhx~?Q1>Bc_I(#-j-TC_SuEo=#9FLbVu@hmF1#rUC28k5?TZKdlZ<~M_ zc-uI*z55>jX*<3yIf<7Hx%=)1497P+(B$)F@`Amiqr=qF(xkcW$Hzs~&wTUEcX{cM z=oZ#vHpkcahCZv(DHieoID@Ryb`{=!E|Dz)#HEFi(cJLDMaoFEAml$1esv*!omW0% zL$uI`!KtXIkkZqX5(NluU%YrR?;O#pwgnOf`4n+Vm=NF*wHntJEy$U@F53Oi&ACK0 zOty|?=e1TquBD}gd*32S8FtR8m|*nYOAN%h{yfTI-zkzGI@;QKk5(rzgvtI_zx*ZN zV1PNXp~x$sZZ-RT<;s--s6*D<;lqamP=}urA;C^XgO{ylMhyqHnKNh7vSrHxb>kq9 zifg5dEtG$^|91@7_Hk%CS$8tJ1G4=sTC$A3{hjYoNlBR__`&sxxVNmVGzO7fhTgS- zfqts3MZ(R22|cgz3VpcO;dzU6zX9k)Cl3RY(y1MY6EHAYUbslHaP}b2x);vKkhwZM zGD2^>@g7Z|K87on#i8 z+2leWiV+tU6a;{PuXNc51;8QJ4U;jT1A{5NZbrpJ-A)1s_qY?!UCvlH%}TpW5f-A9 z-O*0ndH$#ea*qWM}TuYdkDzXzM*$fz7jL&r;pVx*#b7UXkkRYO0u45y<>=lBsGH>ToP1DqzF7)6E8X09_=R z#R=3cSh#@ZFId2#4zYB2F9mGzuxRn3fVWP-9kR0<8yf>~*VEfW$B!MKvXcWKSU{RD z+sD1&D9wW8C@iY9;H3%-N86LnNqcY=c(x+l10*=*9k`<@5s;m<$f7)BtS!uvKd zGQ<~*V`HNs`#g8<0$a$x!;{|<(cJd(;XVSqg(iUno0Lvngt(EB;Q+*4z1pZYj32W# z;m3*>E>cFSJx|^^)a9_1LiS7_9Y21G&YY>IHEULK8BqHV;A+Q(TU_ktg&-lZde!w| zXi$+@GcqBudh0QZ9{NJT4+DR3agj3Us{jXh!-hc=KSfrW9ayspVNUj87jVRDDw3~J z4PB;T8-t`1Ko!s9d>;MeXh@$>^tGH>Gc)KsTk)p3>79e&8pvmmjtz1vU=D%LBg5`x ze(RwQtA0QofDT|+Sy{>cUO4XEDJfC<#;RZk&mn$)_~D0X_wK|i+zR;#^C zv5t3raL;4rCiLa|^BCObD^>B?dBWmB#1}RCp6Ja z*-7$%u+?dwFzU8;{xW-esDnxzB^dxZjvhTq7aM|ut|3_f-tyFv9pb#{uT3{Tvt5rT z9jvp9v6n4|v-l&t?=5 zhZ7GkQbvZ-QU%$WyLa!WnKP?t-n?01tM(_F7tTr>ue5Xk+H~q>lgw{_yN#ADTSQBj zF4Rq=kY~CW94itlWi#qd;JL9yX--ZqFWCF=!(Vp1J4mPK zbviiM&&K0c!*ftye}T4c-7dQ=STu|?#`W`p4PG}a9>wBVW0({-|MHjr@svE94j>Ny zK`oq=l+>V;j97q+7cbLw*Da>9vJ#KHaCQN0^1N``9pUBKzAW<1sH9V;&eG}A=jetT zR`MEiTEOY=A7BtO$mLaJv0lF1?486qG{ytx)6$72Kt$^?vj%?Fb^s4A01nsH=;#=4 zB927^R&JOe;5E|1o7k+tfPR(dB=BGRJl@~wGpDJoy^VtpVmG1zIsATm&LPWQIDWlo zY9rZ6y1*p+@sW?YM^kHvDTMb;Wb6Av0rAv?o=@#kkSh^b}B&3^__|eVM zAPoZ22rMbRbmMz@|G3X{|2)sRb7t<$`OJ6vIJU&=gbLgtzOEI8(+RDMNc z8}?Xs^!}yWb?0X#b&{qc4<#or!v-&fwsEpr%KU^hqot$*f<{{X2U?lQo|udL8f;|o zM};iaA&#GynL#cZ!k(C}X0#`Jdxa}TLF)N*^7q{#eN-DHT-lU-1wz-ovVSK`DbHZ% zy&3un3Iu9Skn2BqKkDj2b^dGP`oV~?j+P;;$m2uaj<|=wvPq3;5Fb;M8O?=bW^)3T zc^SF$lbSX-so>vgSl#I?$QXjL1l5HdDJ{`J@Z-U?L=CP_tz+UJ=xCy`U$}&Uyu|Q1 zM}$8xl^q?r8=|&w&`5ta*DC&F_|0S-{Uw-_j%Vup1w1n_P+FfV_YWX9X6M|l4UN5a{65$PXW?V|vNa=* zzbnTAV$bjSs(QWVEit+CK8>C^w5LF7|L9;l!*^I=I1O|bza`Z+9P~SlwCeMYkzpSB zYt;RNgIj?TF=qsI;V#RBGb4n^u=sq(GBiy4B=6~DtWvoXjXAwj9Ow72Ua1~GvO`OC zvPX%dOHjbE`=`>$z^lN)!QtW4Q;J-f!&OJ%3fo9f0Xb15@PYBVvj=N8bwIiduX&7V z??M6OtTrUl6A&%K+kvwYw}0rcTl;cvkDTrkecfA1iYf#d58N@fjXjJK_;VA}aP&LN z9&T(ETHG=x!ZKsu-&dWvyKMeJc+di84&KG>X)IKC(M=Z|_&^XB!728dC*9&ybAci) z>?ssVa(T%kU-XlDk-E#zt59w!ku;;i`y_6(}68yZM<`S*~xIS!`Vq58to@j zr)zDE-lcmHWp975?&?fdWIk**JGz_f(WZUbIcyehBDsPWbQAVE=;A|=$!Opw7Ov8& zD%IRyNZ*yFW^4ZL@0S|4UrhlQ%KUy_Dlc856f1g6z#_+QuiN<`-1E%!=Mj9IVGf|6 z`=cDASUHk|mj3b;{{V;NkD(KB0QOQApYFEntS=eZi|HZ0#vk(>-CtvHON2lrjZY6j)sPY zw0T@M!~2F5PQIUWbrr_z^36gurX;rAS{7rx%4QJ-CN6IEWWzt?}sUSp-L0m$YR zo;C;xAbHDKfws54a7#ylK&{>&Q^CSC{G=UF4aP|(rc;|x-=UvLjVW(fvvWBa!9@RXd$))Az{$kTdMd+&EhWuqeJbX97 zZ#5D^%NjZp(E01t^zAtyAhnB zP(U(5lGNgOSx?ywN~Q-2054=V}27$8(5Y>v@F~EPab>aZ})^>8Z-V$u9b# z@13yXtnQd4ZMxG`FY(>cGc<)t9Z^Sku6t%MzDkg`$bACIP45vN zQfTNRV!`$w&IAjg>-v9`R%81+Ohk+NaY#+xR8c~%8PyylIsr)BU0hHE`y z2V8u7=x8LCmzS|gJ9Vr0-5_xSd;DoC#D_T7k7mjrRt!s-{iVz`gmW0xs3ebTFx?Cn znv70zB;%23ae1KLS?>fIf1%SH7U#VZd+u3+(s#$zOM%0d}n88U$<01az~-|0p)|ElNk$)X?la`q{Rm$W65f(j#ZCS zdp$!J1b+w3Fmo@Q_O@;x#W43EuVp6Uj%|#n*JHa;?GIU6TAliR28MC+Ki8HWZ`BOH zJ*q2G%%)Sa@aHE7rg6u8A~I7SxRq6A3U-T+hmTj0PE6c>X?hq^5&ZKWNWgY*rY<87 z&~Wy>kCrUUZ0Z-i53GEM{GqIl(ss6K#G90i$I6gjDQMDmNEWx|b}hk+*Hn&2a;L)2 z@JB0MPFl*=+h~OA`Y$CYn7Vkzd+pC~+?8Uzm1?o(rSK1Q*yFzLzk4R1cPtQiNl7HSdrCMo|i~H1E?-saWW>)IY9qf(${e1{_ z1`@ay-gr0I>sZ}!MPVrWi8n`b3?>18YC5BWMcIg02=F4IP^{xf#uei_JQZlBc%S9j zHgqIK-bMRu-%JLMpX^U=M#SyCw{ATpka7JgM8NPGcDP?@? zC3mP=5Pu&z%~l3OFrt9<&pAnGRZ-mSwX2Q3WGD%Uh_Ji|c4rvhP~L|C5B{d6qIMWn zmUAnE2K^hq8NYhoOOsZhPX2ueL{9a$%Gmy`4bf(u;k(pc#Y!R3`*%ugu2Zwat7_~) zRNWD0baIkbr0X?6xsMX&Ck>Y5iSv#FZS|{3{tZRLqWAspBB3BdbREw#3CRtqsItDR zuy}KF#>KjsuKyCZbSkU;JAR0<;oLI zRh@D~o@QI3=)EVo6XyjP12|S1`}Cexh&cN++XNa(ns{EpOlg`UB{@t1$fD?g4GOC8 z-9G!0`(XnG<|a3wKILWC^8)hbjPNHGDLFA`AoHcb(3XSaUVdSr|8eR}IwJug19L|~ z0Rc#mGuJaf{VTM8lnEODiT=hZ$$0b|soaOM+EY7I9Ly)s>S#?`>}cLqkfL%p7S`UgS(vbt`w@PkF%@33>KtD(oaP88G> zxRSP)@pf$iM+Szpq+fK0Fou{Y`h8qg8-Yd~`n$)qe@^)y0~#W0kq|rQmI!+(dFaxn zv@ja%wdl?1mU6!9OMiex@TLCxD~oJBGNMdjt_%nd{q!Ke!$0lzgP8)&qD8)2BxJ4T zNjHfpDO4MFvg(N0iuoJ+vop6;1F5Q6w<3qwwz0?B$4<#e-@$6#b)c&9^8;^~GA zoj#Z<`F#UQxQ5P)v-il8RnXWW9-Pt$jxJUAV47@NXynxud1V^xVKZAv>EED#5ir3u&4Ox}T0?yzm`dc_C6-~VkWxpNzzvj6mZ zM(*qk%Nj}+7QrlvYJn-ZOdjI=$3-O$wH9xyrKP3InuxwR0u$XnDHu0DZbA4Ei{}Lrwd!QiRIB$d z8!wD6?{bS~I`y?`&TtKYda^`QuplwwPgjrxfWl1iE6p8s(ajbe=e%C$Rgw<&M{F z<}#68w9!1?cb!j0>6HRvO+Cdc1GKob^HYmb){Bk&K>$rsZ{T-6F6b!pT{H3Ri}d&5 zEjE*7Q{w8O`v5uci{{_yr(b{s((4X2d8oE_2{xmKa)<2SgU5z#e7fZ3 z8}mwVndQR)ME&6bt$zHCNS1G;@q@C{a?$?O8#%5MDN3)}1t_;+3}(ugyDl#ZEf+R6~RK>ZQ@8n=jXe1=B2I)`+se!EotjfT)dbGD+ERkyYmxe zkGc(726%AUsT)EyBa*}ApPfamWP^%;10y@ZMGDCwVy_q?L3|{aL4>&Pe&dn>n zSRGgU6?QEVFI;2&S0IUX`6p{neRA7nxV&C$fbhWzM)8Xrb<1;Q8#~ zLnD*vhC~NoQ&Us+5SaJsqC&e@fKA!QM=gOzJrJaiir_f2TP&s@jR=Zq;O3O353P0l zNGhqpG?!Pc@2=E=>6USag-ILLLy`QYvkKdHp|PRiEZ7IaCVJkh5^Z#_f@R%+*WYA>oJl}{9J#*ywa{43aGG1te{(-c}*RhMHN2j*?-@4`hBrKi*nun)r%?H6XEjZRX z|9*C0U@RUB34D7qCAQJD?2L6aS7|g%`8!X{J&k1`Ur9lb(0sxDlmFJ}#oE(;wKOw9 z|5VI(aQ*cw)j7}2`j<+mLY_+vwjT$2_9oGbXZ(&sJnnYCb^zvJJ;u7r^wrllzQY*+ zTcLRmTcof9=|Ux_6Zub7E!=3voZjixGyUxSWT^?UkWzH8u2uHQsHHz}1y1ze{xPNQV@w0`CO!DfiWE5tEv#}n3c(FHgp(b&IoKsPq@Me^M z$-vv{UMj6dekVrPu+}W1=swa<%UK_w&(B)+z)rK_9+|1B6Jdv6Fvpr28)u$*Mz~6* z07^s8ed)DX)Wm@P%DokHj`-t6LWzg)?DLP-d>Pk*r`+UbA+OyUT3C2=n_DzS9ICF4 zsJYjOKNwy1phP1(jcf0CAKn9>DNS|#E;HvG?Ux#Y56eP9k)hgI&p02+%%Uu-I%aKb zZU(<$FMOn&z5hZxF@Z|##K(8<9SnwWtb{hYB-r}3t6Dr{Jvm!U7mDZ1V3^qdXuKZa z_D|BOG8h&MfJ-VkN8wTz@8$*NUL7x6?|q-@EuEpTS?WTDAn5n{V|?LYyyqo3S4ayG=d-;8W#K*8KgvdW31S2?dQ+Se5Jez$29{+^tX zLqbCGcSk~U0UlWuIrf*5ND;)q`%B$+CjqDZhWf?Wm&7y0Laato!0Kh#?+NPcQeAmHpXK+r>KB zNWs#-cfs^MtR#n)^HFi6leOCCpS|JY>ETr+nDEGm&F|FD51CgXo!@fl34dM^F_&%6v9bj+v=rvL8dL z>f_7t4(5U@>FVMVEiBTuFuu3R(`+hbL!(Lta|1&WBaO}8et#!uif5n+^%%FxzmcMj z`tT&Scwc+<0Mgj(TUz{$-dJ;E)JhunTB@j(vc8-kZ^<;${OqIAQYIx5O>Il2tnSgW z{F=nk9~(MyV;qX}l4czXE-|XP!ozT}IZ?-{-u&6?eKc(0M?iMSU*!5ZNmI=;kuED6 zF1=i(%@My|QSvy>=6G-psBB~gnne;?1c~;DbDN=Ciz)b|7&~+2Jk3T}BnGB$?bjk4 z#`eim9rzF`KS(EpSyh8cCwg6d+x&d)#2DucosIh>i-&mhC{NuGt3B-VGn>ZqQ4JY7>yw8&eq6^ql`cwpTGJh}+rq8)+^|$-| zgF2EItB!3;({}C|{&po+FklAmn`ZBsjdKY%9D0n@@43V**3Hgu-LRLv>7qYbSpEzp z<+=z^?li)Rd3EYGL>~cbvl_?jqa@R>gusf5qNQ4E5c#J>7~~eAV4dX~7(s=4z#f6h}`5 z(f+`Kx1WnNjqG$eFUHUu{;u`0=v}JwwBwSX6yO?!sB-SA2 z5={)(uToBt`>D&O9${~0yWCp_<((5zt;frEm=w(ZJRc=F_IX@fYz?&p4T)pmE96ID z?NS7ig7Y9aFgH%lRnDQB7hN8E*#-S}AXl1z3xaAcC&AM3W5$XgT*rQVh8eymt~XFD0rfWdcxyl%FwejdM`(o zh=y^ZuA&LXb(|6z(X8Ku*msHiVPiHx_C;cOca_fgyn5>H6@%FlLvxSKlG0LFKw!|U zxNt+dyee}76uZ@O+1rX73*Ry*dAEp^&K|pX`(lhdl@a+p{3i{Cbi%Tg8q?gGk zVcx`d68pW!7nqo2@?m_UnDW0B=wrZ1X9qx}wi~GS|K&w$h>khOoTz-l0fZtfVv5dp zyk1C)4)*vQ<+x*QA+BLQSgqINID0@DKKSA3FkkM{pil2&&hW(bmVbx2hb%%oeiNJ* z&4g`DP(1Tr`Lzm&N-^5~^;Y7I=|ZQ{iWU&$`eh9@HDzyaeQ=4e&1RnWeq(oNi1qU9 z44na}-c#YaZ^+H#8Ub4mYi~~gjOVKOAdIJfI7i4mo<-`r6cr&hYQHR&{gmkS9c6Vr znsno{?VPw&HOAn4V=FV;?)2Exn4GX}SQq%{B0#|N*Qz&!@}B$6n^Nw;(+Xgq`sLRX zYq}ii{XQ#;XT4p=WfQ>w@havqj2F)-FZM`CjEBKw(-#flRD3}K9>Fl>CGQvx@uDl^ z5wz^_&$u}_g-SfpYTVhz>Qod|8ipPvr+Tg1qv>RUq_I(~5e9}LEo1v70{q#QgDu32 z+_5;0Lp1Rz`xF9pAWvACzd2vWm8HCEB$eAdG*Q)>ZE);Wg z3dvsV0@TE#TKxC5gk_u2@*=Ay^rtW6}-Z0kpdi+5!rJxk%w$jeVV$eMET3=26- zjP6uUdgXoJO4ysRZOT6{k?@Hz=jPMGDxaOj_RL7(b?;(m`3<6XPhy638FYsZ@p`j? zc>+84l8Je>n<;2-{SV(n2q*(#V_(#UJc$DHT+yUfSn~V{e|&XLgTUq9l?T!Ux7cpa zh_WNt13wISRK(zzD3&8$78=TY{Pnl{x*cA(!4&SsohPjDn6kOguWzc6Q<$4G8@n zg-H(aL_Z+kO2APa)iRx|p@#WjCpabHS!g=WT5EQ9u?LK(+!rqZaFN zN5=W-*hp9wipF0N_1pTl63O8GdYBks)QuQ`n@@oonN8Wr3J;VX3H(Q4l=EyBq?$aW zO+b{QtG_a4Vv^O;F_8wabfVn|cNAh4y{d@**e&$nrL*lg+wsg)x^C>ScIs+dJG&wP zbW>AG<`*z71u`i>Z+Dl&kGv4)r(kFg&>+BP>WC=ruD;@}EM}=FetFmQVzoi)*J*BW z;!vG^!>R;_*R%Wh6>uFeaT*}RmGkwiCjRs!=t01GBD*O4Q(#V&QR^FP?KsdLv8%J3 zWMw1IG@HYDb=`zhhV~o(|c07+bMBO&YJ1zBV!nyd| zKA=gCXb>0Od@5V88a}9!7$>+md+gVC+?Kj>ucNi44480)?My7B=#E-IO3^vE4Or|K z7VdCmuDZ^wvI0|Q@Saw-#7Z^uv@Ivh85OD}BfNfmx06Is=ZJ#$*R!y&v39PsH>GNk^v8NkBpNA|>nPGg3TxpV5 zOfnZId*gy@Mb~RIJC@yANpnhy z7BzQ%x}GahN@}Y5N7oR}7C!Vs1;n#&CfQno7kpk#cm?u##aH1vk1lH_OJZ+so&_a5 z82&ccVm;wd=pxbsA4+0?!D5!t0vi*MH?n&(QoDd}tB{(SicD@rZ#gx572Zma@Gb+$ zSYa$2rt{TZan`xQjfW2XBVMQQX81w1&c1cP`20WHj_12vOzO^(} z`;mfzYKL7Go3(i@kb%<(JZXy0B>t;=#{JeUZkO=j1Ij=P9@fVGnpZPiUL|5xCT_5$u8a z_ZLk?W8)VS-#zVBKK5hgHidBUY_%b1Qn6+?rKk%?M+rD~X{`9rP$T(!u1B2D%(e8V z1vNi{HIl!H{XhJDW1Ii_HU3Ob2wM~|Tka@#Xav}`3jQCZ#X5S->}VC9v2jj=`Ct}u zj6f#F>VAL1t8*YDTP-~n>M~TUosagxJSOa zqOx)av7;qCVAkBSFqt)5w3^kq916b5a_&?D+FWw^^r23YG$eV5PP!1f?1&`QWo-z6 z(KYmkf^o(o8cr}xjAMZ_M^`Zs8|!vvdCxrl9QIVhjp9sq2n6zP+YU(TQ~xOfj@a#8 zESI;3hx=r9I-z~QBl%K?AG)WvciU>3(m$hs05RYXDpSqL39{v)@}h2qgYHFZLwR{D zFr09^43%8zQM&^H625#|MEh-Xl@PHfcI}Waa@;a{8jzB8u&EC%Dq<+*TT5aXY`J#i zE17|yh^H58g4y0F0rT^uWwJp#w6#v}{HTxG*E43SJszG!0T~UQ^4-Djq!T#m9!gaM zjC{R1--?P9*Cr{Q^c2{2ICx(&ASFnyC@Q@o-HjlyO1OlGEZtqwjdX)Fx^$Oxi-hF=;`6-TH~abCI5TtR%th;F z`jR|k!X?Jm^Gy%=s1-&(7^WXgIPu`Y1IxLFcXBJZ#@W02+%acC(O3CDw;7!rAmU^_ z1Lbe-=)sPsOap20podI=GV}HWDISs`s3fim0!G)2>%G3Ew#f zKnZJ3c6Ppw5FopdYcXKedHlXPZEsifV8?A-+6D&7VAql*!g5dsN*P;NX~ZZ$FV8cn z^Eu`+@bl{rQ%6KZXKSFhvEC6(_C?CM=Bm=!qH;d~*`F#S^F!<>p{{Fw6!@Dbrf%0R ztNm*jPL>z!Y_y|P>M^YL56zMAXAxz|QHs!3_#0_|je4e8nI{^NKn!<;_Lce@=l=TOPE4Dp};Y&I{ z2dj#p#};o#-@D19MNmXu=%3>R)>$^fA1_XOAB4vcj(`xnwCZZnzBw@ zWV;7+h%QY$sa1=}LkM5-*;>KCkkp|TC>W79XKmuxkiWZtnx%^C-UUK)VJ(=L`G*OO z&r&HWV@oD#ZUqhK#kK*XiR*;%t4-vPhH?661e<+*!B&-#5@dio$e$x6YV zjOMMMnNN7$%~!JNtv&V=$!z|)R#{i4m*=%!{>1LyR+B~yd;iYRHf1+Wqy22%)8Scn zne~4#c}+Lh%Blw@dPt8uCea{Qx{< zcd-3Jjl`%8DX+!Ht$(+sDZYh{qDF`pq;<6g zZX|~N87?-gYUoNzoTdL$f)cYIN|C(|MdLr{^?dpvjVss5^C_+p=rc(>Mhd?MyJMW zi&Cd+iz)Y#PKB89!$n#4$!#Apz&Gb0cEF!T zNRIn`0XJ`MV7yN^i=wv?Gm6qje zs*zq*3+N#IqZ5%ZR{W|6T*IW0+3xjU9iKrgX zZ{T9;!AN2*&D6Pc>|x{a_4=4f#buT44V$QsjNx zAvBC$P^VokDacCbcU!uOGz32K<&!9Z;20T+aoI%>U1}eZro7~3uXfYoCs#1A+R??s z82D|WDXCZBKzzY&Z!YXtp#|0%lS1aW70U)W!ONNHspm5J|MwZgjCQ@USY&kU=TQ{) z?|ol~<0<%9Ml?Fw`(%*u8Fa%aFWBoI&A5$A{yujh#2Ge4aMYAIpm|^08yC#U4K=wd z7u3IP{QhNlLDkRyjzVU6?^8Z(N~ywdie|R&P8>kPkXu_@>{es25b^FD^wV~^)F^niN>HK!IwT)S z<%8vh!C;2l+FqJ6CCKt6(WO~-5>P=wnV9ofelVLBOHNJlET}R&JJMIPAeYp}aQ4~R zg8vDuLMM}x2ry%^2gWO!`f!{5-?x@-n=+r$?7u=F7+lKNAG3>hI0s^jEuHQg&c8oT zHhAP_Jvph{V6-XFa4ChbzrHdo_W1nyeW12I2r}|*%l8p)d2n-{`{RY$V_;4XsbykFN!aR} zHy^hxV6ywbLorQ{QK-Qzt)E{R4jewY(k4)YnFOVh=Bw%`xLtx8W+Srs@4$ygK+zJ$ zbBZ+ja2oibciKI^Q=(kWRdVHbtLW z#gJ8}xOR!rLm?j;Fef)RAnk&PVUh4UCcoTu-@~bU^mrJ`JktRjFN#F=ii(QW3qSI- zIbz62NJUzq1Wh+~x3`A#8>e;T7*5(zE>;EkFt5!KUC*c_{Uxh55ZrPP%aFL)(4}4i)zef z%NL;F8x7XW-6h?EN_wBlrm^%qRz;WToDA4J)sX_Q|6Ox|_IyXS7LvQjPz#tl1eny9 z<&KxX)5@@A4O1Z|y7bLeD(unlJ103MnYq`9XG9z_G9VKHY`jj+ZUE{q?Mcthd0o9_ z&v}VF1h!Ewuut}J_D|NMpd|(`Un+L9<|`NG*^Wx7Qt=^NG>kj7L1((5t!uNP`q)m= zeK*R2^i9JU(uMB*44TITiUacdtl9(kBxB$LG2~Qh6<*A#XXodzh9Q#%6s76#)D$sr zd=E1v-*b_gap%m^vg`KmvVM8vLb~}fWN|{a^Q=CDg-9yvtd&*s??qI+_c-dTa7ed8 z#fn9_RWe+W%F9LdBz$WD9h-;QTCKVu72$ zM$k~$+Xz3|8?z8S7t`sObsI<89vpCfAAf^Dh(^aM*fSD(1pf)VI9<;Cb8$HRwW?~s z^x3^YxBCR_$=1!|V2WvJ4iWKhN1c9@0EE-{hcFQN#k?7??#SZmeyrgHP7sL8znY;W zHtUKET2n8KaeDvrC_S&|-FRRWxo`n|O{NHb`YMI^g#N5}ldE;v;nJl0af9=U>VGdb z8522lM>L*JJZ2U5xP$9{W5>04nqbQHk#O>b*82OK^+aWps9~h=vLo`?ZpTeYM}4 zUh^9OhBeZHpWgm*?jUP{3O~SoFwe{^+j+>K(rESe=8VVgOsxy^5cK#DQt*I!LGxS^ z8g1_rn;1+NxnU*bIj}u>xZaA}EIXX5Em1eNu*1p4m6eep#T)(rk+HD6cyKaz?t}2! zDe6h(UxJ<9z)HfCvYSWAwJIBTF7Nl6nVUYw)uv?TwQqF1 zV^j>h!H*8(k8nr}oSPP-w{~`NL#XKPsuk{cnOWrGboRc3zK$gHewBhX@n*QGtD7Kb z!Rykb6nK@CZhsB#6?en;N5i2G$_PhmZ0uTLJH0!E#9`|VkC(qsS6Ik2o^9&qV66I| z@<-lA-W<iCWWUbQvbFxU*zDMPLC+MM<$v zSyb}$XSAA*av=}Tj_XnWVKK3;F6Xv5rvOyv0OI{BwHY+(&{UdIIeU+oAei+s%Y`94 zn7m};RXTq8tkD73SBUj2;)!(W^t%n~0T&FuMzH3sTB0EWoM z3{Rl^1xO5Y4s z2JU@y{p8mu9`j%6c$2hpZb{P_+mK|mIq_*FCT~*2L{1U~90*eNH>FA=PQRedAoS-U zgh07)>ez6fer456%UX5wm)D{(&62ti(G8lbtQ3bhPC@Co?34?AYOk*3o&*l|s^)zD z9K}hXsXo;ls{O%NMU(R-`kl;S<+jI;rMFBL-Gxp@hjh zxJ>MX4$4Z}X)o@q{k8>wo?WAIPu{N9d%3lP3e!Y@F^b{Sif6Jl%YZ}qlCa~z)yX;Q zI&2N%F1%!)dmJ-LfuuZkQt%2SX{?UI8Wc}eYr}onrov;M}Kso#Qn z58wTUoiu5PY>ebBJ_=YPEQ>SuzYQ1Jy=;*Bpd5R5G{rQeap3=#hvApslshWPW3GuS z_IrP5yON;U+9?N*$f%$}sKOliew!jhB8tUV+rB3PJ0RA>+8SSGFDTl^{_R)_hY%T} z)^vj=(K!_hLhPYN=tV!%=OZ?PR9GXvY=fTryPi$YH+4i(b;L0ZBtT~tkOWlAL5IP5 z$w4Y(VU1a;xkHc6E8@aIUXUJ2!oP0aW$f247CcqFYeYCSxkuVD zTs<6407fp9qfh0-4hA1Sv^qZ)qX&fL&Y2@PVoDK}r-P;GS!4|k=9mqaA-iCjjTfkI z1LOwP_#`J$Npd&;h7hf=)XsLKBqAJs%7keHtYX;Ep8_><&w-;@JTRQSgaW+`z9`357|pANeW zH9jUJjAehD7Ur^Wb5(B<-rJ>ia=2;nP%IcLfhMGdj%uiG0Dy5w5i&sxPq1{|>O6eT+JKi}c(KAq$l`9X(SQ-w26vWSTaIqc$l+;i(QVh=@BlAmZGG_ zms2Fb9v8w=QXR#Nc5fyR#vyZaNcSi57RjE_n=;Wfj4QQc`6|pyN36(+!+4+4rJMz; zW-rghhyS7}zBN(36b-%(Tz0UexK1>l@Dp0QO0KroBp$XKkxj*mkM>V5o&k1y^n9v? z$6%Eq5T`REbtp;iYJB3{c!A{@%YKBO~@4VY&kSJdQ-lnxBq_(ph*| z*mIv;z(Ff*uDo2(uTIVK1b5@lq{X+JnX?s$#jqoM5lMzZhc=02Yt~_S)qLC1V!vWG zhTJXG86_n>GbBw_d#Ph}s>nj49-6F4uy8{b?$PYlM?`odO0|Q%2vD#Nd*-b_$?k8v z{Tf9HbsO&9z5AvD9_^$V4zEgQd(d4~aejO=4$<*@%@l%*t)xG1SSY5N)QCTY%Y<60f#Z@2RS&yu^C<-R70ts)~l1+b&AYHHZMq z1+C3oLFiJq?p(@ zObpLckV_JSW1#y(%m~bi+jfhiysb44i&Ad9nL9zTL;Xxdv)-ZwAL^bfJ&t8LV3}S! zSs7(zhU?k3Bo!SSHXQ4ECg^>6?75iX3&8TXnev1fZe8UrNRcbjN4vPHN+=&ICp#4Q zlUPRHol8Vzp}4CR;d(8XFAxZ2MaB0-4*QfFVZQbRXpL`nUbE9sNoYDTXh;#RiPAS@ zSCsYd4UL;7%YFj}+U#Yi`N*>T5JNhFQA_f&3sstH-| zUWh;*3T3fKk9;HwP_Px5&h-o?FQI=`73UBU5$UnyZ|@qlK>3Eo|6UOYAkPF7X3wmw z1Wq8-8vK9%)&fa0v$d5uQMXV9h9AWv@lH5hmQ!@zMi6V2yKnBBpPxa3h>avxP*hr> z7LWRkV-TdBB=m!*ayT7zOCxz$yN04- zrzC9&ncm>l``^9MTv$ZMfeik1Zp7miNY$Xk1g*GA9g*ps`U$bbga}$oyl8%&>V`^z z%;;S~;Jp=r2ETl$@+pGF&MtXI$l|pzO4~lFukhfu>H*YS#Tp|Yz*_2SDv9*OyS92I z_^S%6$ZNV*}TNqH5q}T^kBq_-ev%zOvWW*=+hECWBr(}Y%!W8@1 z^JDLbHG}gD#AA)9mfD~BB6JgvUf%;7FRPQjd(vUPlZp2wc769weU5lXd<#A4liiwS zQN6km17j5PD``8D1E!6~JqCF*WTSpEQKguD0$eTQsz?Q_I$NfT0u&q zdCq`|iQH?h<03zn!8_!M>}EqR@tiQmjH|^aSPPN1nuZoI?DU=beI3EX(kv=oNwmKl z0=xgEcA`6ynt>smfU5YpyL;*mR!+{XUrNijqKxmHlI-DZjHs3&s8s_X3k!DzBTkH( z&u1AtSL3PjN=ly2k%Q(-!kBdA2}WYhLNp5 zOcp=v36g13NMoh-(cJzU?W#wc#|93F;_LMtKQN$4`7vi3jD~5ndx}Qh4+y@Xn z$^x{`!-rn$m~5Ns`bRA6VfzCGu(6Jhk{uu0&XdeH=+}OkI&BDxh{S&vrqwl^<@5xf z&SMKKL)^O)~%(NWHYh>>r1N@vnFLpTya03lV1iXWuR5*l(&{<~nE<#y`-@LK?eB3SUJO_3OoCx==yLcb`)l_JV=Og=#2(Jwy5-QPeHVSWC%6~58)`A07u+w?6y2Izgmga3trmSC{N|t!NFCh9MFJ*_*sHJlE zd#dpM3=Qfh)9&up@BBzm1f7iFFnC|6(co7k)d!X55g%(f6063 zzTZ2!bB2x*?r(H9ZxqTA9ARG7P|;JacIBnms0u1k=1)O}(NH#0Obu~n!zHeWf>F3lzSFQJr zSe{Z(TO_xZO-(K{ZX!-d87!LTzB07;LsGx=hAXShY$)piq~CPN9sv3@Mxg!GZ9J-4 z_&dMUij9=3!TE4?KolX7%_1~Gw^HVOT=(d6`JVj`lGTQQuRXUOLFn+0aYjGps8Y^>>*OtxJQ;ZDZ+)`yS0rdJjf@JQV6+GBGYwXSrs zs~g{vw&qt$ri77F*N6?R>ujD+ef7&YZbTJ5WYWi}jr46o#x@Af_|^hs z@4DCMt`w#7jDtEwVk;mkka--`lT@t;%I8`_JgF2#uKC?w>E8j%h)lik1FnkPL8d*@ zKXP9JTt8)zRP2!;YWw@u{p|^$L6enkTP19xi5)&0PHs+I+_uD88uSJ&6I+qo3~H$@ z3#!d8tT4Y`NFT}C2S~<{LCRZ&d5-=D6`FXb{;|7gJtE9<0} zRbC#eTqD}kVJw33pVP8c&cwTU`9{|LGdwih>d)9`Gs3nH?O%AOuxc;v(VlU8KPLQ5 z9M9)63n8qUxUV+mnrt1F27$pRgU%nG`MP!Nt6Q^;sa$0y2X{$%*C5j#|FbDDbt)|guh-?FlNzBi({Xl_jkBeI8k zM3ZDZ=G)AYmpG$f0ugYPa4a!Fj}T6YACET+1q$w3Fcs(>f29%5BlhC9!feN>+r}AJ zf4JVQ8!d2{YJ0ykUPM&O3^7oD``;k3Uc4H*qDfd4U%Dh0p1g7?7Jlk;g-&-AQUX=q zn~s{gGOjZr!#)%0`T5&NoECjOJ<RCw+ND#{NaPYig|?C`(U(WSL_Q>)0ch zSZ)@0hfJPoKybge`AkZoer1=Lz>+TgN+N>xS2Wu|=!Vi1xyVc7S>xL-pK|ZBW`T`l zZJU7CEQ@G78lzJOD>u`AA9pC}Ww4vAZOacXDjpv>+V;cK;OC@M1DyNNu_$L|8mYsP zd^thIR>Z~aIGQR~U@NZ?b2S9_^F5W^C6S&Um4yhx`kJC2p$7e439kUtLi<&m zYGlJ72II3`U(sW8F~zXzTHUNB0j`Vhv7ypXCbzT|x#7g z+aTA?<(MMiyCWAhK6_ zdi~2Q`2}1GgS9@jU|OioaS`9m{mGZD=WNqXB}o*uWC!X%uo4Zi5yY+lSn&4%fg{-~ zojBkzg=k3|1+{zcx7rgq3=9tyt#yLbR{WvfrOprqeDc?g&ZxS&`n;-a)Q3IL;RVkNFa6FR0}mrB z0pLnBRdO#Ir+@HTT+CV#`)?(5h&jCK$pa9)3m@u=IbWi>32oY@PlNo6YuWO zFGkm)e9aeIHQ1yg=j3xWv;*xq&vVsZ0L}^5lWMs!VK#!svJreN#)WvvX#XwPbUW2_ zJ=7VIlO2*>tgmdtmsS9jhWv+e2ppaFx9j{w(NG=B-)&uDH$TXBir_W*ZAx{lbcB2u?PeCvO&FE*ZT=$YKdb;G88;;~KFl2=d> zaGq5I5fP#LZD+DtsQeeh)mRd zmz%e2b?pWUm;yF?;5?=paa&(eQD9otFYCwN`?ZHr(eaAFJr$J{)z9vxeulh6jttMX zON*y^oxVBSTz*Y3HSUYWo^h4LK_Q6r7luvkB&dpjgC_X{>qSmsAq$5+VJ;1sv!p){c|+&C z+ApNH&WW(9>~MI(DrHjz9JN$Iy~`xox$JRQQXIGa&rV|ED$NldW;M3VmghrkR$< zI(j4`b#LvYbPys+2W|rs!`Yu7L(l7+S9)aup?Zmb+{I%Nc0Kd!Xl-)K#!~9NIOEa6 z#4?7C-EOIi;T?X~WSKIMlH*&sVxyy3OUhf+HwNvQfLlY%VQ!nrk>moMMDyltSJ#Zb$dGVTJv1S zb}Bz{r8Is*Jwv>&huk9Vgn+ zi9k+h0UnEX6!#uaCYELSdIK*~1@@=BeO7!fSA3J{3I!|q`hWG>=ld3y%zRIMS`Ir} zn`T%8x@aD&CO7pEWkx#i!AVI@w3U>=Q(u{+SoW0L6&?w8{&zPqIW z9?_D7k+I0E^=VOCn~wUSg`=Kqf{t#A!ipvew`juR=9kg(s`Vf_T3Zg-jd9&5!~Z*r zPiDCT$^{466sjTbK}Oxw`6lN~p*1eCcPVU*WL@rF>6f~>JrN_Lr@7Yx#kGdt+UE92 z#VQH`Z23n{)xy)^$H#g7mT!jX`2f^Tb9nj}L*?S);%KTcacmU$Oi+lJV<>~_tUlIX zVUfYu9=uG=$$x<(A|m1)Amy=A)%LYeAcR@Pl%NtRwwz1~!q<|hfqpw2LTMT$1_v!P zIF$I@GmhNT9a0J{{ui`m%YQ+;uMoKhz|C~G2Y(Z+t!yZgPoM6(7XUEpXgT-=6JWHB zJx)*0S|3jbMGt3*)cMSzlY%_${Z4oE=bLTtX{b|mwLJr8XNb1-;(joYqH<{0%mb_# zGPI~vB@rBv>j~yaW%RaqTSCpD=$n}kDopk0(6{`@+p2gT=p4n-x0h59t~-3} zz?m5pj;FN(XR?W#5isfF%Cj4A*Por90@B$Py9yKa>XXw!2~PH-`8B`1mcxj11Ofsn zAc>Dq>{_|DFOn1|xE((5zr!Cr94irRS(EI!LD@U;XKa!B9iOm$qLn!)i#UaI<&ZF>GozbqmSr*>`^(C3yX=6_Yn7 zb;6|me7TAv$2i!!vUUBZ*70;_7i+`(g5KG0(|yuJTd+72)Rmy za)^+Cfa2De#gjC{{reB5v~moF+dY&kYmTI90F~t6$OjBL;!Vw@o`C1L0icYrTt#ol z%emZ`dCK<07Yw=zz6n;@i|?EV}e@#CT}ORwDN&X5AWF;n;1i=!O~{85=`tH?;h+B%$$LTbHs~ z5PG$Mu>hvPk#s#^@2K3Q2tZ7)1fITVL49Z7)O3vg9x z?e+1DU2*enSZOxj=MnJc~^=1got@0&jog#bYOb7iNC)VXtIQ|N8-&>7=tzD zU6Jm+bAb7@)bY2uiJ)gDe6G(Uj@XZ3y!^|zj>bVj7BuC6&IV_a==Zaa%zuZdNY)#Y z9#y-IYgzv6mJ}G5UG8w!;FDMs1kGg$k*4P5sRK2GV7X zG6dK1#7IyqLo`o(ho)xKV($`2wr~t2Ms7VuFV2@ZC)26!A)$tznHdw~PptjcKGyzb zI~ke3J_n}%rKMgB9G)M$tU}oS^OhK|_<(&`{!q#<+ZCw+R?KczN`_iJlN=cvBUeF6 zYAw;8wST>$EjL1j(V%un*T=F6Zl_D#y?Hs!TRq}Pu~sa1fr*3n1CLQImSYNux6~xq zuXcJu;2`aOQ9}c*XtOVu*Fw`g`v|VH`(bfkAK%Vy{IZRxu&@SF%OW3OY>tHGX0VG8 zVKw{<^#&}^G-Gl{5ZObK zNf#4$79o8GsYX*=RYx>sR}nkZm7(XcCXwH>~%zNdV2b6whX{Qa8|e2t5^ca z739s0)vrJ3**}`q6sdVVD=m>T+0L(;24&n~5;C#Q;ik^^iCQ8G%A7$6wYmAv z*W!RaD|?~H#>@=pR9MlxsDWWq!w83kAm93>&v{2rvV48&gaTeMeL3KlK#3^0HZCt);SG0RpMUu91mOAG zd5CsFYyj>pK7d(>Z#<9;Iw3(kU9y}{oEknkDsdfl^HqQ6U8#Zue1%FtG0u!}#9@GX zF&+p%vnFdalkz zX=lb~Fc__ok&(SNzZ|UG4?ds%XfWDC5H-B^#kwrvHF=5Ugog_ZbExh<$&1Dn(sLg5z)KBXpila!<&QKtUo?IMoYZ;z&STWZJCFu^mt=qNK`InQ60!h4MfN?j)o`NhBUDf_(eqkz3J7}Xw z6LMno#2LLU;BJtZsb!n{Km{q??X}Q=k**Fn*7$W*>xk*F35nOn)|e{q+;Rqw@Z9?< zcNXQ^Fz;dRI`eqmi~iJ%CSHC!?%x%xBaCiFPSVtUcS6jhIXgO*0E4|RTe<+d>#uO~ z0dbgEZ5R?H9fhC2X<}u?a$6<@8*c&lVP`CO9*kixJOZaHwuOPs`)hfgE;x}bg9v%0 z?(2r<7s$)rd0MJKJz{sE*|Xfufc+L5XL-Z_{V+|+etGM^Es`vZM2Hv9134*shODef zP;g;KDwiZEAm!8?@+l39y9i!>@f4qqV-4U0z6H8H01nC@y4sO-zTEEit@C!F^E>*+5CD+)_>WF*NHSBl8XwL#W#I3gNS@Gky z16ZW!wduP3)_1wjuRbp>whg#rXn>>L^%s$y-8H6fZ%<@rTlA|ZIy~GeH%n4n++|*J z=%=UD7n($NwFTaQrJ$f7jST}8WEC9F_}^F#EJ5=;#BV>4M>!}s=+9F?r)T?i_C&_G z?v=JB=4Y(uo?-i{r@9r=IX~YOtTSjR z;pmo=1g*|;K#)=Gumj+2T`08SGlsL1L#+0eC(j`JH>ISQsdLYCf2+8#mJhwkI)5&N-jVyrR7JVo}Mos8V3sM8*KQ4w`x7rOCf{Emi5EKyTmrB<&F!+9ZnaB)G4XESR*6qn{?sSa1 zaIS4IrccZJ5Q_n(a}#Q4PRvy|2^M*)fOl7-d82!?%e=g^!Q=_2t*TD zxWwm<6b1(V`Ejgbj==?9D9P52!lb06nqx-#0U(PriB4G6R)UF4E6H7hwvbT=ip4^W z$)1}?`W!)~rlvgS>Whj}4?4~tw%mr}_wjR{Vi;#%!*nM08nNn$yt$;ObUcjS^FDwq zlw#K!p9qP}Wtcw{39S_Vw-rbcIM3gaFMSf7?^BP^{?zCn8PyaOF5dPW#jrL>(&Z`-hd@I386V$6ikG99S*yQTFzRmi{PCs-ttO>$LByalklW=5m9HP1D#X zol7gc4hLUCLlAR&*4Wvp^rqRjAjMlOFLO0bU2E*c!_=ocrE+5=&(`QKfOVhR-h4h6 zVv|7?2}{=`Sqv~rsHhtR!8x%%u=Ma8;jjxrvs&ErNIArYGX z>skpAG|uJD(}KaLxsefRuM&HM5z%wK%1f9+1%+5WA_Cj1&8(u9nWwCW5Mce91OHT{ z$!Q~SE}n4iLsI?j9f`RKpy=$j#6$=|l97-or7BkrezH&gWaRk1sAzz`q(TiD5Ue6f zk+9?2&5chRuq-HuF0HFek~e0*YOqBy4ogB~SZfkRh+< z;esq96bc3Unh-9YVO^=W!oM|JWh)D)M+F8~W7T71Ec9g}xwy;c{EK4Q|Nf1foSf_f zd80^SSGh#a`y^{vrwbr&kO&nF`^0q$cE3hRtSm7Omr^=O1lY4m5*@VYxZ}nD->2Oh zuGF_0tzr>n(+JpLRIi|1W20V!%Q1rhedfthbCs?DO=V@t^A5*iU0<KaZ z%keI!W{T7Dt>ud;^i01hD!$btfYkIS_ZRl3SK+BVV+($Uh57w@Q#wV6-GPm&Ur_Zx zcBb2QRCEk(H0pkEI$Qlw@J5G;TUItt)OB7FpZsC!>#g4{)DAwC!Xxrc<<6;mON?g{^a6l=GeSV+#*chi@qNklcg;`_pO;G_fr{TcQt75ld zHjCRJzFGY{?;0yUZ9L2SUMIm}PIX0KNaEX|>ZaKGPJzE#t-XvrKwQFK;DeZM_CU;A zDpzRHfE<(-O?-Tc7H=lYsC+hu9V?G~=tBYBnmU&`K}nyVNhaP5fVkHZurT~Z8!^=R z`ZgSkV)r+=Vp`BKtJ~R+5aJI#U)G|fn8|;f&SDNdByt^pHpGf8^1Wgz4Or|-k~MZ) zS7&pKLhXEmfX$)?m^e&H4@h_40K$LVGb={8kHpjms$q;zcbSKm^mzaYS_~P( zeB|%SDNl?Sa-mZ`-H?a(waR17zdO9_O|WgMF|1IhFj+I?L2QoY)tZx-_UMd6%xjyF z(WawyxXns`%zN!?!<6ahrD8dc3cBSEde6`b$|s?;b z#`jWuv#u8(9_hl>G-a(Fwj|>dZ!%n+x2AKxx@XRhVz8cogCEK*VK5mj{)Z*;p}PDv zBfghi#J5*h0BLc=sajE2B~}(tsfhy2iga~uwsWw(3rY+it3y&yP z#aj1D5Qw=l*p&eIb*Tn9qc~psl^*;MWK~ttC_>7?IFYP=ZZz*pdK|&(>Z-k+g6;G+ zF@Kx5(7~71r<8dT?pW?Rw%!c?_t8ZIp>jmB;}6 zg>PS5TN?m$F6(6ys4l23idJvNr1s$X6J2)s5}lXSLMZ@T(Rwrr1p-DX(FGhx>NQ%O zzw+?=f6v%>R{|P}a7{j#^?Yf+I%qw6;2!if8Lu=)+_R8L?}O{_qf|Sd}uw!aiW9}CG8pYfbA!$FtaV_bS4WIx0h^y9Bc4o;oDf=ty?6! z9mn&+75C}}i{t}ut1nF7tgDTocWER$AD0;IB~0gB<0tP^B>*NFMQ|6ctv&iwUb$h| zOq*QL6Vna4rlz48u)<-f=ZBE+=>c!JVDT(pu9ZrRiTht?88!cl3!eh!uvvBBp1zbb zNYgNuE2Bug5x`=E+yFG4)afT6cyeWNPGuh>X!KPUqm*BY|l@&`O0)kgZZJv9` z+@QA&?ii^5av*Zz_iw;i{0Eyl{>S+GPOv3CaJl|c$priT*Yw7Bfc(JlM>6SoO5NWR zSr^M{b&>cCn`%Q6Po8vklxd57sESa;o0^jR`s7dJV@^z*Gi4g$Pr{$hp+7Y!Khp^a zh^mu*0C~{@-5LoFHE?mMgOxxAhom%u&%^lDV<3)TPbZG!AN-EKcL@0JZhL4aaIWA|xc7IK9dYhet>>z3jZXbVeR~Nyh3PPV~0; zI(A<4t}A)00;xcO47(@mOaUQ#yQJZT{tRWJ6F`oc+GPS)6}ktttLD=cvM&;M#o)%r zN5E9G0AMLf-6!@&Q){27QfECCP^h?^9y_@bNa!^NA_ z!4k6=jZc>RumRPt<~8m1W@rFd_==Q_tO$6p9S7X|iWaD!O>fEG94F${FQ+Q)@xT5P zzx2yKy(#?Lq{(E5X>;;)XuAR2;kEH!jEKFb^PEY83w`kc>Jquwg|%!g5^r4CAQ=c4 zqMUsuWDdJv0jiewS%8FDe8nQ*$aON2t|?}?VSC0Q2bEiVgeWGZt*2F0u}lKa{`0%= zXR8AFa%76HpWa?T+sH^8(-H4Gr-K`e05cADK+br@#Z}TtpMaZq+RTaRIz*iR{35TQ zjBs zh1*dxkGJ<5=`?QEQ;Gw@;EtMU2E3pTg|a|atorJvY+inHW`rgJixe$BuPA6N%t|&UV>BfGd>EuuBKK|xhz!I zPP9cRhg155e>PZqdapI08X7^eHm+eh6CkrDd-=0ngO!(2!Yj#df1b|*Uyh{(0$Lu& z{mQ{ewbB6i7q^_vJ1^ymEj9)F9r}SrEi{_LpBi<%>;F!fVb|1YC=IEGhyes8uAJNl#;~zY22Usw?YZ0u_1VEcyY-i>&|i#5dHdlki7X?DevjYNMC|q zJY13=i(rNU!foVlk&gXD>LKNW{_l^uE(iZ;zef|rGgF8lvjnBa3-b=$wBA5ME$=Cbq~t_`rWCVoSK&|ZZnxq_O_tbYa< zb5W2S&eb|B0^U)o%DcJKl-zUcR%^Aj{sdL?j~0gHSy<$$sV3qdJ$g1QDJ#q{Ty4k` zElxX>V#%kQ|F-F;xrRtN*1HRKTjjwsGsJMO6OJ$tZ5ffKTn4P%O6^dyr9dKL;xyb~ zSGl4GQ|bkK@pizK6x`i$dNr1NXlJ24nWTWmx=gS}b=@8FpYK4#OMrGp&W6NV=FB^0 zEp3@#^jB>BZCQ&j)k8j`2z{fVS0;6@zVmd~=z+aFfgh8|XjWJhZZ_@OxI}9Y6AuiL zTihJU*}l0t6pMf_x3CBI;^E?sU@c++X3Z~%vImI$EZ1Jh*PML{|VMBxy>>mF`kOF`(SW5 z_5D}bGKBf6e@-TfB|tKD13Ct*J?-Gp7pyZ`4}WVJ0+FM!D=AmbjGPbgV`* zoII9A1M4`M-+;B9A{!@<%iwhevA9XSQ`*$rab0GU?UL??VuckQ8ad=nr=6|6{c^#X zf|-OIQ$>Q>$LEQC!L^2ROd##tA3#Y+&P;)AK$sw)%f>*>|c zIz$g8SN$us$ghh&q?=tMPm{yKZqTP2`}-5CEM(Yjx(*3DX{V&#u9Me^PVhmmZht22ql5G7@0G*C0t z19PkR*T{I&Z-ifsQvh;uX;VOEQ`6TM0sanJ1;+R(PB}7)q)+m4k%?@JQ66-7_%S{z zv5~=4Zn}n;;nn@Zx;F3{$UU<$4yVXR_3vISd1YWAtnr87CP~DU>o&T$#7&ogRxFiT zp1ZQd_&W|tv+xq{NR1O~eNz+{2e*HlVJL<;sn!W{PA}1bQd9Q(RQ_WLaAu5V#-m(6 zac$(mTK_ft{&;{rPbE{gH)4dEit0Zq>1Z-0uEUQ>$Ea|HQg_V#E79U&8p=&4=iU38 z|L#S(E()%C_4zW9!?eQ6Y87aYnZRq~T*SD+U@xF!-!VgiM@^BS)b))a*+Kb%^zIn) z`KywHx!RcJuq#(U0X=rY`)03pOzoUAnKpZeNa+u`ASd%jLR4xEAm!J3MYUz1ZtL-L zGoQ(sY0BXZo4uW#sfKJ2lXr*9H6y2c-h&+iaH;3>)>HpWJ892Zs z0RG)6vpz^uMI|#z0M~k-6p)VlrG&mLF)a(a4~FNP(K@9{l%3;cs+x6NcQ>oRV7t`x z9TY9x!w9LD&)`B|A723S-@vrfToKTqn!>jIWBe_Xg%E?K+d{+0vX-7a{5Zho+xw|= zVa+AL2aTtGz;GRMtCdv?4{t*mV% z+(bN6#uBXtb>!BT^#?W%go}luc*{*C1ojaV?QlL)I=ZjXBYSqT0n(w`NpK%TFkn~i z>{fT4!$p-@Ysigdd3k(^w%Qn!8FY3#b*eK6_=2Sq1`5Hp4r|)l+6E;qf2n*Dw9$iE zps=hEa~N8r)$saPKUN=d;pniku&ggl3{OW86?_c#*sD3(_eAha+DTqHs5gd-R>7Qf z>MaTjv7=%2wzebh{K037bRZX%80Lz81wG^qaCF_`E*h4Pfi4%->HQd44*KLwxJKWu z8fyObeoJRhqSzGEuSRyr6p_$0Qa$});Yr}mm>q zFV@_()?VU@f4KCM*BGD|%JMI9g?b3PvBycgsVm&Z?G2KFB#jU*2A|BmT1(J@db~P4 z3g~Pmf!6%CAi;K(6)Y+8{u*)fU=AxTnt1KHt=98Ec2(fBZq%K9|I8%qH@*PKqRZ_r z0B=eWKAz*V!m$4|=KzvNt9Xy)Q?A?~><;F@%Wq_ikD>`1A(>eZHNv4FI;>T}^uKm)^@J6&9R}YXVRNa6_GPrLSIx$D} z#0m8wV!5F1kuzQuZQp78NFaT*34AxJ9?M(cV&PyZak6@{&xZYwa8QF7wXA8!oBx*ffX zK`Gi`p&&P(3OC_rpp{8b1>d5h$fp(>mobRP6@H)8ujTjkh;i{8t}RQI%u9`4IrZ_0 z3{ixyKsdFmisc^NN~9J_qSMSSqWwT%MBom*kI>1;Z6ghFr=-knGb>~8Xpb4$_d(_p z>#Fb%a2f6fDMYr9S2_DPH}`!I#b;sf%6-y!isV?LW23tcxU5EVP`?tv%r@w|n5JD&XE%5{D_v-}A z%7X*N|GeNmzUP}}GS<3IP9-%u$D1SiRgHQyi;$;O_>;k;+G=LeFk2D*bhGelgeJa< zzt$v-I{+M!`OpE4wX+l|kq(M5rM!WOamF75Mlkg?m(I5RYr^TVlT>GH=7Q@BuT2?w z2-hBrAj#0_<(}qtz~Yb>w7isavX8!17Mb@*G?f2I8x@m^*xK@L-C6GoSTO%-MTLE7 z4O2ice++$RtLNf=PH%7cNAsR&0(Hq7$&~q=4a8lLmQ#-btfe1)5-w+AK|jv6j4$={ z*6a!6pF4RJl&G#Dd7fyq2eck%(OzAy(b{L4VFBHUS z$r(^YM zii+FOtD7NK zAV3Rgdx%EQN63iA+_h-_A$Ja!eeeLp)P8v6tj589)|$|VZ5422N$`*bU+m0hzqTmF}pxI3;0WVTT;!`b0tN@%hmu zLYjL4o=4fn0~Fc@OuNjIY~r3JuKBVP<&uj&Bi}kn{&79`O?!>97`PU985oN(p$-AN z-XmFdbK}^hE95QEc?=9|Qf*Dm3@?Ka;@+?EdNaf9TwJ6LT2FBxEJVq&@$V|tVm{ZO zuXKt=mq3(gs$dYvr<*$4!>#oDXjdb73rIy)Q}OpEJ?4flp+S!LI;^7zosL1GDM*E; zx*KzcImZXGGiBS`_N67k4cm$n6BE~0hi!}!)uoxtF4kA$>|)>|q6{rgtSkoHXV}sO zZ7FP==)ANRVDAB*tdodw1cf8`6Z$T5$16NFqsb=DnQr zTy{C1DnxX7A<*L=?`D`UdiT6gV_P6vns4;EO>i9&ecUb~Zlc-hMp09#sMk+`M_AFY zBo+ElLuck;{WwjPbVvg4ym$P>g8;`&tmoJ|RW>0z6*R@u)Jw}zi$}HEVv>0g4?f+l z-O@~=gQBZ9(&Lt`h!*79Kx-L`jxf`gAEXbYLAPCNy!L<3D?RlpOABsTaZ7vqlwnrc z&1&(YI=UAw6K;i7Bq(+^2jF&Yh-i8UQPh}j&($XZ%(w^=&cQ*l0&35}4B7i&_95mL zO~U;go1qMqSW2hv8G4Iq`6GM&m)$zgODCT`TQA!!tE33$egDKMvMtEN(ZD*Nms2gr zCMhHC=|$O-gkFAKq(K#1jsLbyB~OV#1oVy}MSr8B|H%_IwTSb5DAO;~mH@=&+?!+% z2A$=1K}y0v|BwQ&S46a1jJJW?{O8`n0=uLdiG!he1SE%Upw>-Qqwo7*51>JY2(=V4 zNv5Qx8W;^9#Rw6yh%SRACMG8R{8wM7d1@~F5M-P>tYxRGuIE_4xcAJ)ag2rq*_oq7 z8$l6)$-YwgitxfGE#P9cYJ7D3y;b4(?-S+tC!fZjKeMV=F-RDSd5frxiY6`~QQ8d= znw1Bfu~ClF><#M!PconPS)3VY*3hv@6i|UQl$IQ}aK-7MY%o>$+v_a&%k#D}f!B z)2^NK>AO|-S$8-(2s+np=4*u~?Uo z2Fa7gKb8jl=Fob4K{GLH5mHPEv9+#`L6@%UQi=J>cfcYnat zmBo=dfFa*UGF)k4cy{wf^{%zR_^hY9q>h@J+BO`G$gq#NlrY2lQyo%;Vhy?l@iZ4~NpPONsUMm~>W zgaF@e!}5m@J_y5+*j%>TWD->%7CtStFy} zjFjn(nh~ZHF=+^&yV3@9iyL=lT)8~%^JLgmixQ0km*A6QFTigjd{aYjh_UvbAST+B z=x;a^SN?!q<*Ln`*LrCU0RA}VdMdQ1k7H83EMJ~@z^$%W>1@K@X-Xs$DQg5 z1esXnfK(a}rP#sl+e)+(P4oJf(|&M1Lu7>jp5D{q54y@_V<$q+mX$+0PfFShwMH%V zN8eRz1X$$?Gux8IR8CKe(g-_5aV32QbLnqcb)ydc{RUL7j&dm}UgS4!+`OxC^8F(5 z;D?F=sZT36GqVp!*0YqWYn224xJFWeR0S%;7Ut{b)`qAA9lNmC9XZ>Sr&N;2!<9nr z<(y!efW!TW68%iZpwtp-h~ppaQD5kR=vruBVX2*Nv03~)k8-vaSNBIe5zoE? z7+M7;=)%++xfW8%1klfq7@LzL#>aiW8VAzm=FUN4g3WY)&TlDR&9AdFd@2HXxhJ@g zXP7ngQ9Que%&}$fey62}E?-M@e}rM+4ih5lcgSAPW8&%Ed4N?oM^_Y0)M-W102+^p zI)4x8AwVStgi4p=w5H-xpo60SyN_pJbepZvS#KZM#(1Fto_#?T^jp8z0?;|+U7?+> z;Fr7z86MnAhr%OBxiofT-f9x;TTOgtp}MzF*o_aHBG`R*bUK^K6ZE@^fNDpEeS6v{ zxksQoVa$ZMy~Mrw9bEb zU@6Si2gCqrN4Z5s?_TcC$^dLRs_WX;F^B*M03fMPKl>1QJII8;hJI121GQMHa|(6lVEtrAIbP2zicgcKQ?XBtfw7`%9uKh;HmO(ujl- zq}zJ&VVt)J0+dePo^;4mjYoyV<#cfzPZ>>j7qoE*ai#|^`$t6FnUK3mL0lQCNzD1M z5>mL|7hj0Ts{_Q!@^(piDGn0gV`)Lv@km%?!+dhuL zgp2&Ez+O)cMv(}9UuIYRs(!cR`Hx;fI)X0j47WO^C%#H8Y?9kENGtNnh&QrqnBu*x-9 zIeq?lj$9-0@eeWr0#s28S;@8TF6y@5P2CG;fv+_HrV%}@nF4*HJIxA9@M<<1l$@pc zM$OfIT~jn%6x}S&vUu>aFp8cDjEQ1(v~J9E7gzTAu))IF#saN29PxwbOdj2m(9qDZ z+;{x%M(M$|^Yk>#azEkwSh6>yBB6*@w?AHqHCEHof`i$y0s-z;T{mm>KL50bT3)L% zFX+vB;EiolU|^VuWetvYBTjO17TpoK*;3jnthw(%K{4_&lbd_xUqiSzN+>mm@uHT= zl1b=E1>D>B)xB>UM zfm(kXNbx@s3UP5r!G3LS*oGRZgJTO~m#rq!a?KWaQo`Ypv9Tn- zPA8kFATIKr74Z>V0E+=AMYc~9EjiUXuacjJrsm*i?%ZHFv;VRK`PNKjfAi{1SEl*y(g?dD5j zJW}rc^F6U9#`Zst4Ry`JBDz8-m7v6K?xd(M>-K2&eD2q;inEtX43|0#XQOGer!T`N z=TkRMnSv64JJ1{v7Dl>dOHINy1;1OsUr@SyZf15m2;eJ=wLJQ#f%M1}(*<&JIwaJ~ zQ$tISiR`A{=6zq&_g9wo6{2Q=Qex5e{QR|fTn_yJyg)<0{j$f($|0D=V(!PP&z_~% z1RzaKO$Se(^@(CNEJ*a#dVbZZc))+Sf-LILnikRwmYuS&T#+bhwTVbMmwQ?5Pp}!E zCN?>Ae)Hzd_0uiZp*NRj#+K35n_u~tch`8g?xjwvC@9DTu}JWBJ3m6byd5+`3?UBl z!#*$k^ne(g;|JK#Dd?4*lJfLmtA>&WNP-gdLr*v!(1hv~AGj71oR`DB#DFh54 zA2jvTzrB@jAnO{d9%rD=lYd$e#!V}r!lgcuOQiRt)c*sgN@O-welNCl2wqYr37F)U zMxf@#9Bvf;P!R89!D;bf!mhbfp0}VL!eG z%ATUXt6%U>24UKJ$O15#d>|oPKX1~o@z$rO*bX$?S?`Honhenofv*S;wN{%;G$?Zm zc!Fzd5TK%L9PtQLusY2w(^~W=GnM@ceC*q;r7QYVDo9McneNH~ePQnE6IKGD?Di!n zEwPz`Z;1PnZXE-LdwG`-Bckby9m07h#+bCmPcphognY7-f)K$9d9u=#{Yg&_j8T?` z5L%&LBlkyK)jrVAuNZrWR_AW?K3`q?cvYXZIVBXs8eAW9+NQIeLbS3HeJ3vZ{vXFY zN6=3wiVD3&M(T%&SsRw-XI;9usFvYDStv1|s}vgq?!6nry-DR*59}sO6q@1`^;D%s zHvp0+y}!S|bA1-1A@t0-;iM<-%_1W)T@R^g8YXgWFc!&w-g>vPMa{=!oT$28UR!o? zMJM!DSZB>7y!v+)ZEI-0{e8NnGq3-?1q6Y-sy5`R*y?RfPi|0b4^1j-ri*~9@?fUn z5z~#UOibK2pQd$M?zpC#TwYOO>b(M*_FaKn^DO9HXJ<_muV5yfWRH z^Vb)cIw79}$;fQl$(LR$=azJ%KmiB16Go)=(jmQOfiHDJAL03v(5E(eOZ}2D)Yas$ zbANE0+_J^0jzpp_Fwo(#F5aVg7rZNLNl{&YlCiH9I(*4`9l#)t*Yp8 zC!!V;RM&Op%EA^*ZfxQ+76G;fRBpwpe?>2bb?@80pIyB55B-T5QbFj`^`yB}1SNGd zB$(DbG*;S1xZ&RbF6Y@>p|pw$$-#(pClQIHJ9qD}XuNVi>)B-T%<1wHG7lUwCNHy@QOvJ7EJ9c0Ew7Bo{C2}m z?i{c9hJUcRC=(R(MLpl59Z^-iTNNk%dwJ<4%$|@k!Lc_{hb`}OjmkB({eEeZ&U!HO z!_vA*2V|p@Yj)SxRPgY|R2RQ&?M%TIO+GI5lKcr?@b=PyHGH(cFHOHVm24+ulPWa# zK@PAh#261cqbokq(D0jK_M8tz-g~;P>c2A}Vs$+Co1yk{wmKKvUin?n!Jd^MOnbm1PyKIOgJo+aPiaTjPbK{KL%6zAS*Iv}OU zO05aYOK{39siAg0SXL0ZgWrimvp$z#e}SrKzPskSu)w^ZBEt_g3L8 z6!3(b#&*1)_)r*F*jNG^U9=x_wnp6_XcvRB#l^&o|;=t$j^>=mrgG5CZ15)=}oVCzT$}`vc@^5WL zJC8a}YJ~ZWycsVr1t*%c8pmWfa{yyC{V}>e7yFio1Z2752WZU~)VjBd*~X*BognV$ zeSUG?8kI&Tjh&Yiz-%Y_&Mam z(lX9fif2KY>@*G(R;dkCN{OHjD&8U_BqSy-Nz1RmWFswE@!450spdAaJ4osp2^*TQ zyv`x+#mB-IZxM&`HhsRYsmDc*&v|ebf5sbqQgvItIGJ;)x)F2v7KH~YBya69|5~Wp zvimZi9a1R9%Wo2%oiqRExY=aQarybcE*tB+8wqC05oP>*{FxRRe>!D+M!SLm>>hcA z=0~aN&;%r1JSpx7Yb^b8x50F}R->G4Zgl2l$cX=hKgU ztm5Y@DCK?SRyg1$egl7WqfCFdpuLOf7j#Zq zK%kWSxQ1#KfOk1s{z6C%ljM3TPYqR9t){6!vi9Ywh=}Xo^kQYeGxjCv!Wy&o=K*Id z7HW2O_TJMy!`txrXA15y`No0=-s^y%7S|NHDDKm}ul&i#;o7hT_x8k@n7MgwcrsR|l*$m%mXJK<*N?%ZI6-<&PQ075 z+){e8CSFq@>`;z(&E4sGjDs4l)9z!(Mqrn{6j+NvgV%I|K;nSV`)-Hpw{{pnxl0gM z_Rk9F1r8qHIlYY2maV(zonH$z578DJ{N09izw03|h*Z5|=59Ca1hmD3D9Ai|kSAs0 zjf;fhvVd(WFfd3Prl8;z;lI{Tny&?VIKBzx$ z0xo*+CN3CeU=V_FwI9X5>zMz?`c{jPZs(=KH-n(|M+uxdHFxK|NqAS^BK7P zf3fG|{|i|(`mcqdlaRwJcQfuSFpkNXEYxMk4=O7QWvDM^UaU(1R^w*Oid0&OAvJK!mavp*}Ed9;rLN71>7kghD8`pKFH@4K6c7=!%SnSYcA+j4TJTjQg&>c5J znU*#2PP8Lostld+dT7%hlbDD{F1sDN3_yCxrb>}TB=?UPBmgBi+f|DGAk{@nB`F|< zF1qsmk_@yUT?dfVU34h}MLGUcF>xC9eeQeTd(OFEb7x4&k~qA$Jon?hcg~#q+~@r` z?>SSW8^6C4;l8^!Hr8XYFTe9n1lix&*!WE>mfRBs5eJD6XJSwMMU?walk8G#&!MjN zx|P^LqEz9B{?*TZR#)~R$o?kw&;wsOR#)~QWPclbaK|hEp|0%9kfkU0z@he~dcu|{ zJ-G+3{BAv2dTRKq#dhp`;+Z=4-EE0dg?D`Ki{GguyN_j|onCyuj;t+8PcF9p&QhrG z1JkxJi5=Q?EL7HdY7i%=?fBk53zfB=8e|D-5A1v6u{ZeM%NjuKgbei^eq3jd$r~e&u_C z!ZyhGiW*r*&paC_`*-#G(vy2^J^0%>PYu`5liT^<AdZ{FsmIZci09emnE|&!_z`anLJEPj1H_f6nK=KBDyGcKpqQ zGag~jQ^U2jSnPALC6DZGzxxu@9*o`a$nNu#MTI?*vDiUhS$c9lvc96Em>=-U`aCsU zP4C}A@8VR?=>|;kahx|8m^=#XZ{5|HOP9N+(8@-_?t0r8~D_4`I0Fc zQe97lL#pek@a}-BT8CXvZeN(JMenN4p`zxK3j`V8qo!^ei|r1-uTkO9W}y4%_dOVX zUnpkhZ@P}`k|P-gGQNohwR+Xnp|-nD72s~j-@dxCOClQbuE|YqI%-!4SNIrU5fvb6?erNYh! zg>1-^3lUML8mNOjIdyT!mi^^IB-AOp!swjZ{6179voKs#4!K-Q|Tc5Ucp1NXJqGW2HJ$tAk6wi~*6J7uRs zKUtk@v<{8j_n`Wi&@I%Vu70!c0NGG$NBbnm)-fL(X~;%>aF*;o=hDy(OLljth;!1C zjaXqzHe!XB{`mlzGy9y+3ENouO=Rm<_=eP$%6b*nMC-lG zzn#&9>%ga`iN+obZ!|-;4%C+P`vyc};vKkXySntu4zKD8Fb$pBA}J~0)#aYXLGl|tWR}gF|GeXzpCckOyAHY)b>qX z#Mz!!0@{{y+SvGgO~Tpqt!{u#<$5RN=DzQSRM*lhB1z@6^T}#sNjtA^9#kUE){HKo zZTq|%0oC<=H{7qVy7RR2(Xz3mPP(=ZiilIrh=jWxV*4B!dn2&AJ~mZwb-h+=O{(Bi zy6f<+kBl60S6GhwmAlOw2Y`&PbiK?qzxz4I%=_MOj{9xAYzX^FsAIcz+0g2`-i?~N zhu@a*Zrt#b(2h-Ol~~e_`)wXnvW6D+lhxi0>Vpga(<&SSGW#B?!b{fKn9t3yhu!%T>boZ4p#%YIn7n`O~qSohCd46HX_A%gdgVbRnMC}fcOwGG_+|vPn-OmdMYj}L z_MjG3uXoWyk*iCJ&i9@88hyl zEzoL#RtwxaEpR!$F}>Qw>%CL!R!#4p77zsD8v%)}rPTs=wgud%bMN2T+O$4x`?UZ# z5DQA#ZlQ4d;o!6T#+T!aJD`qN9Jw5Cq42YNCfo0mfi~eke0zO+`?W^v8{hdBV7~L> zuEm3Q{#k7APjq9jg~08NhdcZ28GWYx*Rlui>@#S6nsA=Zh5EMMLP5uMnbvlz1sZPw zL7}_U@3h(lt~B{lKi}GJwZP_DK<77oTkgv7npPi*v`4GF9W4;XbHaZpZ^vi1?%8UA z@D>2_1bb5A3enu*SGUf#S^zE3S>BjlDK*y?!hyJ2N1cAWxjVP6+8!;?S&o;}qn+jT zkqgBi6gH;E^NoFPlLK`YZ1tx!){@&*dZn~Jk{(Tu4vemktdwR8vxT8te>Qq+m|SQ2 z#3m<3zh_HwJGH=t;!3HrJT-QG^3ufHW5D5Cd0?p(SHWPA_k@3clLLW3#e+fH;dgAE z-99Y<1diu{z%$ifOkA1(2G3T9D+8k+mVR0s&+pA#O)sSCqtM-Ait7{_Ic})4qWh}W z{`P8tg%pSeJ*xBl(3Fg7GRcPbR@=uGig(tFmG7G6w$;MD62!Sn$SST>SGKmcOA81G!Vdh^NM~7i5Z@oV`0cR+qmPzXEN$GMg*HB#*x!4z z3pk8|L~tJNrMOSVAE|lZJcWj-xKU#qKZz1(TdQaxL+;|=lnO_kG zg$I>A2p;^fbfNfG{<+-VOl|N~@<`(2uA78Hu;C-bhL6XlUl9V|kK=z7tqf$j`HlC@ z<2dG)yC2(sdw(ZE-_;a)hJVd|VxCZQXAzz&`Lo>S`Jch~<;P{_Idr@u1rtoFbnD{l;t$ zG7rAlca$&)|Cmt-tqkk1vDN|xbz}TW9QX<0Z?DCHDECIP2f>4| z2f>5yB#$PJ&;lerLO7HKk;8g?C@ll@3Fn~{G^&zqNRe-q_d^RT5O%ZS==Pw_gUp2BLNMYZJ+Kbpr9dY~;X`nrAWXOqttuQ_16f%z@xRUV%IIP=H13MdL%W4S`BvlMyE+9}~oySG4x-?iN6= z1{UQ53-{^eX6!+5Aaf!3kbPyg4uQd_wxP6QTMtmDkSE+H$54uFtGpLlz|RMEb6`|^ z5c$-w2a!d1H4PpF_P~Me5?Y!0khOASEu~{j5XdaZ_rZB}ys>+?r0;YKhz)4^z&iiQ zcJuZixX-(?ugv!0$E209H2&>{`*5W~9rI-4cWYg7=UYH@F!9{e%zaXtK5-O#aJa(p zLC)x}Sutw12i+Vf`?{};2zKLI87-!BqHIff=UcS(iP2j?_zzKNuMaHTrA4+4!?yd}J2Mj?8Y zp^=->%F=o|>VUr%0;Of{rVjR7Z=PsMI2jLg<=sM*W`*EKiCn{e#N_K<$NrLZyIK_J^dgGRD?SED+ zaNddnauhn64XATtBlci_7X8Hwl)Y8Y9yHG@UzsB|jq#z_fx>;*m$v3}j7m8#=UU~R zY5~Uwe%j4>?tL!@Hf9f+Jm|Im{5Vi?CHE_H1e<-7=32-^8lz9w)Xm+sbyagM0Q7;C zqWi!)|H=04wFh-R6ki#(A$%0rhK<{Yx+d1QRUFYoX>)Dcx++Qwg!{m54wQW_7uL%k zER3r@8^ac5k3S4)wbfv zuxnfAnr#8L0ngKjVBxfS+~+CvH_%A1M8 zclBi8D+?bs6Tw#e*J3|;O1H0M?YmhY*pCOr9$X(02E0Cr89ok-%K9SBg2dnK(!_-# zvJyEy7{+lxpE}RHiK}o-FOS;&%0MDKky2W3v zeqcA(1??;DgB>Vbit!|~g@I9SU(EM5Fp6>QnE&$D$oj|t&4md(3Lj36?a2tb>hWB( z^N(Bo%1SFY7O?>XDn9h0Byx)eFz<|;(>Ak@xf>XT5BEGy5u2!7=-*=MXp19NTQtALT9`+q z6MHqufpVRj3x{%(V_Y{xVGxHoK)i<|*Cx}WCCfg9U(Clb6Ug;R%mXr49nUw~V;Al} z>k(}9qihulTRhl2_BN)K59~J{&X3a?J2sT-EDPJsRh9jRV{_H{R3({9%%{MSXJ{@= zIWJoI+N5Y@-M)*?h2T;53LGL@!x0 zcYZR+8W=X+HHyI~Ze#r6cS(Rki4&rhlVfS}Qt*2v$}Yrp!_uqh^^w|O^W5jM9ePE8lY~KDeIdCt{wmLP&yme9Yfrl%CGIz2;91C6;oyta3T6uD;KYNPi_G!7A6G|TIP!uxQQ4C(l682U`0(0fybP^ej|&;4 zX3rhllt8O~oM#bX+c26|Hc_T~$H;F`=){)V+kUuH-cA?PaTcVM_ypn>MDQffZ*B6ZYz%FBo}VPGqf&`yUuRLq0W@DbmWA zsnF!K&FrIJ8Cn@$%HyP!8^H;q&GePk^*T4IquXIi`hk%P*iZ9~_tP&SVci;gus_>b z=6+yz9te8`9mvlCVPkn?PS!}Mrv@Oa3)-||(?*84@ePA7ZTfv2UGqVNo5uzq%tX??9f&RDyy08SJFGv&fapk3;zZpHx zmne34ZSvy8a*2KAX!f613%e1lvb{d;60O`QO8j|GA+*u^-FxzE|4A<3-VEkcV;&?f zBz=r^Gh8^HAFcp>tbxV;Ly4%LxdL}M7Q6(b(ob6}Us-A8x$02P^p%Ahn=N%;S-h9V zaNx&z;6{@j8@uPdBMl9V1wJtJFE6Z#1$oVJA>!K5z|4QJ$e5Fa15NY=BX6^un6`3n z*#8C_qcgwhvh=H)9{(JE+;pn(96<_z&a8nFoano9Dp(?1dsU zpwhsK1JUE57B3nFky85eVsuU{Ie9iOR@g_mII&JyhhRQN)@I7%eQ#R#!Q5WFz*7$L zll`8b+aC0jxgU?|KJeZQ(1%s=puvR=`o^EouU{h*5C}x3m2e-IKvvKiu8lXti7F0> zJR9)g8Ok~|wen`U5wnP}uZ(d~ji7LQXkGn15*v_x;3o)uL$soFBe5CZcqqrcAc(`f zNdAE0KX?a<|MV@O5{o}N!;y)z(Ku1n1zH(MELHj`zaf|lh2x@@@Q%TSK;r&h-1p6Z zxS{?$u+6@*`{@0;5Bu*tw;Rs1q$L zrB@p_$B8P}hI{njsjpMkVVJGg=s6X^Mn6hpTKRs(ocdniKaK-pUex~VIQ{C|IAQQP z3y0uA=0d|aZXiy0p@=*_(ZD+Y9T)}6A@@aAodwP9&2u6$8{*~V(sF6BxL7=0sOAef zEE2sIKAfZ9h-a-lTR_Z)?YgZf#aHHBFWfgOAF8KyKW?!HEI#m%g+N9hn9$b5#Dlh1 zVnwJWI#b^_9?F%dj}{icj0Mr{KtZ5hn#jXmIQke_w?=M_EEa(-V5^!>W(zsavYt&FO@!w+0*OAJ$e@>E>4sxg`8;RX6!<_R!X;4#_{_RRgHWn z-3JEqjpxT{B_5uT(9Ii0;%~gd1^^&bQM3sRq z<}N{3GTWX(4nNR^6&S+;j0wsZX+WF4F!D?UG7i@U*GJs-yEMUk*jdJJj{z;=T*$n} zGGW{JU0d;%foq^}`yx>^Fk&qh{%rICfxOr}sG>8(gNAP$)PJ0T2Ihzdj|DN~fM6Qn zi<#?m0Xnfg!`Ql#2EI&$F^>t(7;Prv1bsT@1Z{dL>}Qs%UAaV(;+D!zMZYq#U!j%f zswY) z_=7W1b#7t1Yo)X{DA;4ama~| zUnsgc`%LvB>E*dc4gj?1}3OUxaZWJbZGi^OPdv<2pPP8X_6%KV2M&Uqz zG@3lZ}UaxM9f|TF63MR| z!e9=U(~LespjvDM688MO64hs-BGrf!0?!g%!&nfLOPC8EEsy7~1Zd#P@tE}o3}QLg z0UU<$U{o$N(HG2tjKI|{l)1!s{?W4ASH47^GJIw9q<{%G%Y{H3?t!dBEEoxZBlmB_ zM)!e91LrYkq*|B@6%yGV1P?M2gS``Ebzw9nyhzN7s>XuoTrx1aQmPFqPeZZb$z-Cp zyo(VSi}ma*@5;3CdN~f9F(U?{k)ti*kw~fRL4S>GB2jUma3RWt)K7~hm*X9SR=zla z{087KI^TuMim&_#;qd-NAtR9IgaO_Z0vUbK#=Iy^YZrpu+kln6%kfN`AP^W71cD9AyTD1phmG5VjdLJ)P?oly+TgEfRxkbg zOpU=hJVOyB*2;#bNtdIx}#A0%x;y~F7L!v(i zf(Lm?^s-jgIUV^8V8qEW%-^t8TnKLm{mMWh#?0S8e5j%@;4Nt2#UhZm=%b01e{5^w z;5Z>M;vR}AA{U=yXc!Bk+fTwB7m90+2Ih#e@L{E|tp_?6i=dEMP)8xNA#kX$=SCg& z&Ba8W*8_pg=Z`+Y9+${lz8pW9yik-LJ^o(Ee#JMRqnQv{D>uV^Y!8~;316A{@P5$B zrVk9nTp;wx!W`(wg9?crt?a}J;hA7GCP$(5`4DuzSRYAdRkT@nkdc^6T#lD_>1Y!? zo@mG7K8Ki%jzZbq3J&z5(L^E;do}I#mCsPmGO&nQmBQ^kKduye(p|nuqejJ71{?CV z_nQBU`hx$ken7v_3I+t`cwrt?=!0Kk`^TDhESlJk&X7&0#|beS6a0r~fF1=e2M*B8 z&^qee9C)sSvF1i0u;-6L#B2nI^^gZvjKYQN3yUXWB9A$cv!}4#)>FutzA}1J5I2NY zK5fmaWOABtqaOn69TQ&}b2r?ZT3Ppj5j9yUEf-fx7pzsV2o#z~bo<7N2W=!;JjnAQ zzy>^14f284N4UQYEa->CO5eE-UQV>T(TIKhn2AzdD|?Y>YGt6%i$>PM`u{K_0+$Mn zmA(reUzxQsdc>8l?B=#+_K)|mR=ziVWwrs~17i-WMF)M$ghF0|HL-ZdPNdq2&LC0^ z4b1jmun*i>M)r!{=WB8x>_I%&a~)W{h~s0zhHkA4`|xtyM4yQ~FY5g5!FtFu(Wj6& zpTZ2-Cieq};KSy$axf>dugno_aO}OHk;Mj-(MYp}l@c$^gFqo85gK{X@sI1p39T4m z_CgVD4I7Y0W9qh__`ty5>B3@Bc#v~jgbT$VdFUT7weAspQJa(B_~itwYGHfOPa`jKkBQTBry|yD2_gogqR{&LFWc)Q zy2wX1t^Pp&D){cwe^0mjUNg*V#EG1^PtXwmA*o* zlV)SUteB^Z=mYfPPXAn;3l-w95;4Q~5_D7;Z4%=&j20VXkE6ry9eoOcj6TJM%!A4vgkPc~a6F$bV|)*69K79r9C(57w>Ag_ zA`_Y|L9ie&sL&^#2$$$5hAtHx3JQUUTmqv&atS{aa>RyFsIFJ{spbiN)8M~KvUUh_ zDWymCdkg+dJMdhG>Z^{n)w7ck$ZrQ*4T#ye+XwkxN-GPOZN9|s^Kg$IN3cIjE@bqb zx1!LgRvT}^Kd7mBZpJTK%N9!ao``B@-QkHVlI1U`s` zK0=^d6W_A@5=Nkk&OjeC`V<#}2hpb|SxV-ds5%#d8K=hLmL_HnWERBuBaA~59u(9m z4g?QAMtSpCq{l6nxRO3y_>UtWzwi%V`063xx;>LiwDquErt=Q;=D7~$LB)YUaUlmS zyjaAT&Gu}G=2VK872bHumV*V|f6&kh-^5p#UU~qJj z=Ih0{OY~C3%RJ%@qjnjA7!T*=L7fYcpQ^@<%%=*u|5Q5u`oDeknU`WO{PnS1-+XFq zuss8>LU{-}65Tuq3|9JyWi_XBjaY(>DgMHM_cfW!&dZ@gXCSec++oGHGB&pW;E`LiUdp53+x3aiQZO z3j)Upf6%~;Kz&YB(-+p~KmZCcCKIE3*&hZ60)rSaBHGx?g^6B;$SdhW?pVI}^`&pl zSQuP7_BpZ$fl>M`FhY?Z3Y9%5Rwd8|HeD>@^OsBQ8643UL7ggb=Vo}2Y*M?Y(L^9~ z^yT=K^hybBrrK?oVm3UARcU1}w}B&duB*RqW_vNm-fk3rkj8u*G8zOLxRahYuZ%>6 zMqMLEi4(4r#0L(_gQ0m5Dzq>Mf(MxkE!HfNb;w#62rN~+JgATe9W4FGSJLg7`PBE5 z|MhD(2!pQ>4=z3TXNPkn!P*)aghn=z2;@N%o7!0L$eu_T2eO?B%%}`*#dP6Y$Z$M? zj0;-7%YEAhBH30zPm1m>K`zGmnaN(8o?L;CF2pu+@on#fQN> zs8FbQkaeyV)v@_YcO$O^0mEa35G{U<-{l4^C<&e#a30 z0ME(hsw{;D-M(`MxAJ8!CJo@_7l96dP#I93edV@nc&L z&#I*JAv6cHGID*zS2pdu<~R~snQcRii^84X*;M;vzudl{9AUa4(7r74opfn)i)l=4<4WSUi}Z zV`>ra<6H-N%ucks?Lno1ZSHgIJ#Ze7i0EB=X0Zs=OpYy=s`;zrxhHxXkInS#WG{(r z)77s1iBp70{Dv*wJ?g10tPLXejnDmtU5^v($CLiPGTv^?b=WB91tXNRy>6dYMou(1 zP*z4Fe)~XdLZy*SBor=OpG=_DtV2?Smt>-6ke%gwA za+F7d`48jeB#mxfCBzALsS?cE*m5}zORzn2%0{!gm%4vj&wOeq4=l#Zh*SzEu6ALh zDB4+8^fsNbP%xI*4EqRJSH^rGRf zsdp3lSNP50Hj2jZZ>QsX;CB>QMxD3!sWoxzOm($OEU48k(Z~vgf=GoxY!U8~|MDn! z5Pq?DG0`X(BphKeV z_FXLY)A+4KulsY}Cq2D3xJ1)@)v64Iq=_ebUb7 z;tMI6zd`99?ngn^;q8fFLo07gZ{AmC9xPc1a`PZ!g{F6+vKY{VrZg}RsPmp|LoYCo zNjZmoa9eeQdSI*hwZR3-$wGz-_t81$9XXc2P!tx7#oqhEgRlLsum8J0`1ga~x8~*b zM+Gpkm*)|yMcN_d2};P})yjp{-zqzI~#dV7~5Mv$K z2i9|6w*#~>$)-oe8UzyG?e6}ku{UCGEWP^PtAF;w ziLZV04@M6iPJb)?hsigRZ$Jb0<&ufyL+L+%>d@gBE!~F+gHI_Q^zsxlAmPvPJuj2J zkLY+ZE4hc@p_>$isajSUIPca-HD4RNYR&O#A&B~;!Dq<&X=LfAY{?pBInGRiWudrXRY4hO8~gvenhjRgqzP=LaytFDzd z8^KmQ2z}#k6RL z+?WfOzR>+f_Zv69b>mx0-$Y&ldW8?Y)bm2m3lDt#!LPq}?7tlQ@zEb2d*$deN4pPq z9|Zv2px?Vz_4ZIXEI(kyDxVf#FefE{ntGqd1ne9RGNW$ZU;6d0b%zxYq zr|dp?_n?=-b6Dr=<{EWO|1MA(Qx z^gQ`YJm;qFE2HlKbxPBGQ46W)d{>Vbl~!)vR|XFvdw^H3R#tIBa3J?hA_n8{0}qpT zYau6)(}K8;`41eZuV`iXhb9JX9{eVF@Lih+pRrJQ>-NFOvxOEu@m95rI9iA{6ojJz*uzHM$Bv!ViWO!1J9zQ`e|Bh3klzA@jC{!`Bvz zxjyuy=v)Xi;u+%kVgAs192fn(ieNW062Q%aqLroRj(y`aS%7Fc#GLRA#O~8eL66R3 z`u3d7aZ$=S`V_<@IBOL=C}Yr2zUN~PT0Ho|jpx9F@9I2gqwp~!V}ViF)+07xThHl2 zyu3Cjd_wc-TXFa0V$!k8uB5?y@KTxeHqUs`@4%>rjs`CxPPE6U7kc$5w?B{UA=rp* zJ+Kdx*@vk&kw=QEXT}liN$O2SPf9afh-=&{d}WM{!YaOURBsvfAZud9gYGyXMi!zK zfIqMOhf#Q+y}m)QwJYg(nZg@3k5u{=i+G~=tqHdKz09eAQ!febB(Ov zMXsUZ#M&Twt0u<^x&1T;9{lE90zJ+Z8oP-Iu>RbT{R(Scv~m#NLGR*R)KYw9o^O+{ zjiQyA2f=M75}5}F2wfb7_WmxCaG-_I5RL=ySxdxnifk|B3eKn6pT1C-s%%WIkMPJ3 z`TuOn@{1d=2Ya4X84HX;i37Iv;z^<34g7)UhJ0FzTiUkQ+F+GtW(WU7MPC>)xAq)j zTbiXnni+2jaL9akvwMNwu4L|J_wl};(nwLog&32<3;?Z+n2np)n%#$1Wg#!?@J z++XbPkst=c2n_atMFUG2%xzxIgDeoLm#_kXzpJSqABmFseAeeb8nPvRJ(xOOnsy%aybnn)oFN_P_Tp5)Y!HLLb zpjf{ZS6rjf3+L%2BrNoR^TgNM3#r)hfwax<#-{-3k6M;sWvAGL0Gsms}wWlz*N3PH5k);zsbHl~eOH zSRB6?(^;OYR`Z@ z*32L10UOFr4E$)|mzhtqPYt~^Y{^v5jz0DLRqCz#YWnvM?L721hpC_B=&OfcJ^b3U z=bjR81U$%@pm-9uMlgLpdjHo35xGSi68zVnr)Yy+?+@Fa*%1Em}M-~x%Yih%XZ*Gve^GajR#>5UaG!b{*Y!;S}YKE zWs6Tv^#6R|qo;q9>-r}z4ZmH!RJk+;41Sb7?&MF4-sRHGft5Z)aoGlh56pACf;$+0 zTY-kn++#D`$ZrU;EWqhk(}*VZ=h!xcj;3)m6c1gcIXC@%Wkg4mR*uGbVcaMYZ1I)- zkf?Z2v?_A3f?|Lir2(!2xXd^X8TWe8KISgb*NJ6s|MUICgHIC=I`-i8iMPvx&;K&} zvrMW#wZHhqZ$GJc@GQ8Jc<`m?Kh5ra@`#li!&zI5Kb0$!=tY0XcP&4J^AJv@5Sd3` z7-bsJ)52To$9?sV0dH;&4BFoeEPZ8I9Bt1wy`fNw)5YE0-QC^Y-L1G4cW1HU?rsGZ zio3hJyE}Z_=X?L`ajeWtu3X8PGnq`5y}%$!A(f*-FnggYLH9pD0UyQ@?qD`yE~`qQ zD?e1!*77b!IJ*T-B=~uk=Mjk?V?c6(NWP)>c0t*x%fKc5$ltT3In}m)RBD(3w`H;K zlRuCWi|5a}ZKj$;a?Cs5_mT|Gof(1u^Xyx*& zP5iQ++)7RO)%C2(=J3)Ln0ut~?k2-N65~O0_ zmj=7q__(YQiWuyxyLk~6s#*j@>2`A=@`!)eng09YO|%*nZV4251F z-X{%P5$x$^F&rg6GYApc}SBBO>AG7qmJt%Y}HDe@aZa>)%6 zTqxHe5j506x+(gL0#}xYTT5KpjuWp!kRIbmd_(tya7mHn(?&?y_-E>cO)6UI`eo!O zqFXa(+}aGUyG>mkoQxx7%gAz0(i#zIu8G;2C4b2zUo%f8wK;!H*&>;cN>|7NlPc(? zpmYLMq|oIc0c_4=4>E3;o7N~O(5IkbJ_buT#Jz?TgAA0mq6g3DB;vL$PP0WkLMS@~ zMvnw}jBQ?R$Eioo<{Lsdt};2C?8J7Fnc_Z)fj6`{N z$b9JpS!WM5%Abd-rKHK&Md&eQgQTC+%KG4zes_Jf>Ho19A`#}7^~w6Fv|s~n>}}&h z_Pn6rR&P(0IqDuEo2n4>4H$laHwUQV9*G+O`nEFKO<)hjMQx{E!(~~;x3Bk%QLu1s zysgulFPnE4M}OirM(Cma3xs;Az|5w{Y*po23QzkK=-~nPo0)<&bo55ibnV70?MF`!WEy( zm@HPHqgHg~+V#P_p9|rW!T2T1{hj&$K?Gd}VTH;Hbw4O(SwKVs4KYPYy*H zqNKg#7H;tV<7;;Jo2Uk$t<`dgy)F)q&T@N$YX@%e$K46t62w2$$%mJ+EQzrawZLWN zvP79{mFc&NF0b{qp~n`^Nj@Ulofb%QXvrWLspWgJdN`wW!9y0eA5RYmD5i7_Z+)=chRl#4UE=o{G~wk2y?mZDr!K-LBT= zjGzTi@ER9G0#M7lOj){MZG5Y&h2W?tnl7LsnW|+=4&ZwdVE)Vj-Nwbxw4b!LV{%hL zW&tFkiwcbuW76!SS*<`P9>3!edr%wnX62jpto-}y< zus0t!Iy?m~-a9Y(4%b{JQBr<;RyiYt27UGvIp_OP96?o$1Sv=Xgcjj!aO2$l#3ba> zyTgG0L0tgwl)7xbGQC|G(uVe!9`{i4hXSYf3$4iwkw2k%?WM0B9+qX5c168p%_GqJ z1MNW06}*x^IhZvYo|IY@31^57zq+Qs@qtH1DW6gRf>wTqa>)(eG>SLejQ-}AXR(J% zR=(Y6uG!<**dfw_7^LuED9Q1eGdLZC>X*&KK|2)5;8na|I~x!W z_Pli{^YUF;gyh&c+=jklGU;4CgDsUzkj zuM8zOf>;d4iSAr0i0?9g=-T7!Hjlh%Fdcp6X`K*$mz{oo0_FGNAyq72bJHUZbD4_l zXqXpGZCW$gXB>qNeE-hJ=OyR2w860Gm=u^FTv;^H8YwHrZUkCYgagR))Xv=Qna)Hh z*c%gpPYM~bt!omEFnR~f8b2lnyU3SE-`Z|!J-VpBS83Rfg)j_zu+@F-&ZYMQBu<{r zl*XicD18LOxoQEmdXM@;2|eIQ>wYQZuO50+eco3}rgt@`n`2%mUaZYH1S zNA$J@`5p6s6+pG=pQPpC^g6HS-f6e~;`-7Ar~XV2-gSp2HIH~d2qqjN;|yi%#gQq7 zkio}u)oa&tI&xdsW9m|_HyqCmJ561HyI|D` ztJH)R7lA!Nq&n_^Tk$kcMH&gTt!yo-6vI1|{|%6hpHBIlFvv|n3i;{W(7f5X=xpqq z-^k_W^R(WHVKVtRLLo0pI&d%y(WS_ke2x^UEfh^uhT_cKV$fmLryQh_*XQ~!>LuuH z5;Jhzs(23jXQ>WALS@dOeu|(eq_Lo{H5h{yQ{$zT!V9&as9EZiC#e&FzkHp`WQcrf zO(M$Sq)`1rx>4MA(78OkQcehjXWgS%!0qSweubOqwn)P#e@Dyz1uD?-kuUSe>G0%k zFbBlW#?z$Lk;CV<)4!x)TtlIs%Cy5H7V$fULyvPTAf{PoyYF4h6<{!f7`i83)Qnbe zXCvZKCq+A%un+F3C!`{G9tar;6Gbs1CCgL+OepI;4`8z6>~_6ckc|#;jk7wNla7U; zA%!?@N8a@d;X_3n2|fhCsZj{C2d@HR=GrM19qy-eDA^j>sZYJ22IgWQg|@|~Pklwc ziC)0_^8)PiCXsorD?JS246?PU9b(rByhyHrOHrV~mmKWYtob3K$d>o*?kwVg_{OA` zj%SCV7AJ$Zx9eRo4Eg(%9T%)y4URvG5_LCL%$X~)O0&RiDq2s`L{fpTqdNMQH)=5b4j6qC@jrG}ZK&0OSF#}tNnB(C~9eZi_D|Mo6YKWvXvj<{zyraatoGLUe zQ!qcu(F-#yW^S=lOtLOshlt`@^fc zbSxJp!AgJp8N*`5QyV=X{`DeD4FuI!CTpo%ib*PNK?{rmoj!9snTgB;u_k*@<1rN< zZ76xO;arTmXXP`^^V#ux^=p6PTIvqr@+4jJ@?tLz-|~$KJIL~r^P7s6UvEV}^e~GP z^8<|#O?7OOnHT$>CZ)v)DFH~D*R;ABe%@zp2Qg1HbsEM7GAuF^-l5psf|&$zFgQ#~ zl3r;Ui?<1Ki3xWa4K+E19ND9Q5VWHhIUXhiF$tC9h8*e7T=cH)ZK&h;B_PK@xRkN3 zCitGUoABL(7d|U(sP9NJ0Z51k%AE)k#^e8_3EAGyqx^oc~@NB+cvW@v%mYhu%N;m`W!4?WGuBqJI+07 zfS2dGRmn{j0uXPO;rf+pDNZJ~rFYHI$&4ksCXt+frds2#p~RJ?o!)Q)eaTY*Klg2| z@_vavsjGXN)EnA3*s5bUpfRg!Fd$+7SM~F~^H|h_nGnam>z8oKx%62~q@W_FekV_Z zzDNpChM6VINfa-qyQJ!fNb%|OkTWd*Ka&DmiaV~Z#6;y`=sXNveK31W2^ z<)i>KyH9Q=rLVIZ<4}^9ucIA(G5*MxK6Pt$ybc3;Bf1O4dozM% zr=^I~Hsp9kpcqY_weeD5Sdj(rUtnm zWE=A`v>11#)AqHCPKMODbU||u9O~z&1A%R@@I%le;Q<{%U8lpU6CR~m-kzpF;4(WP zuzzQ+t#`iJ247=D=@iHSg!g5mzia$47`C|AQNhCTouP0e9E9cH@u{56dA7jP5||Mt z6lJYC))YK>kHDx00^Nd(Uk)BLMfgqYpJ#J+!vae9qKA_ADgCL^zW>#Z=CNRZ*K>0b z+quuHh)`wtK#-@0qOhd85>qb}@iOyptdKyA{@pkb6go!9UnpRcdYd0-!9en>O|?ki z!RKqgL&dx@uLU_DelT3i)6`(d40sacX4OXJ8m8~d9MZ1CfPo~Pq^*ppoQUCTbjv$~ zNAKJ%mDUbkL+02R#gwd1Xz@|ou__)1Ph9k2thDMSJg*1M@NcRp!ibFS-*MqCk%GIz zIEM^K%oO`$lA8XtPG-jT?7~|`)518smXh$!M0~qvti0&`cKR_3oDO`t3-@!laySVk zE+Y9E)eF38<0ef`5f`|kguF+)JrD%)(KYg;>#FEC3OQaZ4+T#$kQ}6)^c{tgS0*Fz z%ayik^|8K|N>|YTjiZLlb?0{+?adAx+Jq{KIMEcfGqkYtx*9kG11OlE$S8ye`Iy}& zltfXAHPqMp?uVkCwlPvqd>=_!#Dbn2LCiBm8B&@&Tr4w@yp~4|_1Q>#bYy`@8aA)k zz|*Ens;^EPmTYZdO>$jBj`%lo{%u~1Bgh<)4jQojC!<%nz5`jdl1K_8pUpin2pEZ${(|(k=`Z*Jr#E%rQWP-OMM$Y z>8=X=EJ|%dmr5^Xcl&>5aD{D!g`nd71V#R|#8d@vJN)o*s6Dk^=yx#etoQ0-Hr_cN z?A%E6s9ilJ4Fwruoqf8p8_p#)H7GEWfh#TB*ZVEN3S8=F zi#2jr2A!KOr{TKp5EquqfLF4M|2!oyyL2f@Dbn8$V^F-czkdWS7Mt=*Nj**S>*zj_ z?ThU9&^;rwVpC9~)&MVd0@Oc-{>)PNePGBx<_rgfgzbtNxTv# z`aDh$0GvX*AvHl!^tC5NXJOmnFDp6e#o1R?O%Sq4c za7K#WaNKdt=DMwfSX8Ww`da3GU%gG5mr2|i9_6F8!-U21pZV8$ylJGwh0G&g_Q7$r zjG+5!D4nk2UVcwV0Q--08qzjR#co#eOEpn14N_0Yo%X}U^;r*2fdE~sf_^p8v`Aqb zl8~_`|K0J3&@-}~r!?v0$<#0Y4pPLA7}^ToA6{saHTOkBww zXbH6hBzi;g9bfLoK2}^P7ePv^NKu;RsaE2LcM#42H-@c!{zy4|`4qF{M)bi*b<4W< zU=jZyN62k5+Oj(m^091$`N^K!@|D6-5uCh=JDkp|$2^t_fFpV=@oIicNpsF-t!YUQ zZ>dA}E5o1lo8KnAJ*FcO$@n*cH+kCD&6R9K@;`kjId!Y<;{3fKa65s}VIyH)0;}&Z z0au%^lVr}o={O*(Ukq{d=1Id%$Aw90ol6BC)Oxxs<4B*|*adJPCJJrd5$ntKW6uJP zir4846fcGn4t$6Zy{Wjb!lbvCJ=rlZ=t*&v!~uI|8^#%FG$?eL5#!_x1IZUZyE68j z%x++{_(tVwsr`n=_>K~$C+O+zX5tT$=G?jT$9bKR*S6p#Ja!CR!M=zB_u34wjWB-yc=a!nT6>MS&PJf$=k&xT)8@(Fr+VtiDE) zRWO@iZF!j!-&1DqV-0V3(0sA!GN{ORwQ{e0LBJGO3}5%6mw9MiYq;&RfHD|iS}9OB z{2mtmCiR5uz#N(2Zsdfj%B6t2I|wntZ_L4pDuFWjTW@wS9JJAc;iQP3MoBL(rg*N2 z=mPzo1K?$l0xBwy7kwT`a=(v^0lg=Zk2IOmmHPQY<>>Ji0k+-uauI1{*tVjf=khVf zDJ}1qDVQA(<_!jCznSXh)?3tmXSp5eq^uHGsHULiBNGn#&TP`#8}Q>yFa#&TknbR7 z?$8H=4h18Cx;R46RxN2l+)~WXB$(t?Tz|*8bkGI%xMdnePe!_Ig7jg=iTiB_3HnIc-oZQK9drK)~CTT{3+Q@R%;4fkVCK)2-s=dQNwleJ=>?jmy+QK85wMtUB#7 z&~&7~ts27^<%J=5>$OTK918J+r{0<3n$qX|U6)HVJ&{A}YajodI&EncoFBGokTp@V z-L0%!1tgT8Mn8-2eWOH|QyeN~rZc64H;LDOju!P}qlY3{QP~N=>r=33K6zG5|GmIe zy(_Ib!A|;F?LLnUqfJAv9(a?>pG7onV6BkL=PE>N_oQDP?YTIU#=5$S#K#X6@o{Zd zXFNJKvppQge_g)?9%ql?JP;NtP~Cmw4pfMH6VfigJmL2uxe(y1-Ij8Vq~*LyrLdx7 z{t=`AgaJa@>6ul*XoSZ%Fq@|}+B6%iU}XS(2HOJ_&|tKU1SAJbJ`>dndc#qzA@D4ghGb_Kg?+ojyi&#u*G73?WZD^S&CwX zZ-^4Ln3|YD5}%+mlL~@7#}cr)f>f=V2u|jEIh(-i8vj8=0xR%Xtk4E zJNThzo}oiy$$W9|Mru$l6VtYCS8&aEM(C?n^PB>i3_L|jh>-8?|v~E#O?=)z_IF7leFispPnunPK_O&>Y&p@5PO)V{eT=u2-Bf z@Z3N%<{KPX6X@4L(+xL*oh-OEA-XGwyH|Cf6{D-vxR%l_?a$12H=ncPz&QQXi%1~` z4@hp*=hD4d52ES6nTLAJj_OyAg?X2RvI!O3VDv>amPv3>(V31DUO+{>kTIpMd8w|dLBh4@m zTu-IFl0WHSwbpF0%CC_Ljp&3_6rqHXYj~TS&%?{$0 z4#zL&!)X#y=vc*!J`iCoe_6O{nb0$`?kD8z$RLbz^fIaG0t!Hp?at zZtH0#2;CE@SCmyq{_xr3DN9x8So;jv=DDFi1p;(yjDaw4nL879Ug3N@9%V`6>vzit;S#@02B+w7}W`9be^PW1u%@ZxGo3hm!HG%+j=BMzba zQkERAqy00G?_@DHg#|ty){1bN--DX!ymgH9uz1LtmNBV@mFdkVf7xG3*YwpT90@u?N(NS+J;RGbHS?lk01AJO#j}l!v zz*dSOl_S+F#K9_!0!GV4yCT)T#*v6fAuI|MQmP(HiVO0D-b-3OWSQ#$qfLZ|{tfl2 zF!JimCcFZA(*hCdSqo(Y>Fn2ou?v^nu7lqCyx5}3UII2!d!Rne*UiFx{(GM31gBn- zXM?vz!}kODO>R|I@n>}I2v%OTB&6#mD?);WN)E86jVQ$W8$GcoEa~iB^dR?hXwvq$ zFIwuXrf18(W5&R6MG?%mgQ_uu!?L1B*nkE7#yqMMV+a947x2kF-XF|b!o{jk2gVxx zsWN8#cK#YFiC^S-;c(^$?JwM&iJT#@WcBP`rxUZNpEYYG#PJc_)f2li(UBMoYwLKA zy2K4Z)Gl&R5rKc>eZt+8U*}AF53{o{G2ou&o=8*N#6mVgM%F@qcvW4k&pWLC7HqHA zJk{7gehY7IV5ipE7WG@r#JII;gxNMCsDA=#;_y~LU0a0bk9p#1U|Z~17(ey)xPZ{5 zW|zNO`HPwO%AKueQ}UaVid`7ODK*T-j^4*8gR`~!g67oHcKsS>C^rQWOVzR}9Kk&I zj_57bl()>I*;EQujcTHso4wE_OMt5vfhNwHr&Uqut4+tGVrh{#hx*v%EZC@A&Kkw5H@Wb^PXPEvd^1ay**EFbJswkEhj?wi6;^&``PP6OU0;Op zCq=a3K4g$+0fB3WEA98%%kLz;m*EF!7NL0t7))TOq4lGosHc0+qU$JWB!BQ4=PRMy z)q*D*mlg{oNIzwXewrT*W0q+gSl)8%75A$C8+EEyX%Zc@%Gao!`hrUs;!ZPE=H;*z z{<>QA)f=;!u`Y}lrj@A8*BIqhq;|#|7C)t{lTS~&18F-Ufe~#jgPd;g(*oMh ziq4~p$fZa6l}o-%`eM+oK6i(t3c5U?I%9>LASd)ihM(w8_nF0q76Q%T%Dg%H$uD=e zhP$q;$h*R`XA`w&vthcYLvwK~jrfyA}Mtx!$PR{`M zP)o9B);d!7u%f39QKkEwq?dtP44p4-?r)Q2L@UVf#4IZe8NijEg`HJkX!y(S-3BIA z<20MQ@29UsmG>l(Nn$!mcCKcpO5-UnZMpUmaDP=41U!SUO6*4;JF}5CSutWs>J2Nqsm>S|4o^zp^)D$F@$( zc#{gw_*CU#*>{%T6LZ+#JuTAA!T=GhM0JDBtS3hteQ}D_)3)tw0Oz@JtQ**V351o|KTMua)c$Y!%m13Ab7_rumS3Iorw=5SqawTWJCTCA=rl5sQ>vi=K z2gx&dR`b@N$8?7zvO)>HO++@O%?1Yw0#E~kv^+f!`5aeC!RFNi(Z|ZeAuXzeIfSUf z6^idIVR*)Qv&z&9qS>aAR;p2QRYlDQt{4w zZ8`tFfKE0}Hf9>yjX^S)#>Bj$4%Du;;#xIVm$Ai(cSD3qcT@h!kLx@ZHQ+m`eM;c# z$CpFYs&rg^VqjuU@hqj9&BV7v!zW80aZ#iWcW=X)A`BUOAn-KxnHgrs_auMKy7#kt zbgfWCJWlS=vFRxL_5gmZGzGh5u}X`lMWs0s8uXo;T*(a0Woi8SfXIN3Ss0n>>M`-~ z*vuiOJ;l3iUB8_xNx?ua{DLA;5CHeW7O%{kGQ-5VLcOFPR`uvw`mK8YcH2=-hyA#= zgd!#X5#eLP?wIy=V6&aX-2nk%-3JD^k7+h_N;R_OSVtT23H_4%X@CFf=D~QP>4+ol zQ*a&=Rcq)4QKeCYtwAr1Zl4t1NsFGgx;!4m&2dpX>c86Lr^vr&N5Y(JAOjvC*tNfg z)x_b}7Vug;osm_NrL5E1dH=qsD8G$qYk#sFc|Tx#aRPVhw>_~8FO+2=_H(BqBG9x6 z>8|G{Weg+bwGn2d|AX(j2_D;#?-5V^d2-(8PCE_Bq9iHl30W(Pk@=?{Z_KIxcsPM? z9#Q#6IA{~{`*qZpfH4@upLNUcT&xQPK8KrPBs@G~(Z}xc<#ye~b&MJ`Da>!{(h~^u zk{{eDjGuUJ&ox-s;IykUpxK8mFRF5DO=Q7JI)1A%+cj#4_R)9>O^=*6J8k^CQr9CI5aayQFsAU%QesH17W$P+* zkBHp4Y60c8ltzC-=h55QfwArI0k^s7p!AHC1AVm5K=0zm@IV6t;cy!ha-nF4BF^<@ zL5x6H2AE8-FXu);SabGm_P+0Qqop~1dhfb%HuBB6#^M|@FX>|y1by01;7)2WxUiwf zkU5W`46Zil!|+o-spyK`8kybcFgM$B%HHP}VIn4&KM(}Dah#`~6FDDtv^phx^qB|= z5n_igP@rSh$B)TNtU?f=(a5&b{qV!UnkBJ`GLSKvlb?+8-;|3uS-4PhJAHcJ@3Z`K zeE`oNRHlDZyFrx!9q1=qi4r9bsD3Qy_c!7dy(U_Y7!5Lbu%g1ac|$zM)Dd~Y4YTlm z{KJ?alJW=Gp~A{QYwkK}rfv$KhTq!RNnnQ8if0P7FJiqff4!kqLMK4>fp9b;Iz}R5 z$8)%mV^Y9*vyHqI*^x$T)fII~t*J^7JhFi4SeqSZeYyG#<^Hn7Kxbgk+#_=NZfI#K z6esI&>mp8=%>C7I=L}t4PW%>oegkthcOH6Xg<2^da?0AJYI*nG77{Gm0?&QzwD#imc19rVZoiIT8i|sANH2c8r5rFLa9}KnuD~5DoBTLi`k}s$w9)p zY}q%j75u!2gX{hJTx+l+%Jfh+nm?A@#}MqH9QOGK%xJRfv4{`hjtDLPE`}YL!DGTQ zO2hEKH8r&;{Ia#Y$vYy^XE-z0CzomIdlhl6!^@v;H>X^AcK2XGeST9KyEi`LZF#jqY2yo!gvBTHi7p z@uMdWCy_+0V6p`xsvzqWzt1EhA`FAopu-p$)%R0zA~E3*#mz-8D{ea zyFZ{&cJ5;UJW1p<{|@R05y8;~=8%3K?^EXwt60r_n`Ip-%^~NkqtRH29p3HOw(x=QnX{~^!0e`eyBZEjMW;xl?Qqzo%`ZW zD^T|f;wzaO5tjiANtm3DpJP93e6B#z$lt8$KNrv38jwcM@tB%@#Pmq0M$ffRIH-KF zWY+LdqHfilZ5Asr*n;BUN5XcQe}piB()xalmlQB3o)7q*on`ig5P2!P!<$;%yT|*X zr6ARn+v%FhDws@gL^8MdPyV|1+}%0ozreiuXc8)^!QB(albL4X%Qq8EplR{>{ufMKx#r=dIzn!K< zXc`-Z4S77`-_6Yvts|s|wMwKlOkMCnYd#b)mcH`)a8_SKm?#|FwVMh9=ehA8YdoX- z>BGjF+9P$l7UaE;BsZK3S@%RSZVB*DE7T77!A-tdblaR7};Ijg<(wqU1Ls^GFAy3F_4IZqox zf#ddqhg$bL)HwgR$z2fSBM9tmF_WG2kSZ{uvHrWAMLcbwMe@69-<0A2Vd=Z~rVVRm zdFGGT@1;6eBuNqGl>M{nhj}bWED4a;lE0=+2=$=wRROL$oq;z*ynFi?cr%(sMXfl? zkSgf+xU30f61$hD{;5IB&P+P$UeXU$(FrJ8yTY2Rm^XPf(FlvI@h?pA_Lr*>>ikEC z5Fvi@nOVgxx>z(w)CwRMX6x+ihw=;rVV7JRUcXjljPvdwpJTB>s!6lEu_8`v#;4QR z0NkI+XAke)Y~X5i1%kxqdgsB@#c7bP4`00PzXSl48bpd=hJJOZYGp-WLtec6 zZS~@}wh^MAs{Cjj0cLJHZ4vbo7J;lnocrIAp^5huQF92BsSy={2!SkIB|3oQ)4s$-5v>RO$Zkae~57or+cb*7l%GopfrNew9tEV zEC8?l^%Cp$L;h339eQLkfCyM%vA9Vr@s&JG;KnCC^`@G*F5;}a3M;wljcfkG-zuEh ze=$=PV2Hp;uX>8W;@O~5UKC#!=5w(E=irxuI{;K_j{ZVZK>a0OO+)zBR)#?`6XV%f6Y9_nhZiQwuOv;^!i74=Y0tpwfrd1a9cdB zcC{gFgFYElR+Z_Vsb3qEj3icc-8oBcu(u%f;^9)A5{$lmGrPNQ^KNHTGyuCfGTm2) zu0QZj?j}^s;sL!Ucc2FDk(RYEXkHqVzw1o#FE3{o%TfqaCeZu6u#=GLgUZfzry^2y z7B-^B16vmWHOPzDfV0Bp_AV=3NU%+;5@~-|!j*RNI#8{#{<~`&pp`{LY@AFWyL;>2 zb-eKRfh||vwq(_~$w>TfmN8MzkeT=a+zMm`^iHhG@7;&POZ@4ofO8u{TAbKa3TvNm zn5}$TvEiM9g-k*ud;g0Ilyz)N5OnflX6)$G@6~4a8lqs=QscBWW>-BlrdCgwpj0y?rpIx`i2(| z^LRSZw#diL2C+$nL~d5?EH-eK7}$PK{o4MGmz#6xlOijtlV+{N#Pv->_2Sdl^>T}H z9zs1st?s+EPjJEA-gu6yXvfs+9!Z&~cQ)4hT*=03b~gUQdyCHoaMD45@8&6N;_)ur zyZG_3)!{wp(BIz1|Kx4bzG`qnVBvRi!SlFD#N{WPz*~BDcAvzgK(p%@jPIcTlaIn= z*dC_etEM}%!~1L8r-;Jj>t`p>@*3>vF znW>c#gO#0;g&7mQnVtDr7F-&unCGRpz4vn`68hJ;96~L?H~8<0>ofNU1DR0O&)Hq zQC{CFD%uauPfkwCGqR5_ma|K|ird<~+>1{+K3h(zTCB0N4?)bKNe5Zv{N=VNy>%qnj4YpAF0!Fi9{w`OnyEH3K#mMi~S zm+!*uMVy^`YuCnI2ZpgX^272bF94?uK$*&FyyTydvZAV~}n9;o&gDyZO>Ko48s0RcW=oZk=K2g3Gb%fe*&qaa^QU zFX(*!31^z-Ro46ZQ~wHX)8a826sOX&NU;liXHXB-8)aVu&0aO;IFw|$&G}tYy(&CC zyFUHcXs837?jk5D9PS9KD{!8@r%W1XWxrq681wvCC8<5{ZN^xv8&ujr*x}{D0NQzY z2i;b#<+YaCM&Uor4iENUYI@HckAn1THZLhA7bM(z@E{0B;ymA|)(0Tbb&xdopp4vI zU0qE~Oc*gKM;BpAE)gx4jyeikUZMRL=XG2hHjgqvD?Uf4hkHVU^jY_T!2A3As;a8v zcA|R4$MOw77)EpOF8!`2Cn~%zP5K=Gyoi&moA)VXHV#5iecoE+ZGEt zp2@f@`=BXAdEMyxe51Il}@yb|cl}dG?Czg+5Y>Mj-sOY!~&i-k3Pp1yHsr+Hc%pLr9M) z(aLDiZ<}!(O;ipmkleGV{lY6MUE#I5t5upTq}<~Oh=xTS zJd=l$s52B1>|tq^q#U(yQbv_RDTZl*LqdV&S_hfOdq$-u38|H=?D=a%X7hG_()H=LLmKYj5rZQ6A!j~2z zy`9MHyG<$0z9np%Q^yP?f=tZ(Prlm!e>AgXBqJX$?$<}H-~v^%N{L};ezC*A>{x^^ zu*_DNX}B8dpmQM$Ra-r~#*UcPs{CzAu38~3tgmP~q%$KHdCHaduy_s1oFj0fn6Zfi z;;%)Z=ik2BvR_35gD*2m!|G+V=XLNVcSz@76eDWKS0%rD4f3KYbDEF-h&ApB{bj1E znhc+Y+qfg7!U+cqBqRIQqY+vFK!rU9o1z(o^oZ!okg+TydhCrbyMm)JVhhT0ZYJSn zY-EI2A#nOz$a9&qjPy}jmMv#wB7&^aS%;fkxqI09e~L_DLMqHrNptEWqNHZV|JLv5 z_`vXbyLs0OV3WqXLQVzzh5acG`Rln1{6{zrMY;Dj3%PO`_~@~TNykjaU?Y^p&)kXw z{EFm)&q&nD1kh0B9Y?532qAw^RupJ92yqR=qPfd|cQ4^AFkWRS-XAA5yK_udTBby! zwu+e_+r`eSaa6a+oqd2`&B=VQdQigW6=((*mm+ z^X#^OCf1+q`|AGml6k)rCB;R_V1I2V@N$-s^@}RQFK-2hTd+~5lZ&hT{lBxMCYQOj z|EVJ)6cQhYjkS@S%8~xh(63Nam32VOpL(_u6Md+jUmalup1l)o1@JwH-+)*(a=-8; zF>wI;4Zo@v&w86Y*B6r-F+Jm2|jkDnWg`+$S*1#pnshEiWf+Fio)N)+{90lPBH1Mq|PW4s2 z9Zif34?^y5;s4NLoK2M4s#l7RiV1e+H1wbni`vST5Vh%fZ$C{a!EowQ8Y1m-C0AKy z1Q`th_C@75v#`$Tt!({a)Z3-yxwkM($YlW+zN`>|qAXE4JgixBHc5qGIWR_-^NTPl z#6dfI>0BanTOnt?5SNfX3HFQ1fuSUs9a!aNLlH5BmP?kP4i4|%ajdK~eTF28~*SNu>eQ0=ki( zyF7kr|9wI62#?02m~Z0$r?nz#Bj6+?FpVuhh)Eus9slQ=ax@qdCiem(H##jR$U}PG zB*nkVBD``|NKXYR-3;IEvT?GymYMFu-XNtpf2y$PfD97C0v%za8B3w>S z{4bw6GE&Zl9R_Uv1-bPsq-66V75`f&o3WJ<9W|D%PpQBwC>KQZ#jsNbAyTbVQ+3Qv zu70mkQW_gaGY8psDSgs`iM`MiF;sOX5<#02L;i%HSuJ|(ZQKtV#|OPoHUtX1k5bc9 z1ZByEhFF3{lWWNc5$ONKD3e|~P%AfHye=aXBO~Ez5K>}-A<>#aM^e)7ms*#Y$o4t; zJMj3fMXJ3!@%+!RL_s{Js-DQs%U50|Vdp)lUs!<&vvVO6`3}GLr-J| z0V=9h`~RGzd|4vfx2p}rG>7m-oY^EuIs$A?WHS1#h0%S`Mg5^aj$|Vgol*e0r6;el zas-~{fc0EkNlzSA={_k}vajpJzAB|)}~ORc>*C{pFV73-1t^$lcXF$ixd+@~eq z7!$E**e#84c*JqYE@sm{4y}8*b=^9V$ZrMwdhh8{c zl(W>O`E3>D<6HVgl3TV($*DrxRWg-^#gqqTCGg>J0BA~=h*)45NU7%SrUq6kuxxFg zS%{~x-6wdEdl>4r!HUro&=#mq@>>Y}7q}*DB{AfofZEETrG-iHx@0B?kk(yCGiB=s z)-@uYQ+q|&?yFhfC{&24eppSJ*MH%)#Lh@#RbBflsn3R@YArSW&uYFA+kt#RE+quT zoJ5%^w(>Xi{1cg5!oNeM!5X@F+M}StW?#{G2m>>zcqOO6AT+`L(4@3`r-ue94DxrY zP>D<>th_kh+phU@gd=fkoMbSkky=3sBWWtsGy-cL(Ns!*VDKf2;E8q` zOsaSab_fZFWx(I;ow%J^+D01w51pwNEHZSc&{6?5U>BGN0>Yyk%9mIzW#+EyQUR4m zz|7m$rl$Ute18zu3Lqk^QIE!j1WjElM_akxA_mLNC9xk~yH=Y0$yAevG4Zb?81^c5 zOkZAxo@Ktjj7mYn$CWBh*IkQr1tnMh3?n%(B$X*wEc;ccx_Q3P>A`2EBD}t3D>;d1 zNXj7fpP`3n|L~oZwA7k?6`c3C>%;}Jg*qW6DfPBh6cNTm@ODeNdEmuzwwTlW!(=de zZ6LrOm;ZB(OfD*)slnpiA4$nfj|ptHjhEk7aQ@+za#8y^_CNQCjtu%m%8>qDN~ylC zuCDu~*8N%8SWcy74?6Ux8Y;vs3AHNqR4$#WalvO#QD#NB^Jl^9xm5glNRl;`Q)w zKF?aLq*(RW-?|k{b9YiYZF?>%Zc7I{p`29vR6(0R#dhz`HP{ zp{h(Mny8p|$z8Cs-~+7A2rq2Z&%25WeFwlo^y+EITT40R-0wz5Ht!ag2Fb~LURzhz z8GRG4Potr}D27=#ZAppv3H%c(NfreJP|C`e7S>;n=)c7Q^sl)ZZ z@zoi;6!UgP(N%GoBLfv)=iYCO$3{~*K4pZu!p^Jq^`0vZ6KwZD6QrLpLnSq*iGu7no&?Uu;qT zvuS)e<=VezT!+4*k${l{-*!Yos_q-M^NT6&`d1ZnW~*E;8N4 z`wO=-)Ca1*(&(uvNqsSFe5krXp_XEQDr`oEj}7y1GY`@~8k1Vj&8jS10&|>gEHL(a zTBy$K_3X8hBHFjl(*HAjB`0%{HbyvLBDQ6D)1iv`}_zvN(H z9}))1sW8=hzsvuO&TbO>agG3XiFIvdYE$1tU(?zE`HH}p&r=SoNDeuK<@m@y1;&<^ z$^E1}JIy*uQbGm&YHGiv6Jus4H0?7%sE|Rzfj)Jaxq11ffA@0#iJ_GVj!s;|12aF` zV;1jz+9rQT`vFc!B!L&r|I#xZD(J*SNE`r=m-K6!>aTkzNU#c{lB}g7Gh!AWGCn5> z$ibWN%&SQC>&H>_KP#RnO>12QpCA^cWjz;Y+$T<-2~i%IzXL6PQ%b6ro`5So5;Nz+AGXAs2Ce~BSEG(>>eu`j7 z%t#Ve1hciaINP0J2fcY1oU}@Cj;zZ8g*hCJjaH7@>wQb03g(rPIrrmhAZk-$*jODMve!ArJ19=RD-bxsn#)~L_O#B0>vUp3^#NUKzzL+#YlII_B zuLkqvg|G)tyIZt#5{lmh2NGj*kZ>v_|0#A4Oa?xPW5d4e{tH}S#!Y<65|fy30xkg* z9tydzgHsh0955P3xR(B->{6s;!viZT+P6dfm}tq!*^A)YM`n^C^=V+S5|c;REt70( zBV;JtS(f50r*Ct)D*jpB|B-Zdq|+Zs-*ieMNdd?0F&d-i2os@?ECz+JPX7hVmMW&y z2^FOz6KNkC8bZfs#Hh4wbRmG%NN6$$J7Oa$;x9e?Ygp)?C|J&kj_qvO4aD~5HE3UAyY3r)2lm#ncSt9vjv@uJxKRAko8&3YHVb z)wp|*a@DfYLPpclP#a#BQECi6ittpOdG!oTSNN@xIu@36%Kg1Ua`osN8NKvBCZ=s> z;=+on!C6=!Vp&cyZYH3v7H9C2GPzX>`!9Ken5W`zS;ivq5=az1LM4VRnPGsCaWkCP zb)V0_02NG6;N#T3Dxj|CCkB$Pt=-`@tGQT(7AF3)8C$sq`@HMh>GE>HXY>C-i+pP5 z0SkS;C8q|>2sr;F$v;0{PBpZiQ|Q?8V>(kOqnTaTOQpx)qg=;j9=y3`f6;fxAe<{o z!U0sKngzDQ1=dmUGCx{(Qr$2V>rhWMGdqKgJUT)Qmke2O7Dn=LkIT`x?q)Z3*!sov zrBCz{-v&Gn42oYB;?k7W)#C)&=wT+ODQL4z^R&5r^Iz|u6{fb)_#A=_AwSR@>?-sG75cOq@-T(w-vF$mzTd^ zlF!k(%2eXmJw1 zQjamsY7^A3OQoqcS-3^e)1zm~O=XoRdrc`q)EuYpvs#pv?TvTXKQ*NojA@Agl^H@k z38C6Jh>A!UfjpW0yA;gV)AdZ2>SKds5#fK(O{dt8%G8QHop=&-f;SwwHTpUCC+<%7{&-PjWIHE5w%diKN5kh99n ztj*!{6MZ#EJEQ$detxdrpHS>o{fCLNe~sc1R0s;MzF>VYAN)14X!Z?PbyQuELttDI zMtyL&(De?9A^+FepCEAQJ+G}lz1^-WW^(ajhOH^#4df>oB(VAPD=`GWk|XSCE|Kk9`{6zNc3{Mn;>fGU40_;?XdaDS?D~bT+gYoLduO>RLW8SUw7b zpS-fGUFC2iPY7GJM|sO-F6~g|c?KVG8>Hw13;)R!3B|w>zo?=r?2};?dBk*VIaO8l z4$rN|^&fe^cJxIj2eLjqnwSSZ?s{!S*PuIiA&{UAaWD?V)tLyO>tk*-tgce}+@sof z*$2=)5E;(Y^5KJP36%B3AvLj~5e}~(YokpUn5(sKDOY*Xfe)F!{(leM3Uu>;j;@UkD{V{&ch4Rf}d6H_*i8@>R6rlDKLaFm@sOc#| zw`2MH--_@C30AHMR^541<@VVS@1J8pU|qauhHd@SzEA*WUEQ!PQr&ANnxK;x=()#a z1Nnh8#+#e2qTSZY(z+hXPBz!xtJb%j3rYhE0o@IL$Nx_q z<6KCPaAUiTt5bRZ-uEeQ6xKb`@QQjTrmJzpv%xU#Lc#7l;Bw&Mqpk6C&s)Zu=NIVQ zK%*6Xk%YzbKZp8IW}h8pg}jeDpXOZuqB9w1PqNv?h|ePg^qh0|M}JhI zlj5X@iw)1?98a9b>C?|n%q!8}{hROYGt)eAI(A*AHP6kKS7cVk&qYng`9pA|{@dQi z{x{Lan~{%YACpO4Q0Vbf5zG+1)6AjMXnw^HX{~yW#*Voy^IlW})1=Ef50j)bF=NjXrPuqt7Le{oM z);%%wWV*o(_N2gJT9FKKK#oUwb(vE|utM45a+k5*t0m2q{*&AMl->vVZ>G(}Pm3VdM_7h>>SV9+eSCpyEpbxE`Sf9ubBbjbDhX`izG*?#5XT$Pa4)&kqKZ@2nGgG7i z2MPbxtXTOU=w;`Md^v7#oo3)zTXAHgS}5n_1SY7sPz@Ykz2?j~wy@=Yv-V=hz17`zUN{#W^Nyt|o9w*Ax_HP4p!EP&2R(3LJkBR!E=wf7khh;Wv4op~rVP+#q(*uo7#17!X;SU<45)Iw@tLnS4=U$A!|r9d z!O;|)?({+VyYN=^@kOpOr7&rLBSA}P+7F4L&s>zc*TOEqofQ-u@Y*wG)rESju;}BB zR_>ME;gXbb4${{D+-u_etMWq{|Gw)=QiRr~n?BJM_#l<(9oW<5So6Hm08!{cJgsYl zvnGJFoF;lr*|xZcuh=xq_KiFqJ@Glyk$Z47Ni^{0Ui~pDW2Mv0IYO7hd9b|Mp03T+CbH}50lw%$_Ar^CNQlniKqD)`+ho!CS-*{YSFisv>vswt ziAgOv&;2Kk1imH{DM%kOn`UmDi*H**JbA zAV)m_%KF$8L9yEInhW@-oUdNl%{Dhn26>sy2E@d0wXJhF8d%f3z7y7vzB18=VHDDr zW97PH9`m`Y)%I&>28N zIAe(5T`a4lK!@~Ch3Hd2Jg>4%q`<+n7XM*HB-~gMcV6qS8a~@eO2)%A#Qk*TonyyP zTvLH4cL`MobQ;pRpahB;sc3c=cvFp$@3Im6Gm%*?bjfPkv_CY4%aOefH1_a$>_7hY zo$Hw_hawD+=hSdt)eKaxd_&ZAKJ^~So4+uaRlns0WpZuq9EsRLj%hI1h**!LJ4PK` zFZ&PVbrr^EtqB$|-Y5uEn-!xZE;Y8>}YuE1g*kIZnKyE?)zNYUzYWJt#Q zj-{8e^ty~>DNAh=YMzcnS$APQX61kLAAdGS%5;!S^Wu{6Q(G-Zg(a2Z zWSgc4?G+wS=l2)L)ns!Z*CU5OtXvR5V8(t!f#`2LqXD>{O>W&64k#CWRuXhjV zRfu~xM^KXYSdnK7tFD;1Ic;cvvV+@c;+k=ZJl>g#JWcAMo6)jc$__9AJ@@1nGWsUN z%?2XgHmYbtZ9-L^S3)|T+(Ty=v(ghP*cgm2ca7x48gG`i^qy?1-%{l)5zI9=>)v;e zH#NLF(uW6Iq(*>{LPzad=0%NpYMI5drxI`3F|o&i*>Q{Qo-_@I6C_8H|7#Gr%{OW; zVDRy#Q!?8TX5lo*z|1d{p8u%8Rw7Tu@7#B_yt$Cww40g%KbPkTTzzLUTkw{vyH8Ko zji5bwGPym}n4X7UXK4ytQ}*$PN#}6X1FPoDvIGe=gPceiH*hQf)nQ+SQ7Re(U!I!n zpK4Mmf=IWsy$|)O2nor4TnYcmy0@+C^57@PkR!n~zHeti(Wz+C?kA-^7L21vR^KU& z$v$?u5^#QeTJiZ+T=|$|)!nXwTJe_IBOu#RyPfGj;PaZnI2G{~275HOlro#+iI>g4 z*pqX-iFG*?mq6qu0T0}{rdm!E`kZSK!@{w*=*KwX>IB8%FOE>4k$FXxV&XcZ{k|0_ zlJ2`PJQu!0XXB+O=xr>y0YKS?;`sl+7ycX4@9e=wl?_iK#Z*^F8XS1r(ReS9TKb zLJhqP#|ye5)2j|iw(dn*4M`*;qM2;(XX^T^xHv_g!4|~qP{hhtEXC&lVs1`U#}_ufx_SY9OnP@cR7f<% z0VNrs5+UMUSJ1Ft=o~D52Zyth02`O_p1??x=;2LJnyRX*N_JH}^akay${T|-&C|q5 z=o2w9$CF1v7#WULWCffIEe`Sn+mH20q1&h>YGn8-V+nSbhMWG^;`riRQ2xl?SPe{f zjEbv+ZBjDM@<^*0?*XBD!yT6$v?0TY;&FLH zM+$Phww>!A2su(8sA9;=TiSQSq>D2ST~I^zBBPyfqWX(V($Vgh4(d>zdRSVPh(=19 z?3;HWl4yFyQH}+a?eD-`0inS3!GX(#^r5z2jAxMp(i=9JFNw8q z`XsRUkJSXZe1q*WC5k; zjjK`nscPOtQgqQ=K)0{v*f@|_&f*?jju&32M{!~fh|X_2WxGb(NKkj9z^Blz@79R7sMHi7H;Y-oA^Y~z5T}!L620zTzkIbv~ zwx*Yhdmqe)*fZ~9I|}7uOcCM1yPJ#&X~9f*Y81mFhw*hkkO#HB>O47d)pnbr2;5nl zpvfM(2p)@{H(KqlbRO}3mG)PAk(ioM&NTxH>H-DAdHUGr+*Ul}Q_MmQ>7KK1Y4*Db z$2tLkC=SyRwA}=C`dsr^dF;feT~V3@(lyo;SqK_@OHO1A_H5HC5BN1$1ngVF)_!$* zo6veW%qxHMJ{)K%lGp!A;wzko}gF zR^dYjZ3+9sa0!m(%SOsT(9A#sHN{Fs;RPcau#c$b6GO)72`!lp+24*FG%b+L^-xTd8>}5>vPnL1x#}{SU zA=Y81w15nP_;R-&-*D6St=YvA!Ufg1Pgb~gk~8f5?O-gY1X;?fr`rB}isO~5%uAPu zvSY~qL}aTWVwU~&N%8_sB(ifO;r}e7H(16q@sma$AJs-Fud!Hke$eljBH3md)TlIv z-p%7KLR+ZD4ea;G8hYA$bTxs_a~{6^)P$5?A2dm33m zGk&XidZBs>p7Gl$kEC^VlWCv%?PC$W^RTy7ad1AWA5^ujWsz>F$I z$-NLUHM_*0Hu<6un>$v_jtj~e!OFoHdg>4RDwyJSu76TWC0x)x<4}+|!b8X%CNpk@ ztQ`CN@e*{yE0?6Givx~`Y7F6LS%=#`&^w*-*$6D{avDN>NRsy91h+50-JN)H&Fcn@ zX;J8AT{&l7tv%lN?Wc!O@WqR&6@$xhWop?aUN}~bDH>`8Odiw)75d>l-e#UFUduho zw{*P+_=JMij!cUd)@m6M|Fg=nhN}#oIthvqbgYaq%AtjzsaXqk&ZzNd95A4dm~`Lx z+VB5*YS;rSb|>P@tVKL~D7kR}Ov)h}P`v>;@U=up*5XnuVJAVF<=dd{g^OVOm`9dd zI!okU9Rd|pfm?Q=`Ms;TjhMK4GqOm)0*c_#Ho)KAfX(bQqEpA#i13j|3#>{-GUu8%_*6DjdO(0z7}NM99x;bNKR8 zqBJqrBe045o=(iPvu3Dxo~9o5L=<0v1Z{cGzP)^V3auDpKQgYw({}UT z1(pRThHfOh!J1fPh6z`5ZI``>5_s}k%ZvIpNR?_3Hj;{hT^@5^Khg53ec$>nf0UDi zKC9NN71$bArwD<*?@g}!n<$PQhw!h~GFU6n?o^kG1Okw~i@h?x9VD zVYQq}s?lhKC$j`<1kGw7j<*h0@U|3=dYYkbsOfppGW>vw*84D|;7*3Uf+_a-t5X!J zv2uXqNc>I$_pchSWW^=0|3|WDU9^Rp|kG{^!9boNlm|Kpy3X$;7pO zbS27+)7)Y>A9a|xBK{ldx*sjEIPm6q+^mTAA1m<69KcJl%Wdgbc=(g1R4P7aVAYK9}>ol+|&ecJG>+Z z8k6C}AJ$hDaRCKP@dG{>b*JME6j|Z`T&z2#ROS%i#@)#=XTtHLwFtUw_ z&tl)`VJRL1`iSCQ7S^Km}|0Ls}_Y4IDr?)gmP^ZLN3tcLwc=WzIG@06ayA3tn zhjY;+9A?1TDrMM%oeL^A5S(@@w}%@+3;4`@Bhj;SG7@KT)n?4OV6kT-VHEQCj#~Qf zexRIamC~tt=21U$RiDMyftN=F68hW*B_*18wP5JnsWN5`siEsAp*C#j^MFNx~8= zq2niyvnkBs!&<8=mpG|!UxJ3RtCxGyye2~xyDWhP81&`18kfkRDI$^R=%ax(0- z4e!|B{BE+7It(Qu-S!h2PsnoGP*-(O=BIDo;gL&X@)I*1?SKC^jdAQNuq~DvE5b!4 z7THn#qd+~r=`mH@bbr(P$Ps5upUTkr)&V(2&jrkxvC9+)p!*l1JMXLhWgwn8@~*0` z>q;U_yz8JSFBaFe`~8JAzXe~@vRXn^Mo3mt+wR95v9OgeVQpX?*q_S*SLmMqUxmRO zV(jk&hfebJap}V;s6~s?{SlDfoGb==ftEZzwP!fo$%f}N@UTs|Bl0UBhRR_i6q2bu zQB$!Pw?`Dx*W)xEH0XYDzX_T?X9h+gsR)69yEEX3_oP))fF^PR)=;*0F>d0Og$vU! zdb=QI%C-?V?w^m3TKTP}YON?{o5P->4!c{-VwNdWp0A&Fd()?s0lntUsa#=f87wt! zG!>kD?3`cQkiWpws-1NahM1-9vSoc)z9qv?zd|k;TvhsVB!B~AhK9|+s=(Vek{rSS zO{I1&)CSIY7YCEUdR4A5wYi;=$8Pm_nK*+ywbPAKA>^9F!c;O<@ntlz**k?yB3*zm3H?q#7cN4|~I zboZ`@mmM*UG@ilKaOgGC23D;{^6?7}J_Nn+)cWH0O2IsBA=N zW5?$QpKkwz9iWj~fuE<@Oavk0MUy&x^OQP_+f;JUhS*xhC zBh9GESyv=5bv;Y(AXBNiyvc&eZ9>~#0?zUm>i~x6DUFkCld|%2Sv3ZmD}6$$#UOb# z@XW>OAhEj6^RVV?5^0!~Q}o9;XWcP_z0SeY97y)2_|MwW38CAx^{#HRn-;=YVus`8 zd`TRsD;QK-+=lgYutnJw>5y^?L%o>BZuY&+)?!T=)xeOtqV?6r+q%6N*GkU1(h?VE zkQ`Gc(H(EDjo$hZmi3nE?{=^X|M1h%kM8G1!0r?Izi_`4AV_Zp?o;BHad2<_uxf&o z1=F`+Fi5c+J;@y>?43+oxifc!nr&aSeY8^i8;3|4JV=pP#OmKjJx7xCepG>FFOO?g zar|FS;TO5)XmDIRC9|(i`;7~q*`Yf+>c+mil9otBNl;C2Yc1R81UfOcjKzBLVt2u- zo(S^j+Mp3fDTj#)aVu)vnRmvKFi7U|2_l|h1q1BXuj0y54CKS8(cLzP%iLOPPbs-p zmb2>4$=Nj6V&QT~4?~d{gANy_o(!6t;~^0kqFI5l$JIMZCb6XBMF5WO75zyz)25k)oFDa`)Hk~f7xd;w=EUn2z=t`S~dGbG<_`TLe z(Q=*rK=VZBQkQ0W{!VT4QOcpD7(7+3=BbXVvVYGanX%!3lU32J1b2ef zI@0=$%=p}#t~&gk@oRNq;QfFYZ;|S%gT=6Uch(tU@(5=`iy3AZV^o=B2FL*?x9By= z;+15Cl_vkBOxzU3Y-@)9tlFW?SFNqX*OZ)$;)d!)`_*T=+h~7)Fm~pS(0CQO56jth zbXMAuK=tRBN{K1uhXt?VKm>1nDk<;Vyd1s~$2ETC*cQ$03>hC&@Ssw+#Mp+YPmmc@ zVIb%0{uU%fQ+ko<;Gj)10BU4JeCWk&+;$GW`f+XZF>asv$i`N^GHtQ3B4a?}b?Rj~ z>Tw(-?9uDEj$%dslN76zU9uleZkVifqRhKE@YfJTCA=Q8$%V6N*XN!YwDlYIdsWc# zu&poC`-#uKx_`0CE*%=7zgJH^8R>ewS}|b>3&)ixbbTTzGG8zs-c7zSm z^&)u=dCVQz$lvXkz?v+)2GfN(2IpW6ifKPjEUKXvUArT?oa=#58T7LfxF77+lq6C! zvJteJ5*wXOK1ac2NGS&TQ>F^3SifQu$NF8dP7VZ>U^xf=)r0pLU9h-kHk1|KSwBs( z*Ft08`y%$;Sz2*gVO#&ZQL)g$_jp4$&CN0H^Pu2P6~Q6&m8{z)N2!}a8_F%}8LEx^ z(87F9YM3$=fZQNo{W{zSUef<*cVHZU@xu=InsU{HiQ9c-1O!IE`%l4<@OD1G8P{KY zTy&t#UTj?uw$^K0rzT7EhAXcj8HU$Fn{U;PZan8@te4DbZ4Y+TuF zclbNI&IGI9h^+eZ|F5Ed{#pC~s^|xs`_|9R3|=nvt)dPLlSG)9KYybA-vyh9;H8=W z4sw8P0#a)5DFE>A^Z&VEll!ZagLR~ek_-wW!N1E;#ud5f4z9Wy_t~D)Nc4Fc&MNfkJYgrnt zF+eYwNw&|c&%zJME=bin(M85D_lW<${(QTu1NXs#2&OZIX25Z%?egYvJs~R)0h8t# zm4I`#R4N*WIPe9R{1h(62PU9J+vKtn2K#t2ClHDzC`chwP;)pY$E0!2e0bu3e!+76 zE@Qq97<7Dpx|H=))g`Se;<(6ot=_0^c-D+oZ352+5S)_Q3$3%_Rnzgk1q5 zh}&saC28&kg%afS{OZ+3^+zw`1pK(|kpn_0rCzXetnu z*yU4*F=?sH`cg{}0j0*t<#~t4zA(!h>$uIjjv)v_w!={dl%FrYB+5ZlSgsq(w^)zjwmwiphRLC7*G?Z;8kr-<^}q^@hp zx3t=VWx$hjGxu1_FQ% z69|_n)fqMOuU^Fo62O`6-9T(R^8 z;7o6Re<{!-;|wW9kJca%lL~?o*FY<1#Rwc;5k9pBn_l-B=c^}XsnR+ya+JKPc<$Ug z9Ulae?}zB#Fxz>ViC?(C9NAhS-9Ks`j8NYC_Z+UAukG{A`p+0Suh***5#^W?{%p*t z2&y3&6A1}csmGL&q2+UXs#k;0G@D(7JccgEE62fmuE2wb!Nt{H>$I#wKt8hhscMWT z==EKL;hOn#zv!cu#TRC069t%;`SSL@hJU;JX6Nl`72YW%WVj8hl<-(qhA8Z?>Pn0% zLWL*T=EA4+)u1#iE*ZZoTgcvYpx!D_1o}8HYb~Iz0uLeEA zNm2X~k|53bW0UtZUu7^rs;K+awj1(_Ws>yiSd&+n;`3~Q<6voQ%;{z9mcgX4GyLs% zKN>UXAVcK*3EDfruTb#uc%*FXjDw@#i`7I{lPfk>vKp^4-6Ryz5hOAPL^%B|0dPi* ztrIERWq)c+?$wASkM}w3b8uQYKCUi??m3U;Sr_egX5{7}el)cQj51PqN-*#0x|@--FSVa2TnV8J7Yz#2aujPiPWeUE8` zgX8Sz3B0R;gOefc3^bWsjDQ>Q=xPg8(Bz$VG<}AMCjpVdV=h8qK|hdTn+OF-iSayk z1%*VQ!itMQg_f1IK|(Esz`|CB8SX*T9=`<<6Xhz+GzZs6m7;5)_m!acE#an1tFY}@ zdy%B(k)OJPy`bX@Vkd9Me~!{;+P|;E2SmbLMZzdWO5P%xx&>op zHcfD3R4P8fWzN6cAjHsvkZI)sHR-HA%ZTzI{PEX@r=JXQ_r8G7dX9fl$JPVBA&Sy{ z$8)s%o<;tY^Jh{Be~{Pf>_cQ)TODM-k#c6+{{}knjD(8?&pDJIY?>BbfY;2~PlODO z)MM>+ijzu?t$6vx@@Mf1SZe3xi+{1m&{k`c%c4OV%A5AW?&ce(qo zLAiJ5$e|nt#M!U-)wrFa79a&4p!slRdrsmC9_;F<^qyTJqlh^}B?OrF12D8{uXGqcn=z9JI`fZo0BR_jC>O2;KIH}q@&O4ng zS6?YV%k~%ebT8ll8p+nv)0@OYT`Pa_0bXHdK%{0kV@OyQKq#)0$5eBj>TEu~N$;aC z44uk{$Za0O%0p~gldm+{I2uOJh56yrHa3RS_vmaiLAsSX!<4MH%U*|x*sQk0mstJ! zESHNH#deoN0*Y(Rb~oLo2`_!$0GMfn4li9uC}kwgUgyAdIo<~ZQ^TE6)pZ$GBL3>& zV4IMprlyeIr7G8CK=_}wvBC{F!$A1@`rbS~rj;q@ zF?9GolH^~{-aVKqAg-^iMW>}Xrk^1xQ0j=rWI{Z(_N=G|>f;#&KcFCus6UJ3=)(1W zll73c=f55K9xtmz4Y1aV+MysOxe(^%4$h~CM#1?Ri2y(R>W+5}swHYmQHPK@yjyb} zH=W5AVhIj!>Nh?4lj@ zh)g2wbAqSuACAqk0LLA&NZbViI~6fAD>eFMYB0-~{pw(_c7DiihwklXeM^({mj`q7 z3!`8pBg}FCKi%?&XL?eBuu%cB5Gv>3M%%ttyZ$rCdpCi85Mq;qm0f`_ynE}@ZxM)fkGO;VXGh59E`rcj6<{$v!wqEejyq=2 zx#4lOD}mlwyt?#7`h0tw!M&Z?5V+lqAGp2D&FbtrA>zai!cch@IbT}~+Y9W~-JFYl z6y@9u!`aZfTWc!8~ zyr2Z4D4=u6)eiXQIE7&j*9TeiyS_`zSp6e_-thpp zJDgq6$s5`MY8TJacWal$oZzuGiCwm1I>?Sd5kP8)vqe~TV;*2z$L5u4Bam@g+105< zk+!*TDg`_32_m@b2|2$c+X7{_(!H=c;c= zm!ik$O#+Rty}d1ai%aF}A5?C!V9L34zqi1k5X@;= zg^m-Bzc21}s=5O{S`_05g+>tfh=PKAo|_R_wk>mpmU{Od9%wttCIQK?#&160LQedMC;ya7SWcWOobwxrYxe)$b0!(xdQlKFNS$CEhf%&r%- z#O~1Wana4c0zW-3OiPx_ZvX?u^zu>)8Ei;4g9gm8z02Frn@7<(e%~6B&G}mIS(kJ| zIr|AF1e;$%Ql-mZAm`ziaXr#ckx2H!3yUjR(#z1xcbYOk8@iqPHH=kkB+2+;`j&B< zzlP4m{wbbe{;B14aBSS}gK~^6XfYjwFyCa)mBC*h&V*;EoPFGe6W?NJk!Og;w-Zz$ zJ3~w%OMa*3M&*A*h0)Wsj*fE zk_h`iTd$W>@geyxu)**^M43PRc#d2rqZ(6Pjp7(-NB=x(O z{%Vsmq;C!Po_zl(*zfLo#dZ=TNyU4ZVlZ76vsG{G&TpX?;poXfMM_6uZK0n!MUtfy z&oU;1_qcRP;ATGkR@ZuHAvwdqZtEq~khP-6&2mAuk?I-3{vXxl+27qA4YW15FHiR8 zlpp%96Zp8Iz2@mVZd8lCI(_}vOcoi?T%uB}sN6bWlO$+uCe?#k1@xO2!LY1%ynz!%b9o2GDNS=wR>6pOV3N^72S&Q#o*S)e=}n5Eb3Be0yG_Pw1ofC-p+FD55{F=xg}h5{G3G(n(k~$)Mq( zppY#Ak+(romVQj%!8!qbhIFB8{9ok~E+F&L|0S@R1#B3m#s7rX$JoaVjwP}Z)57Yz zd%3AEu}re&8@ub#C&WU)(85i9hD7A^QmklWWDMp8Ar&myJzjF|n9}hi)HQ@DNdd&; zW2*s6mN!3X_L|FyMQ2q#YELO@Z3|$}ea8zF-w&RagL#dFB){&Y-=pNs-R{hKwM@zB z--XDWTg@Vi@|wbi?*~B!T^|kpBvbJsYcKD##`c6`gTbQ_lI165w`xZ0>~^1P$;!K_TK*IbE!vl#0SaFpDMNN_`;a zAKxh$uvm}D_|>`2)Jq|Ix3=0cVg_cS1Jbc#mm(T`PH>BudihSP_1@o7C{(bMYeG21 z;h+{G8>?B!x>%QRe@nAoe2?K22MaFMBc}sK-xzQ31@faC{m-`V9du1ME5dzP1&6h* zz5F8XQN;_S1IpeT97$u$mj@0Q08XFqsSWv4udo|AHjXn20}MQ09s1^RM8V0E3Ofp|J_tlshv1`^ z*0$k!ZNIHJ80H}>@pr` zf`S#?@roDmi}-&QTG>4tbsvW6;}2mk-_^oEzKV905}(2 z+Zi#83&7|an`B|!how}rq_@yt)bq@0{8Q*>m<2q}2LvbNb(etMeZ0F75W1b}U zdf2@R6%(bzU(JLQ%G2nre$+;HDeW~m_|^MV|7oa$r|ANhVSlVR1M{tQwrYogPZnAs zpm*P=vpXEIp(7Mrbgv*#iNaXff_b_-6@j0 zhJOLh8Pa$4$`{B}3=P5`0TAP%K;cEtliEC_g77b0{`6!LNb6 z=|+EdG-u=Z5(YxJ$es!K_8l%I@O$B?l%3!7>|G%j`Hl;QyS%rdK98XxmxA?9V87r+ z1y$}~pL6B+hSgpHV$pQ)dt4;#PxPqEnD7k@!@21HS}w{N>{2iHXS65;oKG6e8Wj{ZdTps6P;g_(HVf$P+F~L5 z^U9LjLn^35B!zCI5zi3Q81>z=P^vjKQmy!eEwiUcDYi>u{$h^mr(rV7xH>VM|A(Zj zj%)h+-gkr1-5|&)=}_rb6cD6K$sr;r5+Wf8Y=D5$jS32agmjAZ5RpYw10h4MdZzO}c6O}5(_cQpxx^>o|w8232c`Mh!m%6q0gOnaMu1jj3 zqv#!Z)3s3E!`0-^h4?f2Yq*@FcDLl?$C9Y^8RfmsMX9QqX)`jolESK?(?P{BdFQ#- zEqYB(k9pUduwl;MCl$Lofie-_*~41i82|M;FJp+ z{sE*Bd2OvrT#gXq&K|w%_R%al+nl_V%n&)#o?xV{RLw-*ax|E$CEF6Xl}Wms>VHPf z`rdUQ)BNMZNfYca*SWypgMZTVqQ>cyV#=xyeXL!+4A{&In&|s6Fd6B7ccy!Ucg ze$8vges&|3LDT6avZRAv+m6zt*d*oB$6?_IQQ~5bilufp#>u}PmWd1$ePrXz{_{7I z4eLEEr$PqomDm7eVq!7!s7lDD!FiH)x@G1xZ_9rn)uz%1U06(ENhUAzIF!F znzKHI0cb?EhSX{_R{xr8JA2&W?BMGzJ+5$L)->)I<3#kmTv}_ zo34y~NE@qif>_1IKG@mV3bk=5yH|g+t2VXH|K%Q|1}4|)B7F01x}_wMUC&WnaKE%n z+x+>3O7fRVxG2}8XNhTBk*NUJZz_1i0RmniF`bT~oK7b(!~d|KPtC(+xLg)>;WJmH z;yC9Rm;9jK%0U#;Ww=E48}z;%(?UaHL2pz8Q>+sP`f!z2cfa;h{QXp4R|%qB^!{=+ zHKPS_gLQnZlP}gM>(dA8ixPC4a?VVP3Mq$fahe}#<#FUaAS;2PvPW~XI9`EaMsQ0r zKQsQm#ov}00^80kv80O7(P)!}Z@&sNg@KB9TEo;&;uZ7e_P@@vI>17n1fP_VA>Vgk z)kEd-wy7Rd+&o8xC}NnXbQZ;lZ@Yx?KtDm`Y8!tVhG(+9ZnC(Cx8sq_-@ zmrI<#ibyAvH&Qn=oM~i@c8W`Wo%So2pOON__mj`2R!*k>ZP<#-aL&7z>TmXFNy>sJ z-Rs{kP7WU2s5;EJJA<*U^}Xk@<9m%0wM?bb5?DT?3BQq~KcvPz)r>D!e)1meKCN*H=5IaG!Js+<0+O+8WdLWvWsu z(I{CjkHCMEEE(cv7_!8qX`|l{v@RpD?G_20e zvlu#y`F_5Z1JgZ9^>yu-s`$TxdaUQqDpTJ{^>Q6rRGOg3T zX+|x*)1l~15M=H2r;UV*SgZ!Qlp;?<6bU3L&1lOdeT?T;%y_^5uDR^?gz$kKk5TbLDdUm5ClM z`5z><;D@NY=sw0-a^YBIimP6+1A7v|6S+iyN58-MUl;&Q-pGG(>4g`YMdrUISlGO5 zYHpU;HWO(JJ}@Aj9;x9^52W#XFFIPA>TLelKfapa7Cv?IP#^6{Ev21T<>mJDmczp5 z^%?N|2w=%N`bxpCc6$!)@!FSC*Xe=W^Vci{B^Zv_r*ih^_pO3bV$#L){XC#ROAYu1 z=peT7mpPsZ)_~(S?K{*Is))G6qb(TSEw!*S9z{knnyg2Tx%Z#Ze)Z0<<>L44tnq3K z{;UDH^dw|;0}N}DkoOCknh*b{NF5I|*lnd^x#_ZFVZRhdT@`IdQWK1VW>xW*utt zTn_9>yg*WnKJ2_8;>pSo8%i~YpJ{k6Oz5NoPl3RCGekp=Okq#yA$%3#Y+`nI?u;^M z?KMd7F|ek!P^kT$)Kjjqi0V59oNrqw!pR z8uf;^_wwMs+Cy8+fu*LUjsOgI*!SIcI`CxxoxQ_ZQ3F}RB&ZPS9dKICr6vEaTGAcjZagsxF& zh7G|{?<1}R2CIhY-&2kaQi^yGet^)mFcg#P_jOR7PRsG3`=Bw|8uWPePeDw4wwzh! z9b;#q^v_G4(+wx^=m=}TR!Ztfo%i3mBFvmt5>Mc9QRTAL&wELSHS1UO=09&-g=6n$iTnPpC~l{{I!*m9KnJC`APy(n3JgIgZ_^wz zih;ouGqb78?^3_Z7E`ZBmi8?Sx>69Q!yq&sEenvcgRs#UPuc$I z#`B8M`pEUe5IuY{Ej4TL2T}BExRFaaDL5}O1quzm{{U(m$y&@TopgKR!>l&Rr;>L; zQiU|4iK67yQQ1^Zd3Q@iIfO%lmzqPY08!p`+iYtSW@K=S$r<7;U$S6{ljtFrEjka^3f<% zo&@ksjCk;Mzm8y&J-Cp|=IU84f%|pjK*g*Kd|ZS_)O5M!Ysdj!T@tPI$xI4 zVf5=5{@%AvtQR@swO5hh%&&cLRxS(-47nPNR}drbT=cl31ZM@=IFxWpf}Bb- z6&RiC#!m*B@BC3id3s7yGM={_$=!AG2cQHZS}%)Hq+R z_fbR2i069$;_ebVhCYhsXr zR}0SOPC<2x?1_Jm(8l1AhSnaXFJTz#oRcbVPCak`r7MQfYV6*d@W-^}3$nMWwfR1H zJ+ny7)GJk?`3)BuiKJlc{IzF)Ken@oRn%ClL{8fI_usRYqbqM_Z^Cj8>}B*Oe%efY zy1Z7ls#Q;rCwUWB6fjEaG>L@S0AH8;4ytLjL1z;4@~BrOa9jriu*v%UAO+y zS(5m*NaMMp^i-jFt@DyS=xF~9S*KRZ5h%AK1+oKJG2nIHPG6>FA5$Q7QdZ-njp^1> zhAgC5LL&rgVBja1vgwtmFmOxP^xx~x(PVe^%l?aij5?qWLWh5m6BMo)?jpBw`5Yd) zRS!h-5c>EeMWhG(B_eNBYkR^HY{uYOZ`MNtUQMlAqvn4O9?0;YG-P%tP3sz%ZOxKX zSRYR=&GVA+5r0ny_8;f$(dRs-VgM#vIaz$Has6Z*KpbMm=W6fnf#Lar`9<*`Iy{sS zC7?1WF~z#@lEk@@{O31UZ52zwvA3W>jI@z~-y;wFj~#vQpl8s+(=eAj@U@H$qoZxR zKasC_WgFx1S!OZ}4KZF>f;KlLyr0TvaPqB5Je~Z|-nunS!uq9yDj3Z0c2$Q_Ok+Kc z2D2P8F_3tpdx23^Z93GRK3aR5&2z5DG}^=z8AgNHrV+w=UxaT&78Xbw-b>B|*k_4_ zcdzxZz(yo>;|yR#dM5YPTUFO+W16cxJS(LdWo1%ZV)O>ybh#|Z1bm&PT;#_P8DCLU zQ@Ly7ly^Jq{>@T?cMFFQ`FR_&S)Z^`m!9C=3A}}t61eI^Fxe#}Ynp5U-YGfVkSt3Z z1`~@Qtt&ph`Kd%S049JEj=@8*DgN>Rdv9M#mSo9#LIw2W#i$6ssN5Ty9(6WLmZ?{@ z<)@BK+h2L>WGmRn_?LrQ8>cyqdAZ-rxEjdM00CVlxf3ny>8u7d;Ul2ZF-vM9wg|k@ z^bae+sC_RTaFTrsg@9x8;zoDarS8d#1<^Ux-tTgV)Dc)0WexsSLekFD9WHS}EnU#s zwKF$T5obuNjLwpnbPZ1OO|3zF<{TLy0~zTGgqk)S=h=jUy@QZdLgC_8RmM{)5wEiRVCckoZx^o0(rpsT`y zn(70ZRB?OWy>ngr-tjkkCOWbd!T!}8-KDI@(=GivC0IS5W4#rsGuSFb^c6yfzR z#s!&VB0Jl`A<-^fUp91YA)|)Rz#yXaqLZ$y2OPV{l~Hh=og6JZSU)==>|DXlPG&G9 zCMZ(GmTF*VI6yetTwu)EEQWsybx)sh<^y9LF}E>K^+fymUItg9DYPNpH7s3*(XF*Op;jDqImKJ&)--sGoh+zHE41=Gcv*7KOzm=XXl;u z37#L}f@#+JH*e&a^D^^~I4+((Cq~a5{bknPrkwhs&b80OSKwecbz|=@i8}dZ-}zDE z`!Q>T28%bmp0=`xBUt&B@n|6L9dMboz}l6_r@TDW%T8i<&AkGs#Z|>S7I@wm`Br@s zkgcjrZb^o2!YubG>FV7XCmD;;n5)T`lA*;-eJK##xvHg<1vTb+C&zXOK)D}3h$z{P zr^Jbxh%GN;zcFqubbd(m#vNyZ?OT7$)Hy99_L3|ThjMay+Tzn zqj2|ct$DDuS>I*Fm<8T9*VmLYED=~c%4io80#(x^RQgQBehV4ZjD~9GU0n^_<~&B$ z1~~f=hItRS;@nJkymxLapnq0=oOxhwB@^_|Y;b6^^Id2a|I+;I@alIf%tf#uCsoC3 zJ8Jrm|NRVqfw0yl>`&OUv2Dfa!t+psbi=W;zM;wI@{~lHojQ=W8+?lPTJe!FmQKgUiQaFa*|r5yhOXVd4@P|Hqjf7sOvVr>-98`D75a;e z{JAI>%hMNW;Yk-+KmS3G-dTMg_(uIw-hF`=85d91XWxPRS7dn?NT#%oFQw;n?o7mS zk8>YqB9(&|d$$rkj?t8~wbxqO-M(TlC@I(^>Y7z9blKp~ZI!$DPUDpwleFy9n0Mg0 z3{V3%VN7RRb6VL{CD#&l4?DxRA3uo4A5)P3 zQz}Q=WXhTk4i$2?21`lJ?zMyr+V}+T<-c`(3pF+3bAzV_Y!%~sMJEpT)AUMlG0&^m zu=Ix-B81q3_jjhmT(8%9dKjVXJ$2!!dh6m!4ePD(Q1-pGxvFm+ zb)Ta|D&E=JT4sn=$W`a-;LJvo*wJtdrDJ=XOU%#f$25uj=iL}TfR&ostcTn-SDNJ1u+@icngHtbiB`^Nkda~F0df|f)`}|=8JK63)n+Ljzy_G!D3B&w19HdOd!rn9DEleMPEUbvDEPkkC3(056u;5~ne zwYjvBh-{^l#UMI#mZ_tryBapl8HW_1 z9>Tcir)QrlfB*Bv<>fZ7oy-+zRhP*eTUl+r`6;oC{`Dze{ekTydAJscEaQ9K8&&6q zp2?hLTsmGtXh-}Ax+*fM(iT7Sb?bAeSm&usP|L!*z3r;U@ObP zAs+0fLlNP?_V-ojfkGHEn3}5vj04b1yyZiV+(Bw9$7ja_eHM@N}sj?K+D*0Lz2@ z-sNH?u+5PU6UZ9_q)W1-v`#YQvl(J2jvDXs*C$B1JZmF6JW^yRBKK>-s1rGxF+~oG zx4qwe?eHP$D7CnF>4Ge@bG-SMqMV;v?IL&5L2*Vj;%0{Y(TlD{1Tb z0mlAsL;c64{pZK=CxJLZNNWtvhhITZB4YUg>oy%7aUtdF^&k2zyT9OLr7wm1*iOHD z2f;9cras=uZ6nFg{xnVDIQv(4X2exi61~7= z45~~Dk1o)q-m{drp>ZLD&bLaM@zMMi`%t)Vx7%}jH)f`w*#sSZY7{vr=%9$K*) zy#m{QmH%g&wP(S$@TzaAHifHFDM!Y{(}1YknXDWWRkN0++ubs1hX>x{QUZ-0S?MhY z{k><=iwjo@XnY$Oa?n*RAO1o*Y-dD7qPHVx4faifV>)y^7PlLj=-dO78Pv7^p?dMKbX@p(gt? zKD#?r*^kH}r%p-kh0R|g6Fdj^Y|Umbo42;&`81w7Wmk5i#y?8rHcvg zc~k6v+%%D92-8^5{Q9)&1d#Nu3&88;1K^IxU)1TD_z_<7dM~CX747}cQYBd;al_=i z#Ve=iYc%jJ_*oYntbuM`;c!3DQ*c6(^Ya8}rkz4;A0HpwMv^m=*2CsyY}o8Lz9V8( zufBxy?P~xTGCq7Ms2J%xfOpU^CF6>1&8^M7u2lk4ZZ`*~F@NoWG5jhlXJ*QThuv5@ z0bpPWyM}wQla6PZ?1M=hxUF8OAma)#NdTDvDZ#<(FQ$W4yd8!29@&1Opu59LPAhbJ z1Z5G!jv+!D@$Ktn4;VNY{wuj)H#ezTCgZN)M{%q-hLS^FNpZLK0yRj@*UZb%`eU zSuWsC1LXDo&C(3c@_g;d1OSQkLps*oGW(!?*R1T%+t*!XpVHHs|0xtU8?uYLXPNkx z_g>&$c1s=`HNR0?<3nVAA<|&w8x+=UQ2E4y$e3Ez3?DWJ-z%NPo&%KX_I|VBr>Q4L z0S}q8u8p`l)#foNTPR;%gLi!<$8Z|Db>eCJ@hp>z=BxI;h3W#PrZO1=qQ$5F3JG}M zu1%$iV>F@|;uz8V!~mQc7d7hofA$qFoctjg9M0;Fbu4P=S3dpgS<+>9eD;Z!O1<;$ z%E0L8c+G6IPgoI5$d*0jW)lk$Z|9{C<@<#7qu-LDpbh~5mXm(-0(WXKjGxA?+I87> zg78l~@Fp5xxG1z>f&jlm_#?DC{*l(eN9hwM-l?%0W? zvt!>w9P)PBPRnSkd$B&#@5|bWVTKsulaw?ldyNQQ!!KD%xWPjTFDHRGd8u@RsmuXk zG9J$4XRln^@zVU}m^epThbdN!T=lsA`|S`rXK}`! zs`|2sh3OodTIIW$^<|?5yVu2qcjARvyhB1>D5xiXdC6lJz{f8Z_-J@JHH!jM){B=1 za%)Mc>s&OK&}!cX?z(^TSQ*2XxbN5;mg=SgU!t8)@RSk3aR#H>x;km%HK$^S;U)XyJ#EFqcC)bD zqZHg4l_bqBx^UD)>|CO9+;6OXh&;!LG)Ufnlcp2mg;_m<%ODb`xoAGcKP&i0?;dV z2QNqLRXwRN^{o*TnPB?V0e7-X2&%PX9;Sb}j@*at_bEW)-{$7#foS7Rts9760;ufm zD$1jqv)SF9)1K>nDe*5Bd``%H!q`|q#zde zKgvifcfeW@edu$>Cd(bG*TH^Tj577{{+DYt*;CqUoHsu_WLiL{M2I_Hgo+6e->w#q z63m%k(+6?L=|Uf$6ZvoiKHNrgw*?c*0CTj;^gN~+NR=YF9H|y&a~kio8wI^T{&>ec zSnqz{M*8g^zlu}tD*6yzeTYpvB45*g?Vhfz?4rBEvi1kk2I?dYt%xQqHxU>%9M9eJ z0zT}USdZo%{Ct_35IIoIk6S;#QLcq_%rJaW97Us?aydi&t=i;%+t!g6WwA-=0}4uu z9(FB0c+4e{3>UIs18r>#9Gms+__2kI_nh;XC=&yp>iZl`c{RW7%jQoi?gdV2P;A@X`eAaYqoe6eYF!_O_ylgm{+2Q?Zzi_C{Hbi2cr2q#WLSWTt&Q z|LfLGm~m#!W*q4mSbO;dIxkyO^Sg0-qNmV^!L_v60YPY)0n=ubC{Hq72A0q+S)7<(uw2- z*M6j+I=+4jUmf%FQdN1QA&=aiKMgtR>tiL!n2VAZ#0X5rCO*$_$6rsm&#H2KvaH(b zo}ae%`|SVmbv5yB+W2WF^Y5R?vO_SOMk9q{UzZY<49C`CUi|nNa^Zswvant}+pKwF zP5()fWS~W~(E)5ib>1>yzyN`ClG5_OyD z{pjW0T*=H$R^?-D>L*!J$mJyd37XiaZDa1+oMgy&yoT%uiU;e5x!<{*hx_+WM&884 zL?w8?z1*WfHS zgV#M8Dg){j1z4L5=C!t^om@E(t1iSY#V2y79C2oppQ|;zn*D{v%>n+R=0YOjqhK^) z7OqV6`}O3P4?sPTpY*5OJRg7jmTYGzct0bq_RYbk zQsl7V8|o*1592o+|LCqQnY=51`aQ?I;mH(Z$Kq#@oB~-83(krcwDQqX`p_@FiwBg& z#oe2CD8PJEB?TL~dpUKr+OTRsIt>*)ykX|SvO$8qR?B0CzK*6m;o2J#H9x0 zK@|}TP88XUJ-Hl4#LLE%*mCz?C<{ABDG73P=yC8kOftcS^h_+JqXpoq%<~aN-TuPM zU_7J}w)gz|fHY|fZqru#g|&ajhXcJ9tGf^TWmkDGm6kxc zR?kl)=Z+;&)+38rdpN@L6DWM&jV9UKlfnw9Z-uWU2{OWbytV)$JZ^>D{zpPeu0KZ4 z=A#}Lh$pJ|xhaeCiM+SPsE{8DzmVx!`YxYXeZrf5 zbii$zm$vud-*7ryYj9|One_r8I4l>5_9lPx$DX*S5VF(b`D*rJn{vF2gdX2?@8p}` z3mcVQz9WS#_PBYkO}szh?M%<7<5AXm*SqV2=Aur%IWT?cv$f@nySH7+2)U!^4jU3T zhg?vHT1B__lfJJo_7v}(<48iT(DW4h3y|+O0}r?XVnwKnv>|u7EN84#?i;j>ZCOkg zr{$d6)8A;ImhVx@L967T#UGLiMw*9o4=v?a8)%nT%z*m(PaPOe{i~L2K81FVDEKDe zL+$cT_B=0b_9&u`Dv~+dA3QEzj4=KQml~qx0(q*q9_dE>?kBlGst^t!&>NyldbsmQ z>K)Vh9>&ebt7GxUe!dczYVGjYi2l!*&*xf;-m&8~j~*>SS&2=35sBP)N7FC)278FA zG}e{X)}74b9UK-}kUo400FLY1sVUtx0rg@Tj#Kl3$;y)j5Z;bi4D$n{?F#Z3cA+AD zlCtIEuf4w&zhcs}b@-usokQ>MC>#0y7*>qV_g-E?gtnzLQkeYiM<|nK)4>@@Ty*1~Dq6D64yN?s9drzt@3DSIN zgC`BXPkxf$I)^)2o@IU840mR6)CA}436DDz;Ds|3}p!P z`XNOTM|U0`&+NE#R_-nx(bSp>r^W_T$dUf^%wEEH9(Xk*2H}Wg><2oLpW~LrB%&1* zhG{X07TNuzSl+%yiHk6_;YAd|R|MSxwdo&j#W$)+B79gq|DKk>Htc7vK3Fy?D)(sE zFfY>YCndz|Fs99p*%1~ zIrifcc>WSxiaNPV#pK4)$%l;}H*{ml`T26qauZEfJA|VNALW_}imXGTpOFxBS*^MC z(>;V6zm%Klf=Y}ycJC==KCSj@RUz#4oFd;=r|;=|t7kCnVmDZ_Kllj0|8=VBoRU{8 z)bF}hpGTPv5`KqUs5MG1iz2^uc5QY0U2T(1<%1s2H<8Bml&cUpuL!V-E?LcHcIy&D zodd$o416Roh~K^gufv1x&Q5*xy=Nz?QrE_s(@~exJ+GpTQ-A9e&GIRMJ0(U>w?Flr z)q9Sd+@E#EGJQFcow*(Cc?3!zafLWR0mPu`cND|agR|_L9sf*$PcSPv8_6ZU^+NA= z3F#djd)@=sYnta>mU%{FEF(y|=WUAZF7;M5A}tm&H}1VLNITUXbBZ-{QibmPf&&zV zrs5ScZI$VqUBc9*Ymg(*_RfHuu!?!KJ^`w&zG2rwHA!Zt&cX_23QVD|oFajw1ZGJ& z2>d)diFN6|R9kRcM`fv5?MsEGlyGUl9bq-JJ3iQlKgmz*nS!t0kL4X`5nnKUso2xD zhR;l&VNx;8!cOfD8yEQXqPK%p?$=M)Pv-mDZcPc++x$JchO;L@@2%h7{lSF5Rx0@F z|1G}=5h~<>DTOrxlu&}a6aG4~d^D#n8sv%c-r`1rxU!pp1ji@ucRUN>x47hOVCu^6 zVMyckl0tzCz-Lace0*nC)G_O(ukupnisT*2gcHAzDZyVMByr+lh@S$5`U4Y?j$`Xe!Q*F?d(9wn>#0YysS`t>c+|YB&{WFKFt^?m7ErZfpqFOy~VfX!H_V{z_Swp?%*vIW|#0JEDr z($RAM>}gk!5k=2GKE2!Ok4K%cW0>FYQp_h^X$<%;2T(-zepD`FQT}SnZQ`r4ly{dYx~ehV!iIP9f`*WzYSO?)6=5|iG$CF^bUAaav#I$ ztCe@NLKp(E5iurZw|Sb3hawfqqMBrZ5b^>dltrZ+u8 zwXKPp74wnx+yFu5)!m-fQePIJ{Gw#22mJaVy_pA}5)^TlwNar6K~Y&_6q0$!LAj1d z{F`MX!Hz{e7*jD6rgti9>i{t0XbuQ@=5heYSB^vd!2T5)Qk>HzGQ{a!*3K)2mzwH> zmzJ1-XSZx%W_nTLkV{oOq`BB!pV}kPam|iry>mp>tv%JtAH#k^>Y0ku2%XCp|&i4SN6n{CA{pL8K7I>>3HXeewz zybn&dXk91yX0cM52jFTk46^m2tM_EwT-~{rT$seA3ZHZyPBuU^V z9Jx}T_}4C_6I3>Q4Jp>Yk$f#aA-Z9zkUf_zrlSCHeEN&aJWz+!bn6fr0-)Fkpz620 z&B2<=2C@6Q6C;?5U&u_!orpYZdhj-6Wx|%2qhd~M3b_3t^7+EyoIlp|9TP<{W5omh zpJ-OQXG^n^!aYiq*vNIayTR*YwfFSHc5XS^B&sx+`vU_g?Oa0-sjj}?X*3(Yi|h4S zy{#5wIh0{J4x6(6CPiI4PmX%zKy*1V=|k@mT`rv*jlJoR1%UQ1;S4tueb9g*c~)qj zU0}yjU;W17lY}uKtGC5sbJe>bLQ>X4qf&)OY7ZJKp6|;49{&By z-is%^oI1KeV_BkE9750*1%5~X8A`)6?XI1PxV(dJ>I z?8Yjq-`u}Qf80>T7U#(hIlfj{73l~Sc=3^Hmoz~jp~R#omp+@_BL6!87jP;_obR3L z87&11W9OAf1>P5U($@n5DyZ2jrHeQ7%UxIZ&0(T26$m=F*x^W8C=#0`#WERMbERQ7!W8!cx^M3O0Xkg)BQduzc3H~>{rD8Fg z|6Sa8++!pIi7E27-rYs{*W~mk{xrew#x4`z!9Ht6xN+6f2Ch7I-RCRK1#r-u9 zIL%KDc2$)gVw73CygQ0_`;xw5p@7dFk%($-t+^@&RQnDQLQ2RdjG@z0+H=u7en(4LldU0nR0Q3{^W=&74* z-aA*_C_cpsUk;MuawC&@a+q<-sTjowoJjE+7Yxm`%WMTJKwt15$h{^cD*jQl2JJ0P zz_6Sg2j6-Eb+T6*$+212NKHCVkF?gHJyP|X_PRKoJ#x1%F=~7v*@0DsPK{<+tNq<8 z-oOW>NMu7jmTX%3P05G3@}vEZE&?-!PrbpK1CP(8eIvpERUgfA{bT^B{h0lvNq)dZ zrB^u5c!><;W_O&aP`&&B5a7HR>9bAzS!xvai}j7%yAIh7G?lW15j_3>sKTgUb~y}{ z>1`O~`>2L|V=aOW030u1142Y`3@%;rtt8T24gU7G3a=svLG(1HPotq7?LUm`EaiK% zT_@WEie(F*qiDGVn>m}n@zoy4-iv?c3cpK{)}=Q@e&u%OZ_t^>o4a@F(rW|mIzO^A zCsV+Dt(`5Z;jQ)(i}|Va`Ci`F5}1$tC+VMP=j&Vny4E@iRd66LmTK@|P7^arD*(Ce zFcx%-*rEuHv|yO@DnOTC0a)Cx{`Aqkk?LV2#@d;;1f$$cgS&AR0ZPFb{EiSk5}@eO z;#6!6l5f+PJBCjLQ$76?hx9^KAxmBKFJV%ef#cdRtG;kbbvO)cBAE)cc0-lV#Am2E zpErX}ZU61V?#*P_HhYfddyYR^-j01S+(HYk#V5G{cV*td*LCgIB0=79pE*Slbys%! zIP-cN%Gr5o{{lcEpQ8gR&yyjN4K_s6nR2cCA2H-zL=IE^#zfb8JCLckkD3xT&JC>c zZL)(_Pum+A8!ysp$V}x6iOtv%}eZWpk&Ts!mxOkx_oofXU5{WwNPgq?ECV=HCD4K-84q;|QR+Ha59 zB${NCpX0ZXC?B8)QWn!_vYJg1lue+@3y(Z9=2bFx3~W}jsjejlJHM#&I1-MNyhd^- zQ+Gmf+PsL>|duu0b5KY?xoILUO#}*($=w<-p4QiUNLhu#J;>X z8Hfv~fm5Sj$s2>`9R`Er{xpnUYIeSKdrYZV*+{kw;9$i^whlHS z6XO|Y>uYm0Zw+8F|5jy`jt)|+T}NSndR!o{U&LI0CPEo@i-a$4n9fcCID=urpA&WN z+$eYUF;0WQyZlC-nJ!TI`1C64U<$s})L0+`YygZ27hyI|KWvGudK}5L7?zmP7F-8?di3?Fiiz>Hg!gHeQEMVJa^oX5@peOQ?!FJ!K4l@PG zR=dNNTXQ@=*QNED?+w%*WJDUVAeLljohDjQnvKkx3Z<7Qjn#USTUJdxS+A-_Lt6{S zvjeNrw3wbl)&5^!`?_iDFpb|U#2h`=o^MSx|E>GT@BsLyz{hlq^1^uoy)I;_GYOl@ z-udT54N5GKO?M?Is@)590>G>F)93r0Y$wV*ep-rU9v^ z$}bvB!dn_-u-w0QGI&hyYb%A6$Fznfda5%gpZNuNZH6B1H`$VX6>1B~HpR`qNGo38 zF<#OL*kMq)(&cZHsQ`N1}-pIv0|HFH)14!*-M3?;;ZZM{`~7bYOb2J-fjj@@f^?8&Yi3*-SNVfs9p;Y?C5 zDcr;@_RPoE|EXSd`;vLJEKa{4{~@wJRA_<}+rbM-DvFuHZ?a6^Iyp!v`Lrp)eBk0( z>Mm&oT6i~vQ5-`)J)F+F&w)3Z5g`DSKJS8!iOjgByA+_dc{9C3w*9&e|p z{xEb!l~c~Epxcx9=a&h4CmF3gF*^G60|RFiiwn;4u@^`VFxl^KI1Xc>KvI|XxWjjB z2bwn9b%d8BqBUFRt1ThHyle+`moLt3d@=WNb-p1lc~J&0FZsXhRy;3xj+GXHwf{thrO^vHCE2`z za(f#sZ=2-X(P3uo1-JcT2TgfVdyqH3XPrAgnK}@asO!TVA#7Y=wPkEoXiqI z4zv2)FrxefzTDwZ_Kaksnj#NZ^B?FfOi`}nwe5z~RL&ULHzUPqco5ik{%QSeQZNA! zAXP5dl4YIt+j{)&(C%7)tM$Yeb!|SC^&e)Hr~Aoa^p6b?0Hc7BC`>ink5C5J@UzT= zvz!#mNf)^Q7lqs11ts3xq=I$;=MwzO4fjtq-J)>+FV9JxOBiR4Rt3oIy@reCpsx);`=#~Kr*Av@uEDw*x-%V-7#XMFap3%=Oo(DHt!!bbPs zSZBJ^`bkkN#E&Mouz2oE82SjPF_Phwce#LE@l)&DN*~1p(f*GdY}qC9c;4D{)!^2| zsC?y0DsvuhKIg`q=OWyIfiE_EnAE6LgZte(t>6sY{_$9ZJk=N=&m$kS62Gu~5HKs67B<_rBV@D`QxnB`zKMTk*%$P> ztzSZ5uAe=Q8?8@u$B&yb&pswm6emY|xnZP_PpF1U<2eInHQ0b#VpTbXDrlk+PIm8x zVGffa-TxLFzQWIHe4e#4`X2dPq#P9)xv~;!jR{F_3UH6^$gqdgJg;bmO%*xI@Fql6 zbhSPqm%uH{l3#d}vHxhT=@aB_X8avb-=j2eU}QF%C+FxF=7n3Oet>wX^|6%&^wi)p zM&5D&7ge7S4>uJGwHN8Q?{(P%aO5YBKjE+0#|^w6Q}KTG|MQ=H?#MkF+d9>f0~?Gt{7r5GyeHn5^x)fj(`)~7G8wbohp{-f(- zfiX0{8s5ilT)Q&t`iLF8qX>W$qTnmS(;Ppo2AvWCmK(!{cQLFtSUEc)@s#`n%GIG2 zeiw3*4Mh)kQA(fb(rGAN#RXIZfaU!F${JP}74XUD3px09zCOu$Z*&MQx90Xb_jc{z z(1qM#koK!2g|OBd-K- zx7g+6uE+PpmfgCY8cy3I_w;P*lfL9TK4A+t13A;ht?{0j2AO$?6;edMi7V|rL}X;_ zZP{9K%axP@pAZY$Cfv{4_YR~57B6+D)mBgag0so;>-Im|w5ca1L(Tsm>Mm@g^((Cz z2XC&%A+gMN$UrmA^C)@kO>SXO0xtod(AA;wxh<@6s3UBB{KD-ew+y<+mtF^->ZX|7 zkTLA9J&1tC2Y-xOSS^fNqd>v2{4KL*a|_X<{A5goIfAGU^D`~1&m-t2EBLHh-NpI@ z#_(}1g3)o=lOf#Db@$mz8p0Wk&BLR0WHHU%WK8S*1^M&r1e182jU z{B}|m=b?l*T0eN9bA5#5JQN#<8M`5vHdU17sqs&Wjkzfg9-xJN?ief%^w5aq(>x7BxJvu(+-e6J?>tN1H&O9R~s(*p| zmw&?)bZ@e2BTz8V;5}?fi93tD81~N?EQDRxJ(GG|r(gPiG`$HtRR8xs{=dFbWiMNn-|h4L{~wQe zjBDmG9`2d*IK9%gJ2;>-*l>WJi9 zRDO+badXmadyK?eO4Uj6pL)RFD)Xw!?!cuN82^d4W`J%@cZtS=T$`8C_V~%Pwi`LJ zQ1ny(mlSG>UTn@(kLedKM!RlN9WeY+x74uLr(h(%Q+Da_JN1*eU2(VCnk(1 zqU{(6T$*d-L1kS?7+c?uvot;Qy8Vptj@h?_NgsQ={XDid9W{ZLpd?lDcKQeY<8o9c z8ue=&cOB3CM(k(9mCx%B4L4f&v9aH82YA&!eQZTh2+Z+PKnhc{fgtTU`&}GZ#l-sc zRzHqjxw+gYb@D(b1d1T=!+)f{=Zpqcn_PJJOFJQ8O9Ps^#a?;j;4UDN{^SWcl)Fgu z&r}pV9~CHhMkpw>R7#{5x4Loi>smW;Cvbg}LcLrcnC!pZ1e!4#5fpuv1n>1P&XnwF zYi-mKtqz_ITgUOm#m6 zb|}ae6?8o+Z~WsB)N+s{tBntw{iRxa1ERV0FGsSGP+3e{J#i&*vt>>F*OUhjadB;9 zAjwZ2V3J=;8k!f=(@Y4#lDx{taU2B+l6`W#se1Dxb|Zg#@?757i|b7ykNW*JT&^6t zCtD>P%iVuR>s5|c@X_E||Nmxd`sewQTYa}{<3QzCj&_&GP2otTmW0c@F2zw7aGJXF zPNSV~^i~4GO5xE5+qKQXXZG{{!FIG-h2FefAd(|#LYstg9Ploga@90+E=|+{rGhPK zMi<9T6^z_8^_I8!-A)saDwvc#c^^LamKT>R0ce|&zOiqsDM=2ViP6YH}_TYF`EDN}{ zY$MY3=H9APq-gPavgq=O|6WEs&c5!cOlWKgkS?tNKjF9-=tgX4hi&6tC+|bA0^%1o zl-^9V^(?qv77I#0Q+CdWcdP;O-xbq6R#<1sMVoDt@o{=HaZ}^0 zaq$V}j=-C?L^9}CL_l*4Nf|Ir(RtVIZYrB9u^4n)?BR(nCyNwbo$G{ z5gG06@kP&gpEox5Zs=QDF{G}frTkrJthaQgSFTFir^d_f?ZUx8?*7&ZD}nC~E&h)|s68*J zGhEqg{juTb4}9v2lO)p-PUh&1J;qzI&+Vs=OdN5r?hp$|fTF2P-LLVm39iO@4-r_# zDt|&GjuR~)=et@xssj47Q?);;;T0Wg^e_5`5a*bLWekLJ@;q&5Q&C-pIxyf>U zhTo>7ked5wd`o=a6-hi0{Wd1taC^7%%e?)T zMS4d%;?LQxFc9yV&SRKnR({E^jfHMXe@8FX1lW84o4=oc3z~oBr9J>_u!EVF+tfQevPqWJ`sye zUwn@U{2BWdpF7lcpZ#L`xR7r{SVE3g`u+S--N?TkEzxVUZ)f7n9{G;kz8QuIP zn4=eAd}t@F<#_t%vcPYG3Ae`-fJ)!NrEuegeR999l0UePgI$u_wNFeiK4+soV>9Bl z?rZ-yJ8{kp!CN=2<41E&9nwnVd$heiW^(}0!wk*~Sn1t;|1-_7yoJZAqah;l@PN82 zF8XI`n+7p%78@ew2J&xhF{i)-%K`(EtcqeKPga(Vb<$xd?2PaY9hNVsEZqy^Zk$I@ z=9@K6XffL#1KJ^QMuMFV7@c)uWY5wFfj>`b3I!Ia~_?`kRJEHo%U?L75*=JRxDiU3$`qQenq&zwJsW?I~uT< z&rs*qu02^+;U2^!k0!nh9ZzbDt<-}Uf{f