无法在以管理员身份运行的 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 文件夹权限错误 - 部分或全部身份引用无法翻译