Mit Powershell und WinSCP auf Daten auf SFTP Speicher Synchronisieren

Aus bknowledgebase
Zur Navigation springen Zur Suche springen

Einleitung[Bearbeiten]

Durch Kombination der Powershell mit WINSCP, respektive der .NET Assembly die WINSCP zur Verfügung stellt kann man ganz einfach Backups auf SFTP(auch andere z.b webdav) Speicherorte durchführen.

Hier ein kurzes Beispiel, welches Grundlegend bereits alles abdeckt und auch ggf. Aufgetretene Fehler ausgibt.

Vorraussetzungen[Bearbeiten]

Man muss sich lediglich die Assembly von der Website von WINSCP herunterladen und gemeinsam mit der WINSCP.exe in einen Ordner legen aus dem heraus es aufrufbar ist. Weiterhin muss die Ausführung des Scripts auch erlaubt sein. Stichwort ExecutionPolicy siehe auch hier im Wiki.


Powershell Script[Bearbeiten]


<#
.synopsis
	.
.Description
	Synchronize Files using SFTP. If you provide a Path for a possible Logfile, the script will inform about any upload/removal or failure.

.PARAMETER source
	The source of the Data to copy.
.PARAMETER destination
	The Backupdestination
.EXAMPLE
	Externalbackup.ps1 -source "C:\archivTestSource" -destination "C:\archivTestDestination"
.NOTES
   	Author: 	Benjamin Bülow
   	Date:   	March 15, 2019
	Version: 	1.0
#>

#Nur für Test
#[string]$source =""
#[string]$destination=""

Param(
[Parameter(Mandatory=$true)]
[string]$source,
[Parameter(Mandatory=$true)]
[string]$destination,
[Parameter(Mandatory=$false)]
[string]$HostName,
[Parameter(Mandatory=$false)]
[string]$UserName,
[Parameter(Mandatory=$false)]
[string]$Password,
[Parameter(Mandatory=$false)]
[string]$LogfilePath

)

 try
{

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

     # Setup session options
        $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
            Protocol = [WinSCP.Protocol]::Sftp
            HostName = "MeinHostOderIP-Adresse"
            UserName = "MeinBenutzername"
            Password = "MeinPasswort"
            SshHostKeyFingerprint = "ssh-rsa 2048 yr0LAQFPmkdj86ZRKlFBdkUIwhn6dk98+SnYUdkiU9NT="
            
        }

   
    $session = New-Object WinSCP.Session
    
    # Connect
    $session.Open($sessionOptions)

    $transferOptions = New-Object WinSCP.TransferOptions
    $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
    $transferOptions.ResumeSupport.State = [WinSCP.TransferResumeSupportState]::On


    try{
       # measure time needed for syncronisation
       $measureResult = Measure-Command {

            # Synchronize files, Delete Files True, Mirror true
                $synchronizationResult = $session.SynchronizeDirectories(
                    [WinSCP.SynchronizationMode]::Remote, $source, $destination, $true,$true)

        }

    
         # Throw on any error
         $synchronizationResult.Check()
             

    }finally
        {
        # Log uploaded Files if LogfilePath is provided
         if($LogfilePath)
         {
            Out-File -FilePath $LogfilePath -Append -InputObject "Die Syncronisation hat folgende Zeit in anspruch genommen:"
            Out-File -FilePath $LogfilePath -Append -InputObject "" #Leerzeile
            Out-File -FilePath $LogfilePath -Append -InputObject $measureResult


            Out-File -FilePath $LogfilePath -Append -InputObject "Folgende Dateien wurden Hochgeladen:"
            Out-File -FilePath $LogfilePath -Append -InputObject "" #Leerzeile

             $uploads = $synchronizationResult.Uploads
             if($uploads){
                foreach ($upload in $uploads) {Out-File -FilePath $LogfilePath -Append -InputObject $upload.FileName}
             }
             Out-File -FilePath $LogfilePath -Append -InputObject "" #Leerzeile

             # Log deleted files
             Out-File -FilePath $LogfilePath -Append -InputObject "Folgende Dateien wurden im Ziel gelöscht:"
             Out-File -FilePath $LogfilePath -Append -InputObject ""
         
             $removals = $synchronizationResult.Removals
             if($removals){
                foreach ($removal in $removals) {Out-File -FilePath $LogfilePath -Append -InputObject $removal.FileName}
             }

             Out-File -FilePath $LogfilePath -Append -InputObject "" #Leerzeile
             $synchronizationResult.Check() | Out-File -FilePath $LogfilePath -Append
         }
            # Disconnect, clean up
            $session.Dispose()
        }
        
        Write-Host "Prozess erfolgreich abgeschlossen"
        exit 0
    }
catch
{
    Write-Host "Fehler bei der Verarbeitung: $($_.Exception.Message)"
    exit 1
}


H@ppy H@cking