11
votes

C ++ Obtenez le nom d'utilisateur du processus

J'ai un processus de processus avec xxx

Comment puis-je obtenir le nom d'utilisateur de l'utilisateur qui exécute le processus?

J'utilise du code non géré (no. Net).


0 commentaires

4 Réponses :


0
votes

WMI devrait pouvoir vous dire ces informations. sinon vous devez compter sur un plaisir sans papiers dans ntdll.dll. Il semble que d'autres ont trouvé des solutions qui n'utilisent pas ntdll.dll - utilisent-leur plutôt que des trucs sans papiers.


2 commentaires

Stuff non-documenté dans NTDLL.DLL est sans papiers pour une raison.


@Stewart: Je suis d'accord. C'est pourquoi je ne suis pas allé dans des détails.



1
votes

WMI est probablement le chemin du moindre résistance. Vous devriez également être capable d'obtenir le jeton à l'aide de OpenProcessToken, puis de GetTokenInformation pour obtenir le SID du propriétaire. Vous pouvez ensuite activer le SID en un nom d'utilisateur.


0 commentaires

22
votes

Utilisez openProcessToken pour obtenir le jeton (évidemment), puis getTokenInformation avec le Tokenowner drapeau pour obtenir le SID du propriétaire. Ensuite, vous pouvez utiliser LookupAccountSide pour obtenir le nom d'utilisateur.


1 commentaires

Travaillé grand. J'ai dû utiliser Tokenuser à la place pour obtenir le nom d'utilisateur. Tokenwek retourne le nom du groupe (administrateurs).



8
votes

Si WMI n'est pas une option, utilisez GETUserFromProcess Strong> ci-dessous qui prend l'identifiant de processus en tant que paramètre d'entrée et renvoie le nom d'utilisateur et le domaine:

#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 commentaires