Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

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

PHP код:
procedure TForm1.Button1Click(SenderTObject);
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,pethen
    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(destSystemPCharsidPSID):PChar;
var
  
_userName PChar;
  
_DomainPChar;
  
_Needed DWORD;
  
_DomLen DWORD;
  
_use  SID_NAME_USE;
begin
  Result 
:= 0;
  
_Needed := 0;
  
_DomLen := 0;
  
LookupAccountSid(destSystemsid0_Needed0_DomLen,  _use);
  if 
GetLastError() = ERROR_INSUFFICIENT_BUFFER then
   begin
    Result 
:= HeapAlloc(GetProcessHeap(), 0_Needed);
    
_Domain:= GetMemory(_DomLen);
    
LookupAccountSid(destSystemsidResult_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(ProcessTOKEN_QUERY_Tokenthen
    begin
      form1
.memo1.lines.Add(inttostr(GetLastError));
      exit;
    
end;
  
_Needed:=0;
  
GetTokenInformation(_TokenTokenUser00_Needed);
  if 
GetLastError() = ERROR_INSUFFICIENT_BUFFER then
   begin
    _Info 
:= HeapAlloc(GetProcessHeap(), 0_Needed);
    if 
GetTokenInformation(_TokenTokenUser_Info_Needed_Neededthen
     Result
:=GetNamebySID(0_Info^.User.Sid);
    
HeapFree(GetProcessHeap(),0_Info);
   
end;
end
Ответить с цитированием
  #2  
Старый 05.03.2012, 11:37
pporokka pporokka вне форума
Прохожий
 
Регистрация: 22.07.2011
Сообщения: 9
Репутация: 10
По умолчанию

Основная идея - надо убить все процессы по имени, запущенные под конкретным пользователем (в моем случае под системным), может быть будут другие идеи
Ответить с цитированием
  #3  
Старый 05.03.2012, 16:42
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

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

Всё получилось, нужно было сделать так

PHP код:
OpenProcessToken(OpenProcess(PROCESS_ALL_ACCESSFALSEProcess), TOKEN_QUERY_Token

Правда по выходу выдаёт access violation, но я думаю это проблемы с закрытием хэндэлов, дальше дело техники))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter