1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| function GetUserAndDomainFromPID(ProcessId: DWORD; var User, Domain: string): Boolean; var hProcess,hToken: Cardinal; szData: Cardinal; szDomain, szUser: Cardinal; Data: PSIDAndAttributes; snu: SID_NAME_USE; bSuccess: Boolean; begin Result := False; bSuccess := False;
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
if hProcess = 0 then ShowMessage(Format('OpenProcess - Fehler %d: %s',[GetLastError,SysErrorMessage(GetLastError)])) else begin
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then begin bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, szData); Data := AllocMem(szData); bSuccess := GetTokenInformation(hToken, TokenUser, Data, szData, szData); CloseHandle(hToken); end;
if bSuccess then begin szUser := 0; szDomain := 0;
LookupAccountSid(nil, Data^.Sid, nil, szUser, nil, szDomain, snu); if (szUser <> 0) and (szDomain <> 0) then begin SetLength(User, szUser); SetLength(Domain, szDomain);
if LookupAccountSid(nil, Data^.Sid, PChar(User), szUser, PChar(Domain), szDomain, snu) then begin Result := True; User := StrPas(PChar(User)); Domain := StrPas(PChar(Domain)); end; end; end;
if Assigned(Data) then FreeMem(Data);
CloseHandle(hProcess); end; end; |