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() 以获取用户名。
我有一个提示用户名的简单 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() 以获取用户名。