Partager via


Événements de déclencheur de service

Un service peut s’inscrire pour être démarré ou arrêté lorsqu’un événement de déclencheur se produit. Cela évite que les services démarrent au démarrage du système, ou que les services interrogent ou attendent activement un événement ; un service peut démarrer quand il est nécessaire, au lieu de démarrer automatiquement, qu’il y ait du travail à effectuer ou non. L’arrivée d’un appareil d’une classe d’interface d’appareil spécifiée ou la disponibilité d’un port de pare-feu particulier sont des exemples d’événements déclencheurs prédéfinis. Un service peut également s’inscrire à un événement déclencheur personnalisé généré par un fournisseur de suivi d’événements pour Windows (ETW).

Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP : Les événements de déclencheur de service ne sont pas pris en charge avant Windows Server 2008 R2 et Windows 7.

Un déclencheur se compose d’un type d’événement déclencheur, d’un sous-type d’événement de déclencheur, de l’action à effectuer en réponse à l’événement déclencheur et (pour certains types d’événements de déclencheur) d’un ou de plusieurs éléments de données spécifiques au déclencheur. Le sous-type et les éléments de données spécifiques au déclencheur spécifient ensemble les conditions de notification de l’événement au service. Le format d’un élément de données dépend du type d’événement déclencheur ; Un élément de données peut être des données binaires, une chaîne ou une chaîne multistring. Les chaînes doivent être Unicode ; Les chaînes ANSI ne sont pas prises en charge.

Pour s’inscrire aux événements déclencheurs, le service appelle ChangeServiceConfig2 avec SERVICE_CONFIG_TRIGGER_INFO et fournit une structure SERVICE_TRIGGER_INFO . La structure SERVICE_TRIGGER_INFO pointe vers un tableau de structures SERVICE_TRIGGER , chacune spécifiant un déclencheur.

L’action de déclencheur spécifiée est effectuée si la condition de déclencheur est true au démarrage du système, ou si la condition de déclencheur devient vraie pendant l’exécution du système. Par exemple, si un service s’inscrit pour être démarré lorsqu’un appareil particulier est disponible, le service démarre lorsque le système démarre si l’appareil est déjà branché à l’ordinateur ; le service est démarré lorsque l’appareil arrive si l’utilisateur le branche pendant que le système est en cours d’exécution.

Si un déclencheur a des éléments de données spécifiques au déclencheur, l’action de déclencheur est effectuée uniquement si l’élément de données qui accompagne l’événement déclencheur correspond à l’un des éléments de données spécifiés par le service avec le déclencheur. La correspondance de données binaires s’effectue par comparaison au niveau du bit. La correspondance de chaîne ne respecte pas la casse. Si l’élément de données est une chaîne multistring, toutes les chaînes de la chaîne multistring doivent correspondre.

Lorsqu’un service est démarré en réponse à un événement déclencheur, le service reçoit SERVICE_TRIGGER_STARTED_ARGUMENT en tant que argv[1] dans sa fonction de rappel ServiceMain . Argv[0] est toujours le nom court du service.

Un service qui s’inscrit pour être démarré en réponse à un événement de déclencheur peut s’arrêter après un délai d’inactivité lorsque le service n’a pas de travail à effectuer. Un service qui s’arrête lui-même doit être prêt à gérer SERVICE_CONTROL_TRIGGEREVENT demandes de contrôle qui arrivent pendant que le service s’arrête lui-même. Le SCM envoie une demande de contrôle SERVICE_CONTROL_TRIGGEREVENT chaque fois qu’un nouvel événement de déclencheur se produit alors que le service est en cours d’exécution. Pour éviter de perdre des événements déclencheurs, le service doit retourner ERROR_SHUTDOWN_IN_PROGRESS pour toute demande de contrôle SERVICE_CONTROL_TRIGGEREVENT qui arrive pendant la transition du service de l’exécution à l’arrêt. Cela indique au SCM de mettre en file d’attente les événements déclencheurs et d’attendre que le service passe à l’état arrêté. Le SCM effectue ensuite l’action associée à l’événement de déclencheur mis en file d’attente, comme le démarrage du service.

Lorsque le service est prêt à gérer à nouveau des événements déclencheurs, il définit SERVICE_ACCEPT_TRIGGEREVENT dans son masque accepté par les contrôles dans un appel à SetServiceStatus. Cette opération est généralement effectuée lorsque le service appelle SetServiceStatus avec SERVICE_RUNNING. Le SCM émet ensuite une requête SERVICE_CONTROL_TRIGGEREVENT pour chaque événement de déclencheur mis en file d’attente jusqu’à ce que la file d’attente soit vide.

Un service qui a des services dépendants en cours d’exécution ne peut pas être arrêté en réponse à un événement déclencheur.

Les demandes trigger-start et trigger-stop ne sont pas garanties dans des conditions de mémoire faible.

Utilisez la fonction QueryServiceConfig2 pour récupérer la configuration de l’événement déclencheur d’un service.

L’outil SC (sc.exe) peut être utilisé pour configurer ou interroger les événements déclencheurs d’un service à l’invite de commandes. Utilisez l’option triggerinfo pour configurer un service pour qu’il démarre ou s’arrête en réponse à un événement déclencheur. Utilisez l’option qtriggerinfo pour interroger la configuration du déclencheur d’un service.

L’exemple suivant interroge la configuration du déclencheur du service W32time, qui est configuré pour démarrer lorsque l’ordinateur est joint à un domaine et s’arrêter lorsque l’ordinateur quitte le domaine.

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]

L’exemple suivant interroge la configuration du déclencheur du service d’entrée de tablette, qui est configuré pour démarrer lorsqu’un appareil HID avec le GUID {4d1e55b2-f16f-11cf-88cb-001111000030} et l’un des ID d’appareil HID spécifiés arrive.

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