2014-11-08 128 views
0

QueryServiceObjectSecurity电话与访问被拒绝错误而失败,我不太能找出原因。我创建服务,然后尝试更新它的权限。有趣的是,一旦呼叫失败服务被创建,如果我重新执行代码,它会检测现有服务并附加句柄,然后这个调用工作正常,那么为什么它第一次失败?我是新的Windows服务,有没有像第一次执行期间,服务已创建,但SCM数据库没有更新之前,我查询对象的安全性?QueryServiceObjectSecurity失败,拒绝访问错误

代码片断如下

服务创建:

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(); 

现在在这之后我调用函数更新DACL为

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

任何帮助,不胜感激

回答

1

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

相关权利是

READ_CONTROL所需调用QueryServiceObjectSecurity功能查询服务对象的安全描述符。

到的CreateService调用返回由dwDesiredAccess参数指示的访问权限,您已设置为

SERVICE_CHANGE_CONFIG | 
    SERVICE_START | 
    SERVICE_QUERY_STATUS | 
    SERVICE_INTERROGATE 

这使手柄,改变服务配置权的手柄,来启动服务,查询服务的状态并询问服务 - 但不是查询安全描述符的权利。

添加READ_CONTROLdwDesiredAccess,问题就会迎刃而解。更好的是,将dwDesiredAccess设置为SERVICE_ALL_ACCESS

+0

约翰逊,ARX,感谢您的答复。添加READ_CONTROL并不能解决问题,但是如果我设置SERVICE_ALL_ACCESS会使问题消失,但这并不合理,因为READ_CONTROL应该能够解决这个问题,我在这里丢失了什么?我不想添加额外的访问来处理,如果它真的不需要。 – NxC 2014-11-09 04:34:16

+0

你能提供[MCVE](http://stackoverflow.com/help/mcve)吗? (它并没有真正伤害的手柄有充分的权利,虽然)。 – 2014-11-09 05:21:11

+0

我发现这个问题,我正在另一个电话QueryServiceObjectSecurity后立即SetServiceObjectSecurity这需要手柄有机会获得 - WRITE_DAC,加入这个解决问题。非常感谢你,我非常感谢你投入的时间。 – NxC 2014-11-09 06:57:17

1

服务Service Security and Access Rights的文档说明了该接口需要拨打READ_CONTROL才能拨打QueryServiceObjectSecurity

在调用CreateService添加READ_CONTROL到你的手柄请求的访问权限列表。