Tags: PowerShell, Remote-Verwaltung
Der wesentliche Zweck von PowerShell ist die Automatisierung der Systemverwaltung, und zwar auch remote von mehreren Computern gleichzeitig. Seit der Version 3.0 erlaubt sie zudem das Unterbrechen von Sessions und ihre Fortsetzung von einer anderen Workstation aus.
In der interaktiven Variante startet man mit Hilfe von Enter-PSSession eine Shell auf dem entfernten Rechner und führt dort Kommandos aus, als säße man an der Konsole der betreffenden Maschine. Für die Automatisierung von Aufgaben wird man jedoch nicht diesen Weg wählen, sondern (mehrere parallele) Sessions öffnen und über diese Scripts oder Befehle starten.
Persistente Sitzungen erzeugen
In der einfachen Form führt man mit Invoke-Command Befehle oder Scripts remote aus. Sobald diese abgearbeitet sind, endet die Sitzung automatisch. Die interaktive Variante mit Enter-PSSession muss man erst explizit durch Exit-PSSession verlassen.
Darüber hinaus erlaubt PowerShell aber das Erzeugen von persistenten Sitzungen, die auch dann weiterlaufen, wenn der Benutzer die Verbindung trennt oder diese etwa durch einen Netzwerkfehler unterbrochen wird. Admins können sich anschließend mit einer solchen Session auch von einem anderen Rechner aus verbinden.
Der Aufbau einer persistenten Sitzung erfolgt mit dem Cmdlet New-PSSession. In der gängigsten Form ruft man es zusammen mit dem Parameter ComputerName auf:
New-PSSession -ComputerName WS2016-VM1
Wie man anschließend mit Get-PSSession schnell feststellen kann, erhält eine solcherart angelegte Session automatisch einen Namen und eine ID, der anfängliche Status lautet Opened.
Wenn man möchte, kann man der Sitzung mit dem Parameter Name explizit einen sprechenden Namen zuweisen und sich später beim Verbinden darauf beziehen.
Mehrere Sessions auf einmal starten
Wenn man mit einem Aufruf gleich Sessions zu mehreren Computern aufbaut, dann ist es für das nachfolgende Management der Sitzungen vorteilhaft, wenn man das Ergebnis des Cmdlets an eine Variable zuweist:
$s = New-PSSession -ComputerName HV2016-VM1,WS2012R2-VM2
Liegt die Liste der Remote-Computer in einer Textdatei vor, dann kann man auf ihnen eine Session so erstellen
$s = Get-Content \\fs\share\servers.txt | New-PSSession
Per Voreinstellung lassen sich auf diesem Weg bis zu 32 Sitzungen erzeugen. Benötigt man mehr, dann muss man dieses Limit mit Hilfe des Parameters ThrottleLimit erhöhen.
Anschließend kann man einzelne Befehle oder Scripts mit einem einzigen Aufruf von Invoke-Command auf allen Hosts starten:
Invoke-Command -Session $s {Get-Service -Name BITS}
In diesem Beispiel würde man untersuchen, ob der BITS-Dienst auf allen Remote-PCs läuft.
Session unterbrechen und wieder verbinden
Möchte man eine Sitzung unterbrechen, um sie auf einem anderen Client wieder aufzunehmen, dann dient das Cmdlet Disconnect-PSSession diesem Zweck. Ihm kann man entweder Session-Objekte, die ID, die InstanceID (die man über Get-PSSession erhält) oder den Namen der Sitzung übergeben. Um beim obigen Beispiel zu bleiben, das mehrere Verbindungen parallel nutzt, könnte man so vorgehen:
Disconnect-PSSession -Session $s
Anschließend wechselt man auf einen anderen Rechner und gibt dort den Befehl
$s = Get-PSSession -ComputerName (Get-Content \\fs\share\servers.txt) |
Connect-PSSession
ein.
Um die Sessions endgültig zu schließen, greift man auf Remove-PSSession zurück:
Remove-PSSession -Session $s
Alternativ zu Session kann man auch hier wieder die Parameter Name, ID oder InstanceID verwenden, um Sitzungen anzusprechen.
Protokollprobleme
PowerShell-Remoting läuft über WinRM, so dass man dieses auf allen beteiligten Rechnern aktivieren muss. Sollen auch User ohne administrative Privilegien eine Remote-Session aufbauen dürfen, dann benötigen sie auf dem Zielsystem zusätzliche Rechte.
Auch wenn diese Voraussetzungen gegeben sind, besteht noch keine Garantie für ein reibungsloses Remote-Management. Das gilt besonders dann, wenn auf den beteiligten Maschinen unterschiedliche Versionen des Protokolls laufen.
Zwar kann man ohne Schwierigkeiten von Windows 10 eine Session zu Server 2012 R2 aufbauen, diese trennen und wieder verbinden. Wenn man dazu aber auf einen anderen Rechner wechselt, dann scheitert dieses Vorhaben mit der Fehlermeldung:
Der Server mit Windows PowerShell unterstützt Verbindungsvorgänge für protocolversion 2.3 (vom Clientcomputer ausgehandelt) nicht. Stellen Sie sicher, dass der Clientcomputer mit dem Build 6.3.9600.17400 und der Protokollversion 2.2 von Windows PowerShell kompatibel ist.
Dieses Problem tritt auch dann auf, wenn der neue Client-PC die gleiche Version des Protokolls ausführt wie jener, auf dem die Sessions angelegt wurden. Die Version kann man mittels
$PSVersionTable
abfragen. Beseitigen kann man es nur dadurch, dass man auf allen beteiligten Rechnern das gleiche Protokoll installiert. Dazu benötigt man
das aktuelle Windows Management Framework für die jeweilige Plattform, für Server 2012 R2 wäre es das WMF 5.0.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- ThinPrint 13 unterstützt Microsofts V4-Druckertreiber und MMC
- PowerShell 7.3: JEA über SSH, Cmdlet für Setup, erweiterte ARM-Unterstützung
- Second-Hop-Problem: CredSSP für PowerShell-Remoting konfigurieren
- Drucker (remote) über PowerShell installieren
- PowerShell für Exchange auf Workstation installieren
Weitere Links