Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

Список процессов   Найти похожие ветки 

 
novice   (2006-05-18 11:33) [0]

procedure CreateNTProcessList(List: TstringList);
var
PIDArray: array [0..1023] of DWORD;
cb: DWORD;
I: Integer;
ProcCount: Integer;
hMod: HMODULE;
hProcess: THandle;
ModuleName: array [0..300] of Char;
begin
if List = nil then Exit;
EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
ProcCount := cb div SizeOf(DWORD);
for I := 0 to ProcCount - 1 do
begin
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
    PROCESS_VM_READ,
    False,
    PIDArray[I]);
  if (hProcess <> 0) then
  begin
    EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
    GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
    List.Add(ModuleName);
    CloseHandle(hProcess);
  end;
end;
end;


Если запустить под учеткой с адм. правами - все нормально, а если под ограниченной, то в список не попадают процессы, запущенные от имени этой учетки. Как быть?


 
Elen ©   (2006-05-18 11:42) [1]


> novice


Можно проблему поподробнее?


 
novice   (2006-05-18 11:55) [2]

Программа, собирающая список запущенных процессов, запускается от имени админа. Запускается некая программа (допустим, 1С). В списке запущенных процессов будут разные winlogon, svchost и т.д., запущенные от имени System, Local Service, Network Service. Но кроме них, будет еще процесс 1Cv77.exe, запущенный от имени Admin. Если же эту программу запустить под учетной записью пользователя, то все вышеперечисленные системные процессы в списке фигурируют, а вот 1С (и другие, запущенные этим пользователем) - нет.


 
manevil   (2006-05-18 12:25) [3]

Вот это у меня работает:

procedure GetProcessList(var sl: TStrings);
var
 pe: TProcessEntry32;
 ph, snap: THandle; //дескрипторы процесса и снимка
 mh: hmodule; //дескриптор модуля
 procs: array[0..$FFF] of dword; //массив для хранения дескрипторов процессов
 count, cm: cardinal; //количество процессов
 i: integer;
 ModName: array[0..max_path] of char; //имя модуля
begin
 sl.Clear;
 if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
 begin //если это Win9x
   snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
   if integer(snap) = -1 then
   begin
     exit;
   end
   else
   begin
     pe.dwSize := sizeof(pe);
     if Process32First(snap, pe) then
       repeat
         sl.Add(string(pe.szExeFile));
       until not Process32Next(snap, pe);
   end;
 end
 else
 begin //Если WinNT/2000/XP
   if not EnumProcesses(@procs, sizeof(procs), count) then
   begin
     exit;
   end;
   for i := 0 to count div 4 - 1 do
   begin
     ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
       false, procs[i]);
     if ph > 0 then
     begin
       EnumProcessModules(ph, @mh, 4, cm);
       GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
       sl.Add(string(ModName));
       CloseHandle(ph);
     end;
   end;
 end;
end;

Взято из DW.


 
novice   (2006-05-18 12:59) [4]


> Вот это у меня работает:

Этот код ничем существенным не отличается от приведенного мной. Разве что, в одной процедуре идет ветвление по платформам. И что, у всех пользователей работает, независимо от их прав?


 
novice   (2006-05-18 13:09) [5]

Кстати, если под платформой 2к и ХР собирать процессы при помощи CreateToolhelp32Snapshot, т.е., как для вин98, то работает под любым пользователем, но вот убить процесс под неадминской учеткой все-равно не выходит. Явно дело тут в правах.


 
manevil   (2006-05-18 13:37) [6]

Проверял под Win XP. Создал юзера с ограниченными правами, на нем проверил - все процессы запущенные от его имени отображает


 
novice   (2006-05-18 13:51) [7]

Попробовал тоже на ХР - все работает как надо, а вот в 2к - нет. А у меня как раз большинство машин с 2к.


 
manevil   (2006-05-18 14:10) [8]

ставь везде ХР ;)
а вообще-то куда потерялись настоящие мастера?


 
manevil   (2006-05-18 14:29) [9]

вот очень интересная ссылочка:
http://www.rsdn.ru/article/qna/baseserv/enumproc.xml


 
Игорь Шевченко ©   (2006-05-18 15:14) [10]

Выставить себе SeDebugPrivilege.


>   if (hProcess <> 0) then
>   begin
>    


else
 raiselastwin32error



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

Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.043 c
3-1144513827
VadimSpb
2006-04-08 20:30
2006.06.04
Экспорт в Excel


4-1142183589
Arazel
2006-03-12 20:13
2006.06.04
Как узнать по PID, в какое время был запущен процесс?


10-1120122297
ingine
2005-06-30 13:04
2006.06.04
закрытие IE


2-1147712772
***(H@kker)***
2006-05-15 21:06
2006.06.04
Как это делает WinAmp


1-1146291373
aleksej-bashkirov
2006-04-29 10:16
2006.06.04
Компонент Chart





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский