2009-10-07 8 views
18

Contesto: Presumo che io usi il seguente script di PowerShell dalla mia macchina locale per mappare automaticamente alcune unità di rete.PowerShell: come mappare un'unità di rete con un nome utente/password diverso

$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 faccio a modificare lo script in modo che io possa anche collegarsi ad romeobox, anche se il mio nome utente/password su romeobox è diversa da quella delle altre due scatole?

risposta

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

dovrebbe fare il trucco,

Gentilezza,

Dan

+0

Per curiosità, qual è lo scopo di $ false, presumibilmente un valore di ritorno? Cercalo ma non riesce a trovare la documentazione per MapNetworkDrive ... – Nagev

0

Questo dovrebbe funzionare:

$net = $(New-Object -ComObject WScript.Network) 
$net.MapNetworkDrive("r:", "\\romeobox\files",,"username","password") 
+0

Grazie, solo una nota: il parametro mancante prima di "username" ha causato la protrusione di PS. A parte questo funziona! – dreftymac

+0

Questa risposta contiene un errore che dovrebbe essere corretto. Potrebbe confondere gli utenti meno esperti. – Kris

12

Se avete bisogno di un modo per memorizzare la password senza metterlo in testo normale nello script o in un file di dati, è possibile utilizzare DPAPI per proteggere la password in modo da poter memorizzare i t in modo sicuro in un file e recuperare in un secondo momento come testo normale ad es .:

# 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 
+0

+1 Roba buona; Grazie per le informazioni, Keith –

8

Sono venuto qui in cerca di come mappare le unità utilizzando 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 interessato solo la sessione di PowerShell corrente. -persist fa sì 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 modificare il dominio \ nomeutente, Windows richiede una password. Un'altra alternativa è passare un oggetto PSCredential come nell'esempio seguente. Vedi Get-Credential 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 
+2

Penso che ci possa essere un modo più semplice per ottenere le credenziali ora: '$ Credenziale = Ottieni-Credenziale -Credenziale" dominio \ utente "'. Questo richiederà una password con il campo username già popolato. – SeanKilleen

1
$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

ho trovato questo semplice uno di linea ha funzionato nel mio caso (poco "out of the box" pensiero;))

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

E come bonus aggiuntivo, si ottiene un bel ExitCode a riferire fuori. Spero possa aiutare.

0

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 (s): «Nom de périph Erique locale déjà utilisé.

Curiosamente, non proveniva dal fatto K: era già utilizzato ma da "::" mancante. Ecco cosa sta funzionando sulla mia workstation:

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

Sì, se guardi da vicino gli esempi forniti, vedrai che il primo argomento ha un colon collegato. – Vesper

Problemi correlati