На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> OpenProcess, SeDebugPrivilege и ошибка доступа в Windows 7+
    Доброго времени суток.

    Задача - 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 не так?
    Сообщение отредактировано: Виталь -
      А зачем тебе именно ansi-функция?
      короче, у меня без ошибок работает, например, это:
      ExpandedWrap disabled
        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;
      Сообщение отредактировано: min@y™ -

      Прикреплённый файлПрикреплённый файл31.png (80,53 Кбайт, скачиваний: 578)
        Я не знаю что там у Вас в PID, что если запросить OpenProcess для какого-нибудь сервиса или Task manager?
        У меня в WindowsXP все сервисы отрабатывают, GetModuleFileNameExA нет но GetProcessImageFileNameA отдает путь. Независимо от пользователя.
        В Windows7 только 4 процесса текущего пользователя. Еще искал по теме раз и два но там тоже не решена проблема в общем случае

        Проверил в Windows 8 на виртуалке - картина точно такая же. Независимо от SeDebugPrivilege доступ только к процессам текущего пользователя.
        OpenProcess работает только при запуске правой кнопкой мыши - Запуск от имени администратора и наличии SeDebugPrivilege (без нее правой кнопкой тоже не отображает). Еще есть проблемы с GetModuleFileNameExA если запрашивать имя 64-битного процесса, но это уже мелочи. Вообщем, привилегии теперь до ноги, жизнь портит UAC. Хотя по логике вещей если не хватает прав - функция AdjustTokenPrivileges не должна возвращать true, или я чего-то не понимаю.
        Сообщение отредактировано: Виталь -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,1277 ]   [ 19 queries used ]   [ Generated: 25.04.24, 04:46 GMT ]