5

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

4

2 回答 2

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:”驱动器的含义有共同的理解,因此一切正常。

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

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

于 2012-06-29T20:16:33.517 回答
3

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

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 上对我有用。

于 2020-02-12T10:13:51.237 回答