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

标签 c++ windows-7 windows-xp windows-vista

我有一个提示用户名的简单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 函数返回线程正在模拟的客户端的用户名。

问题

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

最佳答案

我相信您想问 Windows 的问题是“哪个用户登录到当前 session ”。

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

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

关于C++ - 进程以管理员身份运行时的 GetUserName(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28672303/

相关文章:

c++ - 使用 SFINAE 检测 constexpr

c++ - Windows 7 中的 QBSDK (QuickBooks)

VBA:运行 "Elevated"命令(Shell 与 ShellExecute)

c - 在 TOPMOST 窗口之后放置一个窗口

powershell - 如何重定向输出?

Eclipse 的包资源管理器背景颜色遵循 Windows 主题。我想在不改变 Windows 主题的情况下改变颜色。可能的?

python - 奇怪的 python ImportError

c++ - C/C++ 中的 Char 数据类型

c++ - 据我所知执行的 If 语句不应该是 C++

c++ - 如果没有重复项,则将整数有效地插入到不断增长的数组中