copy-item With Alternate Credentials

时间:2009-03-04 19:14:06

标签: powershell powershell-v2.0

我正在使用powershell v2的CTP。我写了一个脚本,需要在我们的dmz中找到各种网络共享并复制一些文件。但是,我遇到的问题显然是powershell的cmdlet,例如copy-item,test-path等,不支持备用凭据......

任何人都有关于如何最好地完成任务的建议......?

13 个答案:

答案 0 :(得分:40)

我最近遇到过这种情况,在最新版本的Powershell中有一个新的BitsTransfer Module,它允许使用BITS进行文件传输,并支持使用-Credential参数。

以下示例显示如何使用BitsTransfer模块使用指定的PSCredential对象将文件从网络共享复制到本地计算机。

Import-Module bitstransfer
$cred = Get-Credential
$sourcePath = \\server\example\file.txt
$destPath = C:\Local\Destination\
Start-BitsTransfer -Source $sourcePath -Destination $destPath -Credential $cred

另一种处理方法是使用标准的“net use”命令。但是,此命令不支持“securestring”密码,因此在获取凭证对象后,您必须获取密码的解密版本以传递给“net use”命令。

$cred = Get-Credential
$networkCred = $cred.GetNetworkCredential()
net use \\server\example\ $networkCred.Password /USER:$networkCred.UserName
Copy-Item \\server\example\file.txt C:\Local\Destination\

答案 1 :(得分:25)

由于PowerShell不支持通过许多cmdlet使用“-Credential”(非常烦人),并且通过WMI映射网络驱动器在PS中被证明非常不可靠,我发现预先通过net use命令缓存用户凭据可以很好地工作:

# cache credentials for our network path
net use \\server\C$ $password /USER:$username

在路径中使用\\ server \ C $的任何操作似乎都可以使用* -item cmdlet。

您还可以在完成后删除共享:

net use \\server\C$ /delete

答案 2 :(得分:16)

PowerShell 3.0现在支持FileSystem提供程序上的凭据。要使用备用凭据,只需使用New-PSDrive cmdlet上的Credential参数

PS > New-PSDrive -Name J -PSProvider FileSystem -Root \\server001\sharename -Credential mydomain\travisj -Persist

在此命令之后,您现在可以访问新创建的驱动器并执行其他操作,包括复制或移动文件,如普通驱动器。这是完整的解决方案:

$Source = "C:\Downloads\myfile.txt"
$Dest   = "\\10.149.12.162\c$\skumar"
$Username = "administrator"
$Password = ConvertTo-SecureString "Complex_Passw0rd" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential($Username, $Password)

New-PSDrive -Name J -PSProvider FileSystem -Root $Dest -Credential $mycreds -Persist
Copy-Item -Path $Source -Destination "J:\myfile.txt"

答案 3 :(得分:8)

这是一个老问题,但我只是为将来的发现者更新它。

PowerShell v3现在支持使用-Credential参数进行文件系统操作。

希望这有助于其他人搜索相同的解决方案。

答案 4 :(得分:6)

我会尝试将驱动器映射到远程系统(使用'net use'或WshNetwork.MapNetworkDrive,两种方法都支持凭据),然后使用copy-item。

答案 5 :(得分:2)

我现在知道PowerShell 3 supports this out of the box,但是为了记录,如果你被困在PowerShell 2上,你基本上必须使用遗留net use命令(正如其他几个人所建议的那样),或者the Impersonation module that I wrote一段时间专门用来解决这个问题。

答案 6 :(得分:0)

Here是有人让它上班的帖子。看起来它需要更改注册表。

答案 7 :(得分:0)

question解决了一个可能对using network shares in powershell有帮助的非常相关的问题。

答案 8 :(得分:0)

再次从死里复活。通过将.ps1包装在批处理文件中并执行Win7,Shift + r.Click RunAs,我遇到了类似的凭据问题。如果你愿意,你也可以使用PsExec:

psexec.exe /accepteula /h /u user /p pwd cmd /c "echo. | powershell.exe -File script.ps1"

答案 9 :(得分:0)

这是我的脚本在计算机上作为LocalSystem运行,但需要domaim用户的凭据才能访问网络文件位置。它允许您将用户的密码存储在" safe-ish"加密文件;只能由编写它的用户阅读。

通过将包含明文密码的文件复制到本机来完成设置和更改密码。下次运行脚本时,它会读取密码,对其进行加密,然后删除明文密码。

$plaintext_password_file = 'C:\plaintext.txt' # Stores the password in plain text - only used once, then deleted
$encryted_password_file = 'C:\copy_pass.txt'  # Stores the password in "safe" encrypted form - used for subsequent runs of the script
                                              #   - can only be decrypted by the windows user that wrote it
$file_copy_user = 'OURDOMAIN\A_User'

# Check to see if there is a new plaintext password
if (Test-Path $plaintext_password_file)
{
    # Read in plaintext password, convert to a secure-string, convert to an encrypted-string, and write out, for use later
    get-content $plaintext_password_file | convertto-securestring -asplaintext -force | convertfrom-securestring | out-file $encryted_password_file
    # Now we have encrypted password, remove plain text for safety
    Remove-Item $plaintext_password_file
}


# Read in the encrypted password, convert to a secure-string
$pass = get-content $encryted_password_file | convertto-securestring

# create a credential object for the other user, using username and password stored in secure-string
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $file_copy_user,$pass

# Connect to network file location as the other user and map to drive J:
New-PSDrive -Name J -PSProvider FileSystem -Root "\\network\file_directory" -Credential $credentials

# Copy the file to J:
Copy-Item -Force -Verbose -Path "C:\a_file.txt" -Destination "J:\"

作为额外的改进:用户名也可以加密,而不是硬编码。

答案 10 :(得分:0)

较新版本的 PowerShell 处理了这个问题,MS 文档中有一个很好的例子 of copying a file with different credentials here

$Session = New-PSSession -ComputerName "Server02" -Credential "Contoso\User01"
Copy-Item "D:\Folder002\" -Destination "C:\Folder002_Copy\" -ToSession $Session

答案 11 :(得分:-2)

  

显然,powershell的cmdlet(例如copy-item,test-path等)不支持备用凭据...

看起来他们在这里,copy-item当然包括-Credential参数。

PS C:\> gcm -syn copy-item
Copy-Item [-Path] <String[]> [[-Destination] <String>] [-Container] [-Force] [-Filter <String>] [-I
nclude <String[]>] [-Exclude <String[]>] [-Recurse] [-PassThru] [-Credential <PSCredential>] [...]

答案 12 :(得分:-7)

您应该能够将所需的任何凭据传递给-Credential参数。如下所示:

$ cred = Get-Credential

[输入凭据]

Copy-Item -Path $ from -Destination $ to -Credential $ cred