C++ Get Username From Process

前端 未结 4 2066
小蘑菇
小蘑菇 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 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 
    #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;
    }
    

提交回复
热议问题