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

80

我正在运行 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

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


3
相关链接:https://dev59.com/_EjSa4cB1Zd3GeqPI9vj。看起来选项是更改注册表或在提升的进程中重新映射驱动器。 - ig0774
1
我尝试了注册表修改,但没有帮助,但在提升的进程中重新映射驱动器确实有用 - 谢谢。你应该把它作为答案发布。 - EMP
8个回答

114

最终的解决方法就是在管理员权限下重新映射驱动器的盘符:

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

它不一定要从同一个PowerShell实例(或者从PowerShell中完成) - 这只是需要在整个登录会话中完成一次的事情。


3
在不离开 shell 的情况下,一个方便的方法是使用 runasrunas /user:administrator net use Z: "\\vmware-host\Shared Folders" - andersonvom
2
对我来说可以运行。对于其他“net use”参数,如下一个登录会话的“/persistent”,请查看Microsoft net use文档。 - Casey
如果您希望驱动器对自己以外的用户账户可见,例如计划任务/服务,请尝试我的答案 - 这也使驱动器在您是否提升权限时都可见。 - Roman Starkov
对于VirtualBox,路径为\\vboxsvr\share,同样也非常好用。 - Jaded
Net use 能用,而 new-psdrive 不能用是我学到的内容 ;) - Timo

11

在我的情况下,我使用 UNC 路径而不是驱动器映射,它正常工作了。

所以,根据你的示例,不要使用映射的驱动器 Z:\,只需将路径设置为 "\\vmware-host\Shared Folder"。


8

我找到的另一个解决方法花费了我很长时间,即使用计划任务以NT AUTHORITY\SYSTEM账户身份运行net use命令。显然,在此帐户下映射的驱动器会显示给所有用户和所有提升级别

我已经测试过,即使在NFS共享上(可能有点棘手),它也可以正常工作。只需创建一个设置为在系统启动时运行的计划任务,并指定通常的命令:

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

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


4

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

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

0

其他答案都没对我起作用,但是@TimothyLeeRussell的回答将我引导到了正确的方向。

在我的情况下,我有一个位于网络驱动器上的.bat文件。当我以管理员身份运行它时,它只会闪现一个命令提示符窗口并立即消失;但从升级后的命令提示符中运行该文件内容时,则可以正常工作。

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


0

这似乎是自Vista以来微软已知的问题。
微软知识库文章提供了一个不安全的注册表修复方案。

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


0

你可以尝试将一个新的psdrive映射到该数据以进行访问。在PowerShell中编写脚本或访问网络数据存储时,与系统映射驱动器一样,PSDrives的效果甚至更好。

使用New-PSDrive cmdlet的说明在这里:Technet:New-PSDrive

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

~Dan


0
如果Powershell以管理员身份运行,我们可以从注册表中获取有关现有映射驱动器的信息,并通过在$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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接