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() } }