C++;-以管理员身份运行进程时的GetUserName() 我有一个简单的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; } #包括 #包括 #包括 int _tmain(int argc,_TCHAR*argv[] { wchar_t用户名[UNLEN+1]; DWORD username_len=UNLEN+1; ::GetUserName(用户名和用户名); MessageBox(NULL,用户名,NULL,1); 返回1; }

C++;-以管理员身份运行进程时的GetUserName() 我有一个简单的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; } #包括 #包括 #包括 int _tmain(int argc,_TCHAR*argv[] { wchar_t用户名[UNLEN+1]; DWORD username_len=UNLEN+1; ::GetUserName(用户名和用户名); MessageBox(NULL,用户名,NULL,1); 返回1; },c++,windows-7,windows-xp,windows-vista,C++,Windows 7,Windows Xp,Windows Vista,在管理员帐户中按预期执行,即打印真实用户名 但是,当在非管理员帐户中以管理员身份运行时,我得到的是管理员名,而不是真正登录的用户 我相信这种行为是意料之中的,因为它记录在: 如果当前线程正在模拟另一个客户端,则GetUserName函数将返回线程正在模拟的客户端的用户名 问题: 即使进程以管理员身份运行,是否有办法获取真正的登录用户(非管理员用户)?问题不在于模拟的线程。您正在管理员登录下运行整个应用程序。这就是为什么当您从非管理员帐户启动Windows时,Windows要求您使用管理员帐户登录

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

但是,当在非管理员帐户中以管理员身份运行时,我得到的是管理员名,而不是真正登录的用户

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

问题:
即使进程以管理员身份运行,是否有办法获取真正的登录用户(非管理员用户)?

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

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


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

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

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


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

我想知道是否有一个选项可以通过提升的进程获取真正登录的用户?@idanshmu:我认为这个问题没有明确定义。什么是真正的登录用户?因为就Windows而言,您提供了管理员密码以管理员身份登录。那么,你怎么不是管理员呢?真正的用户是激活流程的人,如果我以
idan
身份登录并以管理员身份运行流程,那么真正的用户是
idan
。无论如何,我希望能够获取
idan
,而不是管理员名称。例如,有人告诉我,即使您以管理员的身份运行该进程,active desktop仍然由真正的用户控制。一定有办法得到这个名字。嗯,桌面只是一个由Explorer.Exe进程管理的大窗口。这个过程大概有“idan”作为它的所有者。但出于安全原因,UIPI(UI进程隔离)会将管理员应用程序与不太安全的进程分开。你为什么需要这个名字?我不想要进程用户名。无论我的应用程序以何种方式运行,我都希望能够获得真实的用户名。对我来说,
GetUserName()
应该返回最后一个登录的用户(当然不包括由于提升的进程而需要的登录)not@igalk:XP不受支持,因此文档中对它的引用正在慢慢消失。据可靠消息来源称,WTSQuerySessionInformation()从Windows 2000开始提供。上述“解决方案”不起作用。这是:@UserX,该问题询问如何从服务获取当前登录的用户。此问题询问如何从交互式应用程序获取当前登录的用户。它们是不同的问题,需要不同的解决方案。