QueryServiceObjectSecurity失败并显示访问被拒绝错误

时间:2014-11-08 18:51:12

标签: windows winapi service permissions

QueryServiceObjectSecurity调用失败,访问被拒绝错误,我无法弄清楚原因。我创建服务,然后尝试更新它的权限。有趣的是,一旦调用失败,就会创建服务,如果我重新执行代码,它会检测现有服务并附加句柄,然后这个调用工作正常,那么为什么它第一次失败?我是Windows服务的新手,有没有在第一次执行时,创建服务但是在查询对象安全性之前SCM db没有更新?

代码段位于

之下

服务创建:

managerHandle.Attach(::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS));
serviceHandle.Attach(::CreateService(managerHandle, serviceName, serviceDisplayName, 
                SERVICE_CHANGE_CONFIG | SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_INTERROGATE,
                serviceType, startCode, errorControl, path,
                groupName, NULL, NULL, NULL, NULL));

::ChangeServiceConfig2(m_serviceHandle, SERVICE_CONFIG_DESCRIPTION,  &serviceDesc);
service.Detach();

现在在此i调用函数之后更新服务的dacl

ENSURE_STATE(!!m_serviceHandle)
CAutoPtr<PSECURITY_DESCRIPTOR *> pSecurityDescriptor;
DWORD bytesNeeded = 0;
if(::QueryServiceObjectSecurity(serviceHandle, DACL_SECURITY_INFORMATION, &pSecurityDescriptor, 0, &bytesNeeded) == FALSE)
{

任何帮助非常感谢

2 个答案:

答案 0 :(得分:1)

Service Security and Access Rights的文档说明调用READ_CONTROL需要访问权限QueryServiceObjectSecurity

在调用CreateService时,将READ_CONTROL添加到您请求处理权限的访问权限列表中。

答案 1 :(得分:1)

MSDN文章Service Security and Access Rights中描述了系统服务的访问权限。

相关权利

  

READ_CONTROL调用QueryServiceObjectSecurity函数以查询服务对象的安全描述符所必需的。

对CreateService的调用返回一个句柄,该句柄具有dwDesiredAccess参数指示的访问权限,您已将其设置为

SERVICE_CHANGE_CONFIG | 
  SERVICE_START | 
  SERVICE_QUERY_STATUS | 
  SERVICE_INTERROGATE

这使得句柄有权更改服务配置,启动服务,查询服务状态和查询服务 - 但无权查询安全描述符。

READ_CONTROL添加到dwDesiredAccess,问题就会消失。更好的是,将dwDesiredAccess设置为SERVICE_ALL_ACCESS