是否可以使用标准 Windows Server 2012 功能安全地定期轮询外部 FTPS(或 SFTP)服务器并在本地复制/移动文件?
我想象使用调度程序进行轮询/移动,但是是否有能力将 FTPS/SFTP 添加到组合中?
我遇到的唯一指导是将服务器变成 FTPS 服务器,但不是如何利用操作系统的 FTPS 客户端……如果有的话。
谢谢
答案1
Windows 中没有 FTPS 也没有 SFTP 客户端(任何版本)。
内置的 Windowsftp.exe
仅支持普通的未加密 FTP。此外,它仅支持主动 FTP 模式,当连接到防火墙或 NAT 后面的服务器时,这使其毫无用处。
您需要使用第三方客户端。
例如WinSCP FTP/SFTP 客户端,你可以使用批处理文件轮询 FTPS 服务器,例如:
winscp.com /command ^
"open ftps://user:[email protected]/" ^
"get /path/file c:\path\" ^
"exit"
对于 SFTP 也类似:
winscp.com /command ^
"open sftp://user:[email protected]/ -hostkey=""ssh-rsa 2048 xxxxxxxxxxx...=""" ^
...
查看WinSCP 脚本指南。
(我是 WinSCP 的作者)
您还可以使用FtpWebRequest
.NET 框架中的类来自 PowerShell 脚本。它支持 FTPS(但不支持 SFTP)。虽然微软不建议将其用于新开发。无论如何,例如,请参阅@TessellatingHeckler 的回答。
答案2
看起来你可以用标准的 Windows 工具来实现,使用 .Net Framework 的FTPWeb请求来自 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() 方法。
然后按照您的建议从任务计划程序调用脚本。