Eventi trigger di servizio
Un servizio può essere registrato per essere avviato o arrestato quando si verifica un evento trigger. Ciò elimina la necessità di avviare i servizi all'avvio del sistema o per consentire ai servizi di eseguire il polling o di attendere attivamente un evento; un servizio può essere avviato quando è necessario, invece di iniziare 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 dispositivo specificata o la disponibilità di una determinata porta del firewall. Un servizio può anche registrarsi per un evento trigger personalizzato generato da un provider Event Tracing for Windows (ETW).
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 di 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 di 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 del trigger specificata viene eseguita se la condizione del trigger è true all'avvio del sistema o se la condizione del trigger diventa true mentre il sistema è in esecuzione. Ad esempio, se un servizio viene registrato quando è disponibile un particolare dispositivo, il servizio viene avviato all'avvio del sistema se il dispositivo è già collegato al computer; il servizio viene avviato all'arrivo del dispositivo se l'utente collega il dispositivo mentre il sistema è in esecuzione.
Se un trigger include elementi di dati specifici del trigger, l'azione trigger viene eseguita 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 dati è un 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 callbackServiceMain. Argv[0] è sempre il nome breve del servizio.
Un servizio che esegue la registrazione per l'avvio in risposta a un evento trigger potrebbe 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. Gestione controllo servizi 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 di perdere eventi di 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 controllo servizi 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 relativa maschera accettata dai controlli in una chiamata a SetServiceStatus. Questa operazione viene in genere eseguita quando il servizio chiama SetServiceStatus con SERVICE_RUNNING. Gestione controllo servizi 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 diQueryServiceConfig2per recuperare la configurazione dell'evento trigger di un servizio.
Lo strumento SC (sc.exe) può essere usato per configurare o eseguire query sugli eventi di 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 una 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-001111100030} e arriva uno degli ID dispositivo HID specificati.
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