C++ - 以管理员身份运行进程时的GetUserName()

ida*_*hmu 4 c++ windows-xp username windows-vista windows-7

我有一个简单的C++程序,提示用户名

#include <windows.h>
#include <Lmcons.h>
#include <winbase.h>

int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t username[UNLEN + 1];
    DWORD username_len = UNLEN + 1;
    ::GetUserName(username, &username_len);

    MessageBox(NULL, username, NULL, 1);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

GetUserName()在管理员帐户中按预期执行,这意味着打印真实用户名.

但是,在非管理员帐户中以管理员身份运行时,我会获得管理员名称,而不是真实登录用户.

我相信这种行为是预期的,因为它记录在GetUserName()中:
如果当前线程模拟另一个客户端,则GetUserName函数返回该线程模拟的客户端的用户名.

有没有办法获得真正登录的用户(非管理员用户),即使进程以管理员身份运行?

Har*_*ton 7

我相信你想问Windows的问题是"哪个用户登录到当前会话".

为此,请使用您自己的进程ID 调用ProcessIdToSessionId()以确定当前的会话ID.

然后使用获取用户名的选项调用WTSQuerySessionInformation()WTSUserName.

  • 这个答案对Vista +有好处.WinXP怎么样? (2认同)