Aunque el objetivo de este tema está cumplido, me gustaría añadir algo.
No he terminado de estar contento con la función que expuse para obtener el usuario y dominio de un proceso. El motivo es que no se obtienen los datos de todos los procesos cuando éstos son de mas de un usuario y sobre todo si se ejecuta como usuario no administrador por un problema de privilegios en la API
OpenProcessToken. He implementado otra función con APIs menos conocidas que evitan el uso de la anterior:
Código Delphi
[-]
type
WTS_PROCESS_INFO = record
SessionId: DWORD; ProcessId: DWORD; pProcessName: LPSTR; pUserSid: PSID; end;
PWTS_PROCESS_INFO = ^WTS_PROCESS_INFO;
TA_WTS_PROCESS_INFO = array of WTS_PROCESS_INFO;
PTA_WTS_PROCESS_INFO = ^TA_WTS_PROCESS_INFO;
function WTSEnumerateProcessesA(hServer: Cardinal; Reserved: DWORD; Version: DWORD;
var ppProcessInfo: PWTS_PROCESS_INFO; var pCount: DWORD): BOOL; stdcall external 'Wtsapi32.dll';
procedure WTSFreeMemory(pMemory: Pointer); stdcall external 'Wtsapi32.dll';
implementation
function GetUserAndDomainFromPID(ProcessId: Cardinal; var User, Domain: String): boolean;
var
snu: SID_NAME_USE;
pProcessInfo: TA_WTS_PROCESS_INFO;
nProc,UserSize, DomainSize: Cardinal;
begin
Result:= false;
nProc:= 0;
UserSize:= 0;
DomainSize:= 0;
if WTSEnumerateProcessesA(0, 0, 1, PWTS_PROCESS_INFO(pProcessInfo), nProc) then
begin
repeat dec(nProc) until (nProc <= 0) or (ProcessId = pProcessInfo[nProc].ProcessId);
LookupAccountSid(nil, pProcessInfo[nProc].pUserSid, nil, UserSize, nil, DomainSize, snu);
if (UserSize <> 0) or (DomainSize <> 0) then
begin
SetLength(User, UserSize);
SetLength(Domain, DomainSize);
Result:= LookupAccountSid(nil, pProcessInfo[nProc].pUserSid, @User[1], UserSize, @Domain[1], DomainSize, snu);
end;
WTSFreeMemory(pProcessInfo);
end;
end;
El ejemplo de uso es sencillo:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
User, Domain: String;
begin
GetUserAndDomainFromPID(StrToInt(Edit1.Text), User, Domain);
Label1.Caption:= User;
Label2.Caption:= Domain;
end;
Ahora si, conseguimos los datos de todos los procesos con una excepción, el proceso que corresponde a un Pid = 0 que todos sabemos que es el
proceso inactivo del sistema ([System Process]) cuyo usuario es SYSTEM y el dominio NT AUTHORITY
Espero que sea de utilidad.
Saludos.