次の方法で共有


サービス トリガー イベント

サービスは、トリガー イベントが発生したときに開始または停止されるように登録できます。 これにより、システムの起動時にサービスを開始したり、サービスがイベントをポーリングしたりアクティブに待機したりする必要がなくなります。サービスは、必要に応じて開始でき、実行する作業があるかどうかに関係なく、自動的に開始できます。 定義済みのトリガー イベントの例としては、指定したデバイス インターフェイス クラスのデバイスの到着や、特定のファイアウォール ポートの可用性などがあります。 サービスは、Event Tracing for Windows (ETW) プロバイダーによって生成されたカスタム トリガー イベントに登録することもできます。

Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: Service トリガー イベントは、Windows Server 2008 R2 および Windows 7 までサポートされません。

トリガーは、トリガー イベントの種類、トリガー イベント サブタイプ、トリガー イベントに応答して実行されるアクション、および (特定のトリガー イベントの種類の場合) 1 つ以上のトリガー固有のデータ項目で構成されます。 サブタイプとトリガー固有のデータ項目は、イベントをサービスに通知するための条件を指定します。 データ項目の形式は、トリガー イベントの種類によって異なります。データ項目には、バイナリ データ、文字列、または複数文字列を指定できます。 文字列は Unicode である必要があります。ANSI 文字列はサポートされていません。

トリガー イベントに登録するために、サービスは SERVICE_CONFIG_TRIGGER_INFOChangeServiceConfig2 を呼び出し、SERVICE_TRIGGER_INFO 構造を提供します。 SERVICE_TRIGGER_INFO 構造体は、それぞれ 1 つのトリガーを指定する SERVICE_TRIGGER 構造体の配列を指します。

指定されたトリガー・アクションは、システムの開始時にトリガー条件が true の場合、またはシステムの実行中にトリガー条件が true になった場合に実行されます。 たとえば、特定のデバイスが使用可能な場合にサービス登録を開始する場合、デバイスが既にコンピューターに接続されている場合、システムの起動時にサービスが開始されます。システムの実行中にユーザーがデバイスを接続すると、デバイスが到着したときにサービスが開始されます。

トリガーにトリガー固有のデータ項目がある場合、トリガー アクションは、トリガー イベントに付随するデータ項目が、サービスがトリガーで指定したデータ項目の 1 つと一致する場合にのみ実行されます。 バイナリ データの一致は、ビットごとの比較によって行われます。 文字列の一致では大文字と小文字が区別されません。 データ項目が複数文字列の場合、multistring 内のすべての文字列が一致する必要があります。

トリガー イベントに応答してサービスが開始されると、サービスは、ServiceMain コールバック関数で argv [1]SERVICE_TRIGGER_STARTED_ARGUMENT を受け取ります。 Argv [0]は、常にサービスの短い名前です。

トリガー イベントに応答して開始されるように登録されたサービスは、サービスが実行する作業がない場合、アイドルタイムアウト後に停止する可能性があります。 サービス自体を停止するサービスは、サービス自体が停止している間に到着 SERVICE_CONTROL_TRIGGEREVENT 制御要求を処理するように準備する必要があります。 SCM は、サービスが実行中の状態のときに新しいトリガー イベントが発生するたびに、SERVICE_CONTROL_TRIGGEREVENT 制御要求を送信します。 トリガー イベントが失われるのを防ぐために、サービスは、サービスの実行中から停止中に到着した SERVICE_CONTROL_TRIGGEREVENT 制御要求の ERROR_SHUTDOWN_IN_PROGRESS を返す必要があります。 これにより、SCM はキュートリガー イベントをキューに入れ、サービスが停止状態になるまで待機するように指示します。 その後、SCM は、キューに登録されたトリガー イベントに関連付けられたアクション (サービスの開始など) を実行します。

サービスは、トリガー イベントを再び処理する準備ができたら、SetServiceStatusへの呼び出しで、コントロールで受け入れられたマスクSERVICE_ACCEPT_TRIGGEREVENT を設定します。 これは通常、サービスが SERVICE_RUNNINGで SetServiceStatus 呼び出すときに行われます。 その後、キューが空になるまで、SCM はキューに登録されたトリガー イベントごとに SERVICE_CONTROL_TRIGGEREVENT 要求を発行します。

依存サービスが実行されているサービスは、トリガー イベントに応答して停止できません。

トリガー開始要求とトリガー停止要求は、メモリ不足の条件下では保証されません。

QueryServiceConfig2 関数を使用して、サービスのトリガー イベント構成を取得します。

SC ツール (sc.exe) を使用して、コマンド プロンプトでサービスのトリガー イベントを構成または照会できます。 triggerinfo オプションを使用して、トリガー イベントに応答して開始または停止するようにサービスを構成します。 qtriggerinfo オプションを使用して、サービスのトリガー構成を照会します。

次の例では、W32time サービスのトリガー構成を照会します。この構成は、コンピューターがドメインに参加したときに開始され、コンピューターがドメインを離れたときに停止するように構成されています。

C:\>sc qtriggerinfo w32time
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: w32time

        START SERVICE
          DOMAIN JOINED STATUS         : 1ce20aba-9851-4421-9430-1ddeb766e809 [DOMAIN JOINED]
        STOP SERVICE
          DOMAIN JOINED STATUS         : ddaf516e-58c2-4866-9574-c3b615d42ea1 [NOT DOMAIN JOINED]

次の例では、タブレット入力サービスのトリガー構成を照会します。これは、GUID {4d1e55b2-f16f-11cf-88cb-001111000030} を持つ HID デバイス ID が到着したときに開始するように構成されています。

C:\>sc qtriggerinfo tabletinputservice
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: tabletinputservice

        START SERVICE
          DEVICE INTERFACE ARRIVAL     : 4d1e55b2-f16f-11cf-88cb-001111000030 [INTERFACE CLASS GUID]
            DATA                       : HID_DEVICE_UP:000D_U:0001
            DATA                       : HID_DEVICE_UP:000D_U:0002
            DATA                       : HID_DEVICE_UP:000D_U:0003
            DATA                       : HID_DEVICE_UP:000D_U:0004