Releyendo me he dado cuenta de que el anterior código que publiqué contiene un error de princiapiante (las prisas
![Stick Out Tongue](http://www.clubdelphi.com/foros/images/smilies/tongue.gif)
). 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.