Права доступа к процессу, кажется, различаются при запуске из компилятора и как отдельный exe

Я использую WINAPI для программы, которую я пишу. У программы есть ProcessId другого процесса, и ему необходимо получить его дескриптор (чтобы иметь возможность завершить его позже, а также периодически проверять, жив ли процесс и отвечает, используя WaitForSingleObject). Когда я компилирую свою программу (в Embarcadero RAD Studio 2010 C++ Builder), она работает хорошо; программа, кажется, успешно справляется с управлением и в целом работает как задумано. Однако, если я запускаю его из папки как отдельный exe-файл, кажется, что он не может правильно получить дескриптор. Я проверил это путем сравнения (Companion - это HANDLE, а Companion_PID - это DWORD):

GetProcessId(Companion)

а также

Companion_PID

Где, несколькими строками ранее, Companion взят из Companion_PID в следующем коде:

Companion = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Companion_PID);

И "GetProcessId(Companion)" приводит к 0 (что является хорошим признаком того, что OpenProcess не удалось вернуть правильный дескриптор).

Я очень удивлен, что этот код работает по-разному при запуске из компилятора и как отдельный exe; Я предполагаю, что в первом случае атрибуты безопасности наследуются от самого компилятора, но я хотел бы услышать, возможно, лучшее объяснение этого поведения от кого-то более опытного в WINAPI и атрибутах безопасности в частности.

Небольшое обновление: да, как я и думал, OpenProcess приводит к ошибке 0x5 = ERROR_ACCESS_DENIED.

1 ответ

Решение

Со страницы функции OpenProcess в MSDN:

Чтобы открыть дескриптор другого локального процесса и получить права полного доступа, необходимо включить привилегию SeDebugPrivilege.

Я считаю, что ваша IDE (вы запускаете приложение из IDE, а не из компилятора) имеет SeDebugPrivilege включен по умолчанию. Когда вы запускаете свое приложение, ваш IDE (процесс) создает новый процесс, который наследует привилегии от IDE, включая SeDebugPrivilege и это причина того, почему функция успешно выполняется при запуске из IDE.

Ваша заявка должна проверить, имеет ли она SeDebugPrivilege включен, а если нет, включите его.

Другие вопросы по тегам