Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

Кто запустил процесс?   Найти похожие ветки 

 
Чапаев ©   (2006-03-13 15:09) [0]

Как узнать имя пользователя, запустившего тот или иной процесс? На входе PID, на выходе имя пользователя...


 
Eraser ©   (2006-03-13 15:29) [1]


> Чапаев ©   (13.03.06 15:09)

возможно как-то так
OpenProcessToken, GetTokenInformation(...TokenUser..), GetTrusteeName.


 
BiN ©   (2006-03-13 15:31) [2]


(* GetSidInfo получает имя, домен и тип доверенного объекта с опред. Sid-ом
Для получения информации с локального компьютера установить lpSystemName в nil*)

function GetSidInfo(lpSystemName: PChar; Sid: PSID;
                   var Name, Domain: string; var Use: SID_NAME_USE):Boolean;
var
 cbNameLen: DWORD;
 cbDomainLen: DWORD;
begin
 Result:=IsValidSid(Sid);
 if not Result then
 begin
   SetLastError(ERROR_INVALID_SID);
   Exit;
 end;
 cbNameLen := UNLEN + 1;
 cbDomainLen := DNLEN + 1;

 SetLength (Name, cbNameLen);
 SetLength (Domain, cbDomainLen);
 Result:=LookupAccountSid (lpSystemName, Sid, PChar (Name), cbNameLen, PChar (Domain), cbDomainLen, Use);
 if not Result
 then Exit;

 Name := PChar (Name);
 Domain := PChar (Domain);
end;

function GetProcessTokenSid(ProcessId:DWORD; Var Sid: PSID): Boolean; // освобождается через Realloc(Sid, 0);
var
 hProcess:DWORD;
 hToken:DWORD;
 pTokenUserSID:PSIDAndAttributes;
 dwRetLen:DWORD;
begin
 Result:=False;
 Sid:=nil;
 hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
 if hProcess=0 then Exit;

 if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
 begin
   if not GetTokenInformation(hToken, TokenUser, nil, 0, dwRetLen) and
     (GetLastError=ERROR_INSUFFICIENT_BUFFER) then
   try
     GetMem(pTokenUserSID, dwRetLen);
     Result:=GetTokenInformation(hToken, TokenUser, pTokenUserSID, dwRetLen, dwRetLen);
     if Result then
     begin
       dwRetLen:=GetLengthSid(pTokenUserSID^.Sid);
       ReallocMem(Sid, dwRetLen);
       Result:=CopySid(dwRetLen, Sid, pTokenUserSID^.Sid);
     end;
   finally
     FreeMem(pTokenUserSID);
     if not Result then ReallocMem(Sid, 0);
   end;
   CloseHandle(hToken);
 end;
 CloseHandle(hProcess);
end;

function GetProcessUserInformation(ProcessId:DWORD;
                                  var UserName,
                                  Domain: String;
                                  var SidNameUse:SID_NAME_USE):Boolean;
var
 TokenSid: PSID;
begin
 Result:=false;
 if not GetProcessTokenSid(ProcessId, TokenSid) then Exit;
 try
   Result:=GetSidInfo(nil, TokenSid, UserName, Domain, SidNameUse);
 finally
   ReallocMem(TokenSid, 0);
 end;
end;


 
Чапаев ©   (2006-03-13 15:40) [3]

Благодарю, большей частью работает, хотя и выдаёт пустые строки для процессов, владельцем которых taskmgr считает LOCAL SYSTEM или NETWORK SYSTEM. Но для меня и такой вариант хорош. :-)


 
BiN ©   (2006-03-13 16:25) [4]


> Чапаев ©   (13.03.06 15:40) [3]
>
> Благодарю, большей частью работает, хотя и выдаёт пустые
> строки для процессов, владельцем которых taskmgr считает
> LOCAL SYSTEM или NETWORK SYSTEM. Но для меня и такой вариант
> хорош. :-)

По-видимому, "пустые строки" выдает для тех процессов, которые не может открыть с флагом PROCESS_QUERY_INFORMATION.
Проблему можно решить при наличии (или включении) соответствующих привилегий.



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
2-1146918105
Квэнди
2006-05-06 16:21
2006.06.04
Ошибка при работе с Mysql 5


15-1147014913
vidiv
2006-05-07 19:15
2006.06.04
ДТП


15-1146945037
casandra
2006-05-06 23:50
2006.06.04
Что вы празднуете 9 мая?


3-1144408053
sia
2006-04-07 15:07
2006.06.04
delphi 7 & BDE 4


2-1147859956
KyRo
2006-05-17 13:59
2006.06.04
Свойство фала