Remote-Sessions mit PowerShell aufbauen, unterbrechen, wiederherstellen

    Remote-Session in PowerShellDer wesent­liche Zweck von Power­Shell ist die Auto­mat­isierung der System­verwaltung, und zwar auch remote von mehreren Computern gleich­zeitig. Seit der Ver­sion 3.0 erlaubt sie zudem das Unter­brechen von Ses­sions und ihre Fort­setzung von einer anderen Work­station aus.

    In der interaktiven Variante startet man mit Hilfe von Enter-PSSession eine Shell auf dem entfernten Rechner und führt dort Kom­mandos aus, als säße man an der Konsole der betreffenden Maschine. Für die Automa­tisierung 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 Netzwerk­fehler 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.

    Anzeigen einer Sitzung, die zuvor mit New-PSSession erstellt wurde.

    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 nach­folgende 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.

    Probleme mit unterschiedlichen Protokollversionen

    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.

    Keine Kommentare