【问题标题】:Get UNC path from mapped drive-letter after impersonation模拟后从映射的驱动器号获取 UNC 路径
【发布时间】:2011-08-13 14:57:17
【问题描述】:

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

但是……

  • 如果我通过调用LogonUser() 创建新的登录会话(登录用户与进程创建者相同)
  • 通过调用ImpersonateLoggedOnUser()函数模拟登录用户
  • 再次调用WNetGetUniversalName(),函数返回错误2250 (ERROR_NOT_CONNECTED)

问题是我应该将此进程作为服务运行(在 SYSTEM 帐户中),因此我可能需要模拟用户来获取该用户的映射驱动器和相关的网络路径。正如我检查的那样,无法跨用户会话访问这些信息。

Windows 将这些信息存储在哪里,以便在用户重新登录时重新映射驱动器?我发现映射的网络路径历史记录保存在注册表项下:HKEY_USERS\<User SID>\Software\Microsoft\Windows\CurrentVersion\Explorer\Map Network Drive MRU 但它没有说明当用户重新登录时是否会映射 UNC 路径以及相关的驱动器号。

请帮忙。

【问题讨论】:

  • Windows 没有一个地方存储此信息,这取决于您的网络设置。驱动器最常通过组策略或登录脚本映射。

标签: c++ windows unc mapped-drive


【解决方案1】:

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

【讨论】:

  • 谢谢卢克。正如我所说,该进程将作为服务运行(在 SYSTEM 帐户中),并且用户不得登录。每当用户映射网络驱动器时,都会有一个选项“登录时重新连接”。因此,Windows 必须保存此信息以供下次登录。可能,这个解决方案根本不需要模拟。我还在寻找答案。
  • 如果用户未登录,则不会加载他们的个人资料。您可以显式加载它,但这是一种不好的做法,因为在加载时尝试登录会产生不好的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多