Copy-Item 用于使用凭据将文件从本地复制到远程服务器

Posted

技术标签:

【中文标题】Copy-Item 用于使用凭据将文件从本地复制到远程服务器【英文标题】:Copy-Item for copy files from local to remove server using credentials 【发布时间】:2017-05-27 19:57:56 【问题描述】:

我正在尝试将一些文件和文件夹从我的本地机器复制到远程服务器:

Copy-Item .\copy_test.txt -destination "\\serverip\c$\backups\"

但我收到一个错误:

Copy-Item : 登录失败:未知用户名或密码错误。
在行:1 字符:10
+ 复制项目 

我尝试使用凭据,但此命令不允许使用 -Credential 参数。我搜索了很多,在每个示例中,只需执行Copy-Item $source -destination $destination,命令就非常简单,我想知道为什么在我的工作站上这么难。

创建新的 PSDrive

我尝试创建New-PSDrive,但没有成功。

$creds = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $username, $password

New-PSDrive -Name X -PSProvider FileSystem -Root '\\$serverip\c$' -Credential $creds -Persist
Copy-Item '.\copy_test.txt' -Destination 'X:\backups'
Remove-PSDrive -Name X

这是错误信息:

PS C:\Users\Administrator\Desktop> .\copyfiles.ps1
New-PSDrive : 找不到网络路径
在 C:\Users\Administrator\Desktop\copyfiles.ps1:11 char:1
+ New-PSDrive -Name X -PSProvider FileSystem -Root '\\$serverip\c$' -Credential $c ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (X:PSDriveInfo) [New-PSDrive], Win32Exception
    + FullyQualifiedErrorId : CouldNotMapNetworkDrive,Microsoft.PowerShell.Commands.NewPSDriveC

Copy-Item:找不到驱动器。名为“X”的驱动器不存在。
在 C:\Users\Administrator\Desktop\copyfiles.ps1:12 char:1
+ 复制项目 '.\copy_test.txt' -Destination 'X:\backups'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~
    + CategoryInfo : ObjectNotFound: (X:String) [Copy-Item], DriveNotFoundException
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.CopyItemCommand

Remove-PSDrive : 找不到驱动器。名为“X”的驱动器不存在。
在 C:\Users\Administrator\Desktop\copyfiles.ps1:13 char:1
+ 删除-PSDrive -Name X
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (X:String) [Remove-PSDrive], DriveNotFoundExcepti
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.RemovePSDriveCommand

我的服务器

我的服务器是 AWS 中的 windows 实例。我拥有正确的权限,因为我可以运行其他命令,例如 Invoke-Command,以便检查远程服务器中的某些服务。

PS> $PSVersionTable.PSVersion

主要次要版本修订
----- ----- ----- --------
4 0 -1 -1

【问题讨论】:

New-PSDrive 创建一个临时或永久的映射网络驱动器可能会有所帮助。 【参考方案1】:

如果访问远程共享需要凭据,则需要先将其映射到 (PS) 驱动器,然后才能将其与其他 cmdlet 一起使用。

$cred = Get-Credential
New-PSDrive -Name X -PSProvider FileSystem -Root "\\$serverip\c$" -Credential $cred -Persist
Copy-Item '.\copy_test.txt' -Destination 'X:\backups'
Remove-PSDrive -Name X

【讨论】:

@Robert 如果要在 UNC 路径字符串中使用变量,则必须将其放在双引号中,而不是单引号中。 我做到了。现在用双引号......错误是一样的。所以引号不是问题的根源。 是否需要共享服务器文件夹才能创建 PSDrive? 好吧,如果共享文件夹一开始就没有共享,那么您当然无法映射该共享文件夹。请注意,C$ 是一个管理共享,因此您进行身份验证的帐户需要在远程主机上具有管理员权限才能访问它。如果不是这种情况,您需要创建一个可使用给定凭据访问的共享。还要确保防火墙允许访问共享。【参考方案2】:

我找到了解决方案。我使用的是 PowerShell 4.0 版,然后将我的版本升级到 5.0

在以前的版本中,Copy-Item 不允许使用凭据。现在可以通过服务器之间的会话复制文件:

$deploy_dest = "C:\backup"
$username = "$server\Administrator"
$password =  Get-Content C:\mypassword.txt | ConvertTo-SecureString -AsPlainText -Force

$creds = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password

$session = New-PSSession -ComputerName $server -Credential $creds

Copy-Item -Path .\copy_test.txt -Destination -ToSession $session

【讨论】:

【参考方案3】:

使用 copy 命令和 net use

检查此替代方案
net use \\10.164.60.77\c$\Users\ana\Desktop password /user:username
copy "C:\Users\alex\Desktop\test.txt" "\\10.164.60.77\c$\Users\ana\Desktop\test.txt"

【讨论】:

以上是关于Copy-Item 用于使用凭据将文件从本地复制到远程服务器的主要内容,如果未能解决你的问题,请参考以下文章

用于将目录从 hdfs 复制到本地的 Shell 脚本

无法将文件从共享上的一个位置复制到同一共享上的另一个位置,无需凭据

Copy-Item 是不是应该创建目标目录结构?

使用 FileInfo.CopyTo 将文件复制到映射的网络驱动器

将 .bak 数据库文件从备份位置移动到另一台服务器

scp 文件从本地到远程服务器中的不同用户