Man kann mit der WinSCP Assembly über PowerShell ganz einfach SFTP-Uploads durchführen. WinSCP hat dazu eine gute Doku, die auch zeigt, wie man die Assembly als COM Objekt nutzt und wie man Ressourcen zu einem .NET Projekt hinzufügt und in eine temporäre Datei entpackt:

https://winscp.net/eng/docs/library_install#downloading

Assembly einbinden

Zuerst laden wir dazu die WinSCP .NET / COM library runter:

https://winscp.net/eng/downloads.php#additional

Davon benötigen wir die WinSCPnet.dll und im selben Verzeichnis die WinSCP.exe.

Im Powershell Script wird die DLL geladen mit folgendem Kommando:

Add-Type -Path "C:\PfadZurAssembly\WinSCPnet.dll"

PowerShell Code erzeugen

Den Powershell Code zum Verbinden kann man sich ganz einfach in WinSCP anzeigen lassen. Dazu einfach eine S-FTP Verbindung über WinSCP herstellen. Die S-FTP Session wird in WinSCP als Tab dargestellt. Wir machen nun einen Rechtsklick auf den Tab und wählen „Generate Session URL/Code…“

Dort dann einfach den Code raus kopieren.

Funktion SFTP-Upload

Function SFTP-Upload() {
    Param (
        [parameter(Mandatory=$true)]
        [String[]]
        $File,
        [parameter(Mandatory=$true)]
        [String[]]
        $Hostname,
        [parameter(Mandatory=$true)]
        [String[]]
        $User,
        [parameter(Mandatory=$true)]
        [String[]]
        $Password,
        [parameter(Mandatory=$true)]
        [String[]]
        $SSHFingerprint,
        [parameter(Mandatory=$true)]
        [String[]]
        $AssemblyLocation
    )

    try
    {
        # Load WinSCP .NET assembly
        Add-Type -Path $AssemblyLocation
    }
    catch
    {
        Write-Host  "Can't load DLL $($AssemblyLocation)" -ForegroundColor Red
        #Send-Mail "Error" "Can't load DLL $($AssemblyLocation)" "" $true
        exit
    }

    # Set up session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = $Hostname
        UserName = $User
        Password = $Password
        SshHostKeyFingerprint = $SSHFingerprint
    }

    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Transfer files
        $session.PutFiles($File, "/*").Check()
    }
    catch
    {
        write-host $_ -ForegroundColor Red
        #Send-Mail "Error" $_ "" $true
    }
    finally
    {
        $session.Dispose()
    }
}