Как получить дескриптор процесса с повышенными правами?

В Delphi 10 Seattle я использую этот код, чтобы получить дескриптор процесса:

uses
  Winapi.Windows;

var
  hp: THandle;
begin
    hp := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID);

Это хорошо работает со всеми процессами, как 32-битными, так и 64-битными.

К сожалению, он не работает с ПОВЫШЕННЫМИ ПРОЦЕССАМИ, где он возвращает 0.

Итак, как я могу получить дескриптор процесса с повышенными правами?


person user1580348    schedule 29.01.2016    source источник
comment
Нет, конечно, если это имеет значение, но я все равно спрашиваю: ваше приложение работает с повышенными правами или нет?   -  person Tom Brunberg    schedule 29.01.2016
comment
Вы имеете в виду приложение, в котором я запускаю этот код? Нет. Но даже если я запускаю свое приложение с повышенными правами, оно возвращает ноль.   -  person user1580348    schedule 29.01.2016
comment
В порядке. Тогда что говорит GetLastError? Ссылка Документы MSDN относительно возвращаемого значения: If the function fails, the return value is NULL. To get extended error information, call GetLastError.   -  person Tom Brunberg    schedule 29.01.2016
comment
Я получаю Access denied.   -  person user1580348    schedule 29.01.2016


Ответы (1)


Простой ответ заключается в том, что вы не можете этого сделать. Система сказала нет. Когда вы вызываете GetLastError, возвращаемое значение будет ERROR_ACCESS_DENIED. У вашего процесса недостаточно прав, чтобы получить PROCESS_QUERY_INFORMATION для процесса с повышенными правами.

Вы добьетесь успеха, если сделаете вызов OpenProcess, когда ваш процесс будет повышен.

В качестве альтернативы вполне вероятно, что вы сможете обойтись меньшими правами, чем PROCESS_QUERY_INFORMATION. Трудно судить, так как мы не знаем, что вы хотите сделать с этим дескриптором процесса. В соответствии с вашими комментариями вы передадите дескриптор GetProcessImageFileName, который задокументирован как требующий либо PROCESS_QUERY_INFORMATION, либо PROCESS_QUERY_LIMITED_INFORMATION.

person David Heffernan    schedule 29.01.2016
comment
Мне нужен дескриптор процесса, чтобы получить путь к файлу процесса с помощью GetProcessImageFileName. Итак, есть ли другой способ получить путь к файлу процесса с повышенными правами? - person user1580348; 29.01.2016
comment
Если вам нужен полный путь к файлу, вам нужно будет запустить процесс с повышенными правами. Этот вопрос поможет: deni" title="как получить имя файла процесса из pid, если openprocess не работает с доступом deni"> stackoverflow.com/questions/9146498/ - person David Heffernan; 29.01.2016
comment
ЭВРИКА!! Это работает, когда я использую PROCESS_QUERY_LIMITED_INFORMATION (1000 долларов США) вместо PROCESS_QUERY_INFORMATION!! Затем я получаю полный путь к процессу с повышенными правами с помощью GetProcessImageFileName!! - person user1580348; 29.01.2016
comment
Это немного удивительно, учитывая ответы и комментарии в этом другом вопросе. Во всяком случае, это последний абзац моего ответа. - person David Heffernan; 29.01.2016
comment
Кстати, PROCESS_QUERY_LIMITED_INFORMATION, похоже, не определен в Winapi.Windows или где-либо еще в RTL. Однако значение $1000 кажется правильным. - person user1580348; 29.01.2016
comment
Да, переводы заголовков RTL отстают. Значение задокументировано в MSDN: msdn.microsoft.com/en-gb/library/windows/desktop/ - person David Heffernan; 29.01.2016