Releyendo me he dado cuenta de que el anterior código que publiqué contiene un error de princiapiante (las prisas
). Localizo memoria pero no la libero...
Como no puedo editarlo, lo republico dejando la
chapuza previa.
Código Delphi
[-]
function GetUserAndDomainFromPID(ProcessId: DWORD; var User, Domain: String): boolean;
var
hToken, hProcess, cbBuf, UserSize, DomainSize: Cardinal;
pSidUser: ^SID_AND_ATTRIBUTES;
SidNU: SID_NAME_USE;
begin
Result:= false;
EnablePrivilege('SeDebugPrivilege', true);
hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION, false, ProcessId);
if hProcess <> 0 then
begin
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
begin
GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
GetMem(pSidUser, cbBuf);
GetTokenInformation(hToken, TokenUser, pSidUser, cbBuf, cbBuf);
CloseHandle(hToken);
UserSize:= 0;
DomainSize:= 0;
LookupAccountSid(nil, pSidUser.Sid, nil, UserSize, nil, DomainSize, SidNU);
if (UserSize <> 0) or (DomainSize <> 0) then
begin
SetLength(User, UserSize);
SetLength(Domain, DomainSize);
Result:= LookupAccountSid(nil, pSidUser.Sid, PCHAR(User), UserSize, PCHAR(Domain), DomainSize, SidNU);
end;
FreeMem(pSidUser);
end;
CloseHandle(hProcess);
end;
EnablePrivilege('SeDebugPrivilege', false);
end;
Saludos.