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)
{
任何帮助非常感谢
答案 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
。