So führen Sie Befehle oder PowerShell-Skripte auf Remotecomputern mithilfe von Invoke-Command aus

Wenn Sie also schon einmal versucht haben, Remote-Befehle in PowerShell auszuführen und dabei immer wieder auf Probleme gestoßen sind, ist das wahrscheinlich ziemlich frustrierend. Das Cmdlet „Invoke-Command“ ist zwar äußerst praktisch, um Skripte oder Befehle remote auszuführen, funktioniert aber nur, wenn WinRM (Windows Remote Management) korrekt konfiguriert ist. Häufig treten Probleme auf, weil WinRM auf dem Zielrechner nicht aktiviert ist oder Firewalls eingehende Anfragen blockieren. Die korrekte Einrichtung kann sich wie ein Kampf gegen Windmühlen anfühlen, insbesondere wenn man die genauen Befehle oder die Vorgehensweise zum Ändern von Netzwerkprofilen oder Firewall-Regeln nicht kennt. Dieser Leitfaden erklärt, wie Sie WinRM korrekt aktivieren, Ihr Netzwerk für die Remote-Verwaltung einrichten und anschließend Befehle auf Remote-Systemen ausführen, ohne sich die Haare zu raufen.

So aktivieren Sie PowerShell-Remoting (WinRM) unter Windows

WinRM-Dienst aktivieren – eine zwingende Voraussetzung für die Funktion von Remote-Befehlen.

Der Hauptgrund, warum Invoke-Command keine Verbindung herstellen kann? WinRM ist nicht aktiviert oder nicht mit den korrekten Netzwerkregeln konfiguriert. Zunächst muss der WinRM-Dienst ausgeführt und konfiguriert sein. Um zu überprüfen, ob WinRM bereits ausgeführt wird und auf Anfragen wartet, führen Sie folgenden Befehl in PowerShell auf dem Zielrechner aus:

Get-Service -Name "*WinRM*" | fl WinRM, State Get-Item wsman:\localhost\Listener 

Falls es nicht konfiguriert ist, kein Problem. Führen Sie auf dem Zielrechner Folgendes aus:

winrm quickconfig

Dieser Befehl führt mehrere Aktionen aus: Er startet den WinRM-Dienst, konfiguriert ihn für den automatischen Start, erstellt einen Standardlistener und fügt Firewall-Ausnahmen hinzu. Manchmal genügt es, Enable-PSRemoting -Forceden Befehl in PowerShell als Administrator auszuführen, insbesondere bei Remote-Zugriff oder Skripten. Beachten Sie, dass Sie in manchen Konfigurationen Ihr Netzwerkprofil auf „Privat“ oder „Domäne“ anpassen müssen, da PowerShell Remote standardmäßig nicht reibungslos in öffentlichen Netzwerken funktioniert.

Kurzer Hinweis: Auf manchen Rechnern kann es zu Problemen mit Netzwerkprofilen kommen. Das mag seltsam klingen, aber oft lassen sich Berechtigungsprobleme beheben, indem man das Netzwerk unter Einstellungen > Netzwerk > Ethernet oder WLAN > Netzwerkprofil von „Öffentlich“ auf „Privat“ ändert. Falls die Remote-Verbindung weiterhin nicht funktioniert, sollten Sie die Firewall-Regeln anpassen oder eingehenden WinRM-Datenverkehr explizit zulassen.

Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP" –RemoteAddress Any

Diese Zeile lässt eingehenden WinRM-Datenverkehr unabhängig von der Netzwerkadresse zu – nützlich bei mehreren Subnetzsegmenten oder komplexen Netzwerkkonfigurationen. Denken Sie daran, denn Windows macht es einem manchmal unnötig schwer.

Vertrauenswürdige Hosts – bei der Arbeit über Arbeitsgruppen oder IPs hinweg

Wenn sich Ihre Systeme nicht in einer Domäne befinden oder Sie über IP eine Verbindung herstellen, müssen Sie diese Remote-Rechner Ihrer Liste vertrauenswürdiger Hosts hinzufügen. Dies ist zwar eine Vorsichtsmaßnahme, aber notwendig. Führen Sie folgenden Befehl aus:

Set-Item wsman:\localhost\Client\TrustedHosts -Value "192.168.1.201"

Oder, wenn Sie sich leichtsinnig fühlen, lassen Sie einfach alles zu:

Set-Item wsman:\localhost\Client\TrustedHosts -Value "*"

Vergessen Sie nicht, den WinRM-Dienst anschließend neu zu starten:

Restart-Service WinRM
Hinweis: Beim Hinzufügen mehrerer Hosts trennen Sie deren IPs oder Namen durch Kommas innerhalb von Anführungszeichen, z. B.„192.168.1.201, 192.168.1.202“.

Befehle auf Remotecomputern mit Invoke-Commands ausführen

Die Ausführung eines einzelnen Befehls – unkompliziert, erfordert aber die korrekte Einrichtung.

Sobald WinRM eingerichtet und Ihre Netzwerkregeln konfiguriert sind, müssen Sie bei der Verwendung von Invoke-Command lediglich den Zielrechner und den auszuführenden Befehl angeben. Zum Beispiel:

Invoke-Command -ComputerName dc01 -ScriptBlock { Get-Service wuauclt }

Dadurch wird der Remotecomputer mit dem Namen dc01 aufgefordert, Ihnen mitzuteilen, ob der Windows Update-Dienst ausgeführt wird. Der Dienststatus wird ausgegeben – bei einer Konfiguration funktionierte dies einwandfrei, bei einer anderen kann es zu Authentifizierungsproblemen kommen.Überprüfen Sie daher Ihre Berechtigungen und Netzwerkregeln.

Praktischer Tipp: Wenn Sie den Befehl unter einem anderen Benutzerkonto ausführen möchten, fügen Sie einfach -Credential hinzu und geben Sie die Anmeldeinformationen an:

$cred = Get-Credential Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock { Get-NetAdapter }

Dies hilft in der Regel, wenn Ihr aktueller Benutzer nicht Mitglied der Gruppen „Remoteverwaltung“ oder „Administratoren“ auf dem Zielcomputer ist. Beachten Sie jedoch, dass zahlreiche Berechtigungen erforderlich sind und PowerShell-Sicherheitsrichtlinien mitunter bestimmte Remote-Befehle blockieren.

Mehrere Befehle oder Skripte remote ausführen – ja, das ist möglich.

Möchten Sie mehrere Aktionen gleichzeitig ausführen? Trennen Sie die Befehle einfach durch ein Semikolon innerhalb des ScriptBlocks:

Invoke-Command -ComputerName dc01 -ScriptBlock { Get-TimeZone; Set-TimeZone -Name "Central Europe Standard Time" }

Und wenn Sie ein Skript irgendwo gespeichert haben, zum Beispiel C:\PS\CheckStatus.ps1, können Sie es remote ausführen mit:

Invoke-Command -ComputerName dc01 -FilePath "C:\PS\CheckStatus.ps1"

Dadurch entfällt das manuelle Kopieren von Skripten auf entfernte Systeme, und die Diskrepanz der Ausführungsrichtlinien wird umgangen. Praktisch für Batch-Jobs oder regelmäßig ausgeführte Administrationsskripte.

Achtung: Wenn Ihre Skripte auf entfernte Ressourcen (wie Netzwerkfreigaben) zugreifen, kann das gefürchtete „Double-Hop“-Problem auftreten. Dies ist ein Sicherheitsproblem von Windows. Suchen Sie im Internet nach Lösungen wie der Kerberos-Delegierung oder verwenden Sie CredSSP, da Anmeldeinformationen sonst nicht an Drittanbieterressourcen weitergeleitet werden.

Befehle gleichzeitig auf mehreren Computern ausführen

Parallele Befehle für eine Reihe von Servern

Wenn Sie eine ganze Serverflotte verwalten, wäre die sequentielle Ausführung von Befehlen mühsam. Glücklicherweise ermöglicht Invoke-Command die parallele Ausführung. Listen Sie einfach Ihre Server durch Kommas getrennt auf:

Invoke-Command server1, server2, server3 -ScriptBlock { get-date }

Sie können die Namen auch zur Wiederverwendung in einem Array speichern:

$servers = @("server1", "server2", "server3") Invoke-Command -ComputerName $servers -ScriptBlock { get-date }
Alternativ können Sie eine Liste aus einer Textdatei einlesen, was die Automatisierung vereinfacht:

Invoke-Command -ComputerName (Get-Content c:\ps\servers.txt) -ScriptBlock { Restart-Service spooler }

Wenn Sie Hostnamen aus Active Directory abrufen, hilft Ihnen das Cmdlet „Get-ADComputer“ dabei, bestimmte Systeme herauszufiltern:

$computers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and Enabled -eq "true"').Name Invoke-Command -ComputerName $computers -ScriptBlock { Get-EventLog -LogName System -Newest 10 } -ErrorAction SilentlyContinue

Und was passiert, wenn ein oder mehrere Ziele offline oder ausgelastet sind? Der Parameter „-ErrorAction SilentlyContinue“ sorgt dafür, dass das Skript reibungslos weiterläuft. Um zu sehen, welcher Computer geantwortet hat, verwenden Sie die Variable „PSComputerName“ innerhalb Ihres ScriptBlocks.

$results = Invoke-Command -ComputerName $computers -ScriptBlock { get-date } $results | Select-Object PSComputerName, * 

PowerShell-Remoting für persistente Verbindungen – Zeit und Aufwand sparen

Gestalten Sie eine Sitzung, die in Erinnerung bleibt.

Wenn Sie mehrere Befehle auf demselben Remote-Rechner ausführen, ist es sinnvoll, eine bestehende Sitzung aufrechtzuerhalten, anstatt sich jedes Mal neu zu verbinden. So erstellen und verwenden Sie eine persistente Sitzung:

$session = New-PSSession -ComputerName Server01, Server02 Invoke-Command -Session $session -ScriptBlock { Get-ComputerInfo | select OsLastBootUpTime }

Wenn Sie fertig sind, schließen Sie die Sitzung mit folgendem Befehl:

Remove-PSSession $session

Diese Konfiguration kann die Verwaltung mehrerer Server erheblich beschleunigen, insbesondere wenn Sie viele Befehle in einem Skript oder einem geplanten Job ausführen. Beachten Sie jedoch, dass Sitzungen im Speicher verbleiben können. Schließen Sie diese daher, sobald sie nicht mehr benötigt werden. In manchen Fällen sind zudem zusätzliche Sicherheitsanpassungen oder Richtlinienänderungen erforderlich, um persistente Sitzungen zu ermöglichen.

Ehrlich gesagt, kann die Einrichtung der PowerShell-Fernverwaltung anfangs wie ein Kampf gegen einen übermächtigen Gegner wirken, aber sobald man es geschafft hat, ist es wirklich unglaublich leistungsstark. Denken Sie nur daran, die Netzwerk- und Firewall-Regeln zu überprüfen und etwas Geduld für die Eigenheiten mitzubringen.