无法在以管理员身份运行的 PowerShell 中访问网络驱动器

问题描述 投票:0回答:8

我在 Windows 7 x64 虚拟机中运行 PowerShell。我在主机上有一个映射为网络驱动器 (Z:) 的共享文件夹。当我正常运行 PS 时,我可以很好地访问该驱动器,但如果我“以管理员身份”运行它,它会告诉我:

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

如何以管理员身份访问网络驱动器?

powershell uac unc
8个回答
113
投票

最终的修复方法只是在以管理员身份运行时重新映射驱动器号

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

它不必从同一个 PowerShell 实例(或根本从 PowerShell)完成 - 它只是需要在整个登录会话中完成一次。


11
投票
就我而言,我可以简单地使用 UNC 路径而不是驱动器映射,并且效果很好。

因此,根据您的示例,我没有使用映射驱动器 Z:\,而是使用“\vmware-host\Shared Folder”作为路径。


8
投票
我花费了

很多时间才找到的另一个解决方法是从计划任务作为 NT AUTHORITY\SYSTEM

 帐户运行 
net use。显然,此帐户下映射的驱动器会显示给所有用户和所有海拔级别

我已经对此进行了测试,它甚至可以在 NFS 共享上运行(这可能有点挑剔)。只需创建一个计划任务集在系统启动时运行,并指定常用命令:

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

使用

/persistent:yes

 运行一次可能会起作用,但我还没有尝试过。当然,“只需再次映射它”也可以,但该驱动器对于在不同上下文中运行的计划任务仍然不可见。缺点是所有真实用户也会看到它,因此不适合多用户设置。


4
投票
我正在使用以下 hacky 解决方案,当 Powershell 在提升模式下运行时,我在 profile.ps1 中重新创建“丢失的”PSDrive。

要点

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

0
投票
映射一个新的

psdrive 来访问该数据怎么样?当您在 powershell 中编写脚本或访问网络数据存储时,PSDrive 的工作效果与系统映射驱动器一样好,甚至更好。

使用

New-PSDrive cmdlet 的说明位于:Technet:New-PSDrive

如果您不想每次都创建一个新的 psdrive,您可以将其添加到管理员和用户帐户的配置文件中,并且每次打开 powershell 时它都会自动可用。

~丹


0
投票
自 Vista 以来,这似乎是 Microsoft 的已知问题。

Microsoft
知识库文章,其中包含不安全注册表修复。

我们目前正在评估这种方法,因为我们的一些人感觉机器在此之后可能无法启动;-)


0
投票
其他答案都不适合我;但@TimothyLeeRussell 的

answer 为我指明了正确的方向。

就我而言,我的网络驱动器上有一个

.bat

 文件。当我以管理员身份运行它时,它只会闪烁一个命令提示符窗口,然后立即消失;当我从提升的命令提示符运行文件内容时,它工作得很好。 

最后我意识到我尝试从映射的网络驱动器运行

.bat

 文件。我将文件的执行更改为使用 UNC 路径,并且它有效。


0
投票
如果 Powersheel 以管理员身份运行,我们可以从注册表中获取有关现有映射驱动器的信息,并通过在 $PROFILE 中包含以下内容在管理会话中重新创建它们。

$CurPrincipal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent() if ( $CurPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) ) { Get-ChildItem HKCU:\Network\ | Get-ItemProperty | Select-Object pspath, remotepath | ForEach-Object { New-PSDrive -name "$(Split-Path $_.PSPath -Leaf)" -PSProvider "FileSystem" -Root "$($_.remotepath)" } | Out-Null }
    
© www.soinside.com 2019 - 2024. All rights reserved.