Показать сообщение отдельно
  #1  
Старый 05.03.2012, 11:31
pporokka pporokka вне форума
Прохожий
 
Регистрация: 22.07.2011
Сообщения: 9
Репутация: 10
По умолчанию Получить список процессов и имена пользователей от которых они запущены

Нигде не нашёл как это делается, только кусками. Подскажите где у меня ошибка.
Проблема в том что функция OpenProcessToken Работает правильно только если ей передать Process=-1 (Тогда выдает текущего пользователя). В остальных случаях я получаю ошибку 6 - Не верный PID, в отладчике проверял - приходят верные. Может какая нибудь ошибка в доступе?

PHP код:
procedure TForm1.Button1Click(Sender: TObject);
var
  
hSnap:THandle;
  
pe:TProcessEntry32;
  
s2:THandle;
  
res:String;
  
i:integer;
begin
  memo1
.Clear;
  
pe.dwSize:=SizeOf(pe);
  
hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS ,0);
  If 
Process32First(hSnap,pe) then
    begin
      memo1
.Lines.Add(pe.szExeFile+#9#9+strpas(GetProcessusername(pe.th32ProcessID)));
      
While Process32Next(hSnap,pe) do
        
begin
          memo1
.Lines.Add(pe.szExeFile+#9#9+strpas(GetProcessusername(pe.th32ProcessID)));
        
end;
    
end;
end;


function 
GetNamebySID(destSystem: PChar; sid: PSID):PChar;
var
  
_userName : PChar;
  
_Domain: PChar;
  
_Needed : DWORD;
  
_DomLen : DWORD;
  
_use  : SID_NAME_USE;
begin
  Result 
:= 0;
  
_Needed := 0;
  
_DomLen := 0;
  
LookupAccountSid(destSystem, sid, 0, _Needed, 0, _DomLen,  _use);
  if 
GetLastError() = ERROR_INSUFFICIENT_BUFFER then
   begin
    Result 
:= HeapAlloc(GetProcessHeap(), 0, _Needed);
    
_Domain:= GetMemory(_DomLen);
    
LookupAccountSid(destSystem, sid, Result, _Needed, _Domain, _DomLen, _use);
    
FreeMemory(_Domain);
   
end;
end;

function 
GetProcessUserName(Process:THandle):PChar;
var
  
_Token:THandle;
  
_Info:PTOKEN_USER;
  
_Needed:DWORD;
begin
  Result
:=0;
  if 
not OpenProcessToken(Process, TOKEN_QUERY, _Token) then
    begin
      form1
.memo1.lines.Add(inttostr(GetLastError));
      exit;
    
end;
  
_Needed:=0;
  
GetTokenInformation(_Token, TokenUser, 0, 0, _Needed);
  if 
GetLastError() = ERROR_INSUFFICIENT_BUFFER then
   begin
    _Info 
:= HeapAlloc(GetProcessHeap(), 0, _Needed);
    if 
GetTokenInformation(_Token, TokenUser, _Info, _Needed, _Needed) then
     Result
:=GetNamebySID(0, _Info^.User.Sid);
    
HeapFree(GetProcessHeap(),0, _Info);
   
end;
end; 
Ответить с цитированием