Die Benutzung von PowerShell Copy-Item Cmdlet zum Transferieren von Dateien über WinRM

August 09, 2018 Sicherheit und Compliance, MOVEit

Es ist einfach, Dateien mit PowerShell Copy-Item über die Kommandozeile zu kopieren. Wenn Sie dann die Quelle und das Ziel eingeben, passiert es einfach. Unglücklicherweise denken viele Administratoren nicht darüber nach, wie dieser Prozess eigentlich passiert bis er nicht mehr funktioniert. Ob Sie darüber nachdenken oder nicht – alle Netzwerkkommunikation über TCP (wie SMB-Dateikopien) benutzen Ports, um die Bits zu übertragen. Damit ein Dateikopierprozess die Datei von Punkt A zu Punkt B übertragen kann, muss der Port für den gesamten Weg bis zum Zielknoten auf sein. Im Falle einer SMB-Dateikopie ist das der Port 445. Das ist ein Port, der gewöhnlich intern offen ist, außer in einigen Situationen, die extrem hohe Sicherheit verlangen oder über ein DMZ.

PowerShell Copy-Item

Wie können Sie sicherstellen, dass Ihre Skripts zu jeder Zeit Dateien auf Knoten kopieren können, wenn Sie in einer Umgebung arbeiten, die extrem hohe Sicherheitsanforderungen hat oder wenn Sie Dateien von einem internen Netzwerk in ein DMZ transferieren müssen, das verschiedene Port-Restriktionen hat? Sie können dazu PowerShell v5's Copy-Item cmdlet mit dem neuen –ToSession Parameter benutzen.

Dieser Parameter wurde mit dem Windows Management Framework (WMF) v5 mit Copy-Item cmdlet eingeführt. Er bietet die Möglichkeit, Dateien über den gleichen Link zu transferieren, den Sie wahrscheinlich jetzt benutzen, um Kommandos per Fernzugriff mit cmdlets wie Invoke-Command durchzuführen.

Der Prozess hat einige Vorteile, aber einer von den größten Vorteilen sind die TCP-Ports, die benutzt werden: 5985 (HTTP) und 5986 (HTTPS). Diese Standardknoten sind meistens offen, um ferne Knoten zu verwalten, manchmal sogar zu einer DMZ-Umgebung. Durch die Benutzung von Copy-Item –ToSession kann der Administrator sicherstellen, dass die Dateien immer kopiert werden können, egal ob SMB blockiert ist oder nicht.

Wenn Sie PowerShell Copy-Item via die traditionelle SMB-Methode benutzen, müssen Sie die Pfad- und Ziel-Parameter präzisieren. Wenn Sie eine Datei names “file1.txt”, die sich auf dem Laufwerk C:\ befindet auf einen entfernten Computer SERVER1 auf dessen Laufwerk C:\ kopieren möchten, können Sie folgendes machen:

  Copy-Item –Path C:\Folder1\file1.txt –Destination '\\SERVER1\c$'

Beachten Sie, dass dabei der UNC-Pfad benutzt wird. Es wird gleich erklärt, warum das wichtig ist.

PowerShell Remoting Sessions

Was passiert aber wenn SMB blockiert ist oder Sie sowieso Invoke-Command benutzen, um Kommandos von SERVER1 auszuführen? Sie können dann PowerShell-Remoting-Sessions benutzen, um Dateien über WinRM anstatt SMB auszuführen. Dazu müssen Sie eine neue Remoting-Session erstellen und die Dateien dann über diese kopieren.

Als erstes sollten Sie dafür eine neue PowerShell-Remoting-Session erstellen. Dafür können Sie das New-PSSession cmdlet benutzen und dann die Session der Variable $session zuordnen.

$session = New-PSSession –ComputerName SERVER1

Dadurch wird Kerberos-Authentifizierung benutzt, um eine neue PowerShell-Remoting-Session herzustellen, welches die gebräuchlichste Methode ist, wenn Sie in einer Active Directory-Umgebung arbeiten.

Als nächstes müssen Sie die ToSession-Parameter angeben und einen lokalen Pfad auf dem Remote-Computer als Ziel-Parameter angeben.

Copy-Item –Path C:\Folder1\file1.txt –Destination 'C:\' –ToSession $session

Beachten Sie, dass Sie jetzt C:\ als Ziel benutzen anstatt den UNC-Pfad. Dieser Befehl dient genau dem gleichen Zweck wie der vorige, aber er benutzt die Session, um die Datei zu umschließen und via WinRM zu transferieren.

Vergessen Sie nicht, durch Remove-PSSession die Session zu entfernen.

 $session | Remove-PSSession

Wenn Sie die Session nicht weiter brauchen, können Sie sie auch erstellen und gleich wieder entfernen.

 Copy-Item –Path C:\Folder1\file1.txt –Destination 'C:\' –ToSession (New-PSSession –ComputerName SERVER1)

Und das war’s schon! Das nächste Mal, wenn Sie in einer Umgebung arbeiten, in der PowerShell Remoting erlaubt ist, aber SMB eingeschränkt ist, oder Sie bereits eine Remoting-Session für etwas anderes benutzen, können Sie die Session für Copy-Item benutzen, um die Dateien leicht von Punk A zu Punkt B zu bringen.

Tipp: Lesen Sie dazu auch das Whitepaper Automatisieren mit PowerShell oder laden Sie sich kostenfrei eine Testversion von MOVEit Automation, Software für die Automatisierung der Dateiübertragung, herunter.

Adam Bertram

 

Adam Bertram ist seit 20 Jahren in der IT-Branche tätig und arbeitet aktuell als Automatisierungs-Ingenieur, Blogger und selbstständiger Consultant und Autor, und Ausbilder. Sein Schwerpunkt liegt dabei auf DevOps, System-Management und Automatisierungs-Technologien, sowie auf zahlreichen Cloud-Plattformen. Er ist ein Microsoft Cloud und Datacenter Management MVP und ist dafür bekannt effizient zu arbeiten. Außerdem liebt er es anderen Leuten die Welt der Automatisierung näherzubringen.

Read next File Transfer Protocol (FTP) Versus Managed File Transfer Software (MFT)