2010-04-21 11 views
7

Ho un handle di processo conC++ Get Nome utente Da Process

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

Come posso ottenere il nome dell'utente che esegue il processo?

Sto usando un codice non gestito (no .NET).

risposta

17

Utilizzare OpenProcessToken per ottenere il token (ovviamente), quindi GetTokenInformation con il flag TokenOwner per ottenere il SID del proprietario. Quindi è possibile utilizzare LookupAccountSid per ottenere il nome utente.

+5

Ha funzionato alla grande. Ho dovuto usare TokenUser invece per ottenere il nome utente. TokenOwner stava restituendo il nome del gruppo (amministratori). – modernzombie

0

WMI dovrebbe essere in grado di dirti che informazioni. Altrimenti è necessario fare affidamento su divertimento non documentato in ntdll.dll. Sembra che altri abbiano trovato soluzioni che non usano ntdll.dll - li usano piuttosto che cose non documentate.

+0

roba senza documenti in ntdll.dll è documentato per un ragionare. – Stewart

+0

@Stewart: sono d'accordo. Ecco perché non sono entrato nei dettagli. –

1

WMI è probabilmente il percorso di minor resistenza. Dovresti anche essere in grado di ottenere il token utilizzando OpenProcessToken, quindi GetTokenInformation per ottenere il SID del proprietario. È quindi possibile trasformare il SID in un nome utente.

3

se WMI non è un'opzione, quindi utilizzare GetUserFromProcess sotto che prende l'ID di processo come parametro di input e restituisce il nome utente e il dominio:

#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; 
}