Fotolia
Upload und Download von Dateien per PowerShell und WebClient-Objekt
Über die PowerShell lassen sich Dateien leicht auf FTP-Server hoch- oder herunterladen. Dieses Skript nutzt hierfür ein WebClient-Objekt.
Manchmal braucht auch ein Systemadministrator Hilfe dabei, Dateien von A nach B zu verschieben. Wie meistens gibt es auch hierfür verschiedene Wege, eine sehr beliebte Methode basiert auf der Nutzung eines PowerShell-Skripts, das einfach auf die in Windows bereits eingebauten .NET-Mechanismen aufbaut.
Dank der PowerShell können Windows-Administratoren die .NET-Klasse WebClient einsetzen, mit der sich ein funktionsfähiges PowerShell-Skript zum Upload und Download von Dateien schreiben lässt. Dieses Skript soll fünf grundlegende Aufgaben übernehmen:
- Die Eingaben des Anwenders entgegennehmen;
- Das WebClient-Objekt erzeugen;
- Das Credentials-Objekt erzeugen;
- Den Uniform Resource Identifier (URI) erzeugen;
- Download oder Upload der Datei;
Die erste Aufgabe besteht darin, die Eingaben des Anwenders entgegenzunehmen. Als Eingabedaten soll dabei alles angenommen werden, was für die Nutzung eines FTP-Servers über eine grafische Benutzeroberfläche benötigt wird. Dazu gehören Benutzername und Kennwort, Dateinamen und der FTP-Servername. Diesen Werten werden dann Variablen zugewiesen, damit man sie zu einem späteren Zeitpunkt nach Bedarf und Belieben wieder verändern kann.
$UserName = 'myusername'
$Password = 'mypassword'
$LocalFilePath = 'C:\myfile.txt'
$RemoteFileName = 'myfile.txt'
$ServerName = 'myftpserver.somedomain.com'
Damit wären alle benötigten Eingabedaten in Variablen abgespeichert. Im nächsten Schritt wird das WebClient-Objekt erzeugt:
$webclient = New-Object System.Net.WebClient
Dieser Befehl übergibt uns das Objekt unserer Begierde, mit dem wir später den Upload oder Download der Datei durchführen können.
Das WebClient-Objekt verfügt über einen Credentials-Wert, den die PowerShell zur Übergabe von Benutzername und Kennwort an den FTP-Server einsetzt. Der Wert Credentials muss mit einem Objekt vom Typ System.Net.NetworkCredential belegt werden, das wiederum die beiden Parameter UserName und Password benötigt. Hier werden dann einfach die zuvor in den Variablen abgelegten Daten verwendet:
$webclient.Credentials = New-Object System.Net.NetworkCredential($UserName, $Password)
Upload oder Download?
Damit steht jetzt ein WebClient-Objekt mit Credentials-Eigenschaft zur Verfügung, als nächstes muss die Entscheidung erfolgen, ob ein Upload oder Download der Dateien vorgenommen werden soll. Je nach Auswahl wird sich entsprechend der Uniform Resource Identifier (URI) unterscheiden.
Soll beispielsweise eine Datei von einem FTP-Server heruntergeladen werden, so muss der URI dem folgenden Format entsprechen: ftp://SERVERNAME/filename.ext. Für diesen Fall wird ein System.Uri-Objekt benötigt, das als Parameter den tatsächlichen URI enthält. Danach wird die Variable $RemoteFileName genutzt, um den gewünschten Ordner auf dem FTP-Server anzugeben.
$uri = New-Object System.Uri(“ftp://$ServerName/$RemoteFileName”)
Nun sind alle Voraussetzungen erfüllt, die für den Download einer Datei per FTP erforderlich sind. Um eine Datei tatsächlich herunterzuladen, die auf einem FTP-Server liegt, wird DownloadFile genutzt. DownloadFile benötigt zwei Parameter: den URI und den Dateipfad, unter dem der Download abgelegt werden soll.
$webclient.DownloadFile($uri, $LocalFilePath)
Es ist nur diese eine Zeile, die den kompletten Verbindungsaufbau zum FTP-Server übernimmt. Dabei werden Benutzername und Kennwort für die Anmeldung verwendet und im Stammverzeichnis des Servers die Datei myfile.txt gesucht, die schließlich in das Stammverzeichnis von Laufwerk C übertragen wird.
Um eine Datei hochzuladen, wird entsprechend UploadFile() genutzt. Der zugehörige Befehl ist quasi der gleiche wie beim Download, nur dass statt Download natürlich Upload ersetzt werden muss.
$webclient.UploadFile($uri, $LocalFilePath)
Mit diesem Befehl wird die Datei c:\myfile.txt in das Stammverzeichnis des FTP-Servers übertragen.
Konsolidierung in einem PowerShell-Skript
Alle bisher verwendeten Befehle lassen sich jetzt in einem einzigen PowerShell-Skript zusammenfassen, das zum Beispiel Move-FtpFile.ps1 genannt werden könnte:
param($Username,$Password,$FilePath,$ServerName,$Action)
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($UserName, $Password)
$file = Get-Item -Path $FilePath
$uri = New-Object System.Uri("ftp://$ServerName/$($file.Name)")
if ($Action -eq ‘Download’) {
$webclient.DownloadFile($uri, $FilePath)
} elseif ($Action -eq ‘Upload’) {
$webclient.UploadFile($uri, $FilePath)
}
Die einzige Änderung, die an dieser Stelle vorgenommen wurde, ist die Parametrisierung der Eingabedaten und das Hinzufügen des Parameters $Action. Dieser wurde eingesetzt, um Nutzern des Skripts einen einfachen Weg zum Download oder Upload von Dateien an die Hand zu geben.
Das Skript Move-FtpFile.ps1 kann dann ganz einfach wie folgt gestartet werden:
PS> .\Move-FtpFile.ps1 -Username ‘myuser’ -Password ‘mypassword’ -FilePath ‘C:\myfile.txt’ -ServerName ‘myftpserver.somedomain.com’ -Action Download