【问题标题】:Is there any way to get non-admin user name when running app as admin以管理员身份运行应用程序时有什么方法可以获取非管理员用户名
【发布时间】:2020-03-31 18:22:57
【问题描述】:

我想知道在以管理员身份运行应用程序时是否有任何方法可以获取非管理员用户名。

我尝试使用SHGetKnownFolderPathnull 作为令牌来获取它,它返回管理员用户名而不是当前登录的非管理员用户。

所以想知道我是否需要使用WTSQueryUserToken 来获取非管理员用户名。

【问题讨论】:

标签: c++ winapi


【解决方案1】:

首先,您为什么使用SHGetKnownFolderPath() 来确定用户名?这不是该 API 的用途。还有其他更适合获取用户名的 API。

NULL 令牌句柄传递给SHGetKnownFolderPath()(或任何其他将用户令牌作为输入的API)将使用与调用线程关联的用户帐户,在本例中为管理员用户。对于您的要求,您需要为登录用户传递一个实际的令牌。或者在使用 NULL 用户令牌调用此类 API 之前模拟登录用户。

WTQueryUserToken() 当然可以用于获取用户令牌,但是它只能在SYSTEM 帐户下运行的服务中使用。如果您的应用未作为此类服务运行,则您必须为您的应用创建此类服务以与之通信。

否则,您只需要从其他 API 获取用户名。

例如,您可以使用ProcessIdToSessionId() 获取您的应用正在运行的会话的ID(请参阅Getting the Session ID of the Current Process),然后您可以使用WTSQuerySessionInformation(WTSUserName) 获取该会话的登录用户名.

或者,您可以enumerate all running processes,查找与您的应用在同一会话ID中运行的进程,直到找到explorer.exe进程,然后您可以使用OpenProcess()OpenProcessHandle()获取该进程的用户访问令牌,然后使用GetTokenInformation()TokenUserTokenOwner)获取该令牌的 SID,最后使用LookupAccountSid() 获取该 SID 的用户名。

【讨论】:

  • 感谢雷米的信息!基本上我想使用SHGetKnownFolderPath() 获得像C:\Users\(userName)\AppData\Local 这样的路径。由于WTQueryUserToken() 需要系统帐户,也许我可以使用WTSQuerySessionInformation(WTSUserName) 并将SHGetKnownFolderPath() 的路径中的用户名替换为空用户令牌?
  • @RockyChoi "我想使用SHGetKnownFolderPath() 获得类似C:\Users\(userName)\AppData\Local 的路径" - 不过,这并不是您的问题所要求的。您只要求提供用户名,而不是包含用户名的路径。在这种情况下,您需要一个真实的用户令牌。 “也许我可以使用 WTSQuerySessionInformation(WTSUserName) 并将路径中的用户名从 SHGetKnownFolderPath() 替换为空用户令牌?” - 这不是一个好方法。无法保证两个用户将具有相同的文件夹结构。需要查询分配给目标用户的实际路径
猜你喜欢
  • 2013-05-31
  • 2011-12-29
  • 2011-09-24
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多