Jetzt testen

Erste Schritte mit PowerShell-Remoting

Inhaltsverzeichnis

Post Featured Image

PowerShell-Remoting existiert bereits seit den frühen Tagen der PowerShell-Scriptsprache. Es ermöglicht die Ausführung von Befehlen und den Empfang von Ausgaben zwischen entfernten Systemen. Traditionell baute PowerShell-Remoting auf WinRM auf, aber mit neueren PowerShell-Versionen steht nun das SSH-Protokoll zur Verfügung, um auch das Remoting zwischen Linux-Systemen zu erleichtern. In diesem Artikel erfahren Sie, wie Sie Ihre ersten Schritte mit PowerShell-Remoting gehen können, wobei der Schwerpunkt auf PowerShell-Versionen 5.1 und höher liegt.


 

Anforderungen und Einrichtung

Es gibt drei moderne PowerShell-Varianten, die immer noch weit verbreitet sind. Es wird dringend empfohlen, auf PowerShell 7 umzusteigen, da dies eine Langzeitversion (LTS) und die aktuellste ist. Abgesehen davon gibt es natürlich Situationen, in denen dies noch nicht praktikabel ist.

PowerShell 5.1

Dies ist die letzte Version von Windows PowerShell, die mit dem Windows-Betriebssystem gebündelt wurde. Sie wird immer noch von zahlreichen Unternehmen verwendet, und es gibt einige einfache Anforderungen, damit Remoting funktioniert.

  • Das Microsoft .NET Framework 4.5.2 oder höher
    • .NET 4.6.2 ist auf Windows Server 2016 vorinstalliert
  • Windows Remote Management 5.1
    • Wird zusammen mit Windows 2016 und höher ausgeliefert

In diesem Artikel konzentrieren wir uns auf Windows Server 2016, da frühere Versionen von Microsoft als End-of-Life eingestuft wurden.

Beachten Sie, dass Windows PowerShell standardmäßig einen microsoft.powershell Session Endpunkt erstellt. Enter-PSSession und New-PSSession verwenden diesen Endpunkt, wenn kein anderer Session Endpunkt angegeben ist. Da neuere Versionen von PowerShell diesen Endpunkt nicht erstellen oder überschreiben, muss der Endpunkt Name angegeben werden, um eine Verbindung mit der richtigen Remoteinstanz herzustellen, wenn keine Verbindung mit Windows PowerShell hergestellt wird.

Ein Beispiel für die Windows PowerShell-Standardkonfiguration finden Sie unten (Abbildung 1).

Screenshot of the default Windows PowerShell configuration

Abb. 1: Die Windows PowerShell-Standardkonfiguration

 

PowerShell Core (6.x)

PowerShell Core wird standardmäßig mit den erforderlichen .NET Core-Dateien ausgeliefert. Es sind einige Schritte erforderlich, damit WinRM PowerShell-Remoting funktioniert. Frühere Versionen von PowerShell Core hatten keine ordnungsgemäße Enable-PSRemoting-Unterstützung und erforderten daher ein Installationsscript zum Verschieben der Datei „pwrshplugin.dll“ nach System32 und zum Registrieren von Endpunkten. In den neuesten Versionen von PowerShell Core funktioniert Enable-PSRemoting korrekt, um die DLL und versionsspezifische Endpunkte zu registrieren (wie in Abbildung 2 dargestellt).

Nach der Ausführung von Enable-PSRemoting werden die korrekten versionsspezifischen Endpunkte registriert, in diesem Fall 6.2.5 (Abbildung 3).

 

Screenshot: WinRM PowerShell Remoting in PowerShell Core

Abbildung 2: Aktivieren von WinRM PowerShell-Remoting in PowerShell-Core


Screenshot: version-specific endpoints for PowerShell Core

Fig. 3: Version-specific endpoints for PowerShell Core

Der Grund dafür, dass der Parameter -SkipNetworkProfileCheck angegeben wird, ist, dass ein beliebiges Public Netzwerk den Befehl Enable-PSRemoting vorzeitig beendet. Solange Sie sich der Auswirkungen und der ordnungsgemäßen Kontrolle dessen bewusst sind, ist es sicher, diesen Befehl auszuführen.

PowerShell 7

In der neuesten Version von PowerShell ist das Skript Install-PowerShellRemoting.ps1 ebenfalls nicht mehr erforderlich, da Enable-PSRemoting alles, was benötigt wird, durch Ausführen von Enable-PSRemoting registriert, wie unten in Abbildung 4 zu sehen ist.

Screenshot: Output of the Enable-PSRemoting cmdlet in PowerShell 7

Abb. 4: Ausgabe des Cmdlet „Enable-PSRemoting“ in PowerShell 7

Die Endpunkt-Namen, die dann registriert werden, um Remoting zu ermöglichen, sind spezifisch für die neueste PowerShell-Version, in diesem Fall 7.0.1 (siehe Abbildung 5).

Screenshot: List of endpoint names registered for PowerShell remoting in PowerShell 7

Abb. 5: Liste der für Remoting mit PowerShell 7 registrierten Endpunkt-Namen

 


SSH-Remoting Voraussetzungen

In PowerShell Core und PowerShell 7 ist nun die Option zur Verwendung von SSH als Endpunkt verfügbar. Es gibt einige Anforderungen und Schritte, die erforderlich sind, damit SSH-Remoting funktioniert.

  • PowerShell Core 6.x oder PowerShell 7.x
  • ssh.exe (Client) und sshd.exe (Server)
  • Windows 10 Build 1809 und Windows Server 2019 für integriertes SSH (Client)

Setup der SSH-Endpunkte

Die Einrichtung von PowerShell zur Verwendung von SSH erfordert die folgenden Schritte und Konfigurationen.

  • Installieren von OpenSSH Server und Client
    • OpenSSH ist für Windows direkt in Windows 10 (1809 oder höher) und Windows Server 2019 als optionales Feature verfügbar (Anweisungen zur Installation unter Windows 10 und auf Windows Server finden Sie im Blog von Thomas Maurer)
    • Unter Linux können Sie OpenSSH je nach Plattform installieren
  • Konfigurieren Sie das SSH-Subsystem so, dass es einen PowerShell-Prozess auf dem entfernten Rechner hostet

Führen Sie die folgenden Befehle aus, um die erforderlichen Fähigkeiten (OpenSSH Client ist möglicherweise bereits installiert), Dienstkonfigurationen und Firewall-Regeln zu installieren..

# Install the OpenSSH Client and Server 
Add-WindowsCapability -Online -Name 'OpenSSH.Client~~~~0.0.1.0' 
Add-WindowsCapability -Online -Name 'OpenSSH.Server~~~~0.0.1.0' 

# Initial Configuration of SSH Server 
Start-Service -Name 'sshd' 
Set-Service -Name 'sshd' -StartupType 'Automatic' 

# Confirm the Firewall rule is configured. It should be created automatically by setup. 
Get-NetFirewallRule -Name '*ssh*' | Format-Table -AutoSize 

# There should be a firewall rule named "OpenSSH-Server-In-TCP", which should be enabled 
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

Damit der SSH-Server schließlich mit PowerShell-Remoting arbeiten kann, muss das Subsystem korrekt eingestellt sein.

notepad $Env:ProgramData\ssh\sshd_config

Fügen Sie in der Datei sshd_config die folgenden Konfigurationen hinzu, die speziell für PowerShell 7 gelten.

Stellen Sie nach dem Speichern und Konfigurieren sicher, dass Sie den Befehl Restart-Service -Name ’sshd‘ ausführen, um den SSH-Server neu zu starten.


# Make sure that the subsystem line goes after the existing SFTP subsystem line 
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo -NoProfile 

# Change c:/progra~1/powershell/7/pwsh.exe to c:/progra~1/powershell/6/pwsh.exe for PowerShell Core 
PasswordAuthentication yes 

# Below is optional but recommended to allow use of public/private keys 
PubkeyAuthentication yes

Starten Sie schließlich den SSH-Server neu:

Restart-Service -Name 'sshd'

Es gibt einen Fehler in der OpenSSH-Serverversion, die in Windows enthalten ist. Er erfordert, dass 8.3-Abkürzungen für beliebige Dateipfade verwendet werden, daher c:/progra~1. Um zu überprüfen, ob Sie den korrekten 8.3-Abkürzungen verwenden, können Sie den folgenden Befehl verwenden, um diesen für Programmdateien (wo PowerShell 6 oder 7 installiert ist) abzurufen:

Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName

Beispielbefehle für PowerShell-Remoting

Was können Sie also mit PowerShell Remoting machen und wie wird es nützlich? Oftmals müssen Systemadministratoren Informationen von einer Vielzahl von Systemen sammeln oder einen Befehl auf vielen Systemen gleichzeitig ausführen, um ein Problem zu beheben oder ein neues Paket bereitzustellen. Mit PowerShell-Remoting lässt sich das einfach bewerkstelligen.

Informationen sammeln

Im folgenden Szenario stellen wir eine Remote-Verbindung zu einem PowerShell 7-Remotendpunkt her und erhalten die laufenden Dienste.

$Params = @{ 
		"ComputerName" = 'Host1' 
		"ConfigurationName" = 'PowerShell.7' 
		"ScriptBlock" = { 
				Get-Service | Where-Object Status -EQ 'Running' | Format-Table -AutoSize 
				} 
		} 
Invoke-Command @Params

Einen PowerShell-Befehl ausführen

Vielleicht müssen wir einen Dienst neu starten, in diesem Fall den Druckspooler.

$Params = @{ 
		"ComputerName" = 'Host1' 
		"ConfigurationName" = 'PowerShell.7' 
		"ScriptBlock" = { 
				Get-Service -Name 'Spooler' | Restart-Service 
				} 
		} 
Invoke-Command @Params

 

Fazit

PowerShell-Remoting ist ein leistungsstarkes Tool und wird durch die zusätzlichen plattformübergreifenden Fähigkeiten und die Verwendung optionaler SSH-Verbindungen zu einem noch flexibleren und wichtigeren Werkzeug für Systemadministratoren.

Über den Autor: