web-dev-qa-db-ja.com

代替資格情報を使用したcopy-item

Powershell v2のCTPを使用しています。 dmzのさまざまなネットワーク共有にアクセスして、いくつかのファイルをコピーする必要があるスクリプトを作成しました。ただし、私が抱えている問題は、copy-item、test-pathなどのpowershellのコマンドレットが代替資格情報をサポートしていないことです。

誰も私の仕事を達成する最善の方法についての提案を持っています..?

37
xspydr

最近これに遭遇しましたが、Powershellの最新バージョンには新しい BitsTransfer Module があり、これは [〜#〜] bits [〜#〜] を使用したファイル転送を許可します=、および-Credentialパラメーターの使用をサポートします。

次のサンプルは、指定されたPSCredentialオブジェクトを使用して、BitsTransferモジュールを使用して、ネットワーク共有からローカルマシンにファイルをコピーする方法を示しています。

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\
40
chills42

PowerShellは多くのコマンドレット(very迷惑)による「-Credential」の使用をサポートしていないため、PSでWMIを介したネットワークドライブのマッピングは非常に信頼性が低いことが判明したため、 Net Useコマンドを使用した資格情報は非常にうまく機能します。

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

パスで\\ server\C $を使用する操作はすべて、*-itemコマンドレットを使用して機能するようです。

完了したら、共有を削除することもできます。

Net Use \\server\C$ /delete
25
wes

PowerShell 3.0は、FileSystemプロバイダーの資格情報をサポートするようになりました。代替資格情報を使用するには、New-PSDriveコマンドレットで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"
16
Santosh Panda

これは古い質問ですが、将来の発見者のために更新しています。

PowerShell v3は、ファイルシステム操作に-Credentialパラメーターの使用をサポートするようになりました。

これが他の人が同じソリューションを検索するのに役立つことを願っています。

9
x0n

ドライブをリモートシステムにマップして(「Net Use」またはWshNetwork.MapNetworkDrive、どちらの方法も資格情報をサポートする)、copy-itemを使用しようとします。

6
Shay Levy

PowerShell 3はすぐにこれをサポートします ですが、レコードについては、PowerShell 2にこだわっている場合、基本的にレガシーNet Useコマンド(いくつかの他の人によって提案された)、または 私が書いた偽装モジュール これに対処するためにしばらく前に戻ってきました。

2
Jaykul

これは question に役立つ非常に関連する問題に対処します powershellでネットワーク共有を使用

0
eddiegroves

ここ は、誰かが仕事を始めた投稿です。レジストリの変更が必要なようです。

0
notandy

これは、マシン上でLocalSystemとして実行されますが、ネットワークファイルの場所にアクセスするにはdomaimユーザーの資格情報が必要なスクリプトです。これにより、ユーザーのパスワードを「安全な」暗号化ファイルに保存できます。それを書いたユーザーだけが読むことができます。

パスワードの設定と変更は、プレーンテキストパスワードを含むファイルをマシンにコピーすることにより行われます。次にスクリプトを実行すると、パスワードが読み取られ、暗号化されてから、プレーンテキストのパスワードが削除されます。

$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:\"

追加の改良として:ユーザー名もハードコーディングするのではなく、暗号化することもできます。

0
Jason A

これを再び死者から取り戻します。 .ps1をバッチファイルにラップし、Win7、Shift + r.Click RunAsを実行することで、同様の資格情報の問題を回避しました。必要に応じて、PsExecを使用することもできます。

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