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

2019-06-25 22:06发布

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

Answer 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上看到,驱动器映射特定于用户上下文。 因此,如果用户1有一个驱动器H:映射到\服务器\为share1,用户2不会自动得到这个^ h任何访问:驱动器映射; 它只存在于用户1的会话。 如果用户2想要访问\服务器\为share1,他们需要创建自己的地图,无论是H:驱动器或适合任何其他驱动器。

嗯,这是一种在Vista相同的....只有moreso。

和Windows不同,当管理员登录到运行Windows Vista的计算机的早期版本中,用户的完全管理员访问令牌被分成两个访问令牌:完全管理员访问令牌和标准用户访问令牌。 在登录过程中,识别管理员授权和访问控制部件被去除,导致在标准用户访问令牌。 然后,标准用户访问令牌用于启动桌面,Explorer.exe进程。 因为所有的应用程序从最初推出的桌面继承其访问控制数据,它们都运行作为一个标准的用户也是如此。 在管理员登录时,完全管理员访问令牌,则不会调用,直到用户试图执行管理任务。

所以,当管理员“提升”执行某种动作需要管理员权限,他们的“分裂令牌”被替换,是暂时的,有一个全方位的管理令牌。 实际上,这意味着他们现在有一个不同的用户上下文。 因此,驱动器映射被改变,也是如此。 因此,H:驱动器,不再具有在当前情况下的有效映射。

我用的解决方法是打开管理命令提示符 - 在这里你有一个提升的令牌所有的时间 - 并创建有一个匹配的驱动器映射(NET USE H:\服务器\为share1)。 由于标准用户和提升的管理员有什么共同的认识“H:”驱动装置,一切运行正常。

我的理解(当然,排序的!)为什么要这样设计很到位。 我不打算批评或辩护。 但是你现在有了。

在一个理想的世界中,管理员已经能够配置“全局”的映射,自动适用于每一个用户上下文的机器上(像是真正的设备)。 但是,这并没有发生。 大多数操作系统都凌乱妥协的大杂烩,在不同程度上。



文章来源: DriveInfo.GetDrives() not returning mapped drives when run as administrator