From 89ceab0df43f09ac87bb788293a3978e95912087 Mon Sep 17 00:00:00 2001 From: Alex Kup <116945542+Lifailon@users.noreply.github.com> Date: Fri, 17 Mar 2023 18:15:31 +0300 Subject: [PATCH] Add files via upload --- NET/Dll-Import.txt | 151 +++++ NET/WinForms-Test-Stend.ps1 | Bin 0 -> 75826 bytes posh.txt | 1235 +++++++++++++++++++++++++++++++++++ 3 files changed, 1386 insertions(+) create mode 100644 NET/Dll-Import.txt create mode 100644 NET/WinForms-Test-Stend.ps1 create mode 100644 posh.txt diff --git a/NET/Dll-Import.txt b/NET/Dll-Import.txt new file mode 100644 index 0000000..f8522a7 --- /dev/null +++ b/NET/Dll-Import.txt @@ -0,0 +1,151 @@ +### [System.IconExtractor] + +$dll_import = @" +using System; +using System.Drawing; +using System.Runtime.InteropServices; +namespace System +{ +public class IconExtractor +{ +public static Icon Extract(string file, int number, bool largeIcon) +{ +IntPtr large; +IntPtr small; +ExtractIconEx(file, number, out large, out small, 1); +try +{ +return Icon.FromHandle(largeIcon ? large : small); +} +catch +{ +return null; +} +} +[DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] +private static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons); +} +} +"@ + +Add-Type -TypeDefinition $dll_import -ReferencedAssemblies System.Drawing +$menuItem.Image = [System.IconExtractor]::Extract("shell32.dll", 174, $true) + +### [W.U32]::mouse_event + +Add-Type -MemberDefinition '[DllImport("user32.dll")] public static extern void mouse_event(int flags, int dx, int dy, int cButtons, int info);' -Name U32 -Namespace W; +[W.U32]::mouse_event(0x02 -bor 0x04 -bor 0x8000 -bor 0x01, .1*65535, .1 *65535, 0, 0) + +### [Clicker] + +$cSource = @' +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; +public class Clicker +{ +//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx +[StructLayout(LayoutKind.Sequential)] +struct INPUT +{ + public int type; // 0 = INPUT_MOUSE, + // 1 = INPUT_KEYBOARD + // 2 = INPUT_HARDWARE + public MOUSEINPUT mi; +} +//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx +[StructLayout(LayoutKind.Sequential)] +struct MOUSEINPUT +{ + public int dx ; + public int dy ; + public int mouseData ; + public int dwFlags; + public int time; + public IntPtr dwExtraInfo; +} +//This covers most use cases although complex mice may have additional buttons +//There are additional constants you can use for those cases, see the msdn page +const int MOUSEEVENTF_MOVED = 0x0001 ; +const int MOUSEEVENTF_LEFTDOWN = 0x0002 ; +const int MOUSEEVENTF_LEFTUP = 0x0004 ; +const int MOUSEEVENTF_RIGHTDOWN = 0x0008 ; +const int MOUSEEVENTF_RIGHTUP = 0x0010 ; +const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ; +const int MOUSEEVENTF_MIDDLEUP = 0x0040 ; +const int MOUSEEVENTF_WHEEL = 0x0080 ; +const int MOUSEEVENTF_XDOWN = 0x0100 ; +const int MOUSEEVENTF_XUP = 0x0200 ; +const int MOUSEEVENTF_ABSOLUTE = 0x8000 ; +const int screen_length = 0x10000 ; +//https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx +[System.Runtime.InteropServices.DllImport("user32.dll")] +extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); +public static void LeftClickAtPoint(int x, int y) +{ + //Move the mouse + INPUT[] input = new INPUT[3]; + input[0].mi.dx = x*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width); + input[0].mi.dy = y*(65535/System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height); + input[0].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE; + //Left mouse button down + input[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; + //Left mouse button up + input[2].mi.dwFlags = MOUSEEVENTF_LEFTUP; + SendInput(3, input, Marshal.SizeOf(input[0])); +} +} +'@ + +Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Windows.Forms,System.Drawing +[Clicker]::LeftClickAtPoint(1900,1070) + +### [Audio] + +Add-Type -Language CsharpVersion3 -TypeDefinition @" +using System.Runtime.InteropServices; +[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] +interface IAudioEndpointVolume { +// f(), g(), ... are unused COM method slots. Define these if you care +int f(); int g(); int h(); int i(); +int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext); +int j(); +int GetMasterVolumeLevelScalar(out float pfLevel); +int k(); int l(); int m(); int n(); +int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext); +int GetMute(out bool pbMute); +} +[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] +interface IMMDevice { +int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev); +} +[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] +interface IMMDeviceEnumerator { +int f(); // Unused +int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint); +} +[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { } +public class Audio { +static IAudioEndpointVolume Vol() { +var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator; +IMMDevice dev = null; +Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev)); +IAudioEndpointVolume epv = null; +var epvid = typeof(IAudioEndpointVolume).GUID; +Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv)); +return epv; +} +public static float Volume { +get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;} +set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));} +} +public static bool Mute { +get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; } +set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); } +} +} +"@ + +[Audio]::Volume = 0.50 +[Audio]::Mute = $true \ No newline at end of file diff --git a/NET/WinForms-Test-Stend.ps1 b/NET/WinForms-Test-Stend.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..9049d987a04939256f5a713c103ef92c20408ec0 GIT binary patch literal 75826 zcmdtL`*RdalAv4HOh2vJHJhC~d+%=Fof$Q-+w{-}^nP#-=N!F2peGWDNB0=ULkJ`g zLJ|lu)BpOt`+eaR%FL>)QVFDEJ!>*aRhbd)9_}6V_f4(5=Pw=9tB_e=@Eq zD167a%#Q;;Uv2yg*#4#Q$Hu=mKlL)k>y5im{+5x%xE;T;a+HqY_yp(m#$VuQFBCsW z@It=lA&2X5`%U6)Svpr4X@BD~zds|}o5*;9|BEFV2d#TaKi)K+A&uva&x|ePdZnvm zGT%2F%k+9rFL^AsaWrTUYy(Yfzx2&CKiw?hp6TmdKZSLx)b}P>uAuSib(!wq{$G;} zgx)%L)XErP){Fi|Z}a5$eLwfjr7_)NmfT{tl;_I8$!uwbUzW%D%$9B#GDoXpEYpys z*6VCJOx7aLnD~};yc;DMPoW*z;)q$haH**+zrfYez7cd}3N2C2Klcq`f8?^CpcE|wa+%*6`&iJ@=UnMS$qY#x~B9urdsAv>r4*H%k%hhlFqASbMyM> zc>Qf(H67_&Y_qHAb^gCh?WU06D^{onSZmkGem*}(q6d6_&#LtCj`_06Qg zA-5OMum^Nkf?n3rDrMIj(`hw%54C%&af6Mq#-GyPKQ`B*yiWfaO(?I)t#Iz75$|D9 z<={c%Uzrg%nFafB^F4Dx3|nyQDz-OhE-+k&zrn9}iDR}p4c{uTc2Dq3BZcSS-GTan z=I>x*G<~`#JQ=?H64MAPX2@g%BfE%LXl;GJX6Sk0@ewDE8IiawiG_n(NI`dJZ{@dh8H6(UxN zc3OL1#XD1{?_7-hN?LcT9I3|fmzvRa?qwYI09oi|8}aCIE3fRgw^JSQ`72t!Y5F09 z=*$q7DL6Hczhj2r7QRoXkzYshn@Da87}@t62TF!91P}H8^zl2xm`a}O2dIAA_zJw> z=M{9poP++FeLMGew9oNG4)NhX&_3e!$f-o6J(IW*@y|N?Z7eT;ay$}I$gj|895Qg? z&y6$w+x!}b7>`c%sXssRJ67`W%KBntGePTe^gY29slSX5RVRn+;pdr`$A9}|{2`I4 zN<5$aO1;o-(5q0-Hv8vNB&d&P=3@%p9>C$3aM&n(6aC82uQvYBn89=W3-Oc^+vo3J zklx!QMe|z9qdlrp#;xA_b$V%o{%~UP>$sLNXKqEG;FLN$o;3FkypK6v#Z>t1h4eaW zSe|9mP_@sf9iLivoa|vxa4F@Tz9g=w$wm-b%dBH&NFwf?KA|aeY8w3-=9-!(t)cfj)PkJ7?3KRO2*f!nw+>l5!cQJ9 zc}HcOo$SOR(r}gSEWa6Wh{32vi*miWwz!fN7-HQDC^J|z^L;x+S|6AN=fnS2sP(wo zWzpI%OQiL><1!1-ZcD2?YVTKEaaQL!by}~B)Pm8H7SzrEZZa)K6VfY7_C?~5JTm9r ztJZd#RnsMiA<;69c4_{u?;rdAsqdfre%JSRCppAwkBj2#7(D$`W4II@R`K3ub~vY} z$SRmKaaGmtd&y^W4rS|CUaJS1bFUs+ouv#sp~tR^)t=K}b?zx+SB@gb{~*zG0Cm#l z8g5omu3x5gp0lCD8A^XGoETX>q$O~=ccL#c%jct{E9V1mC1u+k(YL~@_aeH@hcb7| zb72iGzDgE+x}?MBGb`$0$NZ?jSGTJ4PD}T7B{YAmr1_m_(2FkbmesfWfwd}I;rbT6 z+Tyd?wt8%*OZ6GPeec}tX7B1L=q6clUz~J@$PQ`OPM2=b(W``qPLXgx>utrY=UG5# zwOg)9SCY5#?Osi1d}U41W|#~AaL!&%6>4ZkE3WHUR@a*6c+y(i{j|!2hW?5#cqv)! zGIh?lKh<1UPIcFZxgMjv(gy3|v@v|x@$d3ps{E@;th~l8V!IFE;l=o-x35*4nR~Grh(|-E=u(jY5yxCDNJCF>cG`Di&Gqz? zhpy^!tECDHd0vtzW>~=Ogsoj7tvw5wwBPAf)9ZQ`*LsiVFVaVgRnd8pSL9ZST~BLt zrz}k|o-D}>=d9MT6>n$FYHf*yPr8;fhLLv-*;lP>?`uIfKf4OE4$nnNo~_StrB81fVdN{tW&q1{l~+i!4KG^s@_b}l z2RS5McjqGI9BWrq(m}&2qqp{B@SNhtD%A353rwvR^AGH5DTAWLADY@!&!=uHN-Ly7 z(w7Y1kD3zANjLqXGU&oqtvW;BhQN>jb(QTPE_$MblLDymi~ofT41DfPXOifX9u zg;Z44wL`j?xG?YXT5A$Erq>;fcAqWFs%)zsq@AJ7M!t7GwyG6sw%Sokl5s7QQL#SY z7Jg-G4{M3yZg~g#64s`$Gp&7ck4}Bd8L!s9o%)osTO6J)w_#UaZQd^dKWRo}H z`dhM(n|O>?gzWHX|D0@3Hw>W--CA6n#})Hwgniv_pHJN=FLPN5#NMpCm*>UVR;b0? zD&wl-;CbY!h7#wj0xff}m8K#aV})6{PVEpr6gxHT{Wjp#yVT+q8NwLb+5NLB-^(&t z1-~crv_w{Dou_2#VaFKi?_HFXvX+-~NS!FCRuc9SiM8f2GlZ*TP0hty&t~PL6&3H! zRY&R|cgE?t#q#|5KIsfnx80g&uA}FowQ}-1Y;PUCr^|YX3REjrtpgoE2eO{*WbGig+W1%pUU2@ zJ!5BokLp?X?ekgOSFB*4(|Kg;UE{2Ev3Frbz?GAV0Wi zbFSZ-^l?t><HSjKWj@Rx;{kdG@{ckq9SdMLnFW%z{6|wPT=f z^66jsX|22I`OC*dt^H23zv`zZ~ z_E)xn_X$qUK;aSJXOPWoqU{whztH9tIPL*$mG7hc_xl>Kp77nLN8E*yX(Ht(;P^tt z!V~%&(#|M<4ZHCioEzY<|6O`4@%;(ypMv`peU=!A!2Lwb+W zf0nBsz&6vAOP1*%ZQ|_u`U#9Ixv7NlF0|w;ON{v%w0g=nW1M4*18`v(41xK8786M5 zMxtH*#Lo<4oCfA2{;MJWj5q&Jq2G?^cH?7`=^)hZKwGqWh)f2M)EpR;)d&zi!Tnc^ zXB3zZlazKD=QNUC1NvLq&hc%HpO^5_QS3p_8g2di2EEt@&IlMEgG=6iQKY_xSs|F$o`rX}isxVKnv{^Yt2^ z9;a{8HqK{jt@pXU$LDGK+UGSrTo1?jJjo~POunM4OK|-W-~D-xB%g9Ue)gbaxB2rP zoVnF2=Hv<-nr3AC;Gaf+7PLfompnMlhTl~($ zm-onIk#ED?IfkOI(7p)O6L9Sd@b7VD2&$g)cNmV(rO}IV7>IIZIng@Ec$_aEz&B6p z0chUl=a?2+>j~PaSBLc90oM_DZX$O2f}Yzzdf1fd z0H4-r^%UOCC0;*(FRMvocF>S{M)Za6FX^{|wD*9t&FAOH*m?L7>eqmv23(`pDAayJ zVuM_}gYIa92av)BINk!s)1o{43@56$XtBt(Jn&>f0n7xCTG=>HU$b%5D|ByYzX`o>@M*MW-ra42hg&?_zr2Y1$;G1 zx!s4WOF)@mqz|Cu1NUYbp=+7X-90 zl3*>u_hGJSH+N{Q=kfx{kAcnS-h70XHDLH$m_c-LoDtuK8($gA4Mw4z&@Oux<_+|_ z`m86~%zQc%AAoh9&&RZMg&lxG{q#Nh8GUG1wF9p0&WEp1?%F#J%s2eLhWd}de84!g z*`6OANc__CIbx>HG6EsH!mRP#`91}|oy*#tC-6mYb&)%fW&KRsAx1Eiu-yjY(=uKWD^`!Qh;{LGN*Bn&aCWFwJpAujPP#8i@tJwm%ev_f0Sq*OI#JVUfTwchT){1 z-zV;<30jR~Ant-m&u|Wnc?aHYXpd-EPxK+}-_qChM}K`IjddMqErIU__{Zt-6|5V4 zUuB%;7$)fV3dxSaQO`Z@@Xa`L9Y~H=k9i;deFoPNJUimb8$Pe_*ZPkIG(#&g4u!Y5 zdjxI!{7!LaD)H?QNj&D-JTM%SaljHijj~1=kGl)wTps|Y`I2#H)jEEK5@)X#={>kM zX}<={9qziSta3*?#F;T-#cl{J4i~~JH-7rVEIBz zZH>16Ei!u#0~5=yGf~pkFP}=NW@Gy$^qqmCgGBEeFgv@px$B7Z3A7Dbd{>iqjAV@O3;Z{tcc1G$B~FDHO8Qyeivx&%70F@eTD_G=anAXKI2u7 zu5ovUwohnh?E4hDkDz;x(GM`vWB54&p1lO$IM(&)3s;x1lP{q7L9$FA;jt9z^RL56 zS5s%4GF1m%kM#ugrd;o|C9lCC4U=HK4+Xb@xWU-f>34AA0pAb66A|Yp?!V@n7SY(k zO4rczA;vokj6HgMN%QP3G(M!QmPDEz$pAg~8LgvnXZT5?&D@v%(grk|0el3Hok63( zTI9cD)#m$r2=zssSYt$bK61jGi+;Fs`yn{Azj9B{d=4tT?cCha5i))$$8AFGV+ zAvBHv$Gpb?G#QiaK!JPSf^nJNh%^rJZ8-5|fS$%x5z83K3F{b4 zn?N+@wFjlzS7(E<@hp0vZPE|e1&X=GSB!TZ{PM-s^*ybmW|Y1$BW{585!BqK&pqf6 z)_r~tXgka(wN-NP9hB>Jc^Ye7v_9LKufwCFej59{PNUi7>U^|=LlbZyNF`;tSCy=t2Kw9AEGrZTId`QoAFv;b6 z(5m;Qr01X~)`d^BwC8*HvQO_fjB%JT$bYT!5LfrOvdk#9`L8t)_XrX*v!v}ff@kV@ z*bd>Z(o>xt1JV+Z_P}nWVsz;&HZ~dMx^ct`P|Q$#rlm330;7;NeW?W`6sw}yEa$=# z@M|qUrcdTj2H=+#`VDgV3>JMVW3CnW8dg{T$~?jmSB;^}%jh@y3_c@sHPRow-bLWN zfL{GSbF$OWY=!m~@?TFpkT#oczr;B{eUH;Zr;ij zIO69$FpmRiB#q)7ywfTejhgS;L0^}k>IOIt5^Z|n*SN9@KfeNb8~mT4ahoga^mUCK zq2Dk)jggH4^{98~uU%N;vl%{Ttyc3n{f+KF(|!inlW7byv>bu!W;;JY;YT2i1K}}P z??9Qe!5O?uiv#$ym1xu3k{)B2CGJUy65gQqSkfmwBxlJA_p}pc8Ql+g$$0P5;|ss$ zf(M~vowjciW_^k9IKCjcNhmPqYqVib!MwyQ{Em3e+{`PWYjY2w*)>*~e&R=XuB1kM zu4zU)Ml-i*rG|fn4sEenR-;zeNb`&Ox@Idk80iR9Kcw#$?%anG>Cr1(Ln^L1LurpHbRw0L$ok0}Xxzr`Gvv9>U1yh|z69xwh~lbQyVl z0=l!=9FRMR`aGW*{~+_w>yb$rhuTrbHqXx+?keqBiO8TC$c&>Q>_)2;ksy~2l zjVpeNoP#sbJj!tTT?LQ1J~Mc$=!@3yEBsjH(@S_X1Jr#nzYLu$ebG+7aM$hhUW(s2cS4i7hgU=C^mZtp>rFkNTl+dS>>a(#m_ySwDPa|JT` ze}tCF&v*3NfbYh^Qt!&<4Ejp%_4LVXZn2s_O14$s{~?r{AvagI1J9O#IKmaP3nS2B zHqG_IoXs^PV05X(!+$gCK7wxdkc=tZXOKf`h?Lxh>&tvUqQ?Rw*Kc{kJ@Z4Za9XIx zv>xZWYwm4YEYZRh&ADnGdIA`Fwnktp$jw;KJm+TOl{*(^|ID?%Rxy8qa^ts2+B~I?c}4T-^6Wjm+^LD| z#Yg(Q0lTz)hPor5eS{XX46fs2d>Tfw?z>3)EL4s&qHFv$d!&cyj*k@kJfC+^y1~yK zps5#wP@+%cT4T1|n9lfAZPQ12jYb^NTS?pYA(R=d*xtxfZ(iEW)9bC8gVQrIn%o4Z z+}LM~?tg93OY5TFaEErA^wlc*eS>k_2by{HWiXmo({q1IKSwsjce4U_=r4z~WM(Rq zfSGUiA@vXSG_68#w{HlH(sl?AV_DY>HN>4BJ$Rq%HwG@Vy~@^A*44$m#2LQ5fRY_3 zFy`4ze3wto1|wACDD}(y&mMf)N6HZ|xE4H3+BiT9cVEp~n1y-_u07zpKT_zM-}Me% zBL)~xaNjuH%%VB3FNqh&d^h8{PhV}4nRz{CJ+dKwXMwQ~o$mhX`)Y^ZLh%GG^_#Tq zTJd{~?kmuZBA$Zz9&KHV%yPSD`;Ke!O#WsJnz%y{iJsay`^!?nGbf)^WCHLu$;EPbq zG)kK`-yEFP?&bg{5{LBAr@5*ZqUSLQg>$qpKm8RP#xw4WxZga+uRcQ9_YHV@%!oGV z<;m}1u({T}1Dd-aMyGnV$J{e6T81M-v{85Tot^{pHC&N4_0Z=>jWS9(?5vmu^D5W1 zaoSF;;YZ-PV`Dbd{E(JGA3%%d^Qb?8)4eizY*xY@1LwahT=qTn0B2~e{@(|Sah$pB z2T(acOZ_x6#rmGo=Ik>MW6ihwZ2H>MjPn!Fjq{JWZXf5PzThZ5UeVGu%lYsDIwoni z161vtmfd-|$hCRCo1b`q4#*v&k9|1tgga)U_Mpc&BQy^2M0ofO`sMnF&WB^h}eFBK?dFUB0^M8;}?ueQv zGUw^absLL!9|+UX^##~QQLn*e47UZO&s=xa^T*w+1u(f*>>&^3`T!~;-}jpF-bGif zNHiyEeoqVHGjt+$HpAtvnVJ9Lgw^%ex|#zx^pT!Vz%6{^=L!C90!J^($aVx8<&S&l z^2eRC$d#KTQD3xGFTkmN)H)vk(z-w)S+4OO^?HJ-!Xf=1pVVr0W&+vh z-)I;0R$McM_kpYK5gwpN?i{Eo?#<~(-#|<50%@2L1Z{`lJA$5TKy!!MdR1qEx@y&) ztA+W5d;GX3V616`uU*rMY$D0ewA*3q?nqc+;_iW3?T+a~+PdyM<(o00V|NW-rj2X$ zNA%zm@-<)WE|D3$$VKb>sV(NLx4}0LCiTS#;0(E4f8+1K#V z?4~t9`cdw0t68qL?#8>DWR-#bq;b1_U9E=sYlXts#CfwCN=6Fr(l%(@pso1`_fyRV zm;*4QeV-AUIaL;eT+x#2t6Nzz485;uH-ZfAFsiSN!5vyNzRTQ=y$bhu^zo+X=}z5q z?wegV#`TU^HB^j&{XHYsj^sTf_gZd%%{{vtj7?jABhjd}x1W2k?lnyT)4j&G z{MT#O2Uz02yT0x^yXUF~nB~>GJp}I^DAzM}pU+5YoOWhaC%NX{&m_5xa71Lqp;=7D4W&kXqn-?XFVD)kMd$_#?7hQV#!jb59!`Z@nyt<~}+_&0{+ zHqn6zK3OUC1qkNmtq9oy-Z8yhvE5-eA9c*Nd$e~S*L@tT5~b}Cy{xF&L3^~YPv|$p zCwEK-xPBil9Rgebbr6VRl0rQZBMbNGtv)fLzsI*V;Oh;#s=Lc)#gb3`GH%w-dJB9j zTg*B>2D)pXb99LN#?O0rSQ_d2qxm>o|AxVXY~Qswy?@8sjn(?#`MKgf>^& zwBm0Wuk-CK?X)G6^m9d>hAwC4OK_@hdQD?oH^Osm{tT_|fekb{?q2O4*v&Dy$8RM1 z1W7rM-PbX@s--ouS)$;T` z@8F$d9f3+c3A23GE^X6eg#S_JXkDB8HF~pi^fb!1X41^QRdLprTMZ-(bKhq322y|b zln>yMSvvVAZDwekS8t&H2zsqWaM#0HLOs@1Xmn@MYFPbd_xsHgIJftqSRcSOz{tSJ zD|WrDZZmIdCc?e&nIxw#@XUOXyD7@R{T5>d^9kl8j~V|Wzs?S6i@Fv)Pgf_a4)@@~ z2A{MmRwDSGw-<@;`pZTL`YT4EW(-|bUc#H;q@J-m<>ohDfLR^TYOK=!5tJK4OUWwK z-G%~pS|6ry`hI~Ceza|REYdazW+O#CA2X(p;aKc$KW5C6^stIy6DsA4J6&eX9JMu2 z#uCT;==oT?Vm-|~@aEu{J08Y9?j`DxSdsP?E*WWBMd*6>k$dK=mcaQGEitnCny8kx zQRs5lKp)eLhq;;q@SDkSuUb!Sfsv}At6Vo9=MI89+h)CA)9Wkv9G_K#uIE~bZScJ3 zzmT*IT0Ns_cOxDmEwfFZ;GXu%_;3rYT<6yu*fs8lOy#|+rI{$BKC}G#N#c0|4(FQn zB}Saa@ve5pO6I(tLy1`dt)({1$XSoie23nUb;Wn#)*E=S11;AWg|%_68&*#4gTp9I zD{MaI0q~yFI@T;R%SOP~47n$&Uu+iJtZ~HE>(FZ*qA|Qxs8;)ahIYN5E&3?UF|I!b zt~x3XDL1=g?V-`o2IDvHyqx6j+|+Jbon)@mjQ#|l^u2}{x%qebw#_%a<~ith-Ew6z z0@wFb(}rp3UX1nj?n0PJnrEEOEI0ev`s(H7Fg|L{i3myQN7t2cQy2! z%xT;Jhf$~dw65a2(EK9FY?Joxhgu)!u7_E0tA>olp98}@qLB4cCXtl;s8%LLd@8Ta z3|i}Rm(Tih#__HzPiQ|5RK0{rxVcPAYe9DT>)XxD;T!E)>*t=go|5?rqZM15T{O#U zCf4=dog1sItO<5^$=rh;l9Xvf-IH<8%#q1Acii1`+G51+{3(B{WX!RD);l|2M!}V{GrZZiH!OAe&0Geu*5yRO!s)+Ci<+5kekwW%*gfC7PztnW}`A; zx)&s`wD4>6-A!2B^)!dHMw@qV&N?1(Tj4DZV*vLw%v?R;_bcsyEl~vr<6-%4>g;!kB z8<8e`(iw2x=eqIiQIe4ByqQt8%ozF_EwtEXyUZ$Ey{d(t;7aJMtIsz0p91qSvOA)O zc2KR+iaz1W1oSu}t&v%TIp|tsbPu6e+UB{h#%uw>m0i3277j^?dTGX6&rw^j!^$s@L)eSni6O>vH$c^F(sc$XH$1(^~?D^#Eoi%)V-Y2EhFQn#`M+ zjnX$+qmLtW2W5!fBT3%YV2{zu6?uiRx&~Tds>D1m6MVBeMN8#=nEta_|3k1_(`mhq zRbNZAwMx${t(lz_Mqmx8*24U{dan;-6|?+T*R@yrEf1kMYB$W^a_|x4u<7cC#BQQUuy?Lq~+J5G{`$SgryJPv0>q^mT zUH518oAs64LwQIGV->Y(onGc-W4G25b5@VL&*@WXtSxlb3ek*8tXbn}3}$cLJu}ba zs&0+TIBkrk^}ywfd(LM3&7Ntu%ypO}GIykgn@jr$9XIG@^xyNp|54vjKX!*0H}vmEnKtG^w25wo*W;p%7PVU=s>w5K2Uq1O5@ zX>$+LoQz{}H_@FieRQ>akniqX-lvtB61^Y2HFMEw%N#J=BaeN3Yo^r)JwJU>Ez@Us z;`}$aH_v_P&^DTJH1Fk)tE2l*{yc)Nk5Cu$bcELKpqVW&?%QSa8?@gyd8wD-`DEXmm){=W>oak>aW^Ve zt$EO6wW=pmn=$4wSI_zvbX-S2o!j}naPfXDcbf~Ickb)SLVc~`ZE#uk#ToDJC(W-j z!>zk8e_WgzkGB`DW5vv%1?Re-^A710vhMWEx6TqdO};lzp3`PjPikW!|oT}oQ*{GR)GTV5}cD&W;iYQ4#U-&#_c zu3jZ&EM!IC-;Sg*MeUNhnx5`7%dF}}LIs?9355mMt~!46M^@4rznu>+>L7QPH)Zu*ek-8sm@9{oYdc^6p7)dv!rK8Xaerg} zgv;@!`iv=f{##j`jI~!icCFQ?IUm`bhsDVh)$@A}t25G*9v5)x^|;=9bKS6_#})sN zzu7vGX$`5J#h0Ff*4DSH_T!to`?1@c1FnO9^W8b=jx+l*@c;MqdFSDpS*6qMwUTS~dCT$+E4TzaW2kTSLeHX+Gf6g9{`&q|sdH!7 z+*HtF?c_T=G|x8WJE4`oHpi>A4ZZZ8)P>I-Z+GZ)SI@ny)2FpIE3D0z4&PJhX$Q46 ze7>lQ@_dH5mV@ToD6C4dwfjZR4L!9og^n{z7 z4>>3|%jEiP)p@}?SA6CCo}5WoE2Dy|C0vTbcEy zB+DuVj663_LYJxjN!iMw6v%B!8(zJMwts z`y=k!+bmR6hRdUvgVk%-$@`cYQX@Rw5;)yYa$Q(w76fHt&ityO=V6x@lx}4jr6CjE+3_ zf17ND{P>bMl6CSfSj^YSfqp2n-Z1N~8AhK@5zn3zTIXKtC)(BCE7PDI5`q}BY!6Om zL0PXZHGWN;3NPpf@+;Q3$gASBIS(^I%33=UlDX2|1zn?S5zIRWDD8JzGBOG`w|B674m!R$agJ zmhzmwN(S1K7Cuk7{W+rTqc3{}*7Z5Nl&>7>S{lwsE+pYq|pkPc+zhtD)W1}7NGcQV}zXPN=Mp#(x&5B;qNq0 z{g+bUPH(Y!ouuRpI$g&+r{OB2*ASY1iM+Mm_91`YW8dSwcb-nL zK3{tyr}xsQa!c=6MeF{RpRJPE0&@1&@<`0kMi#yM+hub5cDa@#QmNGM(56S8IA`cC zYTmZL1+g;?MxH^Rby(Ja#5$5WooUV9c{fO|=H-lZ>k~S&?XIp#a=I=O(;qnK;tzNR zODPub0nU-u2v*Z4#n#Qqe7&C?tcj-fbsJNCJe|2xm$~aa*Xwhtow0Ys?hXv&d)-7(xVrf)TH}br9M! zZ@*8g+cf)#Q_bAlS)}d?6z7YaDW1s5J1QZIWu&ifC)L(l7WdCbGM(X{hQH36>z$@< z{@e(by7dhNo$0)eOv`IfoPI9+-|kvu_ATC7*%?FVLGVNA}9{l4#waD4KuF{Do=GfF7n zhdf%ZUbGzQR;*sR*h*`ed*ydmUuUFsyTp$8Eq<ZK*e`ZvDg3S5(*>#YEx+`Qt+OdWulC!?CV3xe>UzoerPuTVY zT=yw)Td77(IGv!hMrc=>{bRo@VnN>tVWqUEev7^3&Q!gmWsygVe5@;sD}F>-1L$ry zs;W`IrIcl{ui2K~dTQCtQN~O*kE~y4rq|3tG3pGhw>4`jSx)U^-RR46Af#Z;jgh{T z=^<9%w-@Br^$C=?>24?G9V}4;?-6DVVW8Y$* z5}m-O_B~vFAIHNkGD|rZHO$PMp-u62n44tMTB*P2mDy~c(PU(nX4r-I&DXd1>wCn^ z_>HE_-(AKR@2)A2H27e)Y$~;zpw|*(jz00$v7Z=~Ep9Q|Y2ek3F;{2$JkQ8~zbff+ z=z1}OtGcH&v}e*h#Ba`fI1V$HIY;UBR_o^&v)s;3m(kyGqBrleT%y9)98;02QwQYf zF!U81^jd$Tnpe#>*^K2>`YkH4BFpLseql_$QOI|@-G-NwT)T>978${Vibc?q2~1OP zf2Apf#kQPgcWGHtb!8w2WWAGO8X8nh&LZeacI;4vQaP07JIc-OG59<{@i)J zxw!1-)nSP`A+3qIovNKd_@8UFRtQ0pFGrs#CLA`9kN|gQ5D-|h@T!8f2 zxjlm4=&Dga%h%xdt6FZ`FK0)yO|Z4Qv{BLfL&ts>Cmm1I1YfV9CD||OT{`*QrS*L3 zHXFNRD|1F)vXe#>zJ@cWSQCmkDAwYt)-2+!?{b2p$hn@+ysv}niq`7kO+)ETtm-s# z-1h@6Kzre_wL@vwoZp}H8aSzStm~JrwXa9|N7eNxw=KA06}z#V^%Fj&I=I#jOGt&* z=XPZ{`I=8bvZlls%sG^2g6Gl2;gh(`U-{`>!soe;kaGAxdIY~FZVh2A3tw1oM(<@Nb;mdHjWJ3Xkv#RJu}sXs*)5$sga{dFjNa zTCr4oi@ZaoOzY%4{Ac*4&+8f+7Asri^UPCJVb;(F^_E{K{_d)$evMQ%x~ebYHH&@pIoi7G&^btqJaz z*Va*>^tx-(jnc9QT!*E7MeB!7BfZef#gkR7O5H{0Fg)e|?V3@gwX7M{JKgiWRsFKU z(wd)gom}^s)jBUbYmK!8t^-AjR$t3l&|1;5<;*#NEGw;SSgS(6s_z(91Jut;*rdYm z$!{h0J>$mub+%yWob+)i*&?4}szU^wVFt)jj_14!|be||JeMm z@7{W^dM)R3<-;Vu=2Eog<0;c*O_{!oF`=2K5%>|7+sw>tniXaO!@BDYm>*n7JQJe7 zXNRb4BMX$_1&(o6j)7z)`pJ%8<2SDV0UUowHd}m)XTUklm|S&zhjqNK`eyRdjA|Dc zi))%|mSZoEYw8R*d<%9fR5_M8Xil#at}88Cp?7oft5D=iLj%8W6|#0wI038Jfeal# zul!dl+)miqt$Sp=C*jAL#!eK+TXGcL}qIrDSn zXh3r=>ie7d{+ZqpQM$JOobs?mlv6jh%+2Cn=1Wmg8Wu##oq<;9n(GsrxC%dVg0VQK z3W{3aM?cIs%w^qy<{4UEr6RU~<>-Ctz%uu94qKZr44>SwoTZQZi_Tf`IHyPW)iO$* z9**O7w?oSjTCX+A@t^gJ;rr(Jubo?Zy;)|iK6*x;&>T)O(c^YhvC|U0%h6ZCM|I3^ z#!;S(iDzagWm9koVgmwX?ynR>_Q?`3cnS3OHpjWul(`Gw*Pi}tsA2IctVGb~yXlglM(QZq{>TZ=4oWbo& z*g!SJT~ODJkuG-M-oKsQ&$@P&%5ftCt(4CNRO^+#@4EK%Q&C^l+N%HL47PQ$o|L@W z_%kqUr+2@_EU`vpw^Za zTFLlVpLiC}Ixq$h!k-ymWa|HwhW2tBIEo;T%LZSi-d7E`q?21_ko)VBD~r54k* zErv=hKG(MR`%;UI+7`p57F)F~{;yJtJGCuFN-grfRFxn9P--z-3uCm@B0pQK3gf?& zTFlkLxL;~vbx*9LRVe>Qsg2JftZOq?YU8^N>e~F@r8ZAHv>7k8`C1F*|0%V2TH9ix z)Z%Szi~m|`aksX`WU0k=ZHxa_YH_c&#m!QS?7LPu`@2$$g<2RtmRh{4ZSnt>S}fMK z_^H&wTCMik`QJ+|mTFtvDz(VOD$$Us~7ZYN^e7hc+Sac0|`o zEuPf2SS+=uqv21d++Ql)uV1r%D7C0xvzALOd?s%l9oI{3d?IpPo0U=<-^^Lp=0>TF z&mfLAab6-v3^P1|W$nbf$r;zyike@@)R8;(8RuHwF>%d` zr{NT*n_4~8Kc9^BUm4R6jDHtCI6BV^`V5!;6WXoWjXZJ2AO-F~&!oJ!zOh+s^M=Fx z2LEjnp7azFGY38m-*Xn$(d%7XFQq(`PvoA;esqkaRd=o>-?+VXc}#zW{>%K1gCq2& z%D+zhmXBq+97Q{(*gtFEpU?c6p_e19$Kt+K>7MU)f87eztflRFO)bPBEutDU)@^ktR+g-{Kd}a>u?61961qYcIPC2TYcwbJpdM1^xCDi!M1x|nyT z@u3rp>R7Xnp{L`C!72X7h>I*`oP+xnPslT5xhBamg*RDvBvO_${b$MC&hk{)4gAQx zX2vx}=v&3COZK#s)?$OdJ{u%7;d`xbC+OXAU(^ad)|`WbWZ{dQgHAM_?*#i zR-jky*I&+*Sb^{9)QB#Wo-N!5KbuU>0wTEmzv*x^J%vNsqnEw}^A~;Uj_;bI>n8-Ctg$W;iNosyq#@2ev|z z`tqKVm3vA%s+{6%=@hcoR>~pQZFrRC{#&$2P10|A#q58BZSQaV6Ro1^y{I=4VwDP^ zwChu~_Nx3WKIPXAb%C*l#LG0VG_SVPo%P$D*ZefR>nT6rTB7IUTdLy8r#|D-t5?C$ zZ4MN5OJ#av2DD0TD9I-DG^Axd#Oj=1liy~=l`<%FekDo5>f3gH2|eBg6IEGqINDF9 z*%vcG?a?oc6>q4o^LXc2l|6m3hb(eey(sv%$F?6_%cgDJm?TM>+d9mn>wfm0#|= z%j}(N_7RTuU27dD{+&MoKWx!TYVQeNXJXjV=>++E=2%PK z)q-n(JX;|u^VRTd`CTba^NQENq-|fp2YiQxsHY;lD5=n^3M!&5I@b_8_i`REKSiiB z4}6K(_>mu%8D*zF_2s;7;Q+|I=j;A zK~CTm7w0-UqxaWMg#ia3(3+HV{g?@b>N?AtDR_-Snwh|+wflEOoCplD{`#2op}@V$6NfmYq&bp ziNkqD7?tNaahiQ7dxyQ?ug>POHkb8%0R8OFt?cO(&sDO&T#E>&SI(VI^XXdEJNK)j zFLY%h&G_*Px4jqrlYT5+6A)EXW^me zv}0U)8f7TTGHPaG1fzJYjy#~}sulU~SwPq8Sb?IpqnhiyL#yojJCCb=YMC$Pxs~_c zgWB@0MXTkI)++7AxQl#az$vshYpWViwD%18mlSzKJ%M|edPHU{1A_Ty`4)BHaSqOv zB=4WZb@{1w<$QQSKRd4{Qt6Z%&6w<6#&cR`v<$mFa#QL?ALgLVQ%0VzoqNT+=p4hv z_`;*s(<{a#-UF=eS2!6KIYv{CRCE1&WKHt(OA6V{bdl&fUbwTRuv3mpOA}A7Esrbv z{Nann4nPrs<(Xoh$Jj#KRMn)it+JZS=i5DCY~{Csh~2gH7dUGLPt4AcRP1@^Zy2RV z#y{JfP8u64mhWMAH4EOwnas?!qGvHH!xE}1=DA}v%f9OGYj|_>LN|FQJXw0cwX9ucJgv4Y&hnT;v(neTuehuIjd@T%%R@?Wrd=zeoV837tdoUZ zI&T_{zRynO4E{%0iJ&k0o#p&f1d5zV- zJZ;ovj0c=}9N<)DyLRMNIoF!B*CP*7Wn>P#z#qPm@kUWyAC(;0r#LHZgSE7oRWNhv zyQ?yNLy4MRq+T7rE1z~gP8@We{n?Xh=R=I&Cp{UjrE2_BtVnRdnmJeHXZ+pgDV-tn zU!mj@7GKZTdTrm3{F2X}f%8d>KC!{b=o8**^^Wg4R)1b`{T2OukM%xRUi01ktLVQ+ zzb{=|e8&16bZk+!-nquCS~(t1w5*=x$Rl($vmUQ?>~itwQ=drN&Vj&L{Pk0KW4;e1{7K`g z@OHcH+h!T`H~t-LR>to)=D?^#e_#jo1@9usd$}ReLMxsjxttf)4#t~0vgTb%mS+Q4 z=3eDXe&3KM{p&_0=fYkWXF`;LbuW7QH~CxUendoNTh=ON+h3(tGt;0RI1AeG%fTyH zlIn=Gp23;_0c~+#e6iPf9Umv2P!kqW-Ua+ij5*g|ZE-a}&saUV%&(DqL~2p1VP>Ye z4-S{qy<*HWX+0`y*m+2xyM7fqe104W%j1dY{NADXADpj?9Im5@bzW(%CJ6lxdwLlj z8+pm=)1JvwRQPJ$UpB2~9R7K51|9OT3G!$Ret%ms*~ioW0CW^j=gn<1?eJ z%s=mF#xa-I#LnaD7S(jNwPkO`&t?Cx)l2o6Zk{s9voU)nRzB4Gr}=$`)stba19~K$ zVu`njD@mVi<8!dBkSXqleX)nWN>t6L^=5Sb#EMd^<@LU7`6OG+rR*E@uDSY0)`kZD zc%oIT%lQQ8B4d%3prN`WA;08QKJk+A=XHIJ(HMhoCLghtH`y<&ThGgQVr-q|obS}d zBAKF~-luVz+sqZk?U6{%cUH6h-)e6jG5)Am&|BKaJB+a$wO!AvN7fMaq(9j}wIODH z^vyORo-On&S<1i>Fk08@*7lEB>GCyKW;x_jX!QWw=_-4dxmU(qg%lPm+o-y>;bXMF ziKg}GQSHydI!+qsn<yKMMdpegMp%u#Yd)L4!_dAdEVotS>_-$ysx$8E&5akD7kRS$sz=vo_rLsIvxVPbFhC%a+%`cz;IpbuG-$ z;;l!;TO``KSGKfu{aaVo;Gg*rqx!PXVJ(UA-XrMpdPJ?K`xoXJr`f5ynQFU=D9!4o z$+Saet)fwLdn6Wpy_>55%mx0!_v()4D*n+7UYg#9S(|DMTAVNuQu*GWQ><1zvm*A> z+Pxzqnw*=nO*MlNoNAZJB}R0a-|QKfQ`P5j=hhsal?m>vd!?wlxSDq3^e^-{;t3vp zbN9#A)wd@4ri{G5`y)AsIHP1$VpQzAOBBzTQ2P07W04E$-AecF?}eUa|EaS_S8%LV z)ACHu{#kn-DBtPkxs^wJmig)~p1QQj&aIy!i&VVNCdTKgsJ>;(peOvA@4a)h?0@Jv zhedx6)MEEApm)bu7rpgPMXS%W%9zdm9byCWsm?gvou$%g+H>f$J(M5>qKpgrk=B&*A0)S_i=o$Gz**;C(nuIDgEy9EK`!D;nNy=_2*hOD#N%a zi5B#hW%?RD_6hgT(lblchZsT5F`LmhF32^KgUq_?=$sjC*EzFym#C16R>nBb_@1BY z(n+g)E=7i0Z}|$mL2WtK=mhmysx0VclVWVG@lZFNEUesIie{Yg^U33gr&{c@HfCP6 z(p7N0ZoJ)Qoi?J#T6hjG^Xqi$l3QvY-4%V0gpI?#2VXbt7o+@J<9}XjdgXpGlC$%_ z-1jUJDEI3w^KLRIMw+9ALT~F==Wg0?x*R)cVRI8gR~z7>11 zR^~i_D^l^)_|CYC_(a@!2cVEsmSWDcb%s=bDsikCyVhx<86(#Z_eR{&%qyQ7*$L0t z_0sokdJ;eMu)I6+3@<$HosSllVRyq;r+2+m(CR0ZH7|Q=Rn05YRgAful?~ZvZe&?^ z>eqTEB4}@Y$Iw|NUXLy0-JP3L*b%c!MXcp}L+#^}d)2Xnq+y%Q4DO4j)UWdFC!Yf2 z6Xc57^0(4w7}_SG&G!@MnS2^;qwH`E({5{M|4}A>d!&@ T6kSiLT2<>#y>&Z2arA!yc{)w! literal 0 HcmV?d00001 diff --git a/posh.txt b/posh.txt new file mode 100644 index 0000000..7f5d401 --- /dev/null +++ b/posh.txt @@ -0,0 +1,1235 @@ +PowerShell Commands + +- Object +- Regex +- Items +- Application +- Network +- SMB +- WinRM +- ComObject +- WMI +- ActiveDirectory +- ServerManager +- PackageManagement +- SQLite +- PowerCLI +- Veeam +- XML +- Git + +### Help +Get-Command *Service* # поиск команды по имени +Get-Help Get-Service # синтаксис +Get-Service | Get-Member # отобразить Method (действия: Start, Stop), Property (объекты вывода: Status, DisplayName), Event (события объектов: Click) и Alias +Get-Alias ps +Get-Verb # действия, утвержденные для использования в командах +Set-ExecutionPolicy Unrestricted +Get-ExecutionPolicy + +# Object + +### Array +$srv = @("server-01", "server-02") # создать массив +$srv += @("server-03") # добавить в массив новый элемент +$srv.Count # отобразить кол-во элементов в массиве +Out-String # построчный вывод + +### Index +$srv[0] # вывести первое значение элемента массива +$srv[0] = Name # замена элемента в массиве +$srv[0].Length # узнать кол-во символов первого значения в массиве +$srv[10..100] # срез + +### HashTable +$hashtable = @{} +$User = "user" +$Server = "Computer" +$hashtable.Add($env:username,$env:computername) +$hashtable.Remove("Lifailon") + +$hashtable = @{"User" = "$env:username"; "Server" = "$env:computername"} +$Tag = @{$true = 'dev'; $false = 'prod'}[([System.Net.Dns]::GetHostEntry("localhost").HostName) -match '.*.TestDomain$'] + +### Keys +$hashtable.Keys # список всех ключей +$hashtable["User"] # получить значение (Values) по ключу + +### PSCustomObject +$Collections = New-Object System.Collections.Generic.List[System.Object] +$Collections.Add([PSCustomObject]@{User = $env:username; Server = $env:computername}) + +$object = New-Object –TypeName PSCustomObject -Property @{User = $env:username; Server = $env:computername} # предназначен для хранения объектов с произвольной структурой, где порядок их свойств может поменяться. Чтобы этого избежать, необходимо использовать дополнительный атрибут [ordered] +$object | Get-Member +$object | Add-Member –MemberType NoteProperty –Name IP –Value "192.168.1.1" # добавить свойство или -MemberType ScriptMethod +$object.PsObject.Properties.Remove('User') # удалить свойство (столбец) + +$arr = @() +$arr += [PSCustomObject]@{User = $env:username; Server = $env:computername} # медленный метод добавления, в каждой интерации перезаписывается массив и коллекция становится фиксированного размера (без возможности удаления) +$arr.Remove(0) # Exception calling "Remove" with "1" argument(s): "Collection was of a fixed size." + +Class CustomClass { +[string]$User +[string]$Server +} +$Class = New-Object -TypeName CustomClass +$Class.User = "support" +$Class.Server = "srv-01" + +### CSV +Get-Service | Select Name,DisplayName,Status,StartType | Export-Csv -path "$home\Desktop\Get-Service.csv" -Append -Encoding Default # экспортировать в csv (-Encoding UTF8) +Import-Csv "$home\Desktop\Get-Service.csv" -Delimiter "," # импортировать массив + +### Pipeline +$obj | Add-Member -MemberType NoteProperty -Name "Type" -Value "user" -Force # добавление объкта вывода NoteProperty +$obj | Add-Member -MemberType NoteProperty -Name "User" -Value "admin" -Force # изменеие содержимого для сущности объекта User +ping $srv | Out-Null # перенаправить результат вывода в Out-Null + +### Variable +$var = Read-Host "Enter" # ручной ввод +$pass = Read-Host "Enter Password" -AsSecureString # скрывать набор +$global:path = "\\path" # задать глобальную переменную, например в функции +$using:srv # использовать переменную текущей сесси в Invoke-сессии +Get-Variable # отобразить все переменные +Get-Variable *srv* # найти переменную по имени +Get-Variable -Scope Global # отобразить все глобальные переменные +Get-Variable Error # последняя команда с ошибкой +Remove-Variable -Name * # очистить все переменные +$LASTEXITCODE # содержит код вывода последней запущенной программы, например ping. Если код возврата положительный (True), то $LastExitCode = 0 + +### ENV +Get-ChildItem Env: # отобразить все переменные окружения +$env:PSModulePath # директории импорта модулей +$env:userprofile +$env:computername +$env:username +$env:userdnsdomain +$env:logonserver +([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name +[Environment]::GetFolderPath('ApplicationData') + +### Select-Object +Get-Process | Select-Object -Property * # отобразить все доступные объекты вывода +Get-Process | select -Unique "Name" # удалить повторяющиеся значения в массиве +Get-Process | select -ExpandProperty ProcessName # преобразовать из объекта-коллекции в массив (вывести содержимое без наименовая столбца) +(Get-Process).ProcessName + +### Expression +ps | Sort-Object -Descending CPU | select -first 10 ProcessName, # сортировка по CPU, вывести первых 10 значений (-first) +@{Name="ProcessorTime"; Expression={$_.TotalProcessorTime -replace "\.\d+$"}}, # затрачено процессорного времени в минутах +@{Name="Memory"; Expression={[string]([int]($_.WS / 1024kb))+"MB"}}, # делим байты на КБ +@{Label="RunTime"; Expression={((Get-Date) - $_.StartTime) -replace "\.\d+$"}} # вычесть из текущего времени - время запуска, и удалить milisec + +### Select-String +ipconfig /all | Select-String dns # поиск текста + +### Format-Table/Format-List +Get-Process | ft ProcessName, StartTime -Autosize # автоматическая группировка размера столбцов + +### Measure-Object +Get-Process | Measure | select Count # кол-во объектов +Get-Process | Measure -Line -Word -Character # кол-во строк, слов и Char объектов + +### Compare-Object +Compare-Object -ReferenceObject (Get-Content -Path .\file1.txt) -DifferenceObject (Get-Content -Path .\file2.txt) # сравнение двух файлов +$group1 = Get-ADGroupMember -Identity "Domain Admins" +$group2 = Get-ADGroupMember -Identity "Enterprise Admins" +Compare-Object -ReferenceObject $group1 -DifferenceObject $group2 -IncludeEqual +== # нет изменений +<= # есть изменения в $group1 +=> # есть изменения в $group2 + +### Where-Object (?) +Get-Process | Where-Object {$_.ProcessName -match "zabbix"} # фильтрация/поиск процессов по имени свойства объекта +Get-Process | where CPU -gt 10 | Sort-Object -Descending CPU # вывести объекты, где значения CPU больше 10 +Get-Process | where WS -gt 200MB # отобразить процессы где WS выше 200МБ +Get-Service | where Name -match "zabbix" # поиск службы +Get-Service -ComputerName $srv | Where {$_.Name -match "WinRM"} | Restart-Service # перезапустить службу на удаленном компьютере +(Get-Service).DisplayName # вывести значения свойства массива +netstat -an | where {$_ -match 443} +netstat -an | ?{$_ -match 443} +(netstat -an) -match 443 + +### Sort-Object +Get-Process | Sort-Object -Descending CPU | ft # обратная (-Descending) сортировка по CPU +$path[-1..-10] # обратная сборка массива без сортировки + +### Last/First +Get-Process | Sort-Object -Descending CPU | select -First 10 # вывести первых 10 объектов +Get-Process | Sort-Object -Descending CPU | select -Last 10 # вывести последних 10 объектов + +# Regex + +-replace "1","2" # замена элементов в индексах массива (везде где присутствует 1, заменить на 2), для удаления используется только первое значение +-split " " # преобразовать строку в массив, разделителем указан пробел, которой удаляется ($url.Split("/")[-1]) +-join " " # преобразовать массив (коллекцию) в единую строку (string), добавить разделителем пробел +$iplist -contains "192.168.1.1" # проверить, что в массиве есть целое значение, выводит True или False +"192.168.1.1" -in $iplist # проверить на наличие указанного значения в массиве +-like *txt* # поиск по маскам wildcard, выводит значение на экран +-match txt # поиска по шаблонам, проверка на соответствие содержимого текста +-match "zabbix|rpc" # условия, для поиска по нескольким словам +-NotMatch # проверка на отсутствие вхождения +$ip = "192.168.10.1" +$ip -match "(\.\d{1,3})\.\d{1,2}" # True +$Matches # отобразить все подходящие переменные последнего поиска, которые входят и не входят в группы () + +### Группировка +if ((($1 -eq 1) -and ($2 -eq 2)) -or ($1 -ne 3)) {"$true"} else {"$false"} # два условия: (если $1 = 1 и $2 = 2) или $1 не равно 3. Если хотя бы одно из выражений равно True, то все условие относится к True и наоборот +-and # логическое И +-or # логическое ИЛИ +!(Test-Path $path) # логическое НЕТ (-not), если путь недоступен, вернет True + +### Специальные символы +\d # число от 0 до 9 (20-07-2022 эквивалент: "\d\d-\d\d-\d\d\d\d") +\w # буква от "a" до "z" и от "A" до "Z" или число от 0 до 9 +\s # пробел, эквивалент: " " +\n # новая строка +\b # маска, определяет начало и конец целого словосочетания для поиска +. # обозначает любой символ, кроме новой строки +\ # экранирует любой специальны символ (метасимвол). Используется, если нужно указать конкретный символ, вместо специального ({ } [ ] / \ + * . $ ^ | ?) ++ # повторяется 1 и более раз (\s+) +{1,25} # квантификатор, указывает количество повторений символа слева на право (от 1 до 25 раз) +[] # поиск совпадения любой буквы, например, [A-z0-9] от A до z и цифры от 0 до 9 ("192.168.1.1" -match "192.1[6-7][0-9]") + +### Якори +^ или \A # определяет начало строки. $url -replace '^','https:' # добавить в начало; +$ или \Z # обозначают конец строки. $ip -replace "\d{1,3}$","0" +(?=text) # поиск слова слева. Пишем слева на право от искомого (ищет только целые словосочетания) "Server:\s(.{1,30})\s(?=$username)" +(?<=text) # поиск слова справа. $in_time -replace ".+(?<=Last)" # удалить все до слова Last +(?!text) # не совпадает со словом слева +(? $null +if ($LastExitCode -eq 0) {Write-Host "192.168.3.$_" -ForegroundColor green +} else { +Write-Host "192.168.3.$_"-ForegroundColor Red}} +% # передать цикл через конвеер (ForEach-Object) +$_ # переменная цикла и конвеера ($PSItem) +gwmi Win32_QuickFixEngineering | where {$_.InstalledOn.ToString() -match "2022"} | %{($_.HotFixID.Substring(2))} # gwmi создает массив, вывод команды передается where для поиска подходящих под критерии объектов. По конвееру передается в цикл для удаления первых (2) символов методом Substring из всех объектов HotFixID. + +### While +$srv = "yandex.ru" +$out2 = "Есть пинг" +$out3 = "Нет пинга" +$out = $false # предварительно сбросить переменную, While проверяет условие до запуска цикла +While ($out -eq $false){ # пока условие является $true, цикл будет повторяться +$out = ping -n 1 -w 50 $srv +if ($out -match "ttl") {$out = $true; $out2} else {$out = $false; $out3; sleep 1} +} + +while ($True){ # запустить бесконечный цикл +$result = ping yandex.ru -n 1 -w 50 +if ($result -match "TTL"){ # условие, при котором будет выполнен break +Write-Host "Сайт доступен" +break # остановит цикл +} else {Write-Host "Сайт недоступен"; sleep 1} +} + +# Items + +Test-Path $path # проверить доступность пути +Get-ChildItem $path -Filter *.txt -Recurse # отобразить содержимое каталога (Alias: ls/gci/dir) и дочерних каталогов (-Recurse) и отфильтровать вывод +Get-Location # отобразить текущие месторасположение (Alias: pwd/gl) +Set-Location $path # перемещение по каталогам (Alias: cd/sl) +Invoke-Item $path # открыть файл (Alias: ii/start) +Get-ItemProperty $env:userprofile\Documents\dns-list.txt | select FullName,Directory,Name,BaseName,Extension # свойтсва файла +Get-ItemProperty -Path $path\* | select FullName,CreationTime,LastWriteTime # свойства файлов содержимого директории, дата их создания и последнего изменения +New-Item -Path "C:\test\" -ItemType "Directory" # создать директорию (Alias: mkdir/md) +New-Item -Path "C:\test\file.txt" -ItemType "File" -Value "Добавить текст в файл" # создать файл +"test" > "C:\test\file.txt" # заменить содержимое +"test" >> "C:\test\file.txt" # добавить строку в файл +New-Item -Path "C:\test\test\file.txt" -Force # ключ используется для создания отсутствующих в пути директорий или перезаписи файла если он уже существует +Move-Item # перемещение объектов (Alias: mv/move) +Remove-Item "$path\" -Recurse # удаление всех файлов внутри каталога, без запроса подверждения (Alias: rm/del) +Remove-Item $path -Recurse -Include "*.txt","*.temp" -Exclude "log.txt" # удалить все файлы с расширением txt и temp ([Array]), кроме log.txt +Rename-Item "C:\test\*.*" "*.jpg" # переименовать файлы по маске (Alias: ren) +Copy-Item # копирование файлов и каталогов (Alias: cp/copy) +Copy-Item -Path "\\server-01\test" -Destination "C:\" -Recurse # копировать директорию с ее содержимым (-Recurse) +Copy-Item -Path "C:\*.txt" -Destination "C:\test\" # знак '\' в конце Destination используется для переноса папки внутрь указанной, отсутствие, что это новое имя директории +Copy-Item -Path "C:\*" -Destination "C:\test\" -Include '*.txt','*.jpg' # копировать объекты с указанным расширением (Include) +Copy-Item -Path "C:\*" -Destination "C:\test\" -Exclude '*.jpeg' # копировать объекты, за исключением файлов с расширением (Exclude) +$log = Copy-Item "C:\*.txt" "C:\test\" -PassThru # вывести результат копирования (логирование) в переменную, можно забирать строки с помощью индексов $log[0].FullName + +$date = (Get-Date).AddDays(-30) +$files = (ls $path).FullName +$creations = Get-ItemProperty $files | select FullName,LastWriteTime +foreach ($creat in $creations) { +if ($creat.LastWriteTime -le $date) { +Remove-Item $creat.FullName -Recurse +} +} + +Размер всех дочерних директория в Mb (округлить до одного символа после запятой): +ls (pwd).Path | %{ +$size = "{0:N1} Mb" -f ((ls $_.FullName -Recurse -Force | Measure-Object -Property Length -Sum).Sum / 1Mb) +"$_.Name | $size" +} + +### Filehash +Get-Filehash -Algorithm SHA256 "$env:USERPROFILE\Documents\RSA.conf.txt" + +### Clipboard +Set-Clipboard $srv # скопировать в буфер обмена +Get-Clipboard # вставить + +### Credential +$Cred = Get-Credential # сохраняет креды в переменные $Cred.Username и $Cred.Password +$Cred.GetNetworkCredential().password # извлечь пароль +cmdkey /generic:"TERMSRV/$srv" /user:"$username" /pass:"$password" # добавить указанные креды аудентификации на на терминальный сервер для подключения без пароля +mstsc /admin /v:$srv # авторизоваться +cmdkey /delete:"TERMSRV/$srv" # удалить добавленные креды аудентификации из системы +rundll32.exe keymgr.dll,KRShowKeyMgr # хранилище Stored User Names and Password +Get-Service VaultSvc # служба для работы Credential Manager +Install-Module CredentialManager # установить модуль управления Credential Manager к хранилищу PasswordVault из PowerShell +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls11,Tls12' # для устаноки модуля +Get-StoredCredential # получить учетные данные из хранилища Windows Vault +Get-StrongPassword # генератор пароля +New-StoredCredential -UserName test -Password "123456" # добавить учетную запись +Remove-StoredCredential # удалить учетную запись +$Cred = Get-StoredCredential | where {$_.username -match "admin"} +$pass = $cred.password +$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass) +[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) + +### Out-Gridview +Get-Service -cn $srv | Out-GridView -Title "Service $srv" -OutputMode Single –PassThru | Restart-Service # перезапустить выбранную службу + +### Out-File +Read-Host –AsSecureString | ConvertFrom-SecureString | Out-File "$env:userprofile\desktop\password.txt" # писать в файл. Преобразовать пароль в формат SecureString с использованием шифрования Windows Data Protection API (DPAPI) + +### Get-Content (gc/cat/type) +$password = gc "$env:userprofile\desktop\password.txt" | ConvertTo-SecureString # читать хэш пароля из файла с помощью ключей, хранящихся в профиле текущего пользователя, который невозможно прочитать на другом копьютере + +### AES Key +$AESKey = New-Object Byte[] 32 +[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey) +$AESKey | Out-File "C:\password.key" +$Cred.Password | ConvertFrom-SecureString -Key (Get-Content "C:\password.key") | Set-Content "C:\password.txt" # сохранить пароль в файл используя внешний ключ +$pass = Get-Content "C:\password.txt" | ConvertTo-SecureString -Key (Get-Content "\\Server\Share\password.key") # расшифровать пароль на втором компьютере + +# Application + +### Get-Package +Get-Package -ProviderName msi,Programs # список установленных программ + +### Local User and Group +Get-LocalUser # список пользователей +Get-LocalGroup # список групп +New-LocalUser "1C" -Password $Password -FullName "1C Domain" # создать пользователя +Set-LocalUser -Password $Password 1c # изменить пароль +Add-LocalGroupMember -Group "Administrators" -Member "1C" # добавить в группу Администраторов +Get-LocalGroupMember "Administrators" # члены группы + +### EventLog +Get-EventLog -List # отобразить все корневые журналы логов и их размер +Clear-EventLog Application # очистить логи указанного журнала +Get-EventLog -LogName Security -InstanceId 4624 # найти логи по ID в журнале Security + +function Get-Log ($count=30,$hour=-3) { # указать значения параметров по умолчанию +Get-EventLog -LogName Application -Newest $count | where-Object TimeWritten -ge (Get-Date).AddHours($hour) # отобразить 30 новых событий за последние 3 часа +} +Get-Log 10 -1 # передача параметров функции (если значения идут по порядку, то можно не указывать названия переменных) + +### WinEvent +Get-WinEvent -ListLog * | where logname -match SMB | sort -Descending RecordCount # отобразить все доступные журналы логов +Get-WinEvent -LogName "Microsoft-Windows-SmbClient/Connectivity" | where +Get-WinEvent -LogName Security -MaxEvents 100 # отобразить последние 100 событий +Get-WinEvent -FilterHashtable @{LogName="Security";ID=4624} # найти логи по ID в журнале Security + +$RDPAuths = Get-WinEvent -ComputerName $srv -LogName "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational" -FilterXPath '' +[xml[]]$xml = $RDPAuths | Foreach {$_.ToXml()} +$EventData = Foreach ($event in $xml.Event) { +New-Object PSObject -Property @{ +"Время подключения" = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm K') +"Имя пользователя" = $event.UserData.EventXML.Param1 +"Адрес клиента" = $event.UserData.EventXML.Param3 +}} +$EventData | Out-Gridview -Title "История RDP подключений на сервере $srv" + +$obj = @() +$fw = Get-WinEvent 'Microsoft-Windows-Windows Firewall With Advanced Security/Firewall' +foreach ($temp_fw in $fw) { +if ($temp_fw.id -eq 2004) {$type = "Added Rule"} elseif ($id -eq 2006) {$type = "Deleted Rule"} +$port = $temp_fw.Properties[7] | select -ExpandProperty value +$name = $temp_fw.Properties[1] | select -ExpandProperty value +$obj += [PSCustomObject]@{Time = $temp_fw.TimeCreated; Type = $type; Port = $port; Name = $name} +} + +### Event +Register-EngineEvent # регистрирует подписку на события PowerShell или New-Event и создает задание (Get-Job) +Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action { +$date = Get-Date -f hh:mm:ss; (New-Object -ComObject Wscript.Shell).Popup("PowerShell Exit: $date",0,"Action",64) +} +-SupportEvent # не выводит результат регистрации события на экран, в Get-EventSubscriber и Get-Job +-Forward # перенаправляет события из удаленного сеанса (New-PSSession) в локальный сеанс + +Register-ObjectEvent # регистрирует подписку на события объектов .NET +$System_Obj | Get-Member -MemberType Event # отобразить список всех событий объекта +Register-ObjectEvent -InputObject $System_Obj -EventName Click -SourceIdentifier SrvListClick -Action { +Write-Host $System_Obj.Text +} +Get-EventSubscriber # список зарегистрированных подписок на события в текущей сессии +Unregister-Event -SourceIdentifier SrvListClick # удаляет регистрацию подписки на событие по имени события (или все *) +Remove-Job -Name SrvListClick # удаляет задание +-InputObject # объект или переменная, хранящая объект +-EventName # событие (например, Click,MouseClick) +-SourceIdentifier # название регистрируемого события +-Action # действие при возникновении события + +### Firewall +New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135 # открыть in-порт +Get-NetFirewallRule | Where-Object {$_.DisplayName -match "135"} # найти правило по имени +Get-NetFirewallPortFilter | where LocalPort -like 80 # найти действующие правило по номеру порта + +Get-NetFirewallRule -Enabled True -Direction Inbound | select -Property DisplayName, +@{Name='Protocol';Expression={($_ | Get-NetFirewallPortFilter).Protocol}}, +@{Name='LocalPort';Expression={($_ | Get-NetFirewallPortFilter).LocalPort}}, +@{Name='RemotePort';Expression={($_ | Get-NetFirewallPortFilter).RemotePort}}, +@{Name='RemoteAddress';Expression={($_ | Get-NetFirewallAddressFilter).RemoteAddress}}, +Enabled,Profile + +### Firewall-Manager +Install-Module Firewall-Manager +Export-FirewallRules -Name * -CSVFile $home\documents\fw.csv # -Inbound -Outbound -Enabled -Disabled -Allow -Block (фильтр правил для экспорта) +Import-FirewallRules -CSVFile $home\documents\fw.csv + +### Performance +(Get-Counter -ListSet *).CounterSetName # вывести список всех доступных счетчиков производительности в системе +(Get-Counter -ListSet *memory*).Counter # все счетчики, включая дочернии, поиск по wildcard-имени +Get-Counter "\Memory\Available MBytes" # объем свободной оперативной памяти +Get-Counter -cn $srv "\LogicalDisk(*)\% Free Space" # % свободного места на всех разделах дисков +(Get-Counter "\Process(*)\ID Process").CounterSamples +Get-Counter "\Processor(_Total)\% Processor Time" –ComputerName $srv -MaxSamples 5 -SampleInterval 2 # 5 проверок каждые 2 секунды +Get-Counter "\Процессор(_Total)\% загруженности процессора" -Continuous # непрерывно +(Get-Counter "\Процессор(*)\% загруженности процессора").CounterSamples + +### Regedit +Get-PSDrive # список всех доступных дисков и веток реестра +cd HKLM:\ # HKEY_LOCAL_MACHINE +cd HKCU:\ # HKEY_CURRENT_USER +Get-Item # получить информацию о ветке реестра +New-Item # создать новый раздел реестра +Remove-Item # удалить ветку реестра +Get-ItemProperty # получить значение ключей/параметров реестра (это свойства ветки реестра, аналогично свойствам файла) +Set-ItemProperty # изменить название или значение параметра реестра +New-ItemProperty # создать параметр реестра +Remove-ItemProperty # удалить параметр + +Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select DisplayName # список установленных программ +Get-Item HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002 # посмотреть содержимое Items +(Get-ItemProperty HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002)."New Signature" # отобразить значение (Value) свойства (Property) Items +$reg_path = "HKCU:\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002" +$sig_name = "auto" +Set-ItemProperty -Path $reg_path -Name "New Signature" -Value $sig_name # изменить или добавить в корне ветки (Path) свойство (Name) со значением (Value) +Set-ItemProperty -Path $reg_path -Name "Reply-Forward Signature" -Value $sig_name + +### Scheduled +$Trigger = New-ScheduledTaskTrigger -At 01:00am -Daily # 1:00 ночи +$Trigger = New-ScheduledTaskTrigger –AtLogon # запуск при входе пользователя в систему +$Trigger = New-ScheduledTaskTrigger -AtStartup # при запуске системы +$User = "NT AUTHORITY\SYSTEM" +$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "$home\Documents\DNS-Change-Tray-1.3.ps1" +$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -WindowStyle Hidden -File $home\Documents\DNS-Change-Tray-1.3.ps1" +Register-ScheduledTask -TaskName "DNS-Change-Tray-Startup" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force + +Get-ScheduledTask | ? state -ne Disabled # список всех активных заданий +Start-ScheduledTask DNS-Change-Tray-Startup # запустить задание немедленно +Get-ScheduledTask DNS-Change-Tray-Startup | Disable-ScheduledTask # отключить задание +Get-ScheduledTask DNS-Change-Tray-Startup | Enable-ScheduledTask # включить задание +Unregister-ScheduledTask DNS-Change-Tray-Startup # удалить задание +Export-ScheduledTask DNS-Change-Tray-Startup | Out-File $home\Desktop\Task-Export-Startup.xml # экспортировать задание в xml +Register-ScheduledTask -Xml (Get-Content $home\Desktop\Task-Export-Startup.xml | Out-String) -TaskName "DNS-Change-Tray-Startup" + +# Network + +### ping +Test-Connection -Count 1 $srv1, $srv2 # отправить icmp-пакет двум хостам +Test-Connection $srv -ErrorAction SilentlyContinue # не выводить ошибок, если хост не отвечает +Test-Connection -Source $srv1 -ComputerName $srv2 # пинг с удаленного компьютера + +### port +tnc $srv -p 5985 +tnc $srv -CommonTCPPort WINRM # HTTP,RDP,SMB +tnc ya.ru –TraceRoute -Hops 2 # TTL=2 +tnc ya.ru -DiagnoseRouting # маршрутизация до хоста, куда (DestinationPrefix: 0.0.0.0/0) через (NextHop: 192.168.1.254) + +### ipconfig +Get-NetIPConfiguration +Get-NetAdapter +Get-NetAdapterAdvancedProperty +Get-NetAdapterStatistics + +### nslookup +Resolve-DnsName ya.ru -Type MX # ALL,ANY,A,NS,SRV,CNAME,PTR,TXT(spf) + +### route +Get-NetRoute + +### netstat +Get-NetTCPConnection -State Established,Listen | where LocalAddress -match "192.168" + +### Invoke-WebRequest +$pars = iwr -Uri "https://losst.pro/" +$pars | Get-Member # отобразить все методы +$pars.Content # содержимое страницы (Out-File url.html) +$pars.statuscode -eq 200 # код ответа, запрос выполнен успешно +$pars.Headers # информация о сервере +$pars.Links | fl innerText, href # ссылки +$pars.Images.src # ссылки на изображения +iwr $url -OutFile $path # скачать файл + +### ConvertTo-HTML +Get-Process | select Name, CPU | ConvertTo-HTML -As Table > "$home\desktop\proc-table.html" # вывод в формате List (Format-List) или Table (Format-Table) + +# WinRM + +Enter-PSSession -ComputerName $srv # подключиться к PowerShell сессии через PSRemoting. Подключение возможно только по FQDN-имени +Invoke-Command $srv -ScriptBlock {Get-ComputerInfo} # выполнение команды через PSRemoting +$session = New-PSSession $srv # открыть сессию +Get-PSSession # отобразить активные сессии +icm -Session $session {$srv = $using:srv} # передать переменную текущей сессии ($using) в удаленную +Disconnect-PSSession $session # закрыть сессию +Remove-PSSession $session # удалить сессию + +### Windows Remote Management Configuration +winrm quickconfig -quiet # изменит запуск службы WinRM на автоматический, задаст стандартные настройки WinRM и добавить исключения для портов в fw +Enable-PSRemoting –Force +Test-WSMan $srv -ErrorAction Ignore # проверить работу WinRM на удаленном компьютере (игнорировать вывыод ошибок) +New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "$env:computername" -FriendlyName "WinRM HTTPS Certificate" -NotAfter (Get-Date).AddYears(5) # создать самоподписанный сертификат и скопировать отпечаток (thumbprint) +New-Item -Path WSMan:\Localhost\Listener -Transport HTTPS -Address * -CertificateThumbprint "CACA491A66D1706AC2FEB5E53D0E111C1C73DD65" # создать прослушиватель +New-NetFirewallRule -DisplayName 'WinRM HTTPS Management' -Profile Domain,Private -Direction Inbound -Action Allow -Protocol TCP -LocalPort 5986 # открыть порт в fw +winrm enumerate winrm/config/listener # текущая конфигурация прослушивателей WinRM (отображает отпечаток cert SSL для HTTPS 5986) +dir WSMan:\localhost\client # отобразить конфигурацию +winrm get winrm/config/service/auth # список всех конфигураций аутентификации WinRM (WSMan:\localhost\client\auth) +Set-Item -path wsman:\localhost\service\auth\basic -value $true # разрешить локальную аутентификацию +Set-PSSessionConfiguration -ShowSecurityDescriptorUI -Name Microsoft.PowerShell # добавить права доступа через дескриптор безопасности +Set-Item WSMan:\localhost\client\allowunencrypted $true # работать без шифрования +Set-Item WSMan:\localhost\client\TrustedHosts -Value "*" -force # добавить новый доверенный хост (для всех) в конфигурацию +net localgroup "Remote Management Users" "winrm" /add # добавить пользователя winrm (удалить /del) в локальную группу доступа "пользователи удаленного управления" (Local Groups - Remote Management Users) + +# SMB + +Get-SmbServerConfiguration +Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force # отключить протокол SMB v1 +Get-WindowsFeature | Where-Object {$_.name -eq "FS-SMB1"} | ft Name,Installstate # модуль ServerManager, проверить установлен ли компонент SMB1 +Install-WindowsFeature FS-SMB1 # установить SMB1 +Uninstall-WindowsFeature –Name FS-SMB1 –Remove # удалить SMB1 клиента (понадобится перезагрузка) +Get-WindowsOptionalFeature -Online # модуль DISM, для работы с компонентами Windows +Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -Remove # удалить SMB1 +Set-SmbServerConfiguration –AuditSmb1Access $true # включить аудит SMB1 +Get-SmbConnection # список активных сессий и используемая версия SMB (Dialect) +Get-SmbOpenFile | select ClientUserName,ClientComputerName,Path,SessionID # список открытых файлов +Get-SmbShare # список сетевых папок +New-SmbShare -Name xl-share -Path E:\test # создать новую общую сетевую папку (расшарить) +-EncryptData $True # включить шифрование SMB +-Description # имя в сетевом окружении +-ReadAccess "domain\username" # доступ на чтение +-ChangeAccess # доступ на запись +-FullAccess # полный доступ +-NoAccess ALL # нет прав +-FolderEnumerationMode [AccessBased | Unrestricted] # позволяет скрыть в сетевой папке объекты, на которых у пользователя нет доступа с помощью Access-Based Enumeration (ABE) +Get-SmbShare xl-share | Set-SmbShare -FolderEnumerationMode AccessBased # ключить ABE для всех расшаренных папок +Remove-SmbShare xl-share -force # удалить сетевой доступ (шару) +Get-SmbShareAccess xl-share # вывести список доступов безопасности к шаре +Revoke-SmbShareAccess xl-share -AccountName Everyone –Force # удалить группу из списка доступов +Grant-SmbShareAccess -Name xl-share -AccountName "domain\XL-Share" -AccessRight Change –force # изменить/добавить разрешения на запись (Full,Read) +Grant-SmbShareAccess -Name xl-share -AccountName "все" -AccessRight Change –force +Block-SmbShareAccess -Name xl-share -AccountName "domain\noAccess" -Force # принудительный запрет +New-SmbMapping -LocalPath X: -RemotePath \\$srv\xl-share -UserName support4 -Password password –Persistent $true # подключить сетевой диск +-Persistent # восстановление соединения после отключения компьютера или сети +-SaveCredential # позволяет сохранить учетные данные пользователя для подключения в диспетчер учетных данных Windows Credential Manager +Stop-Process -Name "explorer" | Start-Process -FilePath "C:\Windows\explorer.exe" # перезапустить процесс для отображения в проводнике +Get-SmbMapping # список подключенных сетевых дисков +Remove-SmbMapping X: -force # отмонтировать сетевой диск +$CIMSession = New-CIMSession –Computername $srv # создать сеанс CIM (аудентификация на SMB) +Get-SmbOpenFile -CIMSession $CIMSession | select ClientUserName,ClientComputerName,Path | Out-GridView -PassThru | Close-SmbOpenFile -CIMSession $CIMSession -Confirm:$false –Force # закрыть файлы (открыть к ним сетевой доступ) + +### Get-Acl +(Get-Acl \\$srv\xl-share).access # доступ ACL на уровне NTFS +Get-Acl C:\Drivers | Set-Acl C:\Distr # скопировать NTFS разрешения с одной папки и применить их на другую + +### NTFSSecurity +Install-Module -Name NTFSSecurity -force +Get-Item "\\$srv\xl-share" | Get-NTFSAccess +Add-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights Fullcontrol -PassThru # добавить +Remove-NTFSAccess -Path "\\$srv\xl-share" -Account "domain\xl-share" -AccessRights FullControl -PassThru # удалить +Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Clear-NTFSAccess # удалить все разрешения, без удаления унаследованных разрешений +Get-ChildItem -Path "\\$srv\xl-share" -Recurse -Force | Enable-NTFSAccessInheritance # включить NTFS наследование для всех объектов в каталоге + +### Storage +Get-Command -Module Storage +Get-Disk # список логических дисков +Get-Partition # отобразить разделы на всех дисках +Get-Volume # список логичких разделов +Get-PhysicalDisk # список физических дисков +Initialize-Disk 1 –PartitionStyle MBR # инициализировать диск +New-Partition -DriveLetter D –DiskNumber 1 -Size 500gb # создать раздел (выделить все место -UseMaximumSize) +Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel Disk-D # форматировать раздел +Set-Partition -DriveLetter D -IsActive $True # сделать активным +Remove-Partition -DriveLetter D –DiskNumber 1 # удалить раздел +Clear-Disk -Number 1 -RemoveData # очистить диск +Repair-Volume –driveletter C –Scan # Check disk +Repair-Volume –driveletter C –SpotFix +Repair-Volume –driverletter C -Scan –Cimsession $CIMSession + +### iSCSI +New-IscsiVirtualDisk -Path D:\iSCSIVirtualDisks\iSCSI2.vhdx -Size 20GB # создать динамический vhdx-диск (для фиксированного размера -UseFixed) +New-IscsiServerTarget -TargetName iscsi-target-2 -InitiatorIds "IQN:iqn.1991-05.com.microsoft:srv3.contoso.com" # создать Target +Get-IscsiServerTarget | fl TargetName, LunMappings +Connect-IscsiTarget -NodeAddress "iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target" -IsPersistent $true # подключиться инициатором к таргету +Get-IscsiTarget | fl +Disconnect-IscsiTarget -NodeAddress ″iqn.1995-05.com.microsoft:srv2-iscsi-target-2-target″ -Confirm:$false # отключиться + +# ComObject + +$wshell = New-Object -ComObject Wscript.Shell +$wshell | Get-Member +$link = $wshell.CreateShortcut("$Home\Desktop\Яндекс.lnk") # создать ярлык +$link.TargetPath = "https://yandex.ru" # куда ссылается (метод TargetPath объекта $link где хранится дочерний объект CreateShortcut) +$link.Save() # сохранить +(New-Object -ComObject wscript.shell).SendKeys([char]173) # включить/выключить звук + +$wshell.Exec("notepad.exe") # запустить приложение +$wshell.AppActivate("Блокнот") # развернуть запущенное приложение +sleep -Milliseconds 500 +$wshell.SendKeys("%") # ALT +$wshell.SendKeys("{ENTER}") +$wshell.SendKeys("{DOWN}") +$wshell.SendKeys("{DOWN}") +$wshell.SendKeys("{ENTER}") +Set-WinUserLanguageList -LanguageList en-us,ru -Force # изменить языковую раскладку клавиатуры +$wshell.SendKeys("login") + +$wshell = New-Object -ComObject Wscript.Shell +$output = $wshell.Popup("Выберите действие?",0,"Заголовок",4) +if ($output -eq 6) {"yes"} elseif ($output -eq 7) {"no"} else {"no good"} + +Type: +0 # ОК +1 # ОК и Отмена +2 # Стоп, Повтор, Пропустить +3 # Да, Нет, Отмена +4 # Да и Нет +5 # Повтор и Отмена +16 # Stop +32 # Question +48 # Exclamation +64 # Information + +Output: +-1 # Timeout +1 # ОК +2 # Отмена +3 # Стоп +4 # Повтор +5 # Пропустить +6 # Да +7 # Нет + +# WMI + +### WMI/CIM (Windows Management Instrumentation/Common Information Model) +Get-WmiObjec -ComputerName localhost -Namespace root -class "__NAMESPACE" | select name,__namespace # отобразить дочернии Namespace (логические иерархические группы) +Get-WmiObject -List # отобразить все классы пространства имен "root\cimv2" (по умолчанию), свойства (описывают конфигурацию и текущее состояние управляемого ресурса) и их методы (какие действия позволяет выполнить над этим ресурсом) +Get-WmiObject -List | Where-Object {$_.name -match "video"} # поиск класса по имени, его свойств и методов +Get-WmiObject -ComputerName localhost -Class Win32_VideoController # отобразить содержимое свойств класса + +gwmi -List | where name -match "service" | ft -auto # если в таблице присутствуют Methods, то можно взаимодействовать {StartService, StopService} +gwmi -Class win32_service | select * # отобразить список всех служб и всех их свойств +Get-CimInstance Win32_service # обращается на прямую к "root\cimv2" +Get-CimInstance -ComputerName $srv Win32_OperatingSystem | select LastBootUpTime # время последнего включения +gwmi -ComputerName $srv -Class Win32_OperatingSystem | select LocalDateTime,LastBootUpTime # текущее время и время последнего включения +gwmi win32_service -Filter "name='Zabbix Agent'" # отфильтровать вывод по имени +(gwmi win32_service -Filter "name='Zabbix Agent'").State # отобразить конкретное свойство +gwmi win32_service -Filter "State = 'Running'" # отфильтровать запущенные службы +gwmi win32_service -Filter "StartMode = 'Auto'" # отфильтровать службы по методу запуска +gwmi -Query 'select * from win32_service where startmode="Auto"' # WQL-запрос (WMI Query Language) +gwmi win32_service | Get-Member -MemberType Method # отобразить все методы взаимодействия с описание применения (Delete, StartService) +(gwmi win32_service -Filter 'name="Zabbix Agent"').Delete() # удалить службу +(gwmi win32_service -Filter 'name="MSSQL$MSSQLE"').StartService() # запустить службу +gwmi Win32_OperatingSystem | Get-Member -MemberType Method # методы reboot и shutdown +(gwmi Win32_OperatingSystem -EnableAllPrivileges).Reboot() # используется с ключем повышения привелегий +(gwmi Win32_OperatingSystem -EnableAllPrivileges).Win32Shutdown(0) # завершение сеанса пользователя +gwmi -list -Namespace root\CIMV2\Terminalservices +(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).AllowTSConnections +(gwmi -Class Win32_TerminalServiceSetting -Namespace root\CIMV2\TerminalServices).SetAllowTSConnections(1) # включить RDP +(Get-WmiObject win32_battery).estimatedChargeRemaining # заряд батареи в процентах + +$srv = "localhost" +gwmi Win32_logicalDisk -ComputerName $srv | where {$_.Size -ne $null} | select @{ +Label="Value"; Expression={$_.DeviceID}}, @{Label="AllSize"; Expression={ +[string]([int]($_.Size/1Gb))+" GB"}},@{Label="FreeSize"; Expression={ +[string]([int]($_.FreeSpace/1Gb))+" GB"}}, @{Label="Free%"; Expression={ +[string]([int]($_.FreeSpace/$_.Size*100))+" %"}} + +### NLA (Network Level Authentication) +(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").UserAuthenticationRequired +(gwmi -class "Win32_TSGeneralSetting" -Namespace root\cimv2\Terminalservices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(1) # включить NLA +Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer # отобразить значение (2) +Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication # отобразить значение (1) +Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SecurityLayer -Value 0 # изменить значение +Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name UserAuthentication -Value 0 +REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2 # отключить на клиентском компьютере проверку версии CredSSP, если на целевом комьютере-сервере не установлены обновления KB4512509 от мая 2018 года + +# ActiveDirectory + +### RSAT (Remote Server Administration Tools) +DISM.exe /Online /add-capability /CapabilityName:Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 /CapabilityName:Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0 +Add-WindowsCapability –online –Name Rsat.Dns.Tools~~~~0.0.1.0 +Add-WindowsCapability -Online -Name Rsat.DHCP.Tools~~~~0.0.1.0 +Add-WindowsCapability –online –Name Rsat.FileServices.Tools~~~~0.0.1.0 +Add-WindowsCapability -Online -Name Rsat.WSUS.Tools~~~~0.0.1.0 +Add-WindowsCapability -Online -Name Rsat.CertificateServices.Tools~~~~0.0.1.0 +Add-WindowsCapability -Online -Name Rsat.RemoteDesktop.Services.Tools~~~~0.0.1.0 +Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property DisplayName, State # отобразить список установленных компанентов + +$Session = New-PSSession -ComputerName $srv +Export-PSsession -Session $Session -Module ActiveDirectory -OutputModule ActiveDirectory # экспортировать модуль из удаленной сесси (например, с DC) +Remove-PSSession -Session $Session +Import-Module ActiveDirectory +Get-Command -Module ActiveDirectory + +### LDAP (Lightweight Directory Access Protocol) +$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher +$d0 = $env:userdnsdomain +$d0 = $d0 -split "\." +$d1 = $d0[0] +$d2 = $d0[1] +$ldapsearcher.SearchRoot = "LDAP://OU=Domain Controllers,DC=$d1,DC=$d2" +$ldapsearcher.Filter = "(objectclass=computer)" +$dc = $ldapsearcher.FindAll().path + +$usr = $env:username` # cписок групп текущего пользователя +$ldapsearcher = New-Object System.DirectoryServices.DirectorySearcher +$ldapsearcher.Filter = "(&(objectCategory=User)(samAccountName=$usr))" +$usrfind = $ldapsearcher.FindOne() +$groups = $usrfind.properties.memberof -replace "(,OU=.+)" +$groups = $groups -replace "(CN=)" + +### LAPS (Local Admin Password Management) +Get-ADComputer -Filter * -SearchBase "DC=$d1,DC=$d2" | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp > C:\pass.txt +Get-ADComputer -Identity $srv | Get-AdmPwdPassword -ComputerName {$_.Name} | select ComputerName,Password,ExpirationTimestamp + +### ADComputer +Get-ADDomainController -Filter * | ft HostName, IPv4Address, operatingsystem,site,IsGlobalCatalog,IsReadOnly # список DC в домене +nltest /DSGETDC:$env:userdnsdomain # узнать на каком DC аудентифицирован хост (Logon Server) +nltest /SC_RESET:$env:userdnsdomain\srv-dc2.$env:userdnsdomain # переключить компьютер на другой контроллер домена AD вручную (The command completed successfully) +Get-ADComputer –Identity $env:computername -Properties PasswordLastSet # время последней смены пароля на сервере +Test-ComputerSecureChannel –verbose # проверить доверительные отношения с доменом (соответствует ли локальный пароль компьютера паролю, хранящемуся в AD) +Reset-ComputerMachinePassword -Credential domain\admin # принудительно обновить пароль +Netdom ResetPWD /Server:dc-01 /UserD:domain\admin /PasswordD:* # сбросить хэш пароля компьютера в домене (перезагрузка не требуется) +Search-ADAccount -AccountDisabled -ComputersOnly | select Name,LastLogonDate,Enabled # отобразить все отключенные компьютеры + +Get-ADComputer -Filter * -Properties * | select name # список всех компьютеров в домене (Filter), вывести все свойства (Properties) +Get-ADComputer -Identity $srv -Properties * | ft Name,LastLogonDate,PasswordLastSet,ms-Mcs-AdmPwd -Autosize # конкретного компьютера в AD (Identity) +Get-ADComputer -SearchBase "OU=Domain Controllers,DC=$d1,DC=$d2" -Filter * -Properties * | ft Name, LastLogonDate, distinguishedName -Autosize # поиск в базе по DN (SearchBase) + +(Get-ADComputer -Filter {enabled -eq "true"}).count # получить общее количество активных (незаблокированных) компьютеров +(Get-ADComputer -Filter {enabled -eq "true" -and OperatingSystem -like "*Windows Server 2016*"}).count # кол-во активных копьютеров с ОС WS 2016 + +Get-ADComputer -Filter * -Properties * | select @{Label="Ping Status"; Expression={ +$ping = ping -n 1 -w 50 $_.Name +if ($ping -match "TTL") {"Online"} else {"Offline"} +}}, +@{Label="Status"; Expression={ +if ($_.Enabled -eq "True") {$_.Enabled -replace "True","Active"} else {$_.Enabled -replace "False","Blocked"} +}}, Name, IPv4Address, OperatingSystem, @{Label="UserOwner"; Expression={$_.ManagedBy -replace "(CN=|,.+)"} +},Created | Out-GridView + +### ADUser +Get-ADUser -Identity support4 -Properties * # список всех атрибутов +Get-ADUser -Identity support4 -Properties DistinguishedName, EmailAddress, Description # путь DN, email и описание +Get-ADUser -Filter {(Enabled -eq "True") -and (mail -ne "null")} -Properties mail | ft Name,mail # список активных пользователей и есть почтовый ящик +Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object # посчитать кол-во всех аккаунтов (Count) +Get-ADUser -Filter * -Properties WhenCreated | sort WhenCreated | ft Name, whenCreated # дата создания +Get-ADUser -Identity support4 -property LockedOut | select samaccountName,Name,Enabled,Lockedout +Enabled=True # учетная запись включена - да +Lockedout=False # учетная запись заблокирована (например, политикой паролей) - нет +Get-ADUser -Identity support4 | Unlock-ADAccount # разблокировать учетную запись +Disable-ADAccount -Identity support4 # отключить учетную запись +Enable-ADAccount -Identity support4 # включить учетную запись +Search-ADAccount -LockedOut # найти все заблокированные учетные записи +Search-ADAccount -AccountDisabled | select Name,LastLogonDate,Enabled # отобразить все отключенные учетные записи с временем последнего входа + +Get-ADUser -Identity support4 -Properties PasswordLastSet,PasswordExpired,PasswordNeverExpires +PasswordLastSet # время последней смены пароля +PasswordExpired=False # пароль истек - нет +PasswordNeverExpires=True # срок действия пароля не истекает - да +Set-ADAccountPassword support4 -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "password" -Force -Verbose) # изменить пароль учетной записи +Set-ADUser -Identity support4 -ChangePasswordAtLogon $True # смена пароля при следующем входе в систему + +$day = (Get-Date).adddays(-90) +Get-ADUser -filter {(passwordlastset -le $day)} | ft # пользователи, которые не меняли свой пароль больше 90 дней + +$day = (Get-Date).adddays(-30) +Get-ADUser -filter {(Created -ge $day)} -Property Created | select Name,Created # Новые пользователи за 30 дней + +$day = (Get-Date).adddays(-360) +Get-ADUser -Filter {(LastLogonTimestamp -le $day)} -Property LastLogonTimestamp | select Name,SamAccountName,@{n='LastLogonTimestamp';e={[DateTime]::FromFileTime($_.LastLogonTimestamp)}} | sort -Descending LastLogonTimestamp # пользователи, которые не логинились больше 360 дней. Репликация атрибута LastLogonTimestamp составляет от 9 до 14 дней. +| Disable-ADAccount $_.SamAccountName # заблокировать +-WhatIf # отобразить вывод без применения изменений + +### ADGroupMember +(Get-ADUser -Identity support4 -Properties MemberOf).memberof # список групп в которых состоит пользователь +Get-ADGroupMember -Identity "Domain Admins" | Select Name,SamAccountName # список пользователей в группе +Add-ADGroupMember -Identity "Domain Admins" -Members support5 # добавить в группу +Remove-ADGroupMember -Identity "Domain Admins" -Members support5 -force # удалить из группы +Get-ADGroup -filter * | where {!($_ | Get-ADGroupMember)} | Select Name # отобразить список пустых групп (-Not) + +### ADReplication +Get-Command -Module ActiveDirectory -Name *Replication* # список всех командлетов модуля +Get-ADReplicationFailure -Target dc-01 # список ошибок репликации с партнерами +Get-ADReplicationFailure -Target $env:userdnsdomain -Scope Domain +Get-ADReplicationPartnerMetadata -Target dc-01 | select Partner,LastReplicationAttempt,LastReplicationSuccess,LastReplicationResult,LastChangeUsn # время последней и время успешной репликации с партнерами +Get-ADReplicationUpToDatenessVectorTable -Target dc-01 # Update Sequence Number (USN) увеличивается каждый раз, когда на контроллере домена происходит транзакция (операции создания, обновления или удаления объекта), при репликации DC обмениваются значениями USN, объект с более низким USN при репликации будет перезаписан высоким USN. +Get-ADUser -server dc-01 -Identity support4 -Properties uSNChanged | select SamAccountName,uSNChanged # отобразить номер USN объета на конкретном DC + +repadmin /replsummary # отображает все DC, время последней репликации по направлению (Source и Destination) и их состояние с учетом партнеров +repadmin /showrepl dc-01 # отображает всех партнеров DC по реплкации и их статус для всех разделов NC (Naming Contexts) разделов (DC=ForestDnsZones, DC=DomainDnsZones, CN=Schema, CN=Configuration) +repadmin /retry # повторить попытку привязки к целевому DC, если была ошибка 1722 или 1753 (RPC недоступен) +repadmin /replicate $srv2 $srv1 DC=$d1,DC=$d2 # выполнить репликацию с $srv1 на $srv2 только указанный раздела +repadmin /SyncAll /AdeP # запустить межсайтовую исходящую репликацию всех разделов от текущего сервера со всеми партнерами по репликации +/A # выполнить для всех разделов NC +/d # в сообщениях идентифицировать серверы по DN (вместо GUID DNS - глобальным уникальным идентификаторам) +/e # межсайтовая синхронизация (по умолчанию синхронизирует только с DC текущего сайта) +/P # извещать об изменениях с этого сервера (по умолчанию: опрашивать об изменениях) +repadmin /Queue dc-01 # отображает кол-во запросов входящей репликации (очередь), которое необходимо обработать (причиной может быть большое кол-во партнеров или формирование 1000 объектов скриптом) +repadmin /showbackup * # узнать дату последнего Backup +dcdiag /Test:replications /s:dc-01 # отображает ошибки репликации +dcdiag /Test:DNS /e /v /q # тест DNS +/a # проверка всех серверов данного сайта +/e # проверка всех серверов предприятия +/q # выводить только сообщения об ошибках +/v # выводить подробную информацию +/fix # автоматически исправляет ошибки +/test: +Connectivity # проверяет регистрацию DC в DNS, выполняет тестовые LDAP и RPC подключения +NetLogons # проверка наличие прав на выполнение репликации +Services # проверяет, запущены ли на контроллере домена необходимые службы +Systemlog # проверяет наличие ошибок в журналах DC +FRSEvent # проверяет наличие ошибок в службе репликации файлов (ошибки репликации SYSVOL) +FSMOCheck # проверяет, что DC может подключиться к KDC, PDC, серверу глобального каталога +KnowsOfRoleHolders # проверяет доступность контроллеров домена с ролями FSMO +MachineAccount # проверяет корректность регистрации учетной записи DC в AD, корректность доверительных отношения с доменом + +# ServerManager + +Get-Command *WindowsFeature* # source module ServerManager +Get-WindowsFeature -ComputerName "localhost" +Get-WindowsFeature | where Installed -eq $True # список установленных ролей и компонентов +Get-WindowsFeature | where FeatureType -eq "Role" # отсортировать по списку ролей +Install-WindowsFeature -Name DNS # установить роль +Get-Command *DNS* +Get-DnsServerSetting -ALL +Uninstall-WindowsFeature -Name DNS + +### DNS +$zone = icm $srv {Get-DnsServerZone} | select ZoneName,ZoneType,DynamicUpdate,ReplicationScope,SecureSecondaries, +DirectoryPartitionName | Out-GridView -Title "DNS Server: $srv" –PassThru +$zone_name = $zone.ZoneName +if ($zone_name -ne $null) { +icm $srv {Get-DnsServerResourceRecord -ZoneName $using:zone_name | sort RecordType | select RecordType,HostName, @{ +Label="IPAddress"; Expression={$_.RecordData.IPv4Address.IPAddressToString}},TimeToLive,Timestamp +} | select RecordType,HostName,IPAddress,TimeToLive,Timestamp | Out-GridView -Title "DNS Server: $srv" +} + +Sync-DnsServerZone –passthru # синхронизировать зоны с другими DC в домене +Remove-DnsServerZone -Name domain.local # удалить зону +Get-DnsServerResourceRecord -ZoneName domain.local -RRType A # вывести все А-записи в указанной зоне +Add-DnsServerResourceRecordA -Name new-host-name -IPv4Address 192.168.1.100 -ZoneName domain.local -TimeToLive 01:00:00 -CreatePtr # создать А-запись и PTR для нее +Remove-DnsServerResourceRecord -ZoneName domain.local -RRType A -Name new-host-name –Force # удалить А-запись + +$DNSServer = "DC-01" +$DNSFZone = "domain.com" +$DataFile = "C:\Scripts\DNS-Create-A-Records-from-File.csv" +# cat $DataFile +# "HostName;IP" +# "server-01;192.168.1.10" +$DNSRR = [WmiClass]"\\$DNSServer\root\MicrosoftDNS:MicrosoftDNS_ResourceRecord" +$ConvFile = $DataFile + "_unicode" +Get-Content $DataFile | Set-Content $ConvFile -Encoding Unicode +Import-CSV $ConvFile -Delimiter ";" | ForEach-Object { +$FQDN = $_.HostName + "." + $DNSFZone +$IP = $_.HostIP +$TextA = "$FQDN IN A $IP" +[Void]$DNSRR.CreateInstanceFromTextRepresentation($DNSServer,$DNSFZone,$TextA) +} + +### DHCP +$mac = icm $srv -ScriptBlock {Get-DhcpServerv4Scope | Get-DhcpServerv4Lease} | select AddressState, +HostName,IPAddress,ClientId,DnsRegistration,DnsRR,ScopeId,ServerIP | Out-GridView -Title "HDCP Server: $srv" –PassThru +(New-Object -ComObject Wscript.Shell).Popup($mac.ClientId,0,$mac.HostName,64) + +Add-DhcpServerv4Reservation -ScopeId 192.168.1.0 -IPAddress 192.168.1.10 -ClientId 00-50-56-C0-00-08 -Description "new reservation" + +### RDS +Get-Command -Module RemoteDesktop +Get-RDServer -ConnectionBroker $broker # список всех серверов в фермеы, указывается полное доменное имя при обращение к серверу с ролью RDCB +Get-RDRemoteDesktop -ConnectionBroker $broker # список коллекций +(Get-RDLicenseConfiguration -ConnectionBroker $broker | select *).LicenseServer # список серверов с ролью RDL +Get-RDUserSession -ConnectionBroker $broker # список всех активных пользователей +Disconnect-RDUser -HostServer $srv -UnifiedSessionID $id -Force # отключить сессию пользователя +Get-RDAvailableApp -ConnectionBroker $broker -CollectionName C03 # список установленного ПО на серверах в коллекции +(Get-RDSessionCollectionConfiguration -ConnectionBroker $broker -CollectionName C03 | select *).CustomRdpProperty # use redirection server name:i:1 +Get-RDConnectionBrokerHighAvailability + +### DFSR +dfsutil /root:\\domain.sys\public /export:C:\export-dfs.txt # экспорт конфигурации namespace root +dfsutil /AddFtRoot /Server:\\$srv /Share:public # на новой машине предварительно создать корень на основе домена +dfsutil /root:\\domain.sys\public /import:C:\export-dfs.txt /