2011-01-20 25 views
44

Tôi đang chạy PowerShell trong máy ảo Windows 7 x64. Tôi có một thư mục được chia sẻ trên máy chủ được ánh xạ dưới dạng ổ đĩa mạng (Z :). Khi tôi chạy PS bình thường tôi có thể truy cập vào ổ đĩa mà chỉ là tốt, nhưng nếu tôi chạy nó "as administrator" nó nói với tôi:Không thể truy cập ổ đĩa mạng trong PowerShell đang chạy với tư cách là quản trị viên

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 

Làm thế nào để truy cập vào ổ đĩa mạng as administrator?

+3

liên quan: http://stackoverflow.com/questions/1267085/vista-uac-trouble-mapping-network-drives. Có vẻ như các tùy chọn là thay đổi sổ đăng ký hoặc ánh xạ lại ổ đĩa trong quá trình nâng cao. – ig0774

+0

Tôi đã thử đăng ký hack và điều đó không giúp được gì, nhưng việc sao lưu ổ đĩa trong quá trình nâng cao đã làm - cảm ơn. Bạn nên đăng bài đó như một câu trả lời. – EMP

Trả lời

0

Cách ánh xạ psdrive mới để xác định dữ liệu đó? PSDrives cũng hoạt động tốt nếu không tốt hơn các ổ đĩa được ánh xạ hệ thống khi bạn đang viết các script hoặc truy cập vào các kho dữ liệu mạng trong PowerShell.

Hướng dẫn sử dụng New-PSDrive cmdlet đang ở đây: Technet:New-PSDrive

Nếu bạn không muốn phải thực hiện một psdrive mới mỗi khi bạn có thể thêm nó vào các cấu hình cho cả Administrator và bạn tài khoản người dùng và nó sẽ tự động có sẵn mỗi lần bạn mở PowerShell.

~ Dan

64

Cuối cùng việc sửa chữa chỉ đơn giản là để tái lập bản đồ các ký tự ổ đĩa khi chạy as Administrator:

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

Nó không phải được thực hiện từ PowerShell cùng Ví dụ (hoặc từ PowerShell ở tất cả) - nó chỉ là một cái gì đó mà cần phải được thực hiện một lần cho toàn bộ phiên đăng nhập.

+0

Cách thuận tiện để thực hiện điều đó mà không cần thoát khỏi vỏ là sử dụng 'runas': 'runas/user: quản trị viên sử dụng mạng Z:" \\ vmware-host \ Shared Folders "' – andersonvom

+1

Làm việc cho tôi. Và đối với các tham số '' net use'' khác như ''/persistent'' trong lần đăng nhập tiếp theo, hãy kiểm tra Microsoft net use [documentation] (http://technet.microsoft.com/en-us/library/gg651155 (v = ws) .10) .aspx) – Casey

+0

Nếu bạn cần ổ đĩa hiển thị với tài khoản người dùng khác với chính mình, ví dụ: các nhiệm vụ/dịch vụ đã lên lịch, hãy thử [answer của tôi] (http://stackoverflow.com/a/26579901/33080) - điều này cũng làm cho ổ đĩa hiển thị cho bạn dù bạn có nâng cấp hay không. –

6

Trong trường hợp của tôi, tôi đã có thể chỉ đơn giản là sử dụng đường dẫn UNC thay vì ánh xạ ổ đĩa và nó hoạt động tốt.

Vì vậy, theo ví dụ của bạn, thay vì sử dụng ổ đĩa được ánh xạ Z: \, tôi vừa sử dụng "\\ vmware-host \ Shared Folder" làm đường dẫn.

0

Có vẻ như một vấn đề đã biết đối với Microsoft kể từ Vista.
Microsoft Knowled base article với không an toàn sửa lỗi đăng ký.

Chúng tôi hiện đang đánh giá phương pháp này như một số các chàng trai của chúng ta có cảm giác rằng máy có thể không bắt đầu sau này ;-)

4

Một khác công việc xung quanh đó đã cho tôi lứa tuổi để tìm được để chạy net use từ nhiệm vụ được lập lịch là tài khoản NT AUTHORITY \ SYSTEM. Rõ ràng là drives mapped under this account show up for all users and all elevation levels.

Tôi đã thử nghiệm điều này và nó hoạt động ngay cả trên cổ phiếu NFS (có thể hơi khó tính). Chỉ cần tạo một nhiệm vụ lên kế hoạch thiết lập để chạy lúc khởi động hệ thống, và chỉ định lệnh thông thường:

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

Nó có thể có thể làm việc để chạy nó chỉ một lần với /persistent:yes, nhưng tôi đã không cố gắng đó. Cấp, "chỉ cần bản đồ nó một lần nữa" hoạt động quá, nhưng ổ đĩa đó vẫn sẽ không được hiển thị cho các nhiệm vụ theo lịch trình chạy trong bối cảnh khác nhau. Nhược điểm là tất cả người dùng thực sự đều nhìn thấy nó, vì vậy không tốt cho các thiết lập đa người dùng.

3

Tôi đang sử dụng giải pháp hacky sau đây, nơi tôi tạo lại "thiếu" PSDrives trong tiểu sử.ps1 khi Powershell đang chạy ở chế độ cao.

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