SetSecurityInfo завершается ошибкой для PROCESS_TERMINATE - PullRequest
3 голосов
/ 27 февраля 2012

Я пытаюсь установить безопасность PROCESS_TERMINATE. Это код:

   CreateProcess("C:\\ADP\\SQLBase\\dbntsrv.exe", NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, "C:\\ADP\\SQLBase", &si, &pi);       

if(SetSecurityInfo(pi.hProcess, SE_KERNEL_OBJECT, PROCESS_TERMINATE, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
    MessageBox(NULL, "process_terminate granted", NULL, MB_OK);
}
else
{
    MessageBox(NULL, "process_terminate not granted", NULL, MB_OK);
}



                    //--------------------- Permission to query for info to use GetExitCode -------------------------
if(SetSecurityInfo(pi.hProcess, SE_KERNEL_OBJECT, PROCESS_QUERY_INFORMATION, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
    MessageBox(NULL, "process_query_information granted", NULL, MB_OK);
}
else
{
    MessageBox(NULL, "process_query_information not granted", NULL, MB_OK);
}


LPDWORD lpExitCode;
GetExitCodeProcess(pi.hProcess, lpExitCode);

Здесь SetSecurityInfo для PROCESS_TERMINATE завершается неудачно, и я получаю Unhandled Exception..(KERNEL32.dll):Access Violation для

GetExitCodeProcess(pi.hProcess, lpExitCode);

Почему это происходит? Спасибо

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Нарушение прав доступа из-за этого кода:

LPDWORD lpExitCode;
GetExitCodeProcess(pi.hProcess, lpExitCode);

Здесь вы заявляете, что lpExitCode - это указатель, но вы ни на что не указываете. Когда GetExitCodeProcess пытается выполнить запись в *lpExitCode, это приводит к нарушению доступа.

Правильный подход такой:

DWORD ExitCode;
GetExitCodeProcess(pi.hProcess, &ExitCode);

Я тоже не верю, что вам вообще нужно звонить SetSecurityInfo. Дескриптор процесса, который возвращает CreateProcess, должен иметь достаточные права.

Вам нужно будет дождаться завершения вызываемого процесса, прежде чем вы сможете ожидать получения кода выхода. Это потому, что GetExitCodeProcess является асинхронным. Вы можете подождать так:

WaitForSingleObject(pi.hProcess);
//now you can call GetExitCodeProcess and expect an answer.

И не забудьте проверить все ваши вызовы API на наличие ошибок.

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

В дополнение к неподтвержденному звонку на GetExitCodeProcess ваш звонок на SetSecurityInfo также неверен.PROCESS_TERMINATE не является допустимым значением для третьего параметра.Согласно документации , допустимыми значениями для третьего параметра являются

OWNER_SECURITY_INFORMATION: включить владельца.

GROUP_SECURITY_INFORMATION: включить основную группу.

DACL_SECURITY_INFORMATION: включить список управления доступом по усмотрению (DACL).

SACL_SECURITY_INFORMATION: включить список управления доступом к системе (SACL).

LABEL_SECURITY_INFORMATION: включить обязательную запись контроля доступа к метке целостности).

ATTRIBUTE_SECURITY_INFORMATION: включить информацию об атрибутах SACL.

SCOPE_SECURITY_INFORMATION: включить идентификатор центральной политики доступа (CAP) для SACL.

Ваше значениеиз PROCESS_TERMINATE оказывается численно равным OWNER_SECURITY_INFORMATION, поэтому ваш вызов фактически пытается сменить владельца процесса (но делает это неправильно, поэтому вызов не удался).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...