【问题标题】:DriveInfo.GetDrives() not returning mapped drives when run as administrator以管理员身份运行时 DriveInfo.GetDrives() 不返回映射的驱动器
【发布时间】:2012-06-29 20:10:32
【问题描述】:

我正在创建一个 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 驱动器,但不返回映射驱动器。如果可执行文件以管理员身份运行,也会发生同样的情况。任何想法为什么会发生这种情况?

【问题讨论】:

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


    【解决方案1】:

    来自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:”驱动的含义,一切正常。

    我明白(嗯,有点!)为什么会有这种设计。我不会 试图批评或捍卫它。但是,你有它。

    在理想情况下,管理员可以配置 “全局”映射,自动应用于每个用户上下文 在机器上(几乎像真实设备)。但是,那并没有发生。 大多数操作系统都有杂乱无章的妥协,在 程度不同。

    【讨论】:

    • 谢谢你,克里斯·肖恩。这部分代码,即检查映射驱动器的代码嵌入在安装程序中。我以管理员身份运行代码,并直观地验证映射的驱动器是否存在。浏览上面的代码时,我仍然没有看到 V 映射驱动器。因为这是在 Windows 7 上测试的,正如您提到的,这可能是“设计使然”。我在具有管理权限的帐户下在 Windows 2008 操作系统上尝试了上面的代码和相同的安装程序,并且检测到映射的驱动器正常。
    【解决方案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 上对我有用。

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 1970-01-01
      • 2015-12-19
      • 2011-10-11
      • 1970-01-01
      • 2015-07-08
      • 2022-01-08
      • 1970-01-01
      • 2011-01-15
      相关资源
      最近更新 更多