Eventi trigger di servizio
Un servizio può registrarsi per essere avviato o arrestato quando si verifica un evento trigger. In questo modo si elimina la necessità di avviare i servizi all'avvio del sistema o per consentire ai servizi di eseguire il polling o attendere attivamente un evento; un servizio può essere avviato quando è necessario, invece di avviarsi automaticamente indipendentemente dal fatto che ci sia o meno lavoro da eseguire. Esempi di eventi trigger predefiniti includono l'arrivo di un dispositivo di una classe di interfaccia del dispositivo specificata o la disponibilità di una determinata porta del firewall. Un servizio può anche eseguire la registrazione per un evento trigger personalizzato generato da un provider ETW (Event Tracing for Windows ).
Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: Gli eventi trigger del servizio non sono supportati fino a Windows Server 2008 R2 e Windows 7.
Un trigger è costituito da un tipo di evento trigger, un sottotipo di evento trigger, l'azione da eseguire in risposta all'evento trigger e (per determinati tipi di evento trigger) uno o più elementi di dati specifici del trigger. Il sottotipo e gli elementi di dati specifici del trigger specificano insieme le condizioni per la notifica al servizio dell'evento. Il formato di un elemento di dati dipende dal tipo di evento trigger; un elemento di dati può essere dati binari, una stringa o una multistringa. Le stringhe devono essere Unicode; Le stringhe ANSI non sono supportate.
Per eseguire la registrazione per gli eventi trigger, il servizio chiama ChangeServiceConfig2 con SERVICE_CONFIG_TRIGGER_INFO e fornisce una struttura SERVICE_TRIGGER_INFO . La struttura SERVICE_TRIGGER_INFO punta a una matrice di strutture SERVICE_TRIGGER , ognuna delle quali specifica un trigger.
L'azione trigger specificata viene eseguita se la condizione del trigger è true all'avvio del sistema o se la condizione del trigger diventa true durante l'esecuzione del sistema. Ad esempio, se un servizio viene registrato per l'avvio quando è disponibile un determinato dispositivo, il servizio viene avviato all'avvio del sistema se il dispositivo è già collegato al computer; il servizio viene avviato quando arriva il dispositivo se l'utente collega il dispositivo mentre il sistema è in esecuzione.
Se un trigger include elementi di dati specifici del trigger, viene eseguita l'azione trigger solo se l'elemento di dati che accompagna l'evento trigger corrisponde a uno degli elementi di dati specificati dal servizio con il trigger. La corrispondenza dei dati binari viene eseguita dal confronto bit per bit. La corrispondenza di stringhe non fa distinzione tra maiuscole e minuscole. Se l'elemento di dati è una multistringa, tutte le stringhe nella multistringa devono corrispondere.
Quando un servizio viene avviato in risposta a un evento trigger, il servizio riceve SERVICE_TRIGGER_STARTED_ARGUMENT come argv[1] nella relativa funzione di callback ServiceMain . Argv[0] è sempre il nome breve del servizio.
Un servizio che esegue la registrazione per l'avvio in risposta a un evento trigger può arrestarsi dopo un timeout di inattività quando il servizio non ha alcun lavoro da eseguire. Un servizio che si arresta deve essere preparato per gestire SERVICE_CONTROL_TRIGGEREVENT richieste di controllo che arrivano mentre il servizio si arresta. SCM invia una richiesta di controllo SERVICE_CONTROL_TRIGGEREVENT ogni volta che si verifica un nuovo evento trigger mentre il servizio si trova nello stato in esecuzione. Per evitare la perdita di eventi trigger, il servizio deve restituire ERROR_SHUTDOWN_IN_PROGRESS per qualsiasi richiesta di controllo SERVICE_CONTROL_TRIGGEREVENT che arriva mentre il servizio passa dall'esecuzione all'arresto. In questo modo, SCM deve accodare gli eventi trigger e attendere che il servizio entri nello stato arrestato. Gestione configurazione server esegue quindi l'azione associata all'evento trigger in coda, ad esempio l'avvio del servizio.
Quando il servizio è pronto per gestire di nuovo gli eventi trigger, imposta SERVICE_ACCEPT_TRIGGEREVENT nella maschera accettata dai controlli in una chiamata a SetServiceStatus. Questa operazione viene in genere eseguita quando il servizio chiama SetServiceStatus con SERVICE_RUNNING. Gestione configurazione sito invia quindi una richiesta di SERVICE_CONTROL_TRIGGEREVENT per ogni evento trigger in coda fino a quando la coda non è vuota.
Un servizio con servizi dipendenti in esecuzione non può essere arrestato in risposta a un evento trigger.
Le richieste trigger-start e trigger-stop non sono garantite in condizioni di memoria insufficiente.
Usare la funzione QueryServiceConfig2 per recuperare la configurazione dell'evento trigger di un servizio.
Lo strumento SC (sc.exe) può essere usato per configurare o eseguire query sugli eventi trigger di un servizio al prompt dei comandi. Usare l'opzione triggerinfo per configurare un servizio per l'avvio o l'arresto in risposta a un evento trigger. Usare l'opzione qtriggerinfo per eseguire query sulla configurazione del trigger di un servizio.
Nell'esempio seguente viene eseguita una query sulla configurazione del trigger del servizio W32time, configurato per l'avvio quando il computer viene aggiunto a un dominio e si arresta quando il computer esce dal dominio.
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]
Nell'esempio seguente viene eseguita una query sulla configurazione del trigger del servizio di input tablet, configurato per l'avvio quando un dispositivo HID con il GUID {4d1e55b2-f16f-11cf-88cb-001111000030} e uno qualsiasi degli ID dispositivo HID specificati arriva.
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