Права доступа к процессу, кажется, различаются при запуске из компилятора и как отдельный 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
включен, а если нет, включите его.