2011-01-20 15 views
44

Sto eseguendo PowerShell in una macchina virtuale Windows 7 x64. Ho una cartella condivisa sull'host mappato come unità di rete (Z :). Quando eseguo PS normalmente posso accedere a tale unità più che bene, ma se lo faccio funzionare "come amministratore" mi dice:Impossibile accedere all'unità di rete in PowerShell in esecuzione come amministratore

Set-Location : Cannot find drive. A drive with the name 'Z' does not exist. 
At line:1 char:13 
+ Set-Location <<<< Z: 
    + CategoryInfo   : ObjectNotFound: (Z:String) [Set-Location], DriveNotFoundException 
    + FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.SetLocationCommand 

Come posso accedere alle unità di rete come amministratore?

+3

correlate: http://stackoverflow.com/questions/1267085/vista-uac-trouble-mapping-network-drives. Sembra che le opzioni siano una modifica del registro o la modifica dell'unità nel processo elevato. – ig0774

+0

Ho provato la modifica del Registro di sistema e questo non ha aiutato, ma la modifica del disco in un processo elevato ha fatto - grazie. Dovresti postarlo come risposta. – EMP

risposta

0

Che ne dici di mappare un nuovo psdrive per accedere a tali dati? PSDrives funziona altrettanto bene se non migliore delle unità mappate di sistema quando si scrivono script o si accede agli archivi di dati di rete in PowerShell.

Istruzioni per l'uso della New-PSDrive cmdlet sono qui: Technet:New-PSDrive

Se non si vuole fare una nuova psdrive ogni volta che si potrebbe aggiungere che ai profili sia per l'amministratore e la vostra account utente e sarà automaticamente disponibile ogni volta che si apre PowerShell.

~ Dan

64

Alla fine la correzione era semplicemente quello di ri-mappare la lettera di unità durante l'esecuzione come amministratore:

net use Z: "\\vmware-host\Shared Folders" 

Non deve essere fatto dallo stesso PowerShell istanza (o da PowerShell) - è solo qualcosa che deve essere fatto una volta per l'intera sessione di accesso.

+0

Un modo pratico per farlo senza uscire dalla shell è usare 'runas': ' runas/utente: amministratore net use Z: "\\ vmware-host \ Shared Folders" ' – andersonvom

+1

Funziona per me. E per altri parametri '' net use'' come ''/persistent'' al prossimo accesso, controlla Microsoft net use [documentation] (http://technet.microsoft.com/en-us/library/gg651155 (v = ws .10) .aspx) – Casey

+0

Se è necessario che l'unità sia visibile per gli account utente diversi da sé, ad es. attività/servizi programmati, prova [la mia risposta] (http://stackoverflow.com/a/26579901/33080), che rende anche l'unità visibile a te sia che tu sia elevato o meno. –

6

Nel mio caso, sono stato in grado di utilizzare semplicemente il percorso UNC anziché la mappatura dell'unità e ha funzionato correttamente.

Quindi, per il tuo esempio, invece di utilizzare l'unità mappata Z: \, ho appena usato "\\ vmware-host \ Shared Folder" come percorso.

0

Sembra un problema noto a Microsoft da Vista.
Microsoft Knowled base article con correzione del registro non sicura.

Attualmente stiamo valutando questo approccio come alcuni dei nostri ragazzi hanno sentimenti che la macchina non può essere avviato dopo questo ;-)

4

Un altro work-around che mi ha portato età trovare è quello di eseguire net use da un operazione pianificata come account NT AUTHORITY \ SYSTEM. Apparentemente drives mapped under this account show up for all users and all elevation levels.

Ho provato questo e funziona anche su condivisioni NFS (che può essere un po 'schizzinoso). Basta creare un'operazione pianificata impostato per eseguire all'avvio del sistema, e specificare il solito comando:

net use //server/share Z: /persistent:no 

Si potrebbe forse lavorare per eseguirlo solo una volta con /persistent:yes, ma non ho provato. Certo, funziona anche "mappalo nuovamente", ma quell'unità non sarà ancora visibile per le attività pianificate in esecuzione in diversi contesti. Lo svantaggio è che tutti gli utenti reali lo vedono, quindi non è così buono per le configurazioni multiutente.

3

Sto utilizzando la seguente soluzione hacky in cui ricreare PSDrives "mancanti" in profile.ps1 quando Powershell è in esecuzione in modalità elevata.

Gist

# Reconnect PSDrives for network connections when running with elevated privileges 
$elevated = (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) 
if($elevated) { 
    net use | ?{ $_ -match ":\s+\\\\" -and !$_.StartsWith("Unavailable") } | %{ 
     $tokens = $_.split(":") 
     $psdrivename = $tokens[0][$tokens[0].length-1] 
     $path = $tokens[1].trim().split(" ")[0].trim() 

     if(!(get-psdrive | ?{ $_.Name -eq $psdrivename })) { 
      write-host ("Restoring PSDrive for {0}: {1}" -f $psdrivename, $path) 
      new-psdrive $psdrivename FileSystem $path | out-null 
     } 
    } 
}