2011-04-27 101 views
3

如果我调用函数WNetGetUniversalName()从当前会话中映射的驱动器获取UNC路径,则该函数将成功。从模拟后的映射驱动器号获取UNC路径

但是......

  • 如果我创建通过调用LogonUser()一个新的登录sesssion(登录用户是作为创造者的过程相同)
  • 模拟与登录用户通过调用函数ImpersonateLoggedOnUser()
  • 并再次调用WNetGetUniversalName(),该函数返回错误2250(ERROR_NOT_CONNECTED

的事情是I S应该将这个过程作为服务运行(在SYSTEM帐户中),因此我可能需要模拟用户以获取该用户的映射驱动器和关联的网络路径。正如我检查,信息不能跨用户会话访问。

Windows在哪里存储此信息,以便在用户重新登录时重新映射驱动器?我发现映射的网络路径历史记录保存在注册表下的关键字HKEY_USERS\<User SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\Map Network Drive MRU中,但它并不表示在用户登录时是否映射UNC路径以及关联的驱动器号。

请帮忙。

+0

有没有一个地方Windows存储此信息,这取决于您的网络设置。 驱动器通常通过组策略或通过登录脚本进行映射。 – gnud 2011-04-27 08:26:12

回答

0

如果我记得正确,我相信这些驱动器映射存储在登录会话中。由于LogonUser()创建一个新的登录会话,它不会有驱动器映射;您必须使用带有现有令牌的ImpersonateLoggedOnUser()。

+0

谢谢卢克。正如我所说的,这个过程将作为服务运行(在SYSTEM帐户中),用户不能登录。每当用户映射网络驱动器时,都会有一个选项“登录时重新连接”。所以Windows必须保存这个信息以便下次登录。或许,这个解决方案根本不需要冒充。我仍在寻找答案。 – 2011-04-29 06:35:36

+0

如果用户未登录,则他们的个人资料将不会被加载。你可以明确地加载它,但这是不好的做法,因为在加载它时尝试登录将会产生不好的结果。 – Luke 2011-04-29 14:47:07