[C/C++]Zu einem Prozess Nutzer herausfinden

Hallo,

Wie ist es mit c++ möglich, den Nutzer zu einem Prozess herauszufinden (also unter welchem Benutzer der prozess läuft.)

Falls ihr nicht wisst wovon ich rede, versuche ich es mal mit dieser Spalte vom task-manager zu verdeutlichen:

processownermb4.gif



Hab es schon mit der CreateToolhelp32Snapshot() Funktion, bzw. der PROCESSENTRY32 Struktur probiert, allerdings enthält diese zu wenig (bzw. nicht die passenden) Informationen.
 
Hallo CDW,

Vielen dank für die Links. Hab mir ne Funktion gebastelt:


Code:
bool GetProcessOwner(DWORD dwId, char cBuffer[MAX_PATH]){

    char cProcessOwner[MAX_PATH];
    char cDomain[MAX_PATH];
    DWORD dwSize, dwSizeProcessOwner, dwSizeDomain;
    HANDLE hProcess, hToken;
    PTOKEN_OWNER pTokenOwner = (PTOKEN_OWNER)malloc(16384);
    PSID pSid;
    SID_NAME_USE snuOwner;


    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);

    
    if(hProcess != NULL){

       if(OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken)){

          if(GetTokenInformation(hToken, TokenOwner, pTokenOwner, 16384, &dwSize)){

             dwSizeProcessOwner = sizeof(cProcessOwner);
             dwSizeDomain = sizeof(cDomain);
             pSid = pTokenOwner->Owner;

             if(LookupAccountSid(NULL, pSid, cProcessOwner, &dwSizeProcessOwner, cDomain, &dwSizeDomain, &snuOwner)){

                strcpy(cBuffer, cProcessOwner);
                CloseHandle(hProcess);
                CloseHandle(hToken);
                return TRUE;

             }

          }

       }

    }


    CloseHandle(hProcess);
    CloseHandle(hToken);
    return FALSE;
    
}



Nun noch ne frage, meine Funktion funktioniert zwar. Aber sobald ich sie bei Prozessen anwenden möchte, bei denen der Benutzername "SYSTEM" oder "LOKALE NETZWERKDIENST" ist, scheitert die Funktion schon beim Öffnen des Prozesses. Ähm ...... ist das normal? :D
 
"SYSTEM" oder "LOKALE NETZWERKDIENST" ist, scheitert die Funktion schon beim Öffnen des Prozesses. Ähm ...... ist das normal? großes Grinsen
Ja, ist normal ;)
entweder muss Du das Programm mit Adminrechten ausführen und im Programm noch SeDebugPrivilege holen. Oder (einfacher): bei OpenProcess statt "ALL_ACCESS" doch mal mit "PROCESS_QUERY_INFORMATION" versuchen - denn es ist ein Unterschied, ob man Processmanipulationen beabsichtigt (PROCESS_ALL_ACCESS) oder nur Informationen sammeln möchte (PROCESS_QUERY_INFORMATION) ;)
 
Danke CDW für deine Antwort.

Hast einerseits Recht, OpenProcess funktioniert mit "PROCESS_QUERY_INFORMATION" als Flag, aber das is dann auch schon wieder alles das funktioniert. Ich habe hier auf Microsoft die SetPrivilege() Funktion gefunden. Aber irgendwie hab ich da jetzt immernoch ein Problem. Die Funktion SetPrivilege() benötigt ein token handle, allerdings funktioniert OpenProcessToken() bei den Systemprozessen nicht mit "TOKEN_ADJUST_PRIVILEGES" als flag (kA ob sie überhaupt funktioniert, aber es bringt ja nix, wenn man etwas anderes als "TOKEN_ADJUST_PRIVILEGS" als Flag setzt)


[EDIT]
Ok, hat sich erledit, es reicht schon, wenn ich bei OpenProcessToken() TOKEN_QUERY als Flag setze, ich brauch garkein DebugPrivilege.

Vielen Dank für deine Hilfe :D :D :D
 
Hast einerseits Recht, OpenProcess funktioniert mit "PROCESS_QUERY_INFORMATION" als Flag, aber das is dann auch schon wieder alles das funktioniert.
laut MSDN sollte es eigentlich genug sein für ein OpenProcessToken.
Wie ich aber erst jetzt sehe, versuchts du hier wieder zuviele Rechte zu bekommen:
TOKEN_ALL_ACCESS

GetTokenInformation braucht doch nur:
TokenHandle
[in] A handle to an access token from which information is retrieved. If TokenInformationClass specifies TokenSource, the handle must have TOKEN_QUERY_SOURCE access. For all other TokenInformationClass values, the handle must have TOKEN_QUERY access.

Was die SeDebugPrvileges angeht (ich nehme an, dass es im letzen Post um diese geht):
SeDebugPrivelege solltest du auch nur deinem eigenen Programm geben ;)
C++ OpenThread funktioniert nicht
Dll Injection
ich hoffe mal, einer von den beiden Codes funktioniert (da ich kein C++ Fan bin, habe ich sie noch nie getestet)

Edit: ok, ich war jetzt zu langsam, da ich unbedingt noch MSDN zitieren wollte ;)
 
Zurück
Oben