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

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

来自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进程。 由于所有应用程序都从最初启动的桌面inheritance其访问控制数据,因此它们也都作为标准用户运行。 管理员登录后,在用户尝试执行管理任务之前,不会调用完整的管理员访问令牌。

因此,当管理员“提升”以执行某种需要管理访问的操作时,他们的“拆分令牌”会暂时替换为完整的管理令牌。 实际上,这意味着他们现在拥有不同的用户上下文。 因此驱动器映射也会发生变化。 所以H:驱动器在当前上下文中不再具有有效映射。

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

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

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