次の方法で共有


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 が、dwReason または pszComment SERVICE_CONTROL_STATUS_REASON_PARAMS 構造体のメンバーが無効です。
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 関数は、要求されたコントロール コードをサービスに送信するように Service Control Manager (SCM) に要求します。 SCM は、サービスがコードを受け入れることを指定しており、コントロール コードを送信できる状態にある場合にコードを送信します。

SCM は、サービス制御通知をシリアル形式で処理します。1 つのサービスがサービス 制御通知の処理を完了するまで待機してから、次の通知を送信します。 このため、ControlServiceEx の呼び出し、コントロール コードの処理がビジー状態のサービスがある場合、30 秒間ブロックされます。 タイムアウトの有効期限が切れたときにビジー状態のサービスがハンドラー関数からまだ返されていない場合は、ControlServiceEx ERROR_SERVICE_REQUEST_TIMEOUTで失敗します。

サービスを停止して開始するには、それを可能にするセキュリティ記述子が必要です。 既定のセキュリティ記述子を使用すると、LocalSystem アカウント、および Administrators グループと Power Users グループのメンバーがサービスを停止および開始できます。 サービスのセキュリティ記述子を変更するには、「サービスの DACL の変更」を参照してください。

QueryServiceStatusEx 関数は、dwCurrentState および dwControlsAccepted メンバーが現在の状態を示し、実行中のサービスによって受け入れられるコントロールを持つ 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 または Unicode バージョンを自動的に選択するエイリアスとして ControlServiceEx を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows Vista [デスクトップ アプリのみ]
サポートされる最小サーバー Windows Server 2008 [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winsvc.h (Windows.h を含む)
ライブラリ Advapi32.lib
DLL Advapi32.dll

関連項目

CreateService の

OpenService

QueryServiceStatusEx

SERVICE_CONTROL_STATUS_REASON_PARAMS

SERVICE_STATUS

サービス制御要求の

サービス関数の

SetServiceObjectSecurity の

SetServiceStatus の