C++ Get Username From Process

前端 未结 4 2038
小蘑菇
小蘑菇 2020-11-29 11:39

I have a process handle with

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, THE_PROCESS_ID);

How can I get t

相关标签:
4条回答
  • 2020-11-29 11:54

    WMI should be able to tell you that information. Otherwise you need to rely on undocumented fun in ntdll.dll. It appears others have found solutions that don't use ntdll.dll -- use them rather than undocumented stuff.

    0 讨论(0)
  • 2020-11-29 12:09

    if WMI is not an option, then use GetUserFromProcess below that takes the process ID as an input parameter and returns the user name and domain:

    #include <comdef.h>
    #define MAX_NAME 256
    BOOL GetLogonFromToken (HANDLE hToken, _bstr_t& strUser, _bstr_t& strdomain) 
    {
       DWORD dwSize = MAX_NAME;
       BOOL bSuccess = FALSE;
       DWORD dwLength = 0;
       strUser = "";
       strdomain = "";
       PTOKEN_USER ptu = NULL;
     //Verify the parameter passed in is not NULL.
        if (NULL == hToken)
            goto Cleanup;
    
           if (!GetTokenInformation(
             hToken,         // handle to the access token
             TokenUser,    // get information about the token's groups 
             (LPVOID) ptu,   // pointer to PTOKEN_USER buffer
             0,              // size of buffer
             &dwLength       // receives required buffer size
          )) 
       {
          if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) 
             goto Cleanup;
    
          ptu = (PTOKEN_USER)HeapAlloc(GetProcessHeap(),
             HEAP_ZERO_MEMORY, dwLength);
    
          if (ptu == NULL)
             goto Cleanup;
       }
    
        if (!GetTokenInformation(
             hToken,         // handle to the access token
             TokenUser,    // get information about the token's groups 
             (LPVOID) ptu,   // pointer to PTOKEN_USER buffer
             dwLength,       // size of buffer
             &dwLength       // receives required buffer size
             )) 
       {
          goto Cleanup;
       }
        SID_NAME_USE SidType;
        char lpName[MAX_NAME];
        char lpDomain[MAX_NAME];
    
        if( !LookupAccountSid( NULL , ptu->User.Sid, lpName, &dwSize, lpDomain, &dwSize, &SidType ) )                                    
        {
            DWORD dwResult = GetLastError();
            if( dwResult == ERROR_NONE_MAPPED )
               strcpy (lpName, "NONE_MAPPED" );
            else 
            {
                printf("LookupAccountSid Error %u\n", GetLastError());
            }
        }
        else
        {
            printf( "Current user is  %s\\%s\n", 
                    lpDomain, lpName );
            strUser = lpName;
            strdomain = lpDomain;
            bSuccess = TRUE;
        }
    
    Cleanup: 
    
       if (ptu != NULL)
          HeapFree(GetProcessHeap(), 0, (LPVOID)ptu);
       return bSuccess;
    }
    
    HRESULT GetUserFromProcess(const DWORD procId,  _bstr_t& strUser, _bstr_t& strdomain)
    {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,procId); 
        if(hProcess == NULL)
            return E_FAIL;
        HANDLE hToken = NULL;
    
        if( !OpenProcessToken( hProcess, TOKEN_QUERY, &hToken ) )
        {
            CloseHandle( hProcess );
            return E_FAIL;
        }
        BOOL bres = GetLogonFromToken (hToken, strUser,  strdomain);
    
        CloseHandle( hToken );
        CloseHandle( hProcess );
        return bres?S_OK:E_FAIL;
    }
    
    0 讨论(0)
  • 2020-11-29 12:11

    WMI is probably the path of least resistance. You should also be able to get the token using OpenProcessToken, then GetTokenInformation to get the SID of the owner. You can then turn the SID into a user name.

    0 讨论(0)
  • 2020-11-29 12:13

    Use OpenProcessToken to get the token (obviously), then GetTokenInformation with the TokenOwner flag to get the SID of the owner. Then you can use LookupAccountSid to get the username.

    0 讨论(0)
提交回复
热议问题