C++ - 当进程是 运行 作为管理员时的 GetUserName()

C++ - GetUserName() when process is run as administrator

我有一个提示用户名的简单 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;
}

GetUserName() 在管理员帐户中按预期执行,即打印真实用户名。

但是,当 运行 在 非管理员帐户 中作为管理员时,我得到的是管理员名称,而不是实际登录的用户。

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

问题

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

问题不在于正在模拟的线程。您是 运行 管理员登录下的整个应用程序。这就是为什么当您从非管理员帐户启动时,Windows 要求您使用管理员帐户登录。

因此,您从 GetUserName() 得到的结果是正确的。该名称是您应用的真实登录用户。

如果您想要其他名称,标准解决方案是以普通用户身份启动,并有一个 "elevate" 按钮以提升的权限重新启动您的应用程序。查看任务管理器,如果您想查看所有 运行 个进程,它会执行此操作。此时您当然可以将任何您想要的内容传递给新进程,包括该用户名。

我相信你想问的问题 Windows 是 "which user is logged into the current session"。

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

然后使用 WTSUserName 选项调用 WTSQuerySessionInformation() 以获取用户名。