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-Key: 307874

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

Printed on: April 26, 2024 at 10:04 o'clock

Member: colinardo
Solution colinardo Jun 22, 2016 updated at 11:53:19 (UTC)
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
Member: colinardo
colinardo Jun 28, 2016 at 13:00:22 (UTC)
Goto Top
Kommt hier noch Rückmeldung ?

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