Mi-am dat seama că creatorii PowerShell erau oarecum leneși și asta e bine. Nu au vrut să codifice parametrul -ComputerName pentru fiecare comandă, așa că au creat un sistem comun numit "interacțiune de la distanță". În esență, acest sistem va activa orice comandă pentru a rula pe computerul la distanță. Puteți chiar să executați diferite comenzi care există pe computerul la distanță, dar nu sunt pe a voastră. Aceasta înseamnă că nu este nevoie să instalați în mod constant fiecare comandă pe stația dvs. de lucru. Acest sistem la distanță este foarte eficient și oferă numeroase oportunități administrative interesante
ARUBA INSTANT WI-FI: SIMPLĂ, PUTERNICĂ, DISPONIBILĂ
Când am început să folosesc PowerShell, am fost dus cu comanda Get-Service și am observat că are parametrul -ComputerName. Acest lucru înseamnă că vă puteți conecta la acest serviciu de la alte computere? După efectuarea unei serii de experimente, am constatat că acesta este exact ceea ce este scris. Am devenit interesat și am început să caut parametrii -ComputerName din alte echipe. Și m-am supărat când am aflat că erau doar câțiva dintre ei.
PowerShell oferă două tipuri de interacțiune de la distanță: interacțiune de la distanță una la una (1: 1) și o interacțiune de la distanță una la mai multe (1: n). Înainte de a vă spune despre ele, vreau să clarific câteva dintre elementele de bază.
Elementele de bază ale interacțiunii la distanță în PowerShell
Toate comenzile PowerShell produc obiecte ca ieșire. Când executați comanda de la distanță, ieșirea trebuie să fie înfășurată într-o formă care poate fi ușor transferată prin rețea utilizând protocolul HTTP sau HTTPS. De exemplu, PowerShell convertește automat obiectele de ieșire în fișierele XML care sunt transmise prin rețea. După ce ați atins computerul, acestea sunt transformate în obiecte cu care poate funcționa PowerShell. Cu toate acestea, aceste obiecte convertite sunt de fapt instantanee. Nu se pot actualiza în fiecare minut. Astfel, dacă trebuie să ajungeți la obiecte care sunt procesate pe un computer la distanță, rezultatul va fi corect doar pentru perioada specifică de timp în care au fost generate aceste obiecte. Valorile precum utilizarea memoriei și a procesorului nu se vor schimba. Mai mult, nu puteți forța obiectele transformate să facă nimic. De exemplu, nu puteți spune unui obiect să se oprească. Aceasta este limitarea de bază a interacțiunii la distanță, dar nu vă împiedică să lucrați și să efectuați sarcini interesante.
Există doar câteva cerințe de bază pentru utilizarea sistemului de interacțiune la distanță.
- Cum ar trebui să funcționeze computerul (este un computer local) și unul dintre aceștia la care doriți să trimiteți o comandă (de asemenea, un calculator la distanță) cu Windows PowerShell 2.0? Windows XP este o versiune învechită a Windows, pe care puteți instala PowerShell 2.0. Astfel, vechea versiune poate participa, de asemenea, la o sesiune la distanță.
- În mod ideal, computerele locale și la distanță trebuie să fie membri ai aceluiași domeniu sau membri ai unor domenii de încredere sau de încredere. Cu sistemul de interacțiune de la distanță, puteți lucra în afara domeniului, dar este dificil și aici nu voi vorbi despre asta. Pentru a afla mai multe despre acest scenariu, consultați secțiunea Ajutor PowerShell, care vorbește despre Remote_Troubleshooting.
Privire de ansamblu asupra WinRM
Acum mergeți la WinRM, deoarece trebuie să configurați setările acestui serviciu pentru a începe interacțiunea de la distanță. Din nou, din nou, trebuie doar să setați setările de interacțiune la distanță de la WinRM și PowerShell de pe computerul la distanță. În cele mai multe dintre mediile în care am lucrat, administratorii au activat sistemul de interacțiune de la distanță pe fiecare computer care rulează XP sau versiuni mai noi. Acest lucru face posibilă penetrarea imperceptibilă a calculatoarelor desktop și laptop, ceea ce poate fi foarte util (aceasta înseamnă că utilizatorii unor astfel de computere nu vor ști ce faceți).
Cea mai ușoară modalitate de a efectua ambele sarcini este să porniți PowerShell în numele administratorului și să executați comanda Enable-PSRemoting. Puteți vedea manualul pentru o altă comandă, numită Set-WSManQuickConfig. Nu este nevoie să executați comanda. Acest lucru va face pentru dvs. Enable-PSRemoting, și efectuează, de asemenea, câțiva pași care sunt necesari pentru a stabili interacțiunea și munca la distanță. În esență, comanda Enable-PSRemoting pornește serviciul WinRM, stabilește setările pentru a porni automat, înregistrează PowerShell ca punct final și chiar stabilește excepții în Windows Firewall pentru a permite traficul WinRM primit.
WinRM 2.0 (care utilizează PowerShell) utilizează implicit portul TCP 5985 pentru HTTP și portul 5986 pentru HTTPS. Acest lucru asigură că WinRM nu va intra în conflict cu serverele Web instalate local care sunt configurate să asculte pe porturile 80 și 443. Puteți specifica setările WinRM pentru a utiliza porturi alternative, dar nu recomand să faceți acest lucru. Dacă părăsiți aceste porturi, toate comenzile de acces la distanță de la PowerShell vor funcționa bine. Dacă schimbați aceste porturi, va trebui întotdeauna să specificați un port alternativ la pornirea comenzii de acces la distanță. Aceasta înseamnă că va trebui să tipăriți mai mult. Dacă într-adevăr trebuie să schimbați portul, puteți tasta:
Numerele 1234 înseamnă portul de care aveți nevoie. Aici această comandă este scrisă în mai multe rânduri, dar trebuie să o introduceți într-o singură linie. Același lucru se aplică tuturor celorlalte comenzi descrise în articol. Dacă doriți să utilizați HTTPS în loc de http, puteți modifica această comandă pentru a configura un nou port HTTPS. Trebuie să recunosc că există o modalitate de a seta setările WinRM pe computerele locale pentru a utiliza porturile alternative în mod implicit. Prin urmare, nu trebuie să definiți în mod constant un port alternativ când porniți comanda de acces la distanță. Dar să lucrăm cu setările implicite stabilite de Microsoft.
Dacă introduceți în setările GPO din Remote Shell, veți observa că puteți stabili, de exemplu, cât timp sesiunea la distanță va rămâne inactivă înainte ca serverul să o întrerupă; Câți utilizatori simultani pot accesa serverul la distanță la un moment dat; Cât de multă memorie și procese fiecare shell shell poate folosi; Numărul maxim de cochilii de la distanță pe care utilizatorii le pot deschide simultan. Aceste setări vă vor ajuta să vă asigurați că serverele dvs. nu sunt supraîncărcate cu administratori uitați. Cu toate acestea, în mod implicit, trebuie să fiți un administrator pentru a utiliza interacțiunea de la distanță, astfel încât să nu vă faceți griji cu privire la faptul că utilizatorii obișnuiți vă blochează serverele.
Interacțiune la distanță 1: 1
Folosind o interacțiune la distanță de la 1: 1, accesați în principal linia de comandă de pe un computer la distanță. Orice comenzi pe care le dați sunt executate direct pe computerul la distanță și veți vedea rezultatele în fereastra de comandă. Acest lucru este oarecum similar cu utilizarea conexiunii desktop la distanță, cu excepția faptului că sunteți limitat la mediul liniei de comandă PowerShell. Sistemul RemoteServer folosește unele dintre resursele de care are nevoie Desktopul la distanță, deci are un impact mult mai mic asupra serverelor.
Pentru a stabili o conexiune de 1: 1 cu un computer la distanță numit Server-R2, trebuie să rulați
Presupunând că ați activat sistemul la distanță de pe dispozitivul la distanță, calculatorul se află în același domeniu și rețeaua funcționează normal, veți obține conexiunea necesară. PowerShell vă permite să știți că ați atins obiectivul schimbând linia de comandă la
Partea [server-r2] vă informează că tot ce faceți este efectuat pe Server-R2. După aceasta puteți rula orice comenzi doriți. Puteți chiar să importați module și să adăugați extensii PowerShell (PSSnapins) care vor fi localizate pe computerul la distanță.
Chiar și permisele vor rămâne aceleași. Copia dvs. de PowerShell va funcționa cu același jeton de securitate cu care rulează. PowerShell face acest lucru cu Kerberos, așa că nu trece numele de utilizator și parola în rețea. Orice comandă pe care o rulați pe un computer la distanță va rula sub acreditările dvs., astfel încât să puteți face tot ce aveți permisiunea de a face. Aceasta este similară înregistrării direct de la consola computerului și utilizând o copie a PowerShell-ului acestui computer. E aproape așa. Iată câteva diferențe.
- Dacă aveți un script PowerShell pentru profilul dvs. pe un computer la distanță, acesta nu va porni când vă conectați utilizând sistemul de acces la distanță. Pur și simplu, profilurile sunt un pachet de comenzi care sunt lansate automat de fiecare dată când deschideți o fereastră de comandă. Ele sunt folosite pentru a descărca automat extensii, module și altele asemenea.
- Sunteți limitat la politica de execuție a computerului la distanță. De exemplu, politica computerului dvs. este setată la RemoteSigned, astfel încât să puteți rula scripturi nesemnate locale. Dacă politica computerului la distanță este setată la Restricted (setarea implicită), aceasta nu vă va permite să rulați scenarii atunci când interacționați de la distanță.
Multe comenzi PowerShell merg în perechi: una face ceva, cealaltă - opusul. În cazul nostru, Enter-PSSession vă conectează la un computer la distanță și Exit-PSSession închide această conexiune. Exit-PSSession nu are nevoie de parametri. Odată pornit, conexiunea la distanță se închide și promptul pentru fereastra liniei de comandă revine la vizualizarea normală. Dacă uitați să executați Exit-PSSession? Nu-ți face griji. PowerShell și WinRM au capacitatea de a afla ce ați făcut și de a închide conexiunea la distanță dacă este necesar.
Vreau să vă dau un sfat. Când vă conectați la un computer la distanță, nu executați Enter-PSSession pe el până când înțelegeți pe deplin ceea ce faceți. De exemplu, lucrați pentru ComputerA. Vă conectați la Server-R2. În linia PowerShell, porniți
Acum Server-R2 conține o conexiune deschisă cu Server-DC4. Acest lucru creează un "lanț de interacțiune la distanță", care este dificil de urmărit. În plus, serverele dvs. sunt supraîncărcate inutil. Pot exista momente când trebuie să faceți acest lucru (de exemplu, Server-DC4 se află în spatele unui paravan de protecție și nu îl puteți accesa direct, deci trebuie să utilizați Server-R2 ca intermediar). Cu toate acestea, regula generală este următoarea: încercați să evitați lanțurile de interacțiune de la distanță.
Interacțiunea de la distanță 1: n
Unul dintre cele mai interesante lucruri din PowerShell este interacțiunea la distanță 1: n. Vă permite să trimiteți simultan comenzi la mai multe computere la distanță - computere distribuite pe scară largă. Fiecare computer va executa individual comanda si va va trimite rezultatele. Totul se face cu comanda Invoke-Command în această formă:
Comanda în colțuri externe curbate este transmisă tuturor celor trei computere la distanță. Implicit, PowerShell poate vorbi simultan cu 32 de computere. Dacă definiți mai mult de 32 de calculatoare, acestea vor fi aliniate. Apoi, atunci când un computer iese, comanda execută următoarele. Dacă aveți o rețea foarte rapidă și computere puternice, puteți crește numărul acestora utilizând parametrul ThrottleLimit al comenzii. Citiți despre modul de utilizare a acestui parametru în Invoke-Command, pe pagina de ajutor.
Singurul parametru pe care nu îl veți vedea pe pagina Ajutor a acestei comenzi este parametrul Comandă. El, așa cum am arătat deja, funcționează perfect. Parametrul Comandă este un alias sau un nume scurt pentru parametrul ScriptBlock, care este afișat pe pagina Ajutor. Este mai ușor pentru mine să folosesc Comanda, așa că am tendința să o folosesc în loc de ScriptBlock, dar ele funcționează la fel.
Dacă citiți cu atenție pagina Ajutor pentru Invoke-Command, ați observat și un parametru care vă permite să specificați fișierul script, nu comanda. Parametrul FilePath vă permite să trimiteți un script la computerele de la distanță; acest lucru înseamnă că puteți automatiza anumite sarcini complexe și fiecare calculator își va realiza cota de lucru.
Acum, să examinăm parametrul Nume computer. În exemplul de cod Invoke-Command, am avut o listă de nume de computer separate prin virgule. Dacă aveți multe computere, probabil că nu doriți să le imprimați numele de fiecare dată când vă conectați la ele. În schimb, puteți crea un fișier text care conține un nume de computer pe o singură linie, fără virgule, citate sau orice altceva. De exemplu, dacă fișierul dvs. text a fost numit webservers.txt, ați folosi acest cod:
Parantezele fac ca PowerShell să execute mai întâi comanda Get-Content - aceasta este similară cu modul în care parantezele funcționează în matematică. Rezultatele de obținere a conținutului sunt apoi imbricate în parametrul -ComputerName.
De asemenea, puteți interoga numele computerului în Active Directory, dar acest lucru este mai dificil. Pentru a găsi un computer, puteți folosi comanda Get-ADComputer, dar nu introduceți această comandă în paranteze, așa cum sa făcut în Get-Content. De ce nu? Get-Content produce șiruri de text simple, în timp ce Get-ADComputer produce obiecte de tip "computer". Parametrul -ComputerName așteaptă un șir. Dacă ar primi obiecte "pe calculator", nu ar ști ce să facă cu ei. Prin urmare, dacă doriți să utilizați Get-ADComputer, trebuie să obțineți valori din proprietatea Nume a obiectelor computerului. Aici:
În paranteze, obiectele de computer sunt trimise comenzii Select-Object, iar parametrul -Expand este folosit pentru a afla proprietatea Nume a acestor obiecte de computer. Rezultatul expresiei în paranteze este setul de nume de computer, nu obiecte de calculator. Numele computerului sunt exact ceea ce are nevoie de parametrul -Computer Name.
pentru a încărca comenzile pentru serviciul de directoare în shell-ul comenzii astfel încât să poată fi utilizate.
Există și altceva!
Toate aceste exemple au fost date pentru sesiuni de peer-to-peer de interacțiune de la distanță. Dacă intenționați să vă reconectați de mai multe ori la aceleași computere (sau un computer) într-un timp scurt, puteți crea sesiuni reutilizabile și persistente. Acest lucru este foarte util dacă conexiunea necesită acreditări alternative, numărul portului nu este implicit sau altceva, ceea ce necesită parametri suplimentari.
Pentru a crea sesiuni persistente, trebuie să utilizați comanda New-PSSession, apoi să le salvați într-o variabilă pentru acces ușor. De exemplu, următorul cod creează o sesiune de interacțiune la distanță cu trei computere și le stochează în variabila sesiunilor $:
Sesiunile de interacțiune de la distanță sunt închise automat atunci când închideți shell-ul, dar înainte de aceasta pot prelua memoria și pot încărca procesorul pe sistemele locale și la distanță. Pentru a le închide cu exactitate, puteți folosi comanda Remove-PSSession:
Când trebuie să redeschideți sesiunea, puteți folosi comanda Invoke-Command:
Sau puteți utiliza Enter-PSSession:
Rețineți că în codul Enter-PSSession se deschide o singură sesiune de interacțiune la distanță. Variabila index 1 spune PowerShell că ar trebui să redeschidă sesiunea cu un computer numit Two (indexul este calculat din valoarea zero).
După cum vedem, există multe beneficii din interacțiunea Remote PowerShell. Dacă îl utilizați, veți vedea cât de mult va extinde orizonturile activității dvs.
Distribuiți materialul împreună cu colegii și prietenii