以管理员身份运行应用程序时,有没有办法获取非管理员用户名

Is there any way to get non-admin user name when running app as admin

本文关键字:管理员 获取 用户 运行 身份 应用程序 有没有      更新时间:2023-10-16

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

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

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

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

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

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

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

例如,您可以使用ProcessIdToSessionId()获取运行应用程序的会话的 ID(请参阅获取当前进程的会话 ID(,然后可以使用WTSQuerySessionInformation(WTSUserName)获取该会话的登录用户名。

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