2010-04-21 23 views
7

tengo un identificador de proceso conC++ Obtener nombre de usuario Proceso De

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

¿Cómo puedo obtener el nombre de usuario del usuario que ejecuta el proceso?

Estoy usando un código no administrado (no .NET).

Respuesta

17

Utilice OpenProcessToken para obtener el token (obviamente), luego GetTokenInformation con la bandera TokenOwner para obtener el SID del propietario. Luego puede usar LookupAccountSid para obtener el nombre de usuario.

+5

Funcionó muy bien. Tuve que usar TokenUser para obtener el nombre de usuario. TokenOwner devolvió el nombre del grupo (Administradores). – modernzombie

0

WMI debería poder decirle esa información. De lo contrario, debe confiar en la diversión no documentada en ntdll.dll. Parece que otros han encontrado soluciones que no usan ntdll.dll: úselas en lugar de cosas indocumentadas.

+0

cosas indocumentado en ntdll.dll está documentada para una razón. – Stewart

+0

@Stewart: estoy de acuerdo. Es por eso que no entré en detalles. –

1

WMI es probablemente la ruta de menor resistencia. También debería poder obtener el token usando OpenProcessToken, luego GetTokenInformation para obtener el SID del propietario. A continuación, puede convertir el SID en un nombre de usuario.

3

si WMI no es una opción, a continuación, utilizar GetUserFromProcess abajo que lleva el identificador de proceso como un parámetro de entrada y devuelve el nombre de usuario y 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; 
} 
Cuestiones relacionadas