我想知道以管理员身份运行应用程序时是否有任何方法可以获取非管理员用户名。
我尝试使用<script type="module" src="https://unpkg.com/@material/mwc-button@latest/mwc-button.js?module"></script>
和SHGetKnownFolderPath
作为令牌来获取令牌,并且它返回的管理员用户名不是当前登录的非管理员用户。
所以想知道我是否需要使用null
才能获得非管理员用户名。
答案 0 :(得分: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()
(TokenUser
或TokenOwner
)获取该令牌的SID,然后最终使用{{ 3}},以获取该SID的用户名。