LPe*_*ena 4 .net c# drives driveinfo windows-7-x64
我正在创建一个WPF应用程序,除其他外应检查是否存在多个映射驱动器.代码很简单:
DriveInfo[] systemDrives = DriveInfo.GetDrives();
foreach (DriveInfo i in systemDrives)
{
if ((i.Name.Contains("V")) && (i.IsReady))
{
result = true;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
映射的驱动器将映射到所有用户.上面的代码作为普通用户运行时工作正常,但是Visual Studio 2010以管理员身份运行,GetDrives方法仅返回固定驱动器和DVD驱动器,但不返回映射驱动器.如果可执行文件作为管理员运行,则会发生相同的情况 任何想法为什么会这样?
这实际上是正常行为.正如您在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:"驱动器的含义有共同的理解,所以一切运行正常.
我理解(好吧,有点!)为什么这个设计到位了.我不会试图批评或捍卫它.但是你现在有了.
在理想的世界中,管理员可以配置"全局"映射,该映射自动应用于计算机上的每个用户上下文(几乎与真实设备一样).但是,这没有发生.大多数操作系统都有不同程度的不妥协妥协.