6Sep

Geek School: leer hoe je Remoting moet gebruiken in PowerShell

Een van de beste functies die PowerShell biedt, is de mogelijkheid om uw servers op afstand te beheren. Je kunt er zelfs een aantal tegelijk beheren.

Lees de vorige artikelen in de reeks:

  • Leer hoe u Windows kunt automatiseren met PowerShell
  • Leren gebruik van cmdlets in PowerShell
  • Leren hoe u objecten in PowerShell kunt gebruiken
  • Leren opmaken, filteren en vergelijken in PowerShell

En stay tuned voor derest van de serie de hele week.

Wat is een afstandsverklaring?

Bulkbeheer van uw servers kan vervelend zijn en als u eerder een IIS-configuratiewijziging op 50 webservers hebt moeten uitvoeren, weet u wat ik bedoel. Dit zijn de situaties waarin PowerShell Remoting en de scripting-capaciteiten van de taal te hulp kunnen schieten. Met HTTP of de veiligere HTTPS kunt u met PowerShell Remoting opdrachten naar een externe machine in uw netwerk verzenden. De machine voert vervolgens de opdrachten uit en stuurt de uitvoer terug naar u, die op zijn beurt op uw scherm wordt weergegeven.

Laten we technisch worden

De kern van PowerShell Remoting is een enkele Windows-service, Windows Remote Management of WinRM-service, zoals die bekend is geworden. Met WinRM kunt u een of meer sessieconfiguraties( ook wel endpoints genoemd) instellen. Dit zijn in feite bestanden die informatie bevatten over de ervaring die u wilt bieden aan de persoon die verbinding maakt met uw externe PowerShell-instantie. Meer specifiek kunt u sessieconfiguratiebestanden gebruiken om te definiëren wie wel en wie geen verbinding met de instantie kan maken, welke cmdlets en scripts ze kunnen uitvoeren en welke beveiligingscontext de sessie moet ondergaan. Met behulp van de WinRM-service stelt u ook "listeners" in, die luisteren naar inkomende PowerShell-verzoeken. Deze "luisteraars" kunnen zowel HTTP als HTTPS zijn en kunnen aan een enkel IP-adres op uw computer zijn gekoppeld. Wanneer u een PowerShell-verbinding opent met een andere machine( technisch gezien gebeurt dit met behulp van het WS-MAN-protocol, dat op HTTP is gebaseerd), bindt de verbinding met een van deze "luisteraars".De "luisteraars" zijn vervolgens verantwoordelijk voor het verzenden van het verkeer naar de toepassing die is geassocieerd met het juiste sessieconfiguratiebestand;de toepassing( normaal gesproken PowerShell maar u kunt desgewenst andere hosttoepassingen hebben) en voert vervolgens de opdracht uit en voert de resultaten via de "luisteraar" door het netwerk en terug naar uw machine.

Show Me How

Het eerste wat u moet doen is Remoting inschakelen op de machine waarmee u verbinding wilt maken. Dit kan gedaan worden door het volgende uit te voeren:

Activeren PSRemoting

U moet dan ja antwoorden op alle aanwijzingen. Wanneer u Enable-PSRemoting uitvoert, worden een aantal wijzigingen aangebracht op uw pc:

  • De WinRM-service wordt gestart.
  • De WinRM-service verandert van handmatige opstartmodus naar automatisch.
  • Hiermee maakt u een HTTP-listener die aan al uw netwerkkaarten is gekoppeld.
  • Het maakt ook een inkomende firewall-uitzondering voor het WS-MAN-protocol.
  • Sommige standaard sessieconfiguraties worden gemaakt

Als u Windows 7 gebruikt en de locatie van uw netwerkkaart is ingesteld op Openbaar, mislukt het inschakelen van PowerShell Remoting. U kunt dit probleem oplossen door eenvoudig naar de thuis- of werknetwerklocatie te schakelen. U kunt ook de netwerkcontrole overslaan met behulp van het volgende:

Enable-PSRemoting -SkipNetworkProfileCheck

We raden u echter aan om uw netwerklocatie te wijzigen.

Er zijn twee manieren om verbinding te maken met een andere machine met PowerShell. Er is de één-op-één methode, die erg lijkt op het gebruik van SSH, en dan is er de één-op-veel-methode.

Een PowerShell-sessie gebruiken

De eerste manier om verbinding te maken met een machine op afstand met PowerShell is het gebruik van iets dat een PowerShell-sessie wordt genoemd. Eenvoudig een sessie plaatsen stelt u in staat om commando's op de externe machine op een interactieve manier uit te voeren, ongeveer hetzelfde als op uw eigen computer. Als u een sessie wilt openen, typt u het volgende:

Enter-PSSession -ComputerName "Darlah"

De aanwijzing krijgt een voorvoegsel dat aangeeft op welke machine de cmdlets worden uitgevoerd.

Vanaf hier kunt u de prompt echt behandelen alsof u op de externe machine zat. Als u bijvoorbeeld alle bestanden op station C: \ wilt zien, kunt u een eenvoudige handeling uitvoeren:

Get-ChildItem -Path C: \

Als u een Linux-achtergrond hebt, kunt u deze één-op-één methode van remoting beschouwen als het PowerShell-alternatief voor SSH.

Invoke-Command gebruiken

De tweede manier waarop u PowerShell op een externe machine kunt gebruiken, is door Invoke-Command te gebruiken. Het voordeel van het gebruik van Invoke-Command komt voort uit het feit dat u dezelfde opdracht op meerdere machines tegelijkertijd kunt uitvoeren. Zoals u zich kunt voorstellen, is dit met name handig als u iets wilt doen om gebeurtenislogboeken van uw servers te verzamelen. Invoke-Command volgt de volgende syntaxis:

Invoke-Command -ComputerName Darlah, localhost -ScriptBlock{ Get-EventLog Application -Newest 2}

Aangezien de opdracht op alle computers parallel wordt uitgevoerd, hebt u een manier nodig om te zien welke pc eengegeven resultaat kwam van. U kunt dit doen door te kijken naar de eigenschap PSComputerName.

Wanneer u Invoke-Command gebruikt, hebt u niet langer de objecten die u in de pipeline zou verwachten. U ziet dat PowerShell de informatie van de externe machine niet naar uw computer hoeft terug te halen, maar dat zij een manier nodig hebben om de objecten weer te geven die de opdracht uitvoert die u op de externe machine uitvoert. Tegenwoordig lijkt het erop dat de gekozen manier om een ​​hiërarchische gegevensstructuur weer te geven, is om XML te gebruiken, wat betekent dat wanneer u een opdracht met behulp van Invoke-Command uitvoert, de resultaten eerst worden geserialiseerd in XML voordat ze naar uw computer worden teruggestuurd. Zodra ze teruggaan naar uw machine, worden ze opnieuw gedeserialiseerd in een object;de gotcha is hier dat wanneer ze gedeserialiseerd worden, alle methoden, behalve de ToString() -methode, die het object had, er van verwijderd werden.

Opmerking: Er zijn enkele uitzonderingen op deze regel, bijvoorbeeld de meeste primitieve typen zoals gehele getallen kunnen worden gedeserialiseerd met de bijbehorende methoden. Er is ook een proces genaamd Rehydration, waarbij sommige methoden kunnen worden toegevoegd aan gedeserialiseerde objecten. Wees dus voorzichtig en onthoud dat Get-Member je vriend is.

Homework

  • Lees de geheimen van PowerShell Remoting ebook door Don Jones.