개요
로컬 관리자 권한이 없는 도메인 사용자가 원격 서버에서 실행 중인 서비스 목록을 조회할 수 있도록 원격 액세스 권한을 부여하는 방법을 살펴보겠습니다. 이 작업은 본질적으로 서비스 제어 관리자(Service Control Manager, SCManager)에 대한 원격 연결 권한을 제공하는 것으로 귀결됩니다.
문제 상황
원격 사용자나 모니터링 시스템이 특정 서버의 서비스 상태를 조회할 수 있도록 하고 싶다고 가정해 보겠습니다. 당연히 이 원격 사용자에게는 관리자 권한이 없으며, 서버에 로컬로 액세스할 권한도 없습니다.
services.msc 콘솔을 사용해 원격 컴퓨터에 연결하여 서비스 목록을 가져오려고 하면 다음과 같은 오류가 표시됩니다.
Windows was unable to open service control manager database on computer_name
오류 5: 액세스가 거부되었습니다.
sc.exe를 사용하여 원격 서버의 서비스 목록을 조회하려고 하면 다음과 같은 오류가 발생합니다.
C:\Windows\system32>sc \\lonts-01 query[SC] OpenSCManager FAILED 5:Access is denied.

서비스 목록에 대한 액세스는 Service Control Manager 데이터베이스의 보안 설명자(security descriptor)에 의해 제어됩니다. Windows 2003 SP1부터 이미 "Authenticated Users" 그룹 사용자의 원격 액세스가 제한되었습니다(상당히 합리적인 보안 조치입니다). 로컬 관리자 그룹의 구성원만 이 서비스에 원격으로 액세스할 수 있습니다.
이제 Windows Server 2012 R2 환경에서 관리자 권한이 없는 일반 사용자가 서버의 서비스 목록과 상태를 조회할 수 있도록 Service Control Manager에 대한 원격 액세스를 부여하는 방법을 알아보겠습니다.
1단계: 현재 SCM 권한 확인
관리자 권한으로 실행한 명령 프롬프트에서 다음 명령을 실행하면 sc.exe를 통해 현재 Service Control Manager(SCM) 권한을 확인할 수 있습니다.
sc sdshow scmanager
이 명령은 다음과 유사한 SDDL 문자열을 반환합니다.
D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)

이 문자열을 보면 기본적으로 Authenticated Users(AU) 그룹은 SCM에 연결하는 것만 허용되고, 서비스 조회(LC)는 허용되지 않는 것을 알 수 있습니다. 이 문자열을 텍스트 편집기에 복사해 둡니다.
2단계: 사용자 또는 그룹의 SID 확인
다음 단계는 SCM 원격 액세스 권한을 부여하려는 사용자 또는 그룹의 SID를 확인하는 것입니다. 예를 들어 AD 그룹 lon-hd의 SID를 확인해 보겠습니다.
Get-ADgroup -Identity lon-hd | select SIDSID---S-1-5-21-2470146451-39123456388-2999995117-23338978
3단계: SDDL 문자열 수정
앞서 복사해 둔 SDDL 문자열에서 (A;;CCLCRPRC;;;IU) 블록을 복사합니다(IU는 대화형 사용자, 즉 Interactive Users를 의미합니다). 복사한 블록에서 IU를 대상 사용자/그룹의 SID로 바꾼 뒤, 완성된 문자열을 S 앞에 붙여넣습니다.
이 예제의 경우 최종적으로 다음과 같은 문자열이 완성됩니다.
D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;CCLCRPRC;;;S-1-5-21-2470146451-39123456388-2999995117-23338978)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
4단계: 보안 설명자 변경 적용
이제 다음 명령으로 Service Control Manager 보안 설명자의 설정을 변경합니다.
sc sdset scmanager "D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;CCLCRPRC;;;S-1-5-21-2470146451-39123456388-2999995117-23338978)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)"

[SC] SetServiceObjectSecurity SUCCESS 메시지가 표시되면 새 보안 설정이 성공적으로 적용된 것이며, 해당 사용자는 로컬로 인증된 사용자와 유사한 권한(SC_MANAGER_CONNECT, SC_MANAGER_ENUMERATE_SERVICE, SC_MANAGER_QUERY_LOCK_STATUS, STANDARD_RIGHTS_READ)을 얻게 됩니다.
결과 확인
이제 원격 사용자가 services.msc 콘솔 또는 sc \\srv-name1 query 명령을 사용하여 서비스 목록과 각 서비스의 상태를 정상적으로 조회할 수 있는지 확인합니다.

다만 서비스 자체를 관리(시작/중지/재시작)할 수 있는 권한은 여전히 없습니다. 각 서비스에 대한 액세스는 개별 ACL에 의해 별도로 제어되기 때문입니다. 사용자에게 서비스 시작/중지 권한까지 부여하려면 "사용자에게 Windows 서비스 관리 권한 부여 방법" 관련 문서의 지침을 참고하시기 바랍니다.
참고: 설정 오류 시 복구 방법
팁: 기본값과 다른 SCManager 권한을 할당하면 해당 설정은 레지스트리의 HKLM\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\Security 키에 저장됩니다. SDDL 문자열 작성 중 실수가 있었다면 이 레지스트리 키를 삭제한 후 컴퓨터를 다시 시작하면 현재 권한을 기본값으로 초기화할 수 있습니다.
