Можно ли безопасно регулярно опрашивать внешний сервер FTPS (или SFTP) и копировать / перемещать файлы локально, используя стандартные функции Windows Server 2012?
Я представляю себе использование планировщика для опроса / перемещения, но есть ли возможность добавить FTPS / SFTP в смесь?
Единственное указание, с которым я столкнулся, - это превратить сервер в сервер FTPS, но не то, как использовать клиент FTPS операционной системы… если он есть.
Спасибо
В Windows нет ни FTPS, ни SFTP-клиента (ни в одной версии).
Встроенная Windows ftp.exe
поддерживает только простой незашифрованный FTP. Более того, он поддерживает только активный режим FTP, что делает его бесполезным при подключении к серверу за брандмауэром или NAT.
Вам необходимо использовать сторонний клиент.
Например с Клиент WinSCP FTP / SFTP, вы можете опросить сервер FTPS с помощью командного файла, например:
winscp.com /command ^
"open ftps://user:password@example.com/" ^
"get /path/file c:\path\" ^
"exit"
Аналогично для SFTP:
winscp.com /command ^
"open sftp://user:password@example.com/ -hostkey=""ssh-rsa 2048 xxxxxxxxxxx...=""" ^
...
Увидеть руководство по написанию сценариев с WinSCP.
А потом просто запланировать сценарий с помощью Планировщика Windows.
(Я автор WinSCP)
Вы также можете использовать FtpWebRequest
класс из .NET framework из сценария PowerShell. Он поддерживает FTPS (но не SFTP). Хотя Microsoft не рекомендует его для новой разработки. Во всяком случае, для примера см. ответ @TessellatingHeckler.
Похоже, вы можете сделать это стандартными инструментами Windows, используя .Net Framework. FTPWebRequest класс из PowerShell, с EnableSsl
свойство для включения FTPS.
Вот пример: https://stackoverflow.com/q/1279041/478656 который включает код (я не тестировал):
# Create an FTPWebRequest object to handle the connection to the FTP server
$ftprequest = [System.Net.FtpWebRequest]::Create($sourceuri)
# Set the request's network credentials for an authenticated connection
$ftprequest.Credentials = New-Object System.Net.NetworkCredential($username,$password)
# Set FTPWebRequest method to ListDirectory
$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory
$ftprequest.EnableSsl = $True
$ftprequest.UseBinary = $False
$ftprequest.UsePassive = $True
$ftprequest.KeepAlive = $False
$ftpresponse = $ftprequest.GetResponse()
Write-Out $ftpresponse.StatusCode
Write-Out $ftpresponse.StatusDescription
Я бы посмотрел, как изменить UseBinary на $ true, а затем использовать DownloadFile () метод.
А затем вызовите сценарий из Планировщика заданий, как вы предложили.