Windows PowerShell 2.0 a introdus o nouă tehnologie puternică, Remoting, care a fost rafinată și extinsă pentru PowerShell 3.0. Bazat în primul rând pe protocoale și tehnici standardizate, Remoting este probabil unul dintre cele mai importante aspecte ale PowerShell: viitoarele produse Microsoft se vor baza pe ea aproape în întregime pentru comunicații administrative într-o rețea.,din păcate, Remoting este, de asemenea, un set complex de componente și, în timp ce Microsoft a încercat să ofere îndrumări solide pentru utilizarea acestuia într-o varietate de scenarii, mulți administratori încă se luptă cu acesta. Acest „mini E-book” este conceput pentru a vă ajuta să înțelegeți mai bine ce este Remoting, cum funcționează și-cel mai important-cum să îl utilizați într-o varietate de situații diferite.
Notă Acest ghid nu este menit să înlocuiască multitudinea de cărți existente care acoperă Remoting elementele de bază, cum ar fi Don proprii Învăța Windows PowerShell într-o Lună de Pachet ( http://MoreLunches.com) sau PowerShell în Profunzime., În schimb, acest ghid le completează prin furnizarea de instrucțiuni pas cu pas pentru multe dintre cazurile „de margine” în Remoting și explicând unele dintre comportamentele și cerințele mai neobișnuite de Remoting.
în esență, Remoting vă permite să accesați mașini la distanță într-o rețea și de a prelua date de la sau executa cod pe unul sau mai multe computere la distanță. Aceasta nu este o idee nouă, iar în trecut au evoluat o serie de tehnologii diferite de remotare. Unele cmdleturi au oferit în mod tradițional propriile capacități de remoting limitate, în timp ce majoritatea cmdleturilor nu acceptă remoting pe cont propriu.,cu PowerShell remoting există în cele din urmă un mediu generic remoting care permite executarea de la distanță pentru literalmente orice comandă care poate rula într-un PowerShell local. Deci, în loc să adăugați capabilități remoting la fiecare cmdlet și aplicație, pur și simplu lăsați-l la PowerShell pentru a transfera Codul PowerShell pe computerul țintă, executați-l acolo și apoi returnați rezultatele.de-a lungul acestei cărți electronice, ne vom concentra pe PowerShell remoting și nu vom acoperi capabilitățile de remoting private non-standard încorporate în cmdleturile selectate.,după cum se arată în figura 1.1, arhitectura generică Remoting PowerShell constă din numeroase componente și elemente diferite, interdependente.
Figura 1.1: elementele și componentele de PowerShell la Distanță
Aici este lista completă:
■ La partea de jos a figurii este calculatorul tau, sau mai corect clientul tău., Acest lucru este în cazul în care stai fizic, și este în cazul în care veți iniția cele mai multe dintre activitățile Remoting.■ computerul va comunica prin intermediul ws-MAN, sau servicii Web pentru Management, protocol. Acesta este un protocol bazat pe HTTP(S) care poate încapsula o varietate de comunicări diferite. Am ilustrat acest lucru ca folosind HTTP, care este configurația implicită a lui Remoting, dar ar putea fi la fel de ușor HTTPS.■ pe computerul la distanță, în terminologia corectă serverul (care nu se referă la sistemul de operare), rulează serviciul Windows Remote Management (WinRM)., Acest serviciu este configurat pentru a avea unul sau mai mulți ascultători. Fiecare ascultător așteaptă traficul WS-MAN pe un anumit port, fiecare legat de un protocol specific (HTTP sau HTTPS) și pe adrese IP specifice (sau toate adresele locale).■ când un ascultător primește trafic, serviciul WinRM caută să vadă pentru ce punct final este destinat traficul. În scopurile noastre, un punct final va lansa, de obicei, o instanță a Windows PowerShell. În termeni PowerShell, un punct final este numit și configurație de sesiune., Acest lucru se datorează faptului că, pe lângă lansarea PowerShell, poate încărca automat scripturi și module, poate plasa restricții asupra a ceea ce poate face utilizatorul de conectare și poate aplica setări suplimentare specifice sesiunii care nu sunt menționate aici.
Notă Deși afișăm PowerShell.exe în diagrama noastră, care este în scop ilustrativ. PowerShell.exe este aplicația PowerShell console și nu ar avea sens să funcționeze ca proces de fundal pe un computer la distanță. Procesul real se numește Wsmprovhost.exe, care găzduiește PowerShell în fundal pentru Remotarea conexiunilor.,după cum puteți vedea, un singur computer la distanță poate avea cu ușurință zeci sau chiar sute de puncte finale, fiecare cu o configurație diferită. PowerShell 3.0 configurează în mod implicit trei astfel de puncte finale: unul pentru PowerShell pe 32 de biți (pe sistemele pe 64 de biți), punctul final PowerShell implicit (care este pe 64 de biți pe sistemele x64) și unul pentru fluxul de lucru PowerShell. Începând cu Windows Server 2008 R2, există un al patrulea punct final implicit pentru sarcinile fluxului de lucru Server Manager.,
activarea Remotării
majoritatea versiunilor client de Windows, începând cu Windows Vista, nu permit implicit conexiunile de Remotare primite. Versiunile mai noi Windows Server fac, dar versiunile mai vechi nu pot. Deci, primul pas cu Remoting va fi, de obicei, să-l activați pe acele computere pe care doriți să le primiți conexiuni primite. Există trei moduri de a permite Remotarea, iar tabelul 1.1 compară ceea ce se poate realiza cu fiecare dintre ele.Tabelul 1.,1 Comparing the ways of enabling remoting
Enable-PSRemoting |
Group Policy |
Manually Step-by-Step |
|||
Set WinRM to auto-start and start the service |
Yes |
Yes |
Yes – use Set-Service and Start-Service., |
No |
Yes – use PSSessionConfiguration cmdlets |
Configure Windows Firewall exception |
Yes* |
Yes* |
Yes* – use Firewall cmdlets or Windows Firewall GUI |
Note Existing client versions of Windows, such as Windows Vista, do not permit firewall exceptions on any network identified as „Public”., Rețelele trebuie să fie ” acasă „sau” muncă/domeniu ” pentru a permite excepții. În PowerShell 3.0, puteți rula Enable-PSRemoting cu comutatorul-SkipNetworkProfileCheck pentru a evita această problemă.
vom activa Remoting în mediul nostru de testare prin rularea Enable-PSRemoting. Este rapid, ușor și cuprinzător; veți vedea, de asemenea, majoritatea sarcinilor manuale efectuate în secțiunile viitoare.
mediu de testare
vom folosi un mediu de testare consistent în următoarele secțiuni; acesta a fost creat pe șase mașini virtuale la CloudShare.,com, și este configurat așa cum se arată în figura 1.2.
Figura 1.2: Test de configurare a mediului
Unele note importante:
■ .NET Framework v4 și PowerShell 3.0 este instalat pe toate calculatoarele. Cea mai mare parte a ceea ce vom acoperi se aplică și PowerShell 2.0.,■ după cum se arată, majoritatea computerelor au un nume numeric de computer (C2108222963 și așa mai departe); controlerul de domeniu pentru fiecare domeniu (care este și un server DNS) are înregistrări CNAME cu nume mai ușor de reținut.■ fiecare controler de domeniu are un expeditor condiționat configurat pentru celălalt domeniu, astfel încât mașinile din fiecare domeniu să poată rezolva numele computerelor din celălalt domeniu.■ am efectuat toate sarcinile ca membru al Grupului de administratori de domenii, cu excepția cazului în care se specifică altfel.■ am creat un al șaselea server complet independent, care nu este deloc în niciun domeniu., Acest lucru va fi util pentru acoperirea unora dintre situațiile non-domeniu vă puteți găsi în cu Remoting.Atenție Când deschideți PowerShell pe un computer care are controlul contului de utilizator (UAC) activat, asigurați-vă că faceți clic dreapta pe pictograma PowerShell și selectați Executare ca Administrator. Dacă bara de titlu a ferestrei PowerShell rezultată nu începe cu Administrator: atunci nu aveți privilegii administrative. Puteți verifica permisiunile programatic cu acest lucru (whoami / all / select-string S-1-16-12288) – ne $null din consola PowerShell., Într-o coajă ridicată adevărat este returnat, altfel fals este.
activarea Remoting
am început prin rularea Enable-PSRemoting pe toate cele șase computere. Am avut grijă să ne asigurăm că comanda a rulat fără eroare; orice eroare în acest moment reprezintă un semnal că trebuie să opriți și să rezolvați eroarea înainte de a încerca să continuați. Figura 1.3 arată producția așteptată.
Figura 1.,3: ieșire așteptată de la Enable-PSRemoting
Notă: veți observa utilizarea abuzivă a capturilor de ecran în acest ghid. Vă ajută să vă asigurați că nu fac greșeli sau erori de copiere/lipire – vedeți exact ceea ce am tastat și am rulat.
rularea Get-PSSessionConfiguration ar trebui să dezvăluie cele trei sau patru puncte finale create de Enable-PSRemoting. Figura 1.4 arată ieșirea așteptată pe un server.
Figura 1.,4: ieșire așteptată de la Get-PSSessionConfiguration
notă: figura 1.4 ilustrează faptul că vă puteți aștepta ca diferite puncte finale să fie configurate pe diferite mașini. Acest exemplu a fost de la un computer Windows Server 2008 R2, care are mai puține puncte finale decât o mașină Windows 2012.
merită să luați un moment pentru a testa rapid configurația Remoting. Pentru computerele care fac parte din același domeniu, atunci când sunteți conectat ca administrator de domeniu din acel domeniu, Remoting ar trebui să „funcționeze doar.”Verificați-l rapid prin încercarea de a la distanță de la un computer la altul folosind Enter-PSSession.,notă: în alte medii, este posibil ca un cont de administrator de domeniu să nu fie singurul cont care poate utiliza Remoting. Dacă mediul dvs. de acasă sau de lucru are conturi suplimentare în grupul administratorilor locali ca standard pe domeniul dvs., veți putea, de asemenea, să utilizați aceste conturi pentru Remoting.
figura 1.5 arată ieșirea așteptată, în care am rulat și o comandă rapidă dir și apoi am ieșit din sesiunea de la distanță.
Figura 1.5: Verificarea remoting conectivitate de la COMPANIA.clientul loc la controlerul de domeniu DCA.atenție: dacă urmăriți în propriul mediu de testare, nu continuați până când nu confirmați Remotarea conectivității între două computere din același domeniu. Niciun alt scenariu nu trebuie să funcționeze chiar acum, vom ajunge la ele în secțiunile viitoare.
Core SARCINI Remoting
PowerShell prevede două cazuri principale de Utilizare Remoting., Primul, Remoting 1-to-1, este similar în natură cu SSH secure shell oferit pe sistemele Unix și Linux. Cu aceasta, veți obține un prompt de linie de comandă pe un singur computer la distanță. Al doilea, Remoting de la 1 la mai multe, vă permite să trimiteți o comandă (sau o listă de comenzi) în paralel cu un set de computere la distanță. Există, de asemenea, câteva tehnici secundare utile pe care le vom analiza.
1-to-1 Remoting
comanda Enter-PSSession se conectează la un computer la distanță și vă oferă un prompt de linie de comandă pe acel computer., Puteți rula orice comenzi sunt pe acel computer, cu condiția să aveți permisiunea de a efectua această sarcină. Rețineți că nu creați o sesiune de conectare interactivă; conexiunea dvs. va fi auditată ca o conectare în rețea, la fel ca și cum v-ați conecta la cota administrativă C$ a computerului. PowerShell nu va încărca sau procesa scripturi de profil pe computerul de la distanță. Orice scripturi pe care alegeți să le executați (și aceasta include importul modulelor de script) vor funcționa numai dacă Politica de execuție a mașinii de la distanță o permite.,
Enter-PSSession -computerName DC01
notă: în timp ce sunteți conectat la o mașină la distanță prin Enter-PSSession, promptul dvs. se schimbă și afișează numele sistemului la distanță între paranteze pătrate. Dacă ați personalizat promptul, toate personalizările vor fi pierdute, deoarece promptul este acum creat pe sistemul de la distanță și transferat înapoi la tine. Toate de intrare tastatură interactivă este trimis la aparatul de la distanță, și toate rezultatele sunt marshaled înapoi la tine. Acest lucru este important de reținut, deoarece nu puteți utiliza Enter-PSSession într-un script., Dacă ați făcut-o, scriptul va rula în continuare pe mașina dvs. locală, deoarece nu a fost introdus niciun cod interactiv.
1-to-Many Remoting
cu această tehnică, specificați unul sau mai multe nume de computer și o comandă (sau o listă de comenzi separate cu punct și virgulă); PowerShell trimite comenzile, prin Remoting, către computerele specificate. Aceste computere executa comenzile, serializa rezultatele în XML, și transmite rezultatele înapoi la tine. Calculatorul dvs. deserializează XML-ul înapoi în obiecte și le plasează în conducta sesiunii PowerShell., Acest lucru se realizează prin cmdlet-ul Invoke-Command.
Invoke-Command -computername DC01,CLIENT1 -scriptBlock { Get-Service }
Dacă aveți un script de comenzi pentru a rula, puteți avea Invoca-Comanda-l citesc, transmite conținutul la computerele de la distanță, și de a le executa aceste comenzi.
Invoke-Command -computername DC01,CLIENT1 -filePath c:\Scripts\Task.ps1
rețineți că Invoke-Command va comunica în mod implicit cu doar 32 de computere simultan. Dacă specificați mai multe, figuranti va coadă în sus, și Invoke-Command va începe procesarea lor ca se termină primul 32., Parametrul-ThrottleLimit poate ridica această limită; singurul cost este pentru computerul dvs., care trebuie să aibă resurse suficiente pentru a menține o sesiune PowerShell unică pentru fiecare computer pe care îl contactați simultan. Dacă vă așteptați să primiți cantități mari de date de la computerele la distanță, lățimea de bandă disponibilă a rețelei poate fi un alt factor limitativ.,când executați Enter-PSSession sau Invoke-Command și utilizați parametrul lor-ComputerName, Remoting creează o conexiune (sau sesiune), face tot ce i-ați cerut și apoi închide conexiunea (în cazul unei sesiuni interactive create cu Enter-PSSession, PowerShell știe că ați terminat când executați Exit-PSSession). Există unele cheltuieli implicate în acea configurare și dărâmare, astfel încât PowerShell oferă și opțiunea de a crea o conexiune persistentă-numită PSSession. Rulați New-PSSession pentru a crea o sesiune nouă, persistentă., Apoi, în loc să utilizați-ComputerName cu Enter-PSSession sau Invoke-Command, utilizați parametrul lor-Session și treceți un obiect PSSession existent, deschis. Acest lucru permite comenzilor să reutilizeze conexiunea persistentă pe care ați creat-o anterior.când utilizați parametrul-ComputerName și lucrați cu sesiuni ad-hoc, de fiecare dată când trimiteți o comandă către o mașină la distanță, există o întârziere semnificativă cauzată de cheltuielile necesare pentru a crea o nouă sesiune. Deoarece fiecare apel la Enter-PSSession sau Invoke-Command stabilește o nouă sesiune, de asemenea, nu puteți păstra starea., În exemplul de mai jos, variabila $test se pierde în al doilea apel:
când utilizați sesiuni persistente, pe de altă parte, re-conexiunile sunt mult mai rapide și, din moment ce păstrați și reutilizați sesiunile, acestea vor păstra starea., Deci, aici, al doilea apel pentru a invoca-comanda va fi în continuare posibilitatea de a accesa variabila $test care a fost configurat în primul apel
există diverse alte comenzi pentru a verifica starea sesiunii și a prelua sesiuni (Get-PSSession), închideți-le (Remove-PSSession), deconectați-le și reconectați-le (deconectare-PSSession și reconectare-PSSession, care sunt noi în PowerShell v3), și așa mai departe., În PowerShell v3, puteți trece, de asemenea, o sesiune deschisă pentru a obține-modul și Import-modul, permițându-vă să vedeți modulele listate pe un computer la distanță (prin PSSession deschis), sau pentru a importa un modul de la un computer la distanță în computer pentru Remoting implicit. Examinați ajutorul pentru aceste comenzi pentru a afla mai multe.Notă: Odată ce utilizați New-PSSession și creați propriile sesiuni persistente, este responsabilitatea dvs. să faceți menaj și să închideți și să eliminați sesiunea când ați terminat cu ele., Până când faceți acest lucru, sesiunile persistente rămân active, consumă resurse și pot împiedica conectarea altora. În mod implicit, sunt permise numai 10 conexiuni simultane la o mașină la distanță. Dacă păstrați prea multe sesiuni active, veți intra cu ușurință în limite de resurse. Această linie demonstrează ce se întâmplă dacă încercați să configurați prea multe sesiuni simultane:
PS> 1..10 | Foreach-Object { New-PSSession -ComputerName CLIENT1 }
Remoting se Întoarce Deserialized de Date
rezultatele Pe care le primiți de la un computer la distanță au fost serializat în XML, și apoi deserialized pe computer., În esență, obiectele plasate în conducta shell-ului dvs. sunt instantanee statice și detașate ale ceea ce se afla pe computerul de la distanță în momentul în care comanda dvs. a fost finalizată. Aceste obiecte deserializate nu dispun de metodele obiectelor originale și, în schimb, oferă doar proprietăți statice.dacă trebuie să accesați metode sau să modificați Proprietăți sau, cu alte cuvinte, dacă trebuie să lucrați cu obiectele live, Asigurați-vă că faceți acest lucru pe partea de la distanță, înainte ca obiectele să fie serializate și să călătorească înapoi la apelant., Acest exemplu utilizează metode obiect pe partea de la distanță pentru a determina procesul de proprietari care functioneaza foarte bine:
după ce rezultatele de călătorie înapoi la tine, nu mai poți invoca metodele obiect pentru că acum lucrezi cu „hidratat” obiecte care sunt desprinse din obiectele vii și nu conțin metode mai:
se Înseriază și deserializing este relativ scump. Puteți optimiza viteza și resursele asigurându-vă că codul dvs. de la distanță emite doar datele de care aveți nevoie cu adevărat., Puteți, de exemplu, să utilizați Select-Object și să alegeți cu atenție proprietățile pe care le doriți înapoi, mai degrabă decât să serializați și să deserializați totul.
Enter-PSSession vs. Invoke-Command
o mulțime de nou-veniți vor deveni puțin confuzi cu privire la remoting, în parte din cauza modului în care PowerShell execută scripturi. Luați în considerare următoarele și presupuneți că SERVER2 conține un script numit C:\RemoteTest.,ps1:
Enter-PSSession -ComputerName SERVER2C:\RemoteTest.ps1
Dacă ai putea să stai și tipul acestor comenzi în mod interactiv în fereastra de consola pe computer client, acest lucru ar lucra (presupunând remoting a fost înființat, ai avut permisiuni, și tot așa). Cu toate acestea, dacă le-ați inserat într-un script și ați rulat acel script, nu ar funcționa. Scenariul ar încerca să ruleze C:\RemoteTest.ps1 pe computerul local. rezultatul practic al acestui lucru este că Enter-PSSession este cu adevărat destinat utilizării interactive de către o ființă umană, nu pentru utilizarea în lot de către un script., Dacă doriți să trimiteți o comandă unui computer la distanță, dintr-un script, Invoke-Command este modul corect de a face acest lucru. Puteți configura o sesiune în avans (utilă dacă intenționați să trimiteți mai multe comenzi) sau puteți utiliza un nume de computer dacă doriți să trimiteți o singură comandă. De exemplu:
$session = New-PSSession -ComputerName SERVER2Invoke-Command -session $session -ScriptBlock { C:\RemoteTest.ps1 }
evident, va trebui să fiți precauți. Dacă acestea ar fi singurele două linii din scenariu, atunci când scriptul a terminat de rulat, sesiunea $ar înceta să mai existe., Acest lucru vă poate deconecta (într-un sens) de la sesiunea care rulează pe SERVER2. Ceea ce faci, și chiar dacă trebuie să vă faceți griji despre asta, depinde foarte mult de ceea ce faci și cum o faci. În acest exemplu, totul ar fi probabil în regulă, deoarece Invoke-Command ar „păstra” scriptul local care rulează până când scriptul de la distanță a terminat și a returnat ieșirea (dacă există).