DriveInfo.GetDrives()在以管理员身份运行时不返回映射驱动器

时间:2012-06-29 20:10:32

标签: c# .net windows-7-x64 drives driveinfo

我正在创建一个WPF应用程序,除其他外应检查是否存在多个映射驱动器。代码很简单:

DriveInfo[] systemDrives = DriveInfo.GetDrives();
foreach (DriveInfo i in systemDrives)
{
     if ((i.Name.Contains("V")) && (i.IsReady))
     {
          result = true;
          break;
     }

 }

为所有用户映射映射的驱动器。上面的代码作为普通用户运行时工作正常,但是Visual Studio 2010以管理员身份运行,GetDrives方法仅返回固定驱动器和DVD驱动器,但不返回映射驱动器。如果可执行文件作为管理员运行,则会发生相同的情况有什么想法可能会发生这种情况吗?

2 个答案:

答案 0 :(得分:5)

来自http://www.vistaheads.com/forums/microsoft-public-windows-vista-general/125180-run-administrator-loses-access-mapped-drives.html

(通过http://social.technet.microsoft.com/Forums/en-US/w7itpronetworking/thread/31c9eff2-ece3-4430-886d-19b54796e411/):

  

这实际上是正常行为。正如您在XP上看到的那样,驱动映射   特定于用户上下文。因此,如果User1有一个驱动器H:映射到   \ server \ share1,User2不会自动获得对此的任何访问权限   H:驱动映射;它只存在于User1的会话中。如果User2想要   访问\ server \ share1,他们需要创建自己的映射   H:驱动器或任何其他适合的驱动器。

     

嗯,它在Vista中有点相同......只是更多。

     

与以前版本的Windows不同,当管理员登录时   运行Windows Vista的计算机,用户的完全管理员访问权限   令牌分为两个访问令牌:完全管理员访问权限   令牌和标准用户访问令牌。在登录过程中,   授权和访问控制组件,用于标识   删除管理员,从而​​生成标准用户访问令牌。   然后使用标准用户访问令牌启动桌面   Explorer.exe进程。因为所有应用程序都继承了它们的访   从桌面的初始启动控制数据,它们都作为一个运行   标准用户。管理员登录后,完整   在用户尝试之前,不会调用管理员访问令牌   执行管理任务。

     

因此,当管理员“提升”以执行某种操作时   这需要管理员访问权限,他们的“拆分令牌”被替换,   暂时使用完整的管理令牌。实际上,这意味着   他们现在有不同的用户上下文。所以驱动器映射是   改变了。所以H:驱动器,不再有有效的映射   当前的背景。

     

我使用的解决方法是打开管理命令提示符    - 您始终拥有提升的令牌 - 并从那里创建匹配的驱动器映射(net use h:\ server \ share1)。以来   标准用户和提升的管理员有一个共同点   理解“H:”驱动意味着什么,一切运行正常。

     

我理解(好吧,有点!)为什么这个设计到位了。我不会   试图批评或捍卫它。但是,你有它。

     

在理想的世界中,管理员可以进行配置   “全局”映射,自动应用于每个用户上下文   在机器上(几乎像真正的设备)。但是,这没有发生。   大多数操作系统都有一些不整齐的妥协   不同程度。

答案 1 :(得分:2)

您可以通过注册表项使管理员也可以看到映射的驱动器:

HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / Policies / System

创建值为1的DWORD EnableLinkedConnections

如此处所述: http://www.winability.com/how-to-make-elevated-programs-recognize-network-drives/

这在Win 10上对我有用。