首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PROCESS_TERMINATE的SetSecurityInfo失败

PROCESS_TERMINATE的SetSecurityInfo失败
EN

Stack Overflow用户
提问于 2012-02-27 18:26:51
回答 2查看 2.2K关注 0票数 3

我正在尝试设置PROCESS_TERMINATE的安全性。代码如下:

代码语言:javascript
运行
复制
   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

代码语言:javascript
运行
复制
GetExitCodeProcess(pi.hProcess, lpExitCode);

这一切为什么要发生?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-27 19:02:21

访问冲突是由于以下代码造成的:

代码语言:javascript
运行
复制
LPDWORD lpExitCode;
GetExitCodeProcess(pi.hProcess, lpExitCode);

在这里,您声明lpExitCode是一个指针,但是您没有让它指向任何东西。当GetExitCodeProcess尝试写入*lpExitCode时,会导致访问冲突。

正确的方法是这样的:

代码语言:javascript
运行
复制
DWORD ExitCode;
GetExitCodeProcess(pi.hProcess, &ExitCode);

我也不认为你需要调用SetSecurityInfo。处理CreateProcess返回的进程应该有足够的权限。

您需要等待衍生的进程终止,然后才能获得退出代码。这是因为GetExitCodeProcess是异步的。您可以像这样等待:

代码语言:javascript
运行
复制
WaitForSingleObject(pi.hProcess);
//now you can call GetExitCodeProcess and expect an answer.

并且一定要检查所有的API调用是否有错误。

票数 4
EN

Stack Overflow用户

发布于 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,因此您的调用实际上是在尝试更改进程所有者(但操作不正确,这就是调用失败的原因)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9463437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档