Powershell FTP脚本错误:远程服务器返回错误:227进入被动模式

我有Powershell FTP脚本问题。 我已经把头发拉出来了。

我最近为我的软件项目设置了一个“自动构build服务器”。 所有软件项目都被构build并捆绑到一个zip文件中。 理论上,这个zip文件将通过FTP下载到几个不同的服务器上。 我想build立一个PowerShell脚本,将下载我的软件包,并将其解压缩到所需的目录。

我有问题的部分是通过FTP下载文件。 我可以通过DOS命令窗口手动login到FTP来访问源文件。 我可以下载文件就好了,所以我知道这不是一个防火墙问题。 至less我不认为这是。

每当powershell开始下载源.zip文件,它挂起。 我可以看到文件出现在硬盘上,但是当脚本失败时会消失。 它永远不会从FTP服务器获取任何字节。 然后我收到这个错误:

Powershell FTP脚本错误:远程服务器返回错误:227进入被动模式(10,255,130,77,231,5)Blockquote

这是我的脚本:

#create destination directory (this is where the build files will be dropped) [IO.Directory]::CreateDirectory("C:\tempftp") "Creating staging folder..." #create staging folder for deployment package bundle unzip [IO.Directory]::CreateDirectory("C:\FINALDEPLOYMENTFOLDER") #create destination and source paths for FTP copy command $File = "C:\tempftp\MyPackageT.zip" $ftp = "ftp://AdminiUser:[email protected]/MyPackage.zip" "ftp url: $ftp" $webclient = New-Object System.Net.WebClient $uri = New-Object System.Uri($ftp) "Downloading $File..." #perform the actual data transfer via FTP $webclient.DownloadFile($ftp, $File) "Unzip build package..." #unzip the file that was transferred via FTP $shell_app=new-object -com shell.application $zip_file = $shell_app.namespace("C:\tempftp\MyPackage.zip") #source $destination = $shell_app.namespace("C:\FINALDEPLOYMENTFOLDER") #final destination #unzip to destination folder foreach ($item in $zip_file.Items()) { $destination.CopyHere($item, 16) } 

我能够在本地构build服务器上运行此脚本,并且运行良好。 我知道这个脚本的作品。 我的麻烦是,为什么这个脚本barf在我的非构build服务器上? 为什么被动模式在这种情况下有这样的问题,我该如何解决? 我曾尝试FTP IPv4地址规则,FTP防火墙支持更改等,但没有成功。

值得注意的是,我在IIS7的FTP防火墙支持部分看到了一条警告消息。 它指出:

要在使用FTP over SSL(FTPS)或防火墙不过滤数据包时接受被动连接,请configuration防火墙的外部IPv4地址。

^我不确定这是什么意思,但是我会给它一个机会。 任何想法,为什么被动模式是在我的脖子上这样的痛苦? 我应该不使用WebClient吗? 我真的想避免不得不下载另一个程序/补丁来完成这个工作。 我宁愿在原生Powershell工作…所以不,我不能使用FTP客户端库!

****编辑:我能够解决这个问题,打开我的防火墙上的“所有端口”,但这似乎有点可怕。 任何build议追踪什么端口是需要的,以便这个被动模式错误消失? 我已经有一个规则允许一些特定的端口,我认为FTP使用….但我怎么能看到我需要启用哪些端口?**

从命令提示符连接到FTP站点时,您正在使用主动FTP(只有一个可用),这在防火墙方面更具可预测性。 当您使用System.Net.WebClient进行连接时,您正在使用PASV进行连接,该PASV从预定义的可用范围中获取一个随机端口。 这些请求正在您的防火墙停止。 你也可以尝试打开防火墙上的端口范围,如果你必须坚持使用PASV。 否则,您需要弄清楚如何指定使用活动的FTP连接。 这不能使用System.Net.WebClient来完成。

看看System.Net.FtpWebRequest ,它可以做你想做的。 我看到有一个UsePassive属性。