2011-01-20 19 views
44

Używam programu PowerShell na maszynie wirtualnej z systemem Windows 7 x 64. Mam udostępniony folder na hoście zmapowany jako dysk sieciowy (Z :). Gdy uruchomię PS normalnie mogę uzyskać dostęp do dysku tylko w porządku, ale jeśli uruchomię go „jako administrator” mówi mi:Nie można uzyskać dostępu do dysku sieciowego w środowisku PowerShell działającym pod kontrolą administratora

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 

Jak uzyskać dostęp do dysków sieciowych jako administrator?

+3

pokrewne: http://stackoverflow.com/questions/1267085/vista-uac-trouble-mapping-network-drives. Wygląda na to, że są to zmiany rejestru lub zmiana przypisania dysku w podwyższonym procesie. – ig0774

+0

Próbowałem hack rejestru i to nie pomogło, ale ponowne mapowanie dysku w podwyższonym procesie zrobił - dzięki. Powinieneś opublikować to jako odpowiedź. – EMP

Odpowiedz

0

Co powiesz na mapowanie nowego psdrive, aby uzyskać dostęp do danych? PSDrives działają równie dobrze, jeśli nie lepiej, niż dyski mapowane przez system podczas pisania skryptów lub uzyskiwania dostępu do sieciowych magazynów danych w PowerShell.

Instrukcja korzystania z New-PSDrive komandletu tutaj: Technet:New-PSDrive

Jeśli nie chcesz mieć, aby nowy psdrive za każdym razem można go dodawać do profili zarówno dla Administratora i twoi konto użytkownika i będzie ono automatycznie dostępne za każdym razem, gdy otworzysz pakiet powershell.

~ Dan

64

W końcu poprawka po prostu ponowne mapowanie litery dysku podczas pracy jako administrator:

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

To nie musi być wykonane z tego samego PowerShell wystąpienie (lub w ogóle PowerShell) - to coś, co trzeba zrobić raz dla całej sesji logowania.

+0

Poręcznym sposobem na to bez opuszczania powłoki jest użycie 'runas': ' runas/user: administrator net use Z: "\\ vmware-host \ Shared Folders" ' – andersonvom

+1

Działa u mnie. I dla innych '' net use'' takich jak ''/persistent'' na następne logowanie, sprawdź Microsoft net use [dokumentacja] (http://technet.microsoft.com/en-us/library/gg651155 (v = ws .10) .aspx) – Casey

+0

Jeśli chcesz, aby dysk był widoczny dla kont innych niż Ciebie, np. zaplanowane zadania/usługi, spróbuj [moja odpowiedź] (http://stackoverflow.com/a/26579901/33080) - co również sprawia, że ​​dysk jest dla ciebie widoczny, niezależnie od tego, czy jesteś podniesiony, czy nie. –

6

W moim przypadku mogłem po prostu użyć ścieżki UNC zamiast mapowania dysku i działało dobrze.

Tak więc, dla przykładu, zamiast używania zmapowanego dysku Z: \, użyłem tylko "\\ vmware-host \ Shared Folder" jako ścieżki.

0

Wydaje się znanym problemem dla firmy Microsoft od czasów Vista.
Microsoft Knowled base article z niebezpieczne ustalenie rejestru.

Obecnie oceny tego podejścia, jak niektórzy z naszych chłopaków mają uczucia, że ​​maszyna nie może rozpocząć się po tym ;-)

4

Innym obejście że zajęło mi ages znaleźć się uruchomić net use od A zaplanowane zadanie jako konto NT AUTHORITY \ SYSTEM. Podobno drives mapped under this account show up for all users and all elevation levels.

Przetestowałem to i działa nawet na udziałach NFS (może być trochę drobiazgowo). Wystarczy utworzyć zaplanowanego zadania ustawiony do uruchamiania przy starcie systemu i określ zwykłe polecenie:

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

Może ewentualnie pracować, aby go uruchomić tylko raz /persistent:yes, ale nie próbowałem tego. Przyznane, "po prostu mapuj ponownie" działa również, ale napęd nadal nie będzie widoczny dla zaplanowanych zadań uruchomionych w różnych kontekstach. Minusem jest to, że wszyscy prawdziwi użytkownicy to widzą, więc nie tak dobrze dla konfiguracji wielu użytkowników.

3

Używam następującego hacky rozwiązanie, w którym odtwarzam "brakujące" PSDrives w profile.ps1, gdy Powershell jest uruchomiony w podwyższonym trybie.

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 
     } 
    } 
}