É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 élimine la nécessité de démarrer les services lorsque le système démarre, ou pour que les services interrogent ou attendent activement un événement ; un service peut démarrer lorsqu’il est nécessaire, au lieu de démarrer automatiquement, qu’il y ait du travail à faire. Par exemple, les événements de déclencheur prédéfinis incluent 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. 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 tant que Windows Server 2008 R2 et Windows 7 ne sont pas pris en charge.
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 à entreprendre en réponse à l’événement de déclencheur et (pour certains types d’événements de déclencheur) d’un ou 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 pour notifier le service de l’événement. 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 vous inscrire aux événements de déclencheur, le service appelle ChangeServiceConfig2 avec SERVICE_CONFIG_TRIGGER_INFO et fournit une structure de SERVICE_TRIGGER_INFO. La structure SERVICE_TRIGGER_INFO pointe vers un tableau de structures SERVICE_TRIGGER, chacun spécifiant un déclencheur.
L’action de déclencheur spécifiée est effectuée si la condition de déclencheur est vraie au démarrage du système ou si la condition de déclencheur devient true 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 est démarré 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 se connecte à l’appareil pendant l’exécution du système.
Si un déclencheur possède 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 de 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 est effectuée 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 multiple, toutes les chaînes de la chaîne multistring doivent correspondre.
Lorsqu’un service est démarré en réponse à un événement de 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 à démarrer 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 à faire. Un service qui s’arrête 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 pendant que le service est dans l’état en cours d’exécution. Pour éviter de perdre des événements de déclencheur, le service doit retourner ERROR_SHUTDOWN_IN_PROGRESS pour toute demande de contrôle SERVICE_CONTROL_TRIGGEREVENT qui arrive pendant que le service passe de l’exécution à l’arrêt. Cela indique au SCM de mettre en file d’attente les événements de déclencheur et d’attendre que le service entre dans 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 les événements de déclencheur, il définit SERVICE_ACCEPT_TRIGGEREVENT dans son masque accepté par les contrôles dans un appel à SetServiceStatus. Cela est généralement effectué lorsque le service appelle SetServiceStatus avec SERVICE_RUNNING. Le SCM émet ensuite une demande de SERVICE_CONTROL_TRIGGEREVENT pour chaque événement 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 de déclencheur.
Les requêtes de démarrage et de déclenchement-arrêt ne sont pas garanties dans des conditions de mémoire insuffisantes.
Utilisez la fonction QueryServiceConfig2 pour récupérer la configuration d’événement déclencheur d’un service.
L’outil SC (sc.exe) peut être utilisé pour configurer ou interroger les événements de déclencheur d’un service à l’invite de commandes. Utilisez l’option triggerinfo pour configurer un service pour démarrer ou arrêter en réponse à un événement de 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ée pour démarrer lorsque l’ordinateur est joint à un domaine et s’arrête 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ée 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