05.03.2012, 11:31
|
Прохожий
|
|
Регистрация: 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;
|