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

无法访问以管理员身份运行的PowerShell中的网络驱动器,powershell,uac,unc,Powershell,Uac,Unc,我正在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: + CategoryInf

我正在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
设置位置:找不到驱动器。名为“Z”的驱动器不存在。
第1行字符:13

+设置位置如何映射一个新的psdrive来访问该数据?当您在powershell中编写脚本或访问网络数据存储时,PSDrives即使不比系统映射的驱动器更好,也可以正常工作

有关使用新PSDrivecmdlet的说明如下:

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


~Dan

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


它不必从同一个PowerShell实例(或者根本不需要从PowerShell实例)执行—它只是在整个登录会话中需要执行一次的操作。

在我的情况下,我可以简单地使用UNC路径而不是驱动器映射,并且工作正常


因此,根据您的示例,我没有使用映射的驱动器Z:\,而是使用“\\vmware主机\共享文件夹”作为路径。

自Vista以来,对Microsoft来说似乎是一个已知的问题。
Microsoft安装了不安全的注册表修复程序


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

另一个我花了很长时间才找到的解决方法是从计划任务以NT AUTHORITY\SYSTEM帐户运行
net use
。显然

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

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

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

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


其他答案对我都不管用;但是@Timothylerussell为我指明了正确的方向

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


最后我意识到我尝试从映射的网络驱动器运行
.bat
文件。我已将文件的执行更改为使用UNC路径,并且该路径有效。

Related:。看起来选项是注册表更改或在提升的进程中重新映射驱动器。我尝试了注册表破解,但没有帮助,但在提升的进程中重新映射了驱动器-谢谢。您应该将其作为答案发布。在不离开shell的情况下,一种简便的方法是使用
runas
runas/user:administrator net use Z:“\\vmware host\Shared Folders”
适合我。对于下次登录时使用的其他
net use
参数,如
/persistent
,如果您需要驱动器对您以外的用户帐户可见,请检查Microsoft net use,例如计划任务/服务,try-这也会使驱动器对您可见,无论您是否被提升。对于VirtualBox,路径是
\\vboxsvr\share
,工作起来也很有魅力。我学到的是,Net使用有效,而新的psdrive不起作用;)
net use Z: \\server\share /persistent:no
# 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
        }
    }
}