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

yhxst69z  于 2023-11-18  发布在  Shell
关注(0)|答案(8)|浏览(194)

我在Windows 7 x64虚拟机中运行PowerShell。我在主机上有一个共享文件夹Map为网络驱动器(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

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

pqwbnv8z

pqwbnv8z1#

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

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

字符串
它不必从同一个PowerShell示例(或从PowerShell)完成-它只是需要在整个登录会话中完成一次。

bvjveswy

bvjveswy2#

在我的例子中,我能够简单地使用路径而不是驱动器Map,它工作得很好。
因此,根据您的示例,我没有使用Map驱动器Z:\,而是使用“\vmware-host\Shared Folder”作为路径。

68bkxrlz

68bkxrlz3#

另一个我花了很长时间才找到的解决方法是从一个计划任务作为NT权限\系统帐户运行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只运行一次就可以了,但我还没有尝试过。当然,“再Map一次”也可以,但在不同的上下文中运行的计划任务仍然看不到该驱动器。缺点是所有真实的用户都可以看到它,所以对于多用户设置来说不太好。

3npbholx

3npbholx4#

我使用以下黑客解决方案,当Powershell在提升模式下运行时,我在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
        }
    }
}

字符串

knpiaxh1

knpiaxh15#

如何Map一个新的psdrive来访问这些数据?当你在powershell中编写脚本或访问网络数据存储时,psdrive的工作效果即使不比系统Map驱动器好,也一样好。
有关使用New-PSDrive的说明,请参阅:Technet:New-PSDrive
如果你不想每次都要制作一个新的psdrive,你可以将它添加到管理员和你的用户帐户的配置文件中,它将在你每次打开powershell时自动可用。
~丹

rqenqsqc

rqenqsqc6#

这似乎是微软自Vista以来的一个已知问题。
Microsoft Knowled base article带有unsafe注册表修复。
我们目前正在评估这种方法,因为我们的一些人感觉机器可能无法启动;-)

kr98yfug

kr98yfug7#

其他的答案都不适合我;但是@ martyleeRussell的answer为我指明了正确的方向。
在我的例子中,我有一个位于网络驱动器上的.bat文件,当我以管理员身份运行它时,它只会 Flink 命令提示符窗口并立即消失;当我从提升的命令提示符运行文件内容时,它工作得很好。
最后我意识到我试着从Map的网络驱动器运行.bat文件。我改变了文件的执行以使用nextpath,它工作了。

ix0qys7i

ix0qys7i8#

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

字符串

相关问题