Skipt zum Download von Dateien per SFTP auf Windows Server

  • Beitrags-Autor:
  • Beitrags-Kategorie:Windows Server

Unter Windows wird SFTP erst mal nicht unterstützt. Eine Möglichkeit ist ein PowerShell-Skipt welches mit WinSCP übertragen wird.

Voraussetzung:

  1. WinSCP installieren: Lade WinSCP herunter und installiere es.
  2. WinSCP .NET Assembly: Die Datei WinSCPnet.dll muss vorhanden sein. Standardpfad: C:\Program Files (x86)\WinSCP\WinSCPnet.dll
  3. SSH Host Key Fingerprint: Den Fingerprint des SFTP-Servers erhältst du mit WinSCP (Verbindungsversuch und Fingerprint anzeigen lassen).

Beispiel für das Skipt:

				
					$ftpServer = "ftp://dein-ftp-server.com"  # FTP-Server-Adresse
$ftpUser = "dein-benutzername"            # FTP-Benutzername
$ftpPass = "dein-passwort"                # FTP-Passwort
$remotePath = "/pfad/zur/datei.txt"      # Pfad zur Datei auf dem FTP-Server
$localPath = "C:\Pfad\zur\Speicherung\datei.txt"  # Lokaler Speicherort

$webClient = New-Object System.Net.WebClient
$webClient.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPass)

try {
    $webClient.DownloadFile("$ftpServer$remotePath", $localPath)
    Write-Host "Download erfolgreich: $localPath"
} catch {
    Write-Host "Fehler beim Download: $_"
} finally {
    $webClient.Dispose()
}
				
			

2. Beispiel mehrerer Dateien sollen heruntergeladen werden. Und in Unterschiedliche Ordner abgelegt werden. Und eventuell soll ein Datum angehängt werden

				
					# WinSCP .NET Assembly laden
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"

$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "sftp-server.com"
    UserName = "dein-benutzername"
    Password = "dein-passwort"
    SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:..."
}

$session = New-Object WinSCP.Session

try {
    $session.Open($sessionOptions)

    # Liste der Dateien mit lokalen Ordnern & Kennzeichnung, ob das Datum angefügt werden soll
    $fileMappings = @(
        @{ RemoteFile = "/remote/pfad/erste_datei.txt"; LocalFolder = "C:\LokalerOrdner1"; AddDate = $false },
        @{ RemoteFile = "/remote/pfad/zweite_datei.txt"; LocalFolder = "C:\LokalerOrdner2"; AddDate = $true },  # Diese Datei bekommt das Datum vorne
        @{ RemoteFile = "/remote/pfad/dritte_datei.txt"; LocalFolder = "C:\LokalerOrdner3"; AddDate = $false }
    )

    foreach ($file in $fileMappings) {
        # Datei-Name extrahieren
        $fileName = [System.IO.Path]::GetFileName($file.RemoteFile)

        # Falls AddDate = $true ist, das Datum vorne einfügen
        if ($file.AddDate) {
            $datum = Get-Date -Format "yyyy-MM-dd"
            $fileName = "$datum`_$fileName"  # Datum vorne einfügen
        }

        # Lokalen Ordner prüfen/erstellen
        if (!(Test-Path -Path $file.LocalFolder)) {
            New-Item -ItemType Directory -Path $file.LocalFolder | Out-Null
        }

        # Zielpfad definieren
        $localPath = "$($file.LocalFolder)\$fileName"

        # Datei herunterladen
        $session.GetFiles($file.RemoteFile, $localPath).Check()
        Write-Host "Download erfolgreich: $localPath"
    }
}
catch {
    Write-Host "Fehler beim Download: $_"
}
finally {
    $session.Dispose()
}

				
			

Das Skipt über die Windows Aufgabe ausführen

Aufgabenplanung öffnen

  1. Windows-Taste + R drücken, taskschd.msc eingeben und mit Enter bestätigen.
  2. Klicke auf „Aufgabe erstellen…“ (nicht „Einfache Aufgabe erstellen“).

Aufgabe konfigurieren
Allgemein

  • Name: SFTP-Download
  • Benutzerkonto: Wähle ein Konto mit ausreichend Rechten.
  • Option aktivieren: Mit höchsten Privilegien ausführen

Trigger (Zeitplan einstellen)

  • Neuen Trigger hinzufügen (z. B. täglich oder alle X Minuten).

Aktion (Skript ausführen)

  1. Aktion: Programm starten
  2. Programm/Skript: powershell.exe
  3. Argument hinzufügen: -ExecutionPolicy Bypass -File „C:\Skripte\sftp_download.ps1“