如何使用C++在SYSTEM进程中获取活动用户名?

Leo*_* Xu 2 c++ windows security acl user-accounts

我使用了GetUserName()METHOD,但它返回的用户名是SYSTEM进程中的'SYSTEM'.如何在SYSTEM进程中获取活动用户名?这是我的代码:

void getComputerUsername(char * username,char * domainname)
{
 HANDLE hp , htoken;
 char buff[1024];
 unsigned long size = 1024;

 TOKEN_USER *tuser;
 PSID sid;
 TCHAR * user = new TCHAR[256];
 TCHAR * domain=new TCHAR[256];
 SID_NAME_USE snu;

 hp = htoken = INVALID_HANDLE_VALUE;
 hp = GetCurrentProcess();
 if(OpenProcessToken(hp, TOKEN_QUERY, &htoken))
 {
     if(GetTokenInformation(htoken, TokenUser, (void*)buff, size, &size))
 {
     tuser = (TOKEN_USER*)buff;
     sid = tuser->User.Sid;
     size = 256;
     if(LookupAccountSid(NULL, sid, user, &size, domain, &size, &snu))
     {
    int iLength = WideCharToMultiByte(CP_ACP, 0, user, -1, NULL, 0, NULL, NULL);  
    WideCharToMultiByte(CP_ACP, 0, user, -1, username, iLength, NULL, NULL);   

    iLength = WideCharToMultiByte(CP_ACP, 0, domain, -1, NULL, 0, NULL, NULL);  
    WideCharToMultiByte(CP_ACP, 0, domain, -1, domainname, iLength, NULL, NULL);  
           //strcpy( user,username);
     }
 }
 }
Run Code Online (Sandbox Code Playgroud)

}

Har*_*ton 5

如果您想知道谁登录到物理控制台,您可以调用WTSGetActiveConsoleSessionId以获取当前活动的终端服务(也称为"快速用户切换"又名"远程桌面")会话ID.

然后WTSQuerySessionInformation,您可以使用WTSUserName来获取用户名.

(如果您感兴趣的用户可能通过远程桌面登录,则此方法无效.)


小智 2

您需要使用EnumProcesses枚举所有正在运行的进程

然后查看这个答案以从进程中获取用户名:

/sf/answers/188030531/