Поделиться через


События триггера службы

Служба может быть зарегистрирована для запуска или остановки при возникновении события триггера. Это избавляет от необходимости запуска служб при запуске системы, а также для того, чтобы службы опрашивать или активно ожидать события; служба может запускаться при необходимости, а не автоматически запускаться независимо от того, есть ли работа. Примеры предопределенных событий триггера включают получение устройства указанного класса интерфейса устройства или доступность определенного порта брандмауэра. Служба также может зарегистрироваться для пользовательского события триггера, созданного поставщиком трассировки событий Windows (ETW).

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP: События триггера службы не поддерживаются до Windows Server 2008 R2 и Windows 7.

Триггер состоит из типа события триггера, подтипа события триггера, действия, выполняемого в ответ на событие триггера, и (для определенных типов событий триггера) одного или нескольких элементов данных, относящихся к триггеру. Подтип и элементы данных, относящиеся к триггеру, вместе определяют условия для уведомления службы о событии. Формат элемента данных зависит от типа события триггера; Элемент данных может быть двоичными данными, строкой или многострокой. Строки должны быть в Юникоде; Строки ANSI не поддерживаются.

Чтобы зарегистрироваться для событий триггера, служба вызывает ChangeServiceConfig2 с SERVICE_CONFIG_TRIGGER_INFO и предоставляет SERVICE_TRIGGER_INFO структуру. Структура SERVICE_TRIGGER_INFO указывает на массив SERVICE_TRIGGER структур, каждая из которых указывает один триггер.

Указанное действие триггера выполняется, если условие триггера имеет значение true при запуске системы или если условие триггера становится истинным во время работы системы. Например, если служба регистрируется для запуска, когда доступно определенное устройство, служба запускается при запуске системы, если устройство уже подключено к компьютеру; служба запускается при поступлении устройства, если пользователь подключает устройство во время работы системы.

Если триггер содержит элементы данных, относящиеся к триггеру, действие триггера выполняется только в том случае, если элемент данных, сопровождающий событие триггера, соответствует одному из элементов данных, указанных службой с триггером. Сопоставление двоичных данных выполняется путем побитового сравнения. При сопоставлении строк регистр не учитывается. Если элемент данных является мультистрокой, все строки в мультистроке должны совпадать.

При запуске службы в ответ на событие триггера служба получает SERVICE_TRIGGER_STARTED_ARGUMENT в виде argv[1] в функции обратного вызова ServiceMain . Argv[0] — это всегда короткое имя службы.

Служба, которая регистрируется для запуска в ответ на событие триггера, может остановиться после истечения времени ожидания простоя, когда службе не нужно выполнять никаких действий. Служба, которая сама останавливается, должна быть готова к обработке запросов SERVICE_CONTROL_TRIGGEREVENT управления, поступающих во время остановки службы. SCM отправляет запрос SERVICE_CONTROL_TRIGGEREVENT элемента управления всякий раз, когда происходит новое событие триггера, когда служба находится в состоянии выполнения. Чтобы избежать потери событий триггера, служба должна возвращать ERROR_SHUTDOWN_IN_PROGRESS для любого запроса управления SERVICE_CONTROL_TRIGGEREVENT , который поступает при переходе службы из запущенной в остановленную. Это предписывает SCM ставить события триггера в очередь и ждать, пока служба перейдет в остановленное состояние. Затем SCM выполняет действие, связанное с событием триггера в очереди, например запуск службы.

Когда служба будет готова снова обрабатывать события триггера, она задает SERVICE_ACCEPT_TRIGGEREVENT в маске, принятой элементами управления, в вызове SetServiceStatus. Обычно это делается, когда служба вызывает SetServiceStatus с SERVICE_RUNNING. Затем SCM отправляет запрос SERVICE_CONTROL_TRIGGEREVENT для каждого события триггера в очереди, пока очередь не пуста.

Служба с запущенной зависимыми службами не может быть остановлена в ответ на событие триггера.

Запросы на запуск триггера и триггер-остановку не гарантируются в условиях нехватки памяти.

Используйте функцию QueryServiceConfig2 для получения конфигурации события триггера службы.

Средство SC (sc.exe) можно использовать для настройки или запроса событий триггера службы в командной строке. Используйте параметр triggerinfo , чтобы настроить запуск или остановку службы в ответ на событие триггера. Используйте параметр qtriggerinfo для запроса конфигурации триггера службы.

В следующем примере запрашивается конфигурация триггера службы W32time, которая настроена для запуска при присоединении компьютера к домену и остановки при выходе компьютера из домена.

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]

В следующем примере запрашивается конфигурация триггера службы ввода планшета, которая настроена для запуска при поступлении устройства HID с ИДЕНТИФИКАТОРом GUID {4d1e55b2-f16f-11cf-88cb-001111000030} и любого из указанных идентификаторов устройств HID.

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