サービス トリガー イベント
サービスは、トリガー イベントが発生したときに開始または停止するように登録できます。 これにより、システムの起動時にサービスを開始したり、サービスがイベントをポーリングまたはアクティブに待機したりする必要がなくなります。サービスは、必要に応じて開始でき、実行する作業があるかどうかに関係なく、自動的に開始できます。 定義済みのトリガー イベントの例としては、指定したデバイス インターフェイス クラスのデバイスの到着や、特定のファイアウォール ポートの可用性などがあります。 サービスは、 Event Tracing for Windows (ETW) プロバイダーによって生成されたカスタム トリガー イベントに登録することもできます。
Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP: サービス トリガー イベントは、Windows Server 2008 R2 と Windows 7 までサポートされません。
トリガーは、トリガー イベントの種類、トリガー イベントのサブタイプ、トリガー イベントに応答して実行されるアクション、および (特定のトリガー イベントの種類の場合) 1 つ以上のトリガー固有のデータ項目で構成されます。 サブタイプとトリガー固有のデータ項目は、イベントをサービスに通知するための条件を指定します。 データ項目の形式は、トリガー イベントの種類によって異なります。データ項目には、バイナリ データ、文字列、または複数文字列を指定できます。 文字列は Unicode である必要があります。ANSI 文字列はサポートされていません。
トリガー イベントに登録するために、サービスは ChangeServiceConfig2 を SERVICE_CONFIG_TRIGGER_INFO で呼び出し、 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 デバイスが到着したときに開始するように構成されています。
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