Форум: "Начинающим";
Текущий архив: 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