WinSCP bietet die Möglichkeit wiederkehrende FTP / SFTP Aufgaben mit verschiedenen Skriptsprachen wie PowerShell, VBA oder VBscript zu automatisieren.
Hierzu stellt WinSCP eine .NET Assembly Komponente bereit, welche auf der offiziellen Webseite zum Herunterladen bereitgestellt wird.
Damit in PowerShell mit der .Net Komponente gearbeitet werden kann, wird die Komponente mit dem Befehl in die PowerShell Sitzung geladen.
Add-Type -Path "WinSCPnet.dll"
Damit eine automatische FTP / SFTP Verbindung aufgebaut werden kann, müssen mit der Klasse „SessionOption“ die Verbindungsparameter festgelegt werden.
Folgende Eigenschaften müssen für eine Sitzung angegeben werden:
- Protcol
- HostName
- UserName
- Password
- SshHostKeyFingerprint
Sind die Eigenschaften nicht bekannt, oder möchte man auf Nummer sicher gehen, kann dazu auf die Windows GUI zurückgegriffen werden. Dazu muss eine funktionierende Verbindung gespeichert sein. Durch einen Rechtsklick auf die gespeicherte Verbindung und einen anschließenden Klick auf „Generiere Sitzungs-URL/code“ kann der benötigte Sitzungscode generiert werden.
Die Hauptklasse der .Net Assembly Komponente ist die „Session„-Klasse. Diese baut die Verbindung zum SFTP-, FTP-, WebDAV-, S3- oder SCP-Server auf und bringt die Methoden zum bearbeiten der Remote-Daten mit.
Die drei wichtigsten Methoden sind „Open“ um eine Sitzung aufzubauen und „Dispose“ bzw. „Close“ um die Sitzung zu schließen.
Zudem bringt die Klasse einige Methoden mit, welche die gängigsten Arbeiten abbilden. Zu jeder Methode gibt es auch verschiedene Parameter, welche mitgegeben werden müssen.
Methode | Parameter | Beschreibung |
CreateDirectory | [string]path | Erstellt ein Remote-Verzeichnis |
DuplicateFile | [string]sourcePath, [string]targetPath | Dupliziert die Remote-Datei in ein anderes Remote-Verzeichnis |
FileExists | [string]path | Überprüft, ob eine Remote-Datei vorhanden sind |
ListDirectory | [string]path | Listet das entfernte Verzeichnis auf |
MoveFile | [string]sourcePath, [string]targetPath | Verschiebt die entfernte Datei in ein anderes entferntes Verzeichnis und/oder benennt die entfernte Datei um |
PutFiles | [string]sourcePath, [string]targetPath, [bool]remove | Lädt Dateien hoch |
RemoveFiles | [string]path | Entfernt Remote-Dateien |
SynchronizeDirectories | [string]sourcePath, [string]targetPath, [bool]removeFiles, [bool]mirror | Synchronisiert das lokale Verzeichnis mit dem Remote-Verzeichnis |
Eine weitere wichtige Klasse ist die „TransferOption„-Klasse. Mit dieser werden Optionen für die Dateiübertragung definiert. Zum Beispiel kann Einfluss auf das Verhalten beim überschreiben von vorhandenen Dateien genommen oder auch die Übertragungsgeschwindigkeit begrenzt werden. Auch das setzen der Eigenschaft „TransferMode“ ist für die Dateiübertragung sinnvoll. Da verschiedene Betriebssysteme unterschiedliche Formate bei Textdateien verwenden, gibt es in vielen Übertragungsprotokollen einen Spezialmodus zur Übertragung von Textdateien. In dem Modus werden die Textdateien nicht nur Übertragen, sondern in das von der Zielplattform verwendete Format konvertiert (Text- oder ASCII). Der Modus sollte nicht bei der Übertragung von Dateien moderner Textverarbeitungsprogramme genutzt werden, da diese ohne Änderungen übertragen werden müssen.
Methode | Parameter | Beschreibung |
OverwriteMode | OverwriteMode.Overwrite (Standard), OverwriteMode.Resume, OverwriteMode.Append | Verhalten beim Überschreiben von vorhandenen Dateien |
SpeedLimit | [int]SpeedLimit | Übertragungsgeschwindigkeit begrenzen in KB/s |
TransferMode | TransferMode.Binary (Standard), TransferMode.Ascii, TransferMode.Automatic | Übertragungsmodus von Textdateien |
Anbei ein Beispiel Skript, welches Dateien aus einem bestimmten Verzeichnis herunterlädt.
# WinSCP .NET assembly laden Add-Type -Path "WinSCPnet.dll" # Sitzung konfigurieren anhand einer Sftp Verbindung mit ssh-rsa 265Bit Hashwert $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::Sftp HostName = "DeinHostname" UserName = "DeinBenutzername" Password = "DeinPasswort" SshHostKeyFingerprint = "ssh-rsa 256 DeinHashWert" } $session = New-Object WinSCP.Session try { # Sitzung aufbauen $session.Open($sessionOptions) # Datei aus Verzeichnis herunterladen $transferOptions = New-Object WinSCP.TransferOptions $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary $transferResult = $session.GetFiles("/Test/*", "X:\Downloaded\", $False, $transferOptions) # Stellt Ergebnisse des Übertragungsvorgangs dar $transferResult.Check() # Ausgabe der Ereignisse foreach ($transfer in $transferResult.Transfers) { Write-Host "Download of $($transfer.FileName) succeeded" } } finally { # Sitzung beenden $session.Dispose() }
Die Skripte können zum Beispiel durch eine wiederkehrende Aufgabe aus der Windows-Aufgabenverwaltung ausgeführt werden. Dabei ist darauf zu Achten, dass der komplette Pfad zur .Net Assembly Komponente im Skript angegeben ist.