web-dev-qa-db-ja.com

Powershell:異なるユーザー名/パスワードでネットワークドライブをマップする方法

Background:ローカルマシンから次のPowerShellスクリプトを使用して、いくつかのネットワークドライブを自動的にマッピングするとします。

$net = $(New-Object -ComObject WScript.Network);
$net.MapNetworkDrive("p:", "\\papabox\files");

$net = $(New-Object -ComObject WScript.Network);
$net.MapNetworkDrive("q:", "\\quebecbox\files");

## problem -- this one does not work because my username/password
## is different on romeobox
$net = $(New-Object -ComObject WScript.Network);
$net.MapNetworkDrive("r:", "\\romeobox\files");

質問: romeoboxのユーザー名/パスワードが他の2つのボックスと異なる場合でも、romeoboxに接続できるようにスクリプトを変更するにはどうすればよいですか?

18
dreftymac
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("r:", "\\romeobox\files", $false, "domain\user", "password")

トリックを行う必要があります、

親切、

ダン

34
Daniel Elliott

スクリプトまたはデータファイルにプレーンテキストを入れずにパスワードを保存する方法が必要な場合は、DPAPIを使用してパスワードを保護し、ファイルに安全に保存し、後でプレーンテキストとして取得できるようにします。

# Stick password into DPAPI storage once - accessible only by current user
Add-Type -Assembly System.Security
$passwordBytes = [System.Text.Encoding]::Unicode.GetBytes("Open Sesame")
$entropy = [byte[]](1,2,3,4,5)
$encrytpedData = [System.Security.Cryptography.ProtectedData]::Protect( `
                       $passwordBytes, $entropy, 'CurrentUser')
$encrytpedData | Set-Content -enc byte .\password.bin

# Retrieve and decrypted password
$encrytpedData = Get-Content -enc byte .\password.bin
$unencrytpedData = [System.Security.Cryptography.ProtectedData]::Unprotect( `
                       $encrytpedData, $entropy, 'CurrentUser')
$password = [System.Text.Encoding]::Unicode.GetString($unencrytpedData)
$password
12
Keith Hill

PowerShellを使用してドライブをマップする方法をお探しですか?

PowerShell3.0にはもっと簡単な方法があります。 New-PSDrive-persistオプションで更新されました。例えば。

New-PSDrive -Name U -PSProvider FileSystem -Root \\yourserver\your\folder -Credential yourdomain\username -Persist

過去には、New-PSDriveは現在のPowerShellセッションのみに影響していました。 -persistを使用すると、マッピングがそのままO/Sに登録されます。 New-PSDrive を参照してください

元の質問に答えるために、使用する資格情報を変えることができます。 -Credentialを使用してdomain\usernameを変更すると、Windowsはパスワードを要求します。別の代替方法は、以下の例のようにPSCredentialオブジェクトを渡すことです。詳細については、 Get-Credential を参照してください。

PS C:\> $User = "mydomain\username"
PS C:\> $PWord = ConvertTo-SecureString -String "mypassword" -AsPlainText -Force
PS C:\> $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord
PS C:\> New-PSDrive -Name U -PSProvider FileSystem -Root \\domain\some\folder -Credential $Credential -Persist  
10
Donal Lafferty

私の場合、この簡単な1つのライナーが機能していることがわかりました(「箱から出して」少し考えて;))

(開始プロセス-FilePath "C:\ windows\system32\NET.exe" -ArgumentList "USE I:\ Server\Volume/USER:XXXXX password/persistent:yes" -Wait -Passthru) .ExitCode

また、追加のボーナスとして、報告するための素晴らしい終了コードを取得します。お役に立てば幸いです。

1
JPand Katie
$User = "user"
$PWord = ConvertTo-SecureString -String "password" -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord
$net = $(New-Object -ComObject WScript.Network)
$net.MapNetworkDrive("r:", "\\server\share")
1
DisplayName

私のワークステーションでは、

$net.MapNetworkDrive("k", "\\romeobox\files", $false, "domain\username", "password")

エラーを送ってくれた:

"MapNetworkDrive"avec"5"引数の例外:"Nom depériphériquelocaldéjàutilisé。

奇妙なことに、K:がすでに使用されていたという事実からではなく、 "::"が欠落しているためです。ここに私のワークステーションで働いているものがあります:

$net.MapNetworkDrive::("k", "\\romeobox\files", $false, "domain\username", "password")
0
Valentin O.