risposta-alla-domanda-sullo-sviluppo-web-bd.com

PowerShell: come mappare un'unità di rete con un nome utente/password diversi

Background: Supponiamo che io usi il seguente script di PowerShell dalla mia macchina locale per mappare automaticamente alcune unità di rete.

$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");

Domanda: Come posso modificare lo script in modo che possa anche connettermi a romeobox, anche se il mio nome utente/password su romeobox è diverso da quello delle altre due caselle?

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

Dovrebbe fare il trucco,

Gentilezza,

Dan

33
Daniel Elliott

Se hai bisogno di un modo per memorizzare la password senza inserirla in testo normale nello script o in un file di dati, puoi utilizzare DPAPI per proteggere la password in modo da poterla archiviare in modo sicuro in un file e recuperarla in un secondo momento, ad esempio:

# 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

È venuto qui cercando come mappare le unità usando PowerShell? 

C'è un modo più semplice con PowerShell3.0. New-PSDrive è stato aggiornato con l'opzione -persist. Per esempio. 

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

In passato, New-PSDrive riguardava solo la sessione corrente di PowerShell. -persist fa in modo che la mappatura venga registrata con l'O/S, per così dire. Vedi New-PSDrive

Per rispondere alla domanda originale, è possibile modificare le credenziali utilizzate. Utilizzando -Credential per variare il dominio\username, Windows richiede la password. Un'altra alternativa è passare un oggetto PSCredential come nell'esempio seguente. Vedi Ottieni-Credenziali per maggiori dettagli.

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  
9
Donal Lafferty

Ho trovato che una fodera semplice ha funzionato nel mio caso (un po '"fuori dalla scatola" pensando;))

(Start-Process -FilePath "C:\windows\system32\NET.exe" -ArgumentList "USE I:\Server\Volume/USER: XXXXX password / persistent: yes" -Wait -Passthru) .ExitCode

E come bonus aggiuntivo, ottieni un codice di uscita di Nizza da cui segnalare. Spero che sia d'aiuto.

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

Sulla mia workstation,

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

mi ha mandato errore:

Eccezione lors de l'appel de «MapNetworkDrive» avec «5» argomento (i): «Nom de périph érique local déjà utilisé.

Curiosamente, non è venuto dal fatto che K: era già usato ma da "::" mancante. Ecco cosa sta funzionando sulla mia workstation:

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