События триггера службы
Служба может зарегистрироваться для запуска или остановки при возникновении события триггера. Это устраняет необходимость запуска служб при запуске системы, а также для служб для опроса или активного ожидания события; Служба может запускаться при необходимости, вместо автоматического запуска независимо от того, нужно ли выполнять работу. Примеры предопределенных событий триггера включают прибытие устройства заданного класса интерфейса устройства или доступности определенного порта брандмауэра. Служба также может зарегистрировать событие пользовательского триггера, созданное поставщиком трассировки событий для 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) можно использовать для настройки или запроса событий триггера службы в командной строке. Используйте параметр триггера, чтобы настроить службу для запуска или остановки в ответ на событие триггера. Используйте параметр 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 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