맨위로가기

서비스 제어 관리자

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

서비스 제어 관리자(SCM)는 윈도우 운영 체제에서 서비스의 시작, 중지 및 관리를 담당하는 실행 파일인 `Services.exe`를 의미한다. SCM은 시스템 시작 시 Wininit 프로세스에 의해 시작되며, 레지스트리 키를 읽어 서비스 데이터베이스를 초기화하고, 자동 시작으로 설정된 서비스들을 시작한다. SCM은 장치 드라이버 로드, 명명된 파이프를 통한 서비스 제어 프로세스(SCP)와의 통신, 서비스 프로세스 시작 등의 기능을 수행한다. 지연된 자동 시작 서비스는 시스템 시작 시간을 단축하기 위해 사용되며, 장치 드라이버는 `ScLoadDeviceDriver()` 함수를 통해 로드된다. 또한 SCM은 네트워크 드라이브 문자의 변경을 GUI 응용 프로그램에 알리는 기능도 제공한다.

더 읽어볼만한 페이지

  • 윈도우 구성 요소 - 인터넷 익스플로러
    마이크로소프트가 개발한 웹 브라우저인 인터넷 익스플로러는 윈도우 운영 체제와의 통합으로 높은 시장 점유율을 유지했으나, 웹 표준 문제와 보안 취약점으로 비판받으며 2015년 엣지에 자리를 내주고 2022년 지원이 종료되었지만, 엣지의 IE 모드로 레거시 호환성을 유지하고 있다.
  • 윈도우 구성 요소 - 원격 데스크톱 서비스
    원격 데스크톱 서비스(RDS)는 네트워크를 통해 원격으로 컴퓨터의 데스크톱 환경에 접근할 수 있게 해주는 기술이며, 클라이언트 소프트웨어, 서버 구성 요소, 다양한 역할을 수행하는 구성 요소로 구성된다.
서비스 제어 관리자
서비스 제어 관리자
일반 정보
유형윈도우 NT 운영 체제의 시스템 프로세스
역할윈도우 서비스를 관리하는 중앙 관리 지점
파일 이름Services.exe
서비스 이름Service Control Manager
설명다른 서비스의 시작, 중지, 상호 작용을 담당
기능 및 특징
서비스 관리윈도우 서비스를 시작, 중지, 일시 중지, 재개 및 구성
서비스 상태서비스의 현재 상태를 추적하고 보고 (실행 중, 중지됨 등)
서비스 종속성서비스 간의 종속성을 관리하여 서비스 시작 순서 및 상호 작용 제어
서비스 복구서비스 실패 시 자동으로 복구 작업 수행 (재시작, 컴퓨터 재부팅 등)
보안서비스에 대한 접근 권한 제어 및 보안 컨텍스트 관리
아키텍처
작동 방식서비스 제어 관리자는 부팅 프로세스 중에 시작되는 시스템 프로세스임.
서비스 제어 관리자는 서비스 제어 데이터베이스에서 서비스 구성 정보를 읽어옴.
서비스 제어 관리자는 서비스 호스트 프로세스를 시작하고 서비스를 로드함.
서비스 제어 관리자는 서비스와 통신하여 서비스 상태를 확인하고 서비스를 관리함.
서비스 제어 데이터베이스서비스 구성 정보 (시작 유형, 종속성, 보안 컨텍스트 등)를 저장하는 데이터베이스
사용 방법
서비스 관리 도구서비스 관리자 MMC 스냅인
SC.exe (명령줄 도구)
PowerShell (Set-Service, Get-Service, Start-Service, Stop-Service 등)
서비스 제어 프로그램서비스 제어 관리자와 통신하여 서비스 관리 작업을 수행하는 프로그램
프로그래밍
API윈도우 API를 통해 서비스 제어 관리자와 상호 작용 가능
주요 API 함수OpenSCManager
CreateService
OpenService
StartService
ControlService
DeleteService
기타 정보
관련 항목윈도우 서비스
시스템 프로세스
SC.exe
서비스 관리자 MMC 스냅인

2. 구현

SCM 실행 파일인 `Services.exe`는 윈도우 콘솔 프로그램으로 실행되며, 시스템 시작 초기에 Wininit 프로세스에 의해 시작된다.[10] main 함수인 `SvcCtrlMain()`는 자동 시작으로 설정된 모든 서비스들을 실행시킨다. 먼저 설치된 서비스들의 내부적인 데이터베이스는 다음의 두 레지스트리 키들을 읽음으로써 초기화된다.


  • `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List`는 서비스 그룹들의 이름과 순서를 포함한다. 각 서비스의 레지스트리 키는 선택적으로 `Group` 값을 갖는데 이것은 서비스나 장치 드라이버의 초기화 순서를 관리한다.
  • `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services`는 서비스들과 장치 드라이버들의 실제 데이터베이스를 포함하며 SCM의 내부 데이터베이스로 읽혀진다.[11] SCM은 모든 서비스의 `Group` 값 뿐만 아니라 다음 레지스트리 키에 존재하는 로드 순서 종속성도 읽는다 : `DependOnGroup`, `DependOnService`[12]


다음으로 SCM의 main 함수 `SvcCtrlMain()` 는 함수 `ScGetBootAndSystemDriverState()` 를 호출하는데 이것은 부팅 또는 시스템 시작 시에 시작되었어야 할 장치 드라이버가 성공적으로 로드되었나 그리고 이것들의 실패가 다음 리스트에 저장되었나를 검사한다 : `ScFailedDrivers`. 그 후 명명된 파이프 `\Pipe\Ntsvcs`가 SCM과 특정한 서비스들과 상호작용하는 SCP(서비스 제어 프로세스)들 사이에 원격 프로시저 호출로서 생성된다.

다음으로 이것은 `ScAutoStartServices()` 함수를 호출하는데 이 함수는 자동 시작으로 표시된 모든 서비스들 사이에서 순환하면서 계산된 로드 순서 종속성을 감시한다. 지연된 자동 시작 서비스들에게 그루핑은 의미가 없으며 시스템 시작 이후 단계에 로드된다.[13]

시작되길 원하는 각 서비스들을 위해 SCM은 `ScStartService()` 함수를 호출하는데 이것은 서비스의 프로세스로 실행하는 파일의 이름을 검사하고 서비스에 명시된 계정이 서비스 프로세스가 실행되는 계정과 같은지를 보장한다. `System` 계정으로서 실행되지 않는 모든 서비스들은 LSASS 함수 `[http://msdn.microsoft.com/en-us/library/aa378189(v=vs.85).aspx LogonUserEx()]`를 호출함으로써 로그인 된다. 이 때 LSASS 프로세스는 `HKLM\SECURITY\Policy\Secrets\`에 저장된 "secret" 비밀번호를 찾는데, 이 레지스트리 키는 SCP가 서비스가 초기에 설정되었을 때 `[http://msdn.microsoft.com/en-us/library/ms721818(v=vs.85).aspx LsaStorePrivateData()]` API를 사용해서 저장된다.[14]

다음으로 `ScLogonAndStartImage()` 함수가 서비스 프로세스가 아직 실행되지 않은 모든 서비스들을 위해 호출된다. 서비스 프로세스들은 `[http://msdn.microsoft.com/en-us/library/ms682429(v=vs.85).aspx CreateProcessAsUser()]` API를 통해 대기 상태로서 생성된다. 서비스 프로세스의 실행이 재개되기 전에 명명된 파이프 `\Pipe\Net\NtControlPipeX` (X는 각 서비스 반복 시에 더해지는 숫자이다)가 생성되는데 이것은 SCM과 서비스 프로세스 사이의 통신 채널로서 동작한다. 서비스 프로세스는 `[http://msdn.microsoft.com/en-us/library/ms686324(VS.85).aspx StartServiceCtrlDispatcher()]` 함수를 호출함으로써 파이프와 연결되는데 이후 SCM은 서비스에게 "start" 명령어를 보낸다.[15]

2. 1. 초기화

서비스 제어 관리자(SCM) 실행 파일인 `Services.exe`는 윈도우 콘솔 프로그램으로 실행되며, 시스템 시작 초기에 Wininit 프로세스에 의해 시작된다.[2] 주요 기능인 `SvcCtrlMain()`은 자동 시작으로 구성된 모든 서비스를 시작한다. 먼저 설치된 서비스의 내부 데이터베이스는 다음 두 개의 레지스트리 키를 읽어 초기화된다.

  • `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List`: 서비스 그룹의 이름과 순서를 포함한다. 각 서비스의 레지스트리 키는 다른 서비스 그룹과 관련하여 해당 서비스 또는 장치 드라이버의 초기화 순서를 관리하는 선택적 `Group` 값을 포함한다.
  • `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services`: 실제 서비스 및 장치 드라이버 데이터베이스를 포함하며, SCM의 내부 데이터베이스로 읽어들인다.[3] SCM은 각 서비스의 `Group` 값과 로드 순서 종속성을 해당 `DependOnGroup` 및 `DependOnService` 레지스트리 키에서 읽는다.[4]


다음 단계에서 SCM의 주요 기능인 `SvcCtrlMain()`은 부팅 또는 시스템 시작 중에 시작되어야 하는 장치 드라이버가 성공적으로 로드되었는지 확인하는 `ScGetBootAndSystemDriverState()` 함수를 호출하고, 실패한 드라이버는 `ScFailedDrivers`라는 목록에 저장된다. 그런 다음 SCM과 특정 서비스와 상호 작용하는 SCP(서비스 제어 프로세스) 간의 원격 프로시저 호출 인터페이스로 명명된 파이프 `\Pipe\Ntsvcs`가 생성된다.

다음으로 `ScAutoStartServices()` 함수를 호출하여 계산된 로드 순서 종속성에 주의하면서 자동 시작으로 표시된 모든 서비스를 반복한다. 순환 종속성이 있는 경우 오류가 기록되고 로드 순서에서 나중에 나오는 그룹에 속한 서비스에 종속된 서비스는 건너뜁니다. 지연된 자동 시작 서비스의 경우 그룹화는 아무런 영향을 미치지 않으며, 이는 시스템 시작의 나중 단계에서 로드된다.[5]

시작하려는 각 서비스에 대해 SCM은 서비스 프로세스를 실행하는 파일의 이름을 확인하여 서비스에 지정된 계정이 서비스 프로세스가 실행되는 계정과 동일한지 확인하는 `ScStartService()` 함수를 호출한다. `System` 계정에서 실행되지 않는 모든 서비스는 LSASS 함수인 `LogonUserEx()`를 호출하여 로그인되며, LSASS 프로세스는 서비스가 원래 구성되었을 때 SCP가 `LsaStorePrivateData()` API를 사용하여 저장한 `HKLM\SECURITY\Policy\Secrets\` 레지스트리 키에 저장된 "비밀" 암호를 찾는다.[6]

다음으로, 서비스 프로세스가 아직 시작되지 않은 모든 서비스에 대해 `ScLogonAndStartImage()` 함수가 호출된다. 서비스 프로세스는 `CreateProcessAsUser()` API를 통해 중단된 상태로 생성된다. 서비스 프로세스의 실행이 재개되기 전에 명명된 파이프 `\Pipe\Net\NtControlPipeX`(여기서 X는 각 서비스 반복마다 증가하는 숫자)가 생성되어 SCM과 서비스 프로세스 간의 통신 채널 역할을 한다. 서비스 프로세스는 `StartServiceCtrlDispatcher()` 함수를 호출하여 파이프에 연결한 후 SCM은 서비스에 "시작" 명령을 보낸다.[7]

2. 2. 서비스 시작

SCM 실행 파일인 `Services.exe`는 윈도우 콘솔 프로그램으로서 실행되며, 시스템 시작 초기에 Wininit 프로세스에 의해 실행된다.[10] main 함수인 `SvcCtrlMain()`는 자동 시작으로 설정된 모든 서비스들을 실행시킨다. 먼저 설치된 서비스들의 내부적인 데이터베이스는 다음의 두 레지스트리 키들을 읽음으로써 초기화된다.

  • `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List`는 서비스 그룹들의 이름과 순서를 포함한다. 각 서비스의 레지스트리 키는 선택적으로 `Group` 값을 갖는데 이것은 서비스나 장치 드라이버의 초기화 순서를 관리한다.
  • `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services`는 서비스들과 장치 드라이버들의 실제 데이터베이스를 포함하며 SCM의 내부 데이터베이스로 읽혀진다.[11] SCM은 모든 서비스의 `Group` 값 뿐만 아니라 다음 레지스트리 키에 존재하는 로드 순서 종속성도 읽는다 : `DependOnGroup`, `DependOnService`[12]


다음으로 SCM의 main 함수 `SvcCtrlMain()` 는 함수 `ScGetBootAndSystemDriverState()` 를 호출하는데 이것은 부팅 또는 시스템 시작 시에 시작되었어야 할 장치 드라이버가 성공적으로 로드되었나 그리고 이것들의 실패가 다음 리스트에 저장되었나를 검사한다 : `ScFailedDrivers`. 그 후 명명된 파이프 `\Pipe\Ntsvcs`가 SCM과 특정한 서비스들과 상호작용하는 SCP(서비스 제어 프로세스)들 사이에 원격 프로시저 호출로서 생성된다.

다음으로 이것은 `ScAutoStartServices()` 함수를 호출하는데 이 함수는 자동 시작으로 표시된 모든 서비스들 사이에서 순환하면서 계산된 로드 순서 종속성을 감시한다. 지연된 자동 시작 서비스들에게 그루핑은 의미가 없으며 시스템 시작 이후 단계에 로드된다.[13]

시작되길 원하는 각 서비스들을 위해 SCM은 `ScStartService()` 함수를 호출하는데 이것은 서비스의 프로세스로 실행하는 파일의 이름을 검사하고 서비스에 명시된 계정이 서비스 프로세스가 실행되는 계정과 같은지를 보장한다. `System` 계정으로서 실행되지 않는 모든 서비스들은 LSASS 함수 `[http://msdn.microsoft.com/en-us/library/aa378189(v=vs.85).aspx LogonUserEx()]`를 호출함으로써 로그인 된다. 이 때 LSASS 프로세스는 `HKLM\SECURITY\Policy\Secrets\`에 저장된 "secret" 비밀번호를 찾는데, 이 레지스트리 키는 SCP가 서비스가 초기에 설정되었을 때 `[http://msdn.microsoft.com/en-us/library/ms721818(v=vs.85).aspx LsaStorePrivateData()]` API를 사용해서 저장된다.[14]

다음으로 `ScLogonAndStartImage()` 함수가 서비스 프로세스가 아직 실행되지 않은 모든 서비스들을 위해 호출된다. 서비스 프로세스들은 `[http://msdn.microsoft.com/en-us/library/ms682429(v=vs.85).aspx CreateProcessAsUser()]` API를 통해 대기 상태로서 생성된다. 서비스 프로세스의 실행이 재개되기 전에 명명된 파이프 `\Pipe\Net\NtControlPipeX` (X는 각 서비스 반복 시에 더해지는 숫자이다)가 생성되는데 이것은 SCM과 서비스 프로세스 사이의 통신 채널로서 동작한다. 서비스 프로세스는 `[http://msdn.microsoft.com/en-us/library/ms686324(VS.85).aspx StartServiceCtrlDispatcher()]` 함수를 호출함으로써 파이프와 연결되는데 이후 SCM은 서비스에게 "start" 명령어를 보낸다.[15]

2. 3. 지연된 자동 시작 서비스

지연된 자동 시작 서비스는 시스템 시작 시간을 단축하고 지연될 수 없는 중요한 서비스의 시작 속도를 높이기 위해 윈도우 비스타에 추가되었다.[8][16] 원래 서비스 초기화의 자동 시작 방식은 다른 응용 프로그램 및 서비스가 의존하는 필수 시스템 서비스를 위해 설계되었다. 서비스 제어 관리자(SCM)는 `ScInitDelayStart()` 함수를 호출하여 지연되지 않은 자동 시작 서비스를 모두 처리한 후에 지연된 서비스를 초기화한다. 이 함수는 해당 작업자 스레드와 관련된 지연된(기본적으로 120초) 작업 항목을 큐에 넣는다. 지연 후 초기화된다는 점 외에는 지연된 서비스와 지연되지 않은 서비스 간의 다른 차이점은 없다.

3. 장치 드라이버

`Type` 레지스트리 값이 `SERVICE_KERNEL_DRIVER` 또는 `SERVICE_FILE_SYSTEM_DRIVER`인 서비스는 특별하게 다루어진다. 이들은 장치 드라이버를 나타내며, `ScStartService()`가 `ScLoadDeviceDriver()` 함수를 호출하여 적절한 드라이버를 로드한다. 드라이버 파일은 일반적으로 확장자가 `.sys`이며 `%SystemRoot%영어\System32\Drivers\` 디렉토리에 위치한다. 이 과정을 위해 `[http://msdn.microsoft.com/en-us/library/ff556539(VS.85).aspx NtLoadDriver]` 시스템 호출이 유발되며, `SeLoadDriverPrivilege`가 SMC의 프로세스에 추가된다.

4. 네트워크 드라이버 문자

SCM은 윈도우 서비스와 완전히 관계 없는 추가적인 기능을 제공한다. 이는 네트워크 드라이브 문자가 생성되거나 삭제되었을 때 윈도우 메시지 WM_DEVICECHANGE를 브로드캐스트하여 GUI 응용 프로그램(예: Windows 탐색기)에 알린다.

참조

[1] 간행물
[2] 간행물
[3] 웹사이트 Database of Installed Services http://msdn.microsof[...] 2011-03-06
[4] 간행물
[5] 간행물
[6] 간행물
[7] 간행물
[8] 간행물
[9] 간행물
[10] 간행물
[11] 웹인용 Database of Installed Services http://msdn.microsof[...] 2011-03-06
[12] 간행물
[13] 간행물
[14] 간행물
[15] 간행물
[16] 간행물



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com