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)
{
任何帮助,不胜感激
约翰逊,ARX,感谢您的答复。添加READ_CONTROL并不能解决问题,但是如果我设置SERVICE_ALL_ACCESS会使问题消失,但这并不合理,因为READ_CONTROL应该能够解决这个问题,我在这里丢失了什么?我不想添加额外的访问来处理,如果它真的不需要。 – NxC 2014-11-09 04:34:16
你能提供[MCVE](http://stackoverflow.com/help/mcve)吗? (它并没有真正伤害的手柄有充分的权利,虽然)。 – 2014-11-09 05:21:11
我发现这个问题,我正在另一个电话QueryServiceObjectSecurity后立即SetServiceObjectSecurity这需要手柄有机会获得 - WRITE_DAC,加入这个解决问题。非常感谢你,我非常感谢你投入的时间。 – NxC 2014-11-09 06:57:17