我正在创建一个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驱动器,但不返回映射驱动器。如果可执行文件作为管理员运行,则会发生相同的情况有什么想法可能会发生这种情况吗?
答案 0 :(得分:5)
这实际上是正常行为。正如您在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上对我有用。