Права доступа к процессу, кажется, различаются при запуске из компилятора и как отдельный exe - PullRequest
2 голосов
/ 09 февраля 2012

Я использую 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 Ответ

3 голосов
/ 09 февраля 2012

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

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

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

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

...