2014-11-08 3 views
0

QueryServiceObjectSecurity 호출이 액세스 거부 오류로 인해 실패했습니다. 이유를 파악하지 못했습니다. 서비스를 만든 다음 해당 서비스에 대한 사용 권한을 업데이트하려고합니다. 흥미롭게도 호출이 실패하면 서비스가 만들어지고 코드를 다시 실행하면 기존 서비스를 감지하고 핸들을 연결 한 다음이 호출이 올바르게 작동 한 다음 처음 실패하는 이유는 무엇입니까? 나는 Windows 서비스에 익숙하지 않다. 처음 실행하는 동안 서비스가 생성되었지만 SCM db가 업데이트되지 않고 객체 보안을 쿼리합니까?QueryServiceObjectSecurity가 액세스 거부 오류로 인해 실패합니다.

코드는

서비스 생성

아래 : 어떤 도움을 크게

답변

1

시스템 서비스에 대한 액세스 권한은 MSDN 문서 Service Security and Access Rights에 설명되어 있습니다.

관련 권리는 서비스 개체의 보안 설명을 조회 할 QueryServiceObjectSecurity 함수를 호출

READ_CONTROL 필요합니다.

가 CreateService에 대한 호출하면

(가) 서비스 구성을 변경할 수있는 권리를 처리 할 수 ​​있습니다
SERVICE_CHANGE_CONFIG | 
    SERVICE_START | 
    SERVICE_QUERY_STATUS | 
    SERVICE_INTERROGATE 

로 설정 한 dwDesiredAccess 파라미터로 나타나는 액세스 권한이있는 핸들을 반환, 시작 서비스를 쿼리하고 서비스의 상태를 쿼리하고 서비스를 확인합니다. 그러나 보안 설명자를 쿼리 할 수있는 권한은 아닙니다.

READ_CONTROL - dwDesiredAccess을 추가하면 문제가 해결됩니다. 더 나은 방법은 dwDesiredAccess에서 SERVICE_ALL_ACCESS으로 설정하는 것입니다.

+0

Johnson, arx, 답장을 보내 주셔서 감사합니다. READ_CONTROL을 추가해도 문제가 해결되지 않지만 SERVICE_ALL_ACCESS를 설정하면 문제가 해결되지만 READ_CONTROL이 여기에없는 내용을 해결할 수 있어야하므로 의미가 없습니다. 정말 필요하지 않은 경우 처리 할 추가 액세스를 추가하고 싶지 않습니다. – NxC

+0

[MCVE] (http://stackoverflow.com/help/mcve)를 제공 할 수 있습니까? (그래도 손잡이가 완전한 권한을 갖기 위해 상처를 입지는 않습니다.) –

+0

QueryServiceObjectSecurity 직후에 다른 호출을 만들기 위해 SetServiceObjectSecurity에 핸들이 필요한 WRITE_DAC이 문제가 추가되었습니다. 정말 고마워요. 시간을 내 주셔서 감사합니다. – NxC

1

감사

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

서비스의 DACL을 업데이트 난 함수를 호출이 후 지금

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

Service Security and Access Rights에 대한 설명서는 acce 오른쪽 READ_CONTROLQueryServiceObjectSecurity으로 전화해야합니다.

CreateService으로 전화 할 때 핸들 요청한 액세스 권한 목록에 READ_CONTROL을 추가하십시오.

관련 문제