Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.204.208] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток.
Задача - OpenProcess определенного процесса и получение пути к файлу через GetModuleFileNameExA (именно пути с буквой диска, GetProcessImageFileNameA не интересует). Код отлично отрабатывает на Windows XP, но не хочет работать под Windows 7 и, предположительно, более новыми версиями. Запускается везде из под пользователя - администратора. Проблема: в Windows 7 для процессов, запущенных другим пользователем, OpenProcess с требуемыми для задачи параметрами PROCESS_QUERY_INFORMATION or PROCESS_VM_READ не выполняется, GetLastError выдает 5 (Отказано в доступе). Проверил через Process32Next ради интереса - OpenProcess срабатывает только для taskhost.exe, dwm.exe, explorer.exe, project1.exe (сама программа). Диспетчер задач Windows кроме этих процессов (при выборе только процессов текущего пользователя) выдает еще taskmgr.exe, crss.exe, winlogon.exe - к ним доступа нет. Цитата To open a handle to another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. SeDebugPrivilege установлена (OpenProcessToken=true, AdjustTokenPrivileges=true, в противном случае у меня в лог стоит дебаг). В принципе, что с ней что без нее имею доступ к указанным 4 процессам. Что с Windows 7 не так? |
Сообщ.
#2
,
|
|
|
А зачем тебе именно ansi-функция?
короче, у меня без ошибок работает, например, это: function TProcessItem.GetExeName: string; var ProcessHandle: THandle; buffer: array[0..MAX_PATH] of char; begin if FExeName <> '' then begin Result:= FExeName; Exit; end; Result:= 'sys - ' + FEntry.szExeFile; ProcessHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID); if ProcessHandle <> 0 then try if GetModuleFileNameEx(ProcessHandle, 0, buffer, MAX_PATH) <> 0 then Result:= buffer else DoError(); finally CloseHandle(ProcessHandle); end; FIsSysProcess:= ProcessHandle = 0; FExeName:= Result; end; Прикреплённый файл31.png (80,53 Кбайт, скачиваний: 578) |
Сообщ.
#3
,
|
|
|
Я не знаю что там у Вас в PID, что если запросить OpenProcess для какого-нибудь сервиса или Task manager?
У меня в WindowsXP все сервисы отрабатывают, GetModuleFileNameExA нет но GetProcessImageFileNameA отдает путь. Независимо от пользователя. В Windows7 только 4 процесса текущего пользователя. Еще искал по теме раз и два но там тоже не решена проблема в общем случае Проверил в Windows 8 на виртуалке - картина точно такая же. Независимо от SeDebugPrivilege доступ только к процессам текущего пользователя. OpenProcess работает только при запуске правой кнопкой мыши - Запуск от имени администратора и наличии SeDebugPrivilege (без нее правой кнопкой тоже не отображает). Еще есть проблемы с GetModuleFileNameExA если запрашивать имя 64-битного процесса, но это уже мелочи. Вообщем, привилегии теперь до ноги, жизнь портит UAC. Хотя по логике вещей если не хватает прав - функция AdjustTokenPrivileges не должна возвращать true, или я чего-то не понимаю. |