我正在尝试设置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);
这里PROCESS_TERMINATE的SetSecurityInfo失败了,我得到了一个Unhandled Exception..(KERNEL32.dll):Access Violation
GetExitCodeProcess(pi.hProcess, lpExitCode);
这一切为什么要发生?谢谢
发布于 2012-02-27 19:02:21
访问冲突是由于以下代码造成的:
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调用是否有错误。
发布于 2012-02-28 07:11:32
除了对GetExitCodeProcess
的incorect调用之外,您对SetSecurityInfo
的调用也是不正确的。PROCESS_TERMINATE
不是第三个参数的有效值。根据the documentation的说法,第三个参数的有效值为
OWNER_SECURITY_INFORMATION:包含所有者。
GROUP_SECURITY_INFORMATION:包含主组。
DACL_SECURITY_INFORMATION:包括自主访问控制列表(DACL)。
SACL_SECURITY_INFORMATION:包括系统访问控制列表(SACL)。
LABEL_SECURITY_INFORMATION:包括必需的完整性标签访问控制条目(ACE)。
ATTRIBUTE_SECURITY_INFORMATION:包含SACL的属性信息。
SCOPE_SECURITY_INFORMATION:包括SACL的中央访问策略标识符。
您的PROCESS_TERMINATE
值恰好在数字上等于OWNER_SECURITY_INFORMATION
,因此您的调用实际上是在尝试更改进程所有者(但操作不正确,这就是调用失败的原因)。
https://stackoverflow.com/questions/9463437
复制相似问题