Vertrauen ist gut, Kontrolle ist besser

Unter Windows gibt es einige Möglichkeiten, entfernte Rechner zu steuern - da wären beispielsweise WMI (Windows Management Instrumentation), welches mit VBScript benutzt werden kann oder das Tool PSExec aus den Windows Sysinternals. Doch fast alle diese Methoden haben gewisse Nachteile. Sei es die fehlende Konsistenz in der Schreibweise der verschiedenen Befehle und Parameter oder die Tatsache, dass sich die meisten Tools für ihre Verbindungen von RPC oder COM bzw. DCOM bedienen, was unter Umständen Probleme bereiten kann, wenn erst eine Firewall durchschritten werden muss oder gewisse Sicherheitssoftware zum Einsatz kommt. Hier kommt PowerShell Remoting ins Spiel.

PowerShell Remoting bietet eine gute Lösung für die oben genannten Probleme an. Zum einen findet man hier eine konsistente Syntax vor, zum anderen baut es auf Microsoft's Implementierung des WSMan Protokolls (Web Services for Management) auf und regelt Verbindungen sowie Authentifizierungen durch das sichere und stabile WinRM (Windows Remote Management). Ein riesiger Vorteil dabei liegt darin, dass in den Firewalls nur noch ein einziger Port geöffnet sein muss, über welchen dann jede Anwendung operiert, die WSMan benutzt. Um die richtige Zuordnung der Verbindungen zu den jeweiligen Anwendungen kümmert sich der WinRM. Die Kommunikation zwischen den Computern erfolgt dabei verschlüsselt und für Authentifizierungen stehen verschiedene Methoden bereit, unter Anderem Kerberos und Windows Challenge/Response.

PowerShell Remoting funktioniert über Verbindungen zwischen PowerShell Sessions. Dabei wird von einer lokalen PowerShell Session aus eine Verbindung zu einer anderen Session auf einem entfernten Computer aufgebaut, die eingegebenen Befehle über diese Verbindung übertragen und dann lokal auf dem entfernten Rechner ausgeführt. Die Ergebnisse bzw. Aus-und Rückgaben der übermittelten Befehle werden daraufhin über die bestehende Verbindung wieder zurückgeschickt.

Doch genug der Theorie, auf zur Praxis.

1. Konfiguration von PowerShell Remoting

Voraussetzung ist eine bestehende Installation von Windows PowerShell 2.0 sowohl auf dem Rechner, der die Befehle absetzen möchte, als auch auf allen Rechnern, die ferngesteuert werden sollen. Während für Windows 7 und höher sowie Windows Server 2008 R2 und höher dies in der Regel schon vorinstalliert ist, können ältere Betriebssysteme wie Windows Vista, Windows XP, Windows Server 2008 und Windows Server 2003 durch Installation des Windows Management Frameworks für dein Einsatz von PowerShell Remoting präpariert werden.

Zur Konfiguration sind grundsätzlich drei Schritte nötig:

  • Der WinRM Service muss automatisch gestartet werden und aktiv sein
  • Ein Listener, welcher auf eingehende Verbindungen hört, muss eingerichtet werden
  • Der Windows Firewall muss eine entsprechende Regel zum Erlauben dieser Verbindungen hinzugefügt werden

Innerhalb einer Domäne lassen sich diese Einstellungen am Einfachsten über entsprechende Gruppenrichtlinien bewerkstelligen:

Während auf Windows Servern der WinRM Service automatisch gestartet wird, muss dieser auf Client-Computern explizit dazu angehalten werden, dies zu tun. Dazu unter Computer Configuration\Windows Settings\Security Settings\System Services einfach den Windows Remote Management Service auf Automatisch Starten setzen.

service
service

Zur Konfiguration des Listeners unter Computer Configuration\Administrative Templates\Window Components\Windows Remote Management (WinRM)\WinRM ServiceAllow remote server Management through WinRM aktivieren. Zum Erlauben aller Verbindungen wie in der GPO dokumentiert einfach ein "*" bei IPv4 und IPv6 Filter eintragen oder alternativ zum Einschränken der Verbindungen eine bestimmte IP-Range.

winrmlistener
winrmlistener

Zur Erstellung der Firewall Regel unter Computer Configuration\Windows Settings\Security Settings\Windows Firewall with Advanced Security\Inbound Rules die vorgefertigte Regel für Windows Remote Management wählen.

firewall
firewall

Alternativ können diese Einstellungen auch lokal auf den Client-Computern vorgenommen werden, indem auf diesen in einer PowerShell das Cmdlet Enable-PSRemoting ausgeführt wird. Dieses Cmdlet vollzieht alle oben geschilderten Änderungen automatisch auf dem jeweiligen Client, auf dem es ausgeführt wird.

enable
enable

2. Erste Schritte mit PowerShell Remoting

Nachdem nun hoffentlich alles erfolgreich für den Einsatz von PowerShell Remoting vorbereitet wurde, kann es auch schon direkt losgehen. Grundsätzlich unterscheidet man zwischen zwei Arten von PowerShell Remoting: interactive und fan-out. Während man durch interactive-remoting genau einen entfernten Rechner mit Befehlen fernsteuern kann, als säße man direkt davor, lassen sich per fan-out-remoting Befehle oder PowerShell Skripte auf einer Liste oder Gruppe von Rechnern ausführen.

2.1 Interactive Remoting

Eine interaktive PowerShell Remoting Session wird durch das Cmdlet Enter-PSSession aufgebaut. Diesem übergibt man mittels des ComputerName Parameters den Namen des Rechners, den man fernsteuern möchte. Der erfolgreiche Aufbau der Verbindung ist daran zu erkennen, dass vor Eingabeaufforderung nun der Computername innerhalb eckiger Klammern angezeigt wird. Eingegebene Befehle werden jetzt auf dem entfernten Rechner ausgeführt. Mittels Exit-PSSession kann die Verbindung wieder beendet und geschlossen werden.

Enter-PSSession
Enter-PSSession

2.2 Fan-out Remoting

Um einen Befehl oder ein PowerShell Skript auf mehreren Rechnern gleichzeitig auszuführen, bedient man sich des Invoke-Command Cmdlets. Hier werden die Zielrechner (siehe Einleitung: konsistente Syntax) ebenfalls über den ComputerName Parameter spezifiziert - diesmal allerdings entweder als komma-separierte Liste oder durch ein Array aus Computernamen (dazu später mehr). Der auszuführende Befehl wird über den Parameter ScriptBlock innerhalb geschweifter Klammern spezifiziert.

Invoke-Command
Invoke-Command

Alternativ kann statt des ScriptBlock Parameters auch der FilePath Parameter verwendet werden. Über diesen lässt sich ein konkretes PowerShell Skript spezifizieren, dessen Inhalt dann auf allen Zielrechnern ausgeführt wird.

filepath
filepath

Im nächsten Teil erfahren Sie mehr dazu, wie man Sessions zu mehreren Rechnern besser verwalten kann und was sogenannte Endpoints sind, wie man diese erstellt und sie konfiguriert.