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

Posted

技术标签:

【中文标题】无法在以管理员身份运行的 PowerShell 中访问网络驱动器【英文标题】:Cannot access network drive in PowerShell running as administrator 【发布时间】:2011-06-12 04:41:07 【问题描述】:

我在 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

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

【问题讨论】:

相关:***.com/questions/1267085/…。看起来选项是注册表更改或在提升的过程中重新映射驱动器。 我尝试了注册表破解,但没有帮助,但在提升的进程中重新映射驱动器确实 - 谢谢。您应该将其发布为答案。 【参考方案1】:

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

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

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

【讨论】:

一个方便的方法是使用runas:runas /user:administrator net use Z: "\\vmware-host\Shared Folders" 为我工作。对于其他net use 参数,例如/persistent 在下次登录时,请检查Microsoft net use documentation 如果您需要驱动器对您以外的其他用户帐户可见,例如计划的任务/服务,试试my answer - 无论你是否被提升,它都会让你看到驱动器。 VirtualBox 的路径是\\vboxsvr\share,它也很有效。 网络使用有效,new-psdrive 不工作是我学到的;)【参考方案2】:

就我而言,我能够简单地使用 UNC 路径而不是驱动器映射,并且效果很好。

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

【讨论】:

【参考方案3】:

我花了 ages 时间才找到的另一个解决方法是,以 NT AUTHORITY\SYSTEM 帐户从计划任务运行 net use。显然是drives mapped under this account show up for all users and all elevation levels。

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

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

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

【讨论】:

【参考方案4】:

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

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
        
    
  

【讨论】:

【参考方案5】:

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

New-PSDrive cmdlet 的使用说明如下:Technet:New-PSDrive

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

~丹

【讨论】:

【参考方案6】:

似乎是自 Vista 以来 Microsoft 的一个已知问题。 Microsoft Knowled base article 与 unsafe 注册表修复。

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

【讨论】:

【参考方案7】:

其他答案都不适合我;但@TimothyLeeRussell 的answer 为我指明了正确的方向。

就我而言,我有一个位于网络驱动器上的.bat 文件。当我以管理员身份运行它时,它只会闪烁一个命令提示符窗口并立即消失;当我从提升的命令提示符运行文件内容时,它运行良好。

最后我意识到我尝试从映射的网络驱动器运行.bat 文件。我将文件的执行更改为使用 UNC 路径,它可以正常工作。

【讨论】:

以上是关于无法在以管理员身份运行的 PowerShell 中访问网络驱动器的主要内容,如果未能解决你的问题,请参考以下文章

无法以非管理员模拟用户身份运行 - 访问被拒绝

PowerShell 文件夹权限错误 - 部分或全部身份引用无法翻译

如何以管理员身份运行powershell

使用 PowerShell 以管理员身份运行命令?

powershell 通过Powershell禁用/启用Hyper-V(“以管理员身份运行”)

如何让Delphi程序启动自动“以管理员身份运行