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

时间:2015-02-23 11:06:36

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

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

问题

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:4)

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

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

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

相关问题