WinSCP mit PowerShell automatisieren

WinSCP-Sitzung-generieren

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.