Geek School leert om Remoting te 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.
Zorg ervoor dat u de vorige artikelen in de serie leest:
- Leer hoe u Windows kunt automatiseren met PowerShell
- Leren gebruik te maken van cmdlets in PowerShell
- Leren hoe objecten in PowerShell te gebruiken
- Leren opmaken, filteren en vergelijken in PowerShell
En blijf op de hoogte voor de rest van de serie de hele week.
Wat is Remoting?
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 scriptingmogelijkheden 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 deze 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 uitvoeren. Met behulp van de WinRM-service, stelt u ook "listeners" in, die luisteren naar inkomende PowerShell-verzoeken. Deze "luisteraars" kunnen HTTP of 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 belast met het verzenden van het verkeer naar de toepassing die is geassocieerd met het juiste sessieconfiguratiebestand; de applicatie (normaliter PowerShell maar u kunt desgewenst andere hosttoepassingen gebruiken) en vervolgens de opdracht uitvoeren en de resultaten via de "luisteraar" door het netwerk en terug naar uw machine doorsturen.
Laat me zien hoe
Het eerste dat u moet doen, is Remoting inschakelen op de computer waarmee u verbinding wilt maken. Dit kan gedaan worden door het volgende uit te voeren:
Enable-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.
- Het creëert een HTTP-listener die is verbonden met al uw netwerkkaarten.
- 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:
Activeren - 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 externe machine met PowerShell is het gebruik van iets dat een PowerShell-sessie wordt genoemd. Eenvoudig een sessie plaatsen stelt u in staat om opdrachten op de externe machine uit te voeren op een interactieve manier die vrijwel hetzelfde is als op uw eigen computer. Om een sessie te 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 je een Linux-achtergrond hebt, kun je deze één-op-één methode van remoting gebruiken als het PowerShell-alternatief voor SSH.
Gebruik van Invoke-Command
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 als het verzamelen van gebeurtenislogboeken van uw servers. Invoke-Command volgt de volgende syntaxis:
Invoke-Command -ComputerName Darlah, localhost -ScriptBlock Get-EventLog Application -Newest 2
Omdat de opdracht op alle computers parallel wordt uitgevoerd, hebt u een manier nodig om te zien uit welke pc een bepaald resultaat is voortgekomen. 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 XML is, 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 zijn.
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.
Huiswerk
- Lees de geheimen van PowerShell Remoting ebook door Don Jones.