我在 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
如何以管理员身份访问网络驱动器?
最终的修复方法只是在以管理员身份运行时重新映射驱动器号:
net use Z: "\\vmware-host\Shared Folders"
它不必从同一个 PowerShell 实例(或根本从 PowerShell)完成 - 它只是需要在整个登录会话中完成一次。
因此,根据您的示例,我没有使用映射驱动器 Z:\,而是使用“\vmware-host\Shared Folder”作为路径。
很多时间才找到的另一个解决方法是从计划任务作为 NT AUTHORITY\SYSTEM
帐户运行
net use
。显然,此帐户下映射的驱动器会显示给所有用户和所有海拔级别。
我已经对此进行了测试,它甚至可以在 NFS 共享上运行(这可能有点挑剔)。只需创建一个计划任务集在系统启动时运行,并指定常用命令:
net use Z: \\server\share /persistent:no
使用
/persistent:yes
运行一次可能会起作用,但我还没有尝试过。当然,“只需再次映射它”也可以,但该驱动器对于在不同上下文中运行的计划任务仍然不可见。缺点是所有真实用户也会看到它,因此不适合多用户设置。
# 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
}
}
}
Microsoft
知识库文章,其中包含不安全注册表修复。
answer 为我指明了正确的方向。
就我而言,我的网络驱动器上有一个.bat
文件。当我以管理员身份运行它时,它只会闪烁一个命令提示符窗口,然后立即消失;当我从提升的命令提示符运行文件内容时,它工作得很好。最后我意识到我尝试从映射的网络驱动器运行
.bat
文件。我将文件的执行更改为使用 UNC 路径,并且它有效。
$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
}