johnny-cgn
Goto Top

Powershell FTP-Upload schlägt fehl

Liebe Administratoren,
zu dem folgenden Skript bekomme ich leider eine Fehlermeldung:

$File = "D:\Dev\somefilename.zip"  
$ftp = "ftp://username:password@example.com/pub/incoming/somefilename.zip"  
$webclient = New-Object System.Net.WebClient
$uri = New-Object System.Uri($ftp)
$webclient.UploadFile($uri, $File)

Ausnahme beim Aufrufen von "UploadFile" mit 2 Argument(en): "Ausnahmefehler während einer
WebClient-Anforderung."
In Zeile:12 Zeichen:1

back-to-top$webclient.UploadFile($uri, $File)

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile , MethodInvocationException
+ FullyQualifiedErrorId : WebException


Nur warum?
Habe das Skript mehrfach in dieser Form auf x Seiten gefunden und scheinbar funktioniert es bei anderen.

Content-ID: 307874

Url: https://administrator.de/contentid/307874

Ausgedruckt am: 19.11.2024 um 19:11 Uhr

colinardo
Lösung colinardo 22.06.2016 aktualisiert um 13:53:19 Uhr
Goto Top
Hallo JohnnyCGN,
der Grund sind aktuelle IE Versionen, die das URI-Schema ftp://username:password@domain.de aus Sicherheitsgründen nicht mehr erlauben. Im Hintergrund eines WebClient-Objekts arbeitet nämlich die IE-Engine, deswegen schlägt diese Methode fehl. Das Schema kann man zwar in der Registry wieder freischalten ist aber aus erstens Sicherheitsgründen nicht empfehlenswert und zweitens ist das Skript dann nicht portabel auf allen Clients lauffähig.

Deswegen benutze diese funktionsfähige FTP-Funktionen die ich hier schon mal gespostet habe und welche nicht vom IE abhängig sind:
FTP UP und Download
Powershell: FTP Directorylisting

Hier nochmal alle meine FTP-Funktionen zusammengefasst:
function Upload-File([string]$path,[string]$url,$username,$password){
    try{
        $request = [System.Net.FtpWebRequest]::Create($url)
        $request.Method = [System.Net.WebRequestMethods+FTP]::UploadFile
        $request.Credentials = New-Object System.Net.NetworkCredential($username,$password)
        [bytes[]] $bytes = [System.IO.File]::ReadAllBytes($path)
        [System.IO.Stream]$stream = $request.GetRequestStream();
        $stream.Write($bytes,0,$bytes.Length)
        $stream.Close(); $stream.Dispose()
        $response = [System.Net.FtpWebResponse]$request.GetResponse()
        $result = $response.StatusDescription
        $response.Close()
        return $result
    }catch{
        throw $_.Exception.Message
        return $false
    }
}
function Download-File([string]$url,[string]$path,$username,$password){
    try{
        $request = [System.Net.FtpWebRequest]::Create($url)
        $request.Method = [System.Net.WebRequestMethods+FTP]::DownloadFile
        $request.Credentials = New-Object System.Net.NetworkCredential($username,$password)
        $response = [System.Net.FtpWebResponse]$request.GetResponse()
        [System.IO.Stream]$stream = $response.GetResponseStream()
        [System.IO.FileStream]$outstream = New-Object System.IO.FileStream ($path,[System.IO.FileMode]::Create)
        $stream.CopyTo($outstream)
        $outstream.Close();$stream.Close();$response.Close()
        $stream.Dispose();$outstream.Dispose();$response.Dispose()
        return $true
    }catch{
        throw $_.Exception.Message
    }
}

function List-FTPFiles([string]$url,$username,$password){
        $request = [System.Net.FtpWebRequest]::Create($url)
        $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
        $request.Credentials = New-Object System.Net.NetworkCredential($username,$password)
        $response = [System.Net.FtpWebResponse]$request.GetResponse()
        [System.IO.Stream]$stream = $response.GetResponseStream()
        $reader = new-object System.IO.StreamReader($stream)
        $list = $reader.ReadToEnd() -split "`n"  
        $stream.Close();$response.Close();$reader.Close()
        $stream.Dispose();$response.Dispose();$reader.Dispose()
        return $list
}

function List-AllFTPFiles([string]$server,$username,$password){
    function Get-FilesInDir([string]$path){
        $filelist = @()
        $request = [System.Net.FtpWebRequest]::Create("$server/$path")  
        $request.UseBinary = $false
        $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectoryDetails
        $request.Credentials = New-Object System.Net.NetworkCredential($username,$password)
        $response = [System.Net.FtpWebResponse]$request.GetResponse()
        [System.IO.Stream]$stream = $response.GetResponseStream()
        $reader = new-object System.IO.StreamReader($stream)
        $folderlist = $reader.ReadToEnd() -split [Environment]::NewLine | select -skip 2 | ?{$_ -ne ''}  
        $stream.Close();$response.Close();$reader.Close()
        
        # Items durchlaufen
        $folderlist | %{
            $tokens = $_ -split '\s+'  
            $item = $tokens[8..($tokens.length-1)]
            if ($_ -match '^d'){  
                Get-FilesInDir "$path/$item"  
            }else{
                $filelist += "$path/$item"  
            }
        }
        $stream.Dispose();$response.Dispose();$reader.Dispose()
        return $filelist
    }
    return Get-FilesInDir
}

function Delete-FtpFile([string]$url,$username,$password){
    try{
        $request = [System.Net.FtpWebRequest]::Create($url)
        $request.Method = [System.Net.WebRequestMethods+FTP]::DeleteFile
        $request.Credentials = New-Object System.Net.NetworkCredential($username,$password)
        $response = [System.Net.FtpWebResponse]$request.GetResponse()
        $result = $response.StatusDescription
        $response.Close()
        return $result
    }catch{
        throw $_.Exception.Message
        return $false
    }
}

$username = 'FTPUSER'  
$password =  'PASSWORD'  
$remotefile = 'ftp://ftp.domain.de/file.csv'  
$localfile = 'C:\Ordner\file.csv'  

# Beispiele:
# -----------
# Download-File -url $remotefile -path $localfile -username $username -password $password
# Upload-File -path $localfile -url $remotefile -username $username -password $password
# List-FTPFiles -url 'ftp://ftp.domain.de/ordner/*.log' -username $username -password $password 
# List-AllFTPFiles -server 'ftp://ftp.domain.de' -username $username -password $password 
# Delete-FtpFile -url $remotefile -username $username -password $password

Grüße Uwe
colinardo
colinardo 28.06.2016 um 15:00:22 Uhr
Goto Top
Kommt hier noch Rückmeldung ?

Ansonsten...
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.