다음을 통해 공유


ControlServiceExA 함수(winsvc.h)

컨트롤 코드를 서비스로 보냅니다.

통사론

BOOL ControlServiceExA(
  [in]      SC_HANDLE hService,
  [in]      DWORD     dwControl,
  [in]      DWORD     dwInfoLevel,
  [in, out] PVOID     pControlParams
);

매개 변수

[in] hService

서비스에 대한 핸들입니다. 이 핸들은 OpenService 또는 CreateService 함수에서 반환됩니다. 이 핸들에 필요한 액세스 권한 요청된 dwControl 코드에 따라 달라집니다.

[in] dwControl

이 매개 변수는 다음 컨트롤 코드 중 하나일 수 있습니다.

제어 코드 의미
SERVICE_CONTROL_CONTINUE
0x00000003
일시 중지된 서비스에 다시 시작해야 임을 알 수 있습니다. hService 핸들에는 SERVICE_PAUSE_CONTINUE 액세스 권한이 있어야 합니다.
SERVICE_CONTROL_INTERROGATE
0x00000004
서비스 제어 관리자에 현재 상태 정보를 보고해야 한다는 것을 서비스에 알깁니다. hService 핸들에는 SERVICE_INTERROGATE 액세스 권한이 있어야 합니다.

SCM이 서비스의 현재 상태를 인식하기 때문에 이 컨트롤은 일반적으로 유용하지 않습니다.

SERVICE_CONTROL_NETBINDADD
0x00000007
네트워크 서비스에 바인딩에 대한 새 구성 요소가 있음을 알 수 있습니다. hService 핸들에는 SERVICE_PAUSE_CONTINUE 액세스 권한이 있어야 합니다. 그러나 이 컨트롤 코드는 더 이상 사용되지 않습니다. 대신 플러그 앤 플레이 기능을 사용합니다.
SERVICE_CONTROL_NETBINDDISABLE
0x0000000A
네트워크 서비스에 해당 바인딩 중 하나가 비활성화되었음을 알 수 있습니다. hService 핸들에는 SERVICE_PAUSE_CONTINUE 액세스 권한이 있어야 합니다. 그러나 이 컨트롤 코드는 더 이상 사용되지 않습니다. 대신 플러그 앤 플레이 기능을 사용합니다.
SERVICE_CONTROL_NETBINDENABLE
0x00000009
사용하지 않도록 설정된 바인딩이 사용하도록 설정되어 있음을 네트워크 서비스에 알깁니다. hService 핸들에는 SERVICE_PAUSE_CONTINUE 액세스 권한이 있어야 합니다. 그러나 이 컨트롤 코드는 더 이상 사용되지 않습니다. 대신 플러그 앤 플레이 기능을 사용합니다.
SERVICE_CONTROL_NETBINDREMOVE
0x00000008
바인딩 구성 요소가 제거되었음을 네트워크 서비스에 알깁니다. hService 핸들에는 SERVICE_PAUSE_CONTINUE 액세스 권한이 있어야 합니다. 그러나 이 컨트롤 코드는 더 이상 사용되지 않습니다. 대신 플러그 앤 플레이 기능을 사용합니다.
SERVICE_CONTROL_PARAMCHANGE
0x00000006
시작 매개 변수가 변경되었다는 것을 서비스에 알깁니다. hService 핸들에는 SERVICE_PAUSE_CONTINUE 액세스 권한이 있어야 합니다.
SERVICE_CONTROL_PAUSE
0x00000002
일시 중지해야 한다는 것을 서비스에 알깁니다. hService 핸들에는 SERVICE_PAUSE_CONTINUE 액세스 권한이 있어야 합니다.
SERVICE_CONTROL_STOP
0x00000001
중지해야 한다는 것을 서비스에 알깁니다. hService 핸들에는 SERVICE_STOP 액세스 권한이 있어야 합니다.

서비스에 중지 요청을 보낸 후에는 다른 컨트롤을 서비스에 보내면 안 됩니다.

 

이 매개 변수는 다음 표에 설명된 대로 사용자 정의 제어 코드일 수도 있습니다.

제어 코드 의미
범위 128 ~ 255
서비스는 제어 코드와 연결된 작업을 정의합니다. hService 핸들에는 SERVICE_USER_DEFINED_CONTROL 액세스 권한이 있어야 합니다.

[in] dwInfoLevel

서비스 제어 매개 변수의 정보 수준입니다. 이 매개 변수는 SERVICE_CONTROL_STATUS_REASON_INFO(1)로 설정해야 합니다.

[in, out] pControlParams

서비스 컨트롤 매개 변수에 대한 포인터입니다. dwInfoLevel SERVICE_CONTROL_STATUS_REASON_INFO 경우 이 멤버는 SERVICE_CONTROL_STATUS_REASON_PARAMS 구조체에 대한 포인터입니다.

반환 값

함수가 성공하면 반환 값은 0이 아닌 값입니다.

함수가 실패하면 반환 값은 0입니다. 확장 오류 정보를 얻으려면 GetLastError호출합니다.

서비스 제어 관리자에서 다음 오류 코드를 설정할 수 있습니다. 다른 오류 코드는 서비스 제어 관리자가 호출하는 레지스트리 함수에서 설정할 수 있습니다.

반환 코드 묘사
ERROR_ACCESS_DENIED
핸들에 필요한 액세스 권한이 없습니다.
ERROR_DEPENDENT_SERVICES_RUNNING
다른 실행 중인 서비스가 종속되어 있으므로 서비스를 중지할 수 없습니다.
ERROR_INVALID_HANDLE
CreateService 또는 OpenService사용하여 지정된 핸들을 가져오지 않았거나 핸들이 더 이상 유효하지 않습니다.
ERROR_INVALID_PARAMETER
dwControl 매개 변수의 요청된 제어 코드가 정의되지 않았거나 dwControl SERVICE_CONTROL_STOP 있지만 SERVICE_CONTROL_STATUS_REASON_PARAMS 구조의 dwReason 또는 pszComment 멤버가 잘못되었습니다.
ERROR_INVALID_SERVICE_CONTROL
요청된 제어 코드가 유효하지 않거나 서비스에 허용되지 않습니다.
ERROR_SERVICE_CANNOT_ACCEPT_CTRL
서비스 상태가 SERVICE_STOPPED, SERVICE_START_PENDING 또는 SERVICE_STOP_PENDING 요청된 제어 코드를 서비스로 보낼 수 없습니다.
ERROR_SERVICE_NOT_ACTIVE
서비스가 시작되지 않았습니다.
ERROR_SERVICE_REQUEST_TIMEOUT
서비스에 대한 프로세스가 시작되었지만 StartServiceCtrlDispatcher호출하지 않았거나 StartServiceCtrlDispatcher 호출한 스레드가 제어 처리기 함수에서 차단될 수 있습니다.
ERROR_SHUTDOWN_IN_PROGRESS
시스템이 종료되고 있습니다.

발언

ControlServiceEx 함수는 SCM(서비스 제어 관리자)에 요청된 제어 코드를 서비스에 보내도록 요청합니다. SCM은 서비스에서 코드를 수락하도록 지정하고 제어 코드를 보낼 수 있는 상태에 있는 경우 코드를 보냅니다.

SCM은 서비스 제어 알림을 직렬 방식으로 처리합니다. 한 서비스가 서비스 제어 알림 처리를 완료할 때까지 기다린 후 다음 알림을 보냅니다. 이 때문에 ControlService Ex에 대한 호출은 서비스가 제어 코드를 처리하는 데 사용 중인 경우 30초 동안 차단됩니다. 시간 제한이 만료되면 사용 중인 서비스가 처리기 함수에서 아직 반환되지 않은 경우 ERROR_SERVICE_REQUEST_TIMEOUT ControlServiceEx 실패합니다.

서비스를 중지하고 시작하려면 이 작업을 수행할 수 있는 보안 설명자가 필요합니다. 기본 보안 설명자를 사용하면 LocalSystem 계정관리자 및 Power Users 그룹의 구성원이 서비스를 중지하고 시작할 수 있습니다. 서비스의 보안 설명자를 변경하려면 서비스대한 DACL 수정을 참조하세요.

QueryServiceStatusEx 함수는 dwCurrentStatedwControlsAccepted 멤버가 실행 중인 서비스에서 허용하는 현재 상태 및 컨트롤을 나타내는 SERVICE_STATUS_PROCESS 구조를 반환합니다. 실행 중인 모든 서비스는 기본적으로 SERVICE_CONTROL_INTERROGATE 제어 코드를 허용합니다. 드라이버는 SERVICE_CONTROL_STOP 및 SERVICE_CONTROL_INTERROGATE 이외의 제어 코드를 허용하지 않습니다. 각 서비스는 SetServiceStatus 함수를 호출하여 상태를 보고할 때 허용하는 다른 컨트롤 코드를 지정합니다. 서비스는 실행 중일 때 어떤 작업을 수행하든 항상 이러한 코드를 수락해야 합니다.

다음 표에서는 가능한 각 서비스 상태의 SCM 동작을 보여 줍니다.

서비스 상태 멈추다 기타 컨트롤
중지 (c) (c)
STOP_PENDING (b) (b)
START_PENDING (a) (b)
달리기 (a) (a)
CONTINUE_PENDING (a) (a)
PAUSE_PENDING (a) (a)
일시 중지 (a) (a)
(a)
서비스에서 이 제어 코드를 수락하는 경우 서비스에 요청을 보냅니다. 그렇지 않으면 ControlServiceEx 0을 반환하고 GetLastError ERROR_INVALID_SERVICE_CONTROL반환하는 .
(b)
서비스가 컨트롤을 보낼 수 있는 상태가 아니므로 controlServiceEx 0을 반환하고 GetLastError ERROR_SERVICE_CANNOT_ACCEPT_CTRL반환할 있습니다.
(c)
서비스가 활성화되지 않았으므로 ControlServiceEx 0을 반환하고 GetLastError ERROR_SERVICE_NOT_ACTIVE반환합니다.

메모

winsvc.h 헤더는 UNICODE 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 ControlServiceEx를 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입대한 규칙을 참조하세요.

요구 사항

요구
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 winsvc.h(Windows.h 포함)
라이브러리 Advapi32.lib
DLL Advapi32.dll

참고 항목

CreateService

OpenService

QueryServiceStatusEx

SERVICE_CONTROL_STATUS_REASON_PARAMS

SERVICE_STATUS

서비스 제어 요청

Service Functions

SetServiceObjectSecurity

SetServiceStatus