none
FTP-Upload mit gespeicherten Credentials RRS feed

  • Frage

  • Hi Leute,

    ich möchte Daten per FTP hochladen und den Benutzernamen + Kennwort in einer Datei speichert.
    Hierzu habe ich folgendes Skript im Netz gefunden, welches den eingegebenen Benutzernamen und Kennwort in einer Datei speichert:

    Param (
     [String]$AuthUser = $env:USERNAME,
     [String]$PathToCred = "d:\Skripte"
     )
    
     $File = $PathToCred + "\Credentials-$AuthUser.crd"
    If (-not (Test-Path $File))
     { (Get-Credential).Password | ConvertFrom-SecureString | Set-Content $File
     }
    

    Auf diese Zugangsdaten möchte ich jetzt in meinem FTP-Upload-Skript zugreifen:

    #we specify the directory where all files that we want to upload  
    $dirs= @("D:/Backup", "D:/Filesbackup")
     
    #ftp server 
    $ftp = "ftp://xxxxxxxxxxxxx/"
    $Credfile = "d:\Skripte\Credentials-myuser.crd"
     
    $Password = Get-Content $Credfile | ConvertTo-SecureString
    $cred = New-Object System.Management.Automation.PsCredential($AuthUser,$Password)
    #System.Net.NetworkCredential $networkCredential = (System.Net.NetworkCredential) $cred
    
    $webclient = New-Object System.Net.WebClient  
    $webclient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password)
    
    foreach ($dir in $dirs)
    {
        #list every sql server trace file 
        foreach($item in (dir $dir "*.*")){ 
            "Uploading $item..." 
            $uri = New-Object System.Uri($ftp+$item.Name) 
            $webclient.UploadFile($uri, $item.FullName) 
         }
     }
    
    


    Das ganze klappt aber nicht, weil die Anmeldung an den FTP-Server nicht funktioniert. Habt Ihr eine Idee wieso?

    Ausnahme beim Aufrufen von "UploadFile" mit 2 Argument(en):  "Der Remoteserver hat einen Fehler zurückgegeben: (530) Nicht angemeldet."
    In D:\Skripte\ftpupload.ps1:21 Zeichen:9
    +         $webclient.UploadFile($uri, $item.FullName)
    +         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : WebException

    Viele Grüße

    Markus

    Sonntag, 17. Januar 2016 22:18

Antworten

  • Hallo,

    ich vermute das Problem ist das $cred.Password nicht das Passwort in klar Text zurück gibt, sondern System.Security.SecureString.

    Versuch mal folgendes:

    $webclient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.GetNetworkCredential().Password)
    

    Hab leider keinen FTP Server bei der Hand, daher kann ich es nicht testen!

    Lg

    • Als Antwort markiert Markus335 Dienstag, 19. Januar 2016 19:45
    Montag, 18. Januar 2016 13:44

Alle Antworten

  • Wenn ich das richtig sehe, dann wird in dem Beispiel $Authuser auf den aktuelle Benutzernamen gesetzt.
    In deinem upload script setzt du aber nur das Password.

    Montag, 18. Januar 2016 08:21
  • Hallo,

    ich vermute das Problem ist das $cred.Password nicht das Passwort in klar Text zurück gibt, sondern System.Security.SecureString.

    Versuch mal folgendes:

    $webclient.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.GetNetworkCredential().Password)
    

    Hab leider keinen FTP Server bei der Hand, daher kann ich es nicht testen!

    Lg

    • Als Antwort markiert Markus335 Dienstag, 19. Januar 2016 19:45
    Montag, 18. Januar 2016 13:44
  • Hi,

    hab das bei mir so gelöst:

    $FTPHost = ftp://ftp.domain.tld
    
    $username = "Der Benutzername"
    
    $password = cat C:\cred.txt | convertto-securestring
    
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password  
    

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Montag, 18. Januar 2016 13:51
  • Danke für Eure Hilfe, ich habe es hinbekommen :)

    Jetzt habe ich nur noch eine Frage. Ich möchte alle Dateien hochladen die sich seit gestern geändert haben:

    $1TagAlt = (Get-Date).AddDays(-1)
    
    foreach ($dir in $dirs)
    {
        foreach($item in (dir $dir "*.*")){
            if ( test-path $item.FullName ) {
                if ( (get-item $item.FullName).LastWriteTime -gt $1TagAlt)
                {
                    "Uploading $item..."
                    $uri = New-Object System.Uri($ftp+$item.Name)
                    $webclient.UploadFile($uri, $item.FullName)
                }
            }
       
         }
     }

    Ist das so korrekt? Die Schleife scheint nur eine Datei zu durchlaufen, obwohl 20 vorhanden sind.

    Danke & Gruß Markus

    Dienstag, 19. Januar 2016 19:47