4

I have searched and read a lot about downloading SSL FTP files in PowerShell... But how do I upload them? I have a filename I need to upload each day and I get errors that I am not logged in. I'm currently uploading to other FTP sites like this:

$Filename = "myfile.txt"
$FullPath = "\\server\share\$Filename"
$ftp = "ftp://user:[email protected]/$Filename"
$ftpWebClient = New-Object System.Net.WebClient
$ULuri= New-Object System.URI($ftp)
$ftpWebClient.UploadFile($ULuri, $FullPath)

Do I need to create a whole new block of code for the SSL FTP upload, or do I just need to make minor adjustments to this code?

Thanks!

2 Answers 2

8

I use the WinSCP DLL to do this stuff. Check out some examples here: http://winscp.net/eng/docs/library#powershell

Here's some of my sample code.

[Reflection.Assembly]::LoadFrom("D:\WinSCP.dll") | Out-Null
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
$sessionOptions.HostName = "192.168.1.120"
$sessionOptions.UserName = "user"
$sessionOptions.Password = "pass"
$session = New-Object WinSCP.Session
$session.Open($sessionOptions)

#upload stuff here, check the link for detail on how, and use powershell to populate your file list!

$session.Dispose()
Sign up to request clarification or add additional context in comments.

3 Comments

SFTP is not FTP over TLS/SSL. For FTP over TLS/SSL use $sessionOptions.Protocol = [WinSCP.Protocol]::Ftp and $sessionOptions.FtpSecure = [WinSCP.FtpSecure]::Explicit
Just to add to @MartinPrikryl's comment, you will also need to either set $sessionOptions.GiveUpSecurityAndAcceptAnyTlsHostCertificate = $true or set $sessionOptions.TlsHostCertificateFingerprint = "00:11:22:..."
@Mort You need that only if the server's certificate is not signed by a trusted authority.
6

As you are already using the WebClient class from the .NET framework in your script, I suggest you create a derived version from WebClient that supports FTP over TLS, by embedding C# code in PowerShell:

$typeDefinition = @"
using System;
using System.Net;
public class FtpClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        FtpWebRequest ftpWebRequest = base.GetWebRequest(address) as FtpWebRequest;
        ftpWebRequest.EnableSsl = true;
        return ftpWebRequest;
    }
}
"@

Add-Type -TypeDefinition $typeDefinition
$ftpClient = New-Object FtpClient
$ftpClient.UploadFile("ftp://your-ftp-server/yourfile.name", "C:\YourLocalFile.name")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.