我有一个简单的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函数将返回该线程模拟的客户端的用户名。
有没有办法获得真正登录的用户(非管理用户),即使该进程是以管理员身份运行的?
答案 0 :(得分:7)
我认为您想问Windows的问题是“哪个用户登录到当前会话”。
要执行此操作,请使用您自己的进程ID调用ProcessIdToSessionId()以确定当前的会话ID。
然后使用WTSUserName
选项调用WTSQuerySessionInformation()以获取用户名。
答案 1 :(得分:4)
问题不在于假冒。您正在管理员登录下运行整个应用程序。这就是为什么当您从非管理员帐户启动时,Windows要求您使用管理员帐户登录。
因此,您从GetUserName()
获得的结果是正确的。该名称是您应用的真实登录用户。
如果您想要另一个名称,标准解决方案是以普通用户身份启动,并有一个“提升”按钮,可以使用提升的权限重新启动您的应用程序。看作任务管理器,如果您想查看所有正在运行的进程,它会执行此操作。此时,您当然可以将任何想要的内容传递给新进程,包括该用户名。