跨域远程服务器文件本地复制:PowerShell代码执行报错求助
跨域远程服务器文件复制的PowerShell问题解决
作为PowerShell新手,我尝试把另一域的远程服务器上的文件复制到本地,从技术论坛找了一段代码,但执行后报错了:
$Source = "\\xx.xxx.xxx.xx\Users\test\test_1.txt" $Dest = "D:\Demo\" $Username = "domainname\username" $Password = "xxx" $WebClient = New-Object System.Net.WebClient $WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) $WebClient.DownloadFile($Source, $Dest)
执行后出现的错误信息:
Exception calling "DownloadFile" with "2" argument(s): "An exception occurred during a WebClient request."
At line:9 char:1
- $WebClient.DownloadFile($Source, $Dest)
- CategoryInfo : NotSpecified: (:) [], MethodInvocationException
- FullyQualifiedErrorId : WebException
问题原因
System.Net.WebClient主要是为HTTP/HTTPS这类Web协议设计的文件下载工具,对SMB协议的网络共享路径(也就是\\开头的远程共享)支持不佳,这才触发了WebException错误。
解决方案
推荐用PowerShell原生的SMB相关命令来处理,下面两种方法都能解决跨域复制的问题:
方法1:挂载远程共享后复制
先临时挂载远程共享目录,再执行复制操作:
$SourceFile = "\\xx.xxx.xxx.xx\Users\test\test_1.txt" $DestFile = "D:\Demo\test_1.txt" # 注意这里要指定具体文件名,不能只写目录 $Username = "domainname\username" $Password = ConvertTo-SecureString "xxx" -AsPlainText -Force $Credential = New-Object System.Management.Automation.PSCredential ($Username, $Password) # 临时挂载远程共享为Z盘 New-PSDrive -Name Z -PSProvider FileSystem -Root "\\xx.xxx.xxx.xx\Users\test" -Credential $Credential # 复制文件到本地 Copy-Item -Path "Z:\test_1.txt" -Destination $DestFile # 用完后可以卸载挂载的驱动器 Remove-PSDrive -Name Z
方法2:直接用Copy-Item带凭据
如果你的PowerShell版本在3.0以上,可以直接给Copy-Item传递跨域凭据:
$Source = "\\xx.xxx.xxx.xx\Users\test\test_1.txt" $Dest = "D:\Demo\test_1.txt" # 目标必须指定文件名,否则会把文件当成目录处理 $Username = "domainname\username" $Password = ConvertTo-SecureString "xxx" -AsPlainText -Force $Credential = New-Object System.Management.Automation.PSCredential ($Username, $Password) Copy-Item -Path $Source -Destination $Dest -Credential $Credential
额外注意点
- 目标路径一定要写具体文件名,不管用哪种方法,只写目录都会导致复制失败
- 确认本地机器能访问远程服务器的445端口(SMB默认端口),防火墙没有拦截该端口
- 确保你使用的跨域账号拥有远程共享文件的读取权限
内容的提问来源于stack exchange,提问作者Naresh
相关产品推荐
相关产品推荐

