Udostępnij za pośrednictwem


Zdarzenia wyzwalacza usługi

Usługa może zostać uruchomiona lub zatrzymana po wystąpieniu zdarzenia wyzwalacza. Eliminuje to konieczność uruchamiania usług podczas uruchamiania systemu lub sondowania usług lub aktywnego oczekiwania na zdarzenie; usługa może być uruchamiana, gdy jest potrzebna, zamiast uruchamiać się automatycznie, niezależnie od tego, czy istnieje praca do wykonania. Przykłady wstępnie zdefiniowanych zdarzeń wyzwalacza obejmują przybycie urządzenia określonej klasy interfejsu urządzenia lub dostępność określonego portu zapory. Usługa może również zarejestrować się w celu uzyskania niestandardowego zdarzenia wyzwalacza wygenerowanego przez dostawcę śledzenia zdarzeń systemu Windows (ETW).

Windows Server 2008, Windows Vista, Windows Server 2003 i Windows XP: zdarzenia wyzwalacza usługi nie są obsługiwane do systemu Windows Server 2008 R2 i Windows 7.

Wyzwalacz składa się z typu zdarzenia wyzwalacza, podtypu zdarzenia wyzwalacza, akcji, która ma zostać podjęta w odpowiedzi na zdarzenie wyzwalacza, oraz (w przypadku niektórych typów zdarzeń wyzwalacza) co najmniej jednego elementu danych specyficznych dla wyzwalacza. Podtyp i elementy danych specyficzne dla wyzwalacza razem określają warunki powiadamiania usługi zdarzenia. Format elementu danych zależy od typu zdarzenia wyzwalacza; element danych może być danymi binarnymi, ciągiem lub wielociągowym. Ciągi muszą być unicode; Ciągi ANSI nie są obsługiwane.

Aby zarejestrować się pod kątem zdarzeń wyzwalacza, usługa wywołuje ChangeServiceConfig2 za pomocą SERVICE_CONFIG_TRIGGER_INFO i dostarcza strukturę SERVICE_TRIGGER_INFO. Struktura SERVICE_TRIGGER_INFO wskazuje tablicę struktur SERVICE_TRIGGER, z których każdy określa jeden wyzwalacz.

Określona akcja wyzwalacza jest wykonywana, jeśli warunek wyzwalacza ma wartość true podczas uruchamiania systemu lub jeśli warunek wyzwalacza stanie się spełniony podczas działania systemu. Jeśli na przykład usługa zostanie uruchomiona po udostępnieniu określonego urządzenia, usługa zostanie uruchomiona po uruchomieniu systemu, jeśli urządzenie jest już podłączone do komputera; usługa jest uruchamiana po nadejściu urządzenia, jeśli użytkownik podłącza urządzenie podczas działania systemu.

Jeśli wyzwalacz zawiera elementy danych specyficznych dla wyzwalacza, akcja wyzwalacza jest wykonywana tylko wtedy, gdy element danych, który towarzyszy zdarzeniu wyzwalacza, pasuje do jednego z elementów danych określonych przez usługę z wyzwalaczem. Dopasowywanie danych binarnych odbywa się za pomocą porównania bitowego. Dopasowywanie ciągów jest bez uwzględniania wielkości liter. Jeśli element danych jest wielociągowy, wszystkie ciągi w wielociągowaniu muszą być zgodne.

Po uruchomieniu usługi w odpowiedzi na zdarzenie wyzwalacza usługa odbiera SERVICE_TRIGGER_STARTED_ARGUMENT jako argv[1] w funkcji ServiceMain wywołania zwrotnego. Argv[0] to zawsze krótka nazwa usługi.

Usługa, która rejestruje się w odpowiedzi na zdarzenie wyzwalacza, może zatrzymać się po przekroczeniu limitu czasu bezczynności, gdy usługa nie działa. Usługa, która zatrzymuje się, musi być przygotowana do obsługi SERVICE_CONTROL_TRIGGEREVENT żądań kontroli, które docierają, gdy usługa się zatrzymuje. Program SCM wysyła żądanie kontroli SERVICE_CONTROL_TRIGGEREVENT za każdym razem, gdy wystąpi nowe zdarzenie wyzwalacza, gdy usługa jest w stanie uruchomienia. Aby uniknąć utraty zdarzeń wyzwalacza, usługa powinna zwrócić ERROR_SHUTDOWN_IN_PROGRESS dla każdego żądania kontroli SERVICE_CONTROL_TRIGGEREVENT, które zostanie dostarczone, gdy usługa przechodzi z działania do zatrzymania. Powoduje to, że program SCM może kolejkować zdarzenia wyzwalacza i czekać na wprowadzenie stanu zatrzymania usługi. Narzędzie SCM następnie podejmuje akcję skojarzona ze zdarzeniem wyzwalacza w kolejce, na przykład uruchomieniem usługi.

Gdy usługa jest gotowa do ponownego obsługi zdarzeń wyzwalacza, ustawia SERVICE_ACCEPT_TRIGGEREVENT w akceptowanej przez kontrolki masce w wywołaniu SetServiceStatus. Zwykle jest to wykonywane, gdy usługa wywołuje SetServiceStatus z SERVICE_RUNNING. Narzędzie SCM wysyła następnie żądanie SERVICE_CONTROL_TRIGGEREVENT dla każdego zdarzenia wyzwalacza w kolejce, dopóki kolejka nie będzie pusta.

Nie można zatrzymać usługi, która ma uruchomione usługi zależne w odpowiedzi na zdarzenie wyzwalacza.

Żądania wyzwalacza uruchamiania i zatrzymywania wyzwalacza nie są gwarantowane w warunkach małej ilości pamięci.

Użyj funkcji QueryServiceConfig2, aby pobrać konfigurację zdarzenia wyzwalacza usługi.

Narzędzie SC (sc.exe) może służyć do konfigurowania lub wykonywania zapytań o zdarzenia wyzwalacza usługi w wierszu polecenia. Użyj opcji triggerinfo, aby skonfigurować usługę do uruchamiania lub zatrzymywania w odpowiedzi na zdarzenie wyzwalacza. Użyj opcji qtriggerinfo, aby wysłać zapytanie do konfiguracji wyzwalacza usługi.

Poniższy przykład wykonuje zapytanie o konfigurację wyzwalacza usługi W32time, która jest skonfigurowana do uruchamiania, gdy komputer jest przyłączony do domeny i zatrzymuje się po opuszczeniu domeny przez komputer.

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]

Poniższy przykład wykonuje zapytania dotyczące konfiguracji wyzwalacza usługi wejściowej tabletu, która jest skonfigurowana do uruchamiania, gdy urządzenie HID z identyfikatorem GUID {4d1e55b2-f16f-11cf-88cb-001111000030} i jakiekolwiek określone identyfikatory urządzeń HID docierają.

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