服务触发器事件

发生触发器事件时,服务可以注册为启动或停止。 这样就无需在系统启动时启动服务,或者让服务轮询或主动等待事件:服务在需要时可以启动,而不是自动启动,无论是否有工作要做。 预定义触发器事件的示例包括指定设备接口类的设备到达或特定防火墙端口的可用性。 服务还可以注册由Windows (ETW) 提供程序生成的自定义触发器事件

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:在 Windows Server 2008 R2 和 Windows 7 之前,不支持服务触发器事件。

触发器由触发器事件类型、触发器事件子类型、响应触发器事件执行的操作以及某些触发器事件类型的 () 一个或多个特定于触发器的数据项。 子类型和特定于触发器的数据项一起指定通知事件服务的条件。 数据项的格式取决于触发器事件类型;数据项可以是二进制数据、字符串或多字符串。 字符串必须是 Unicode;不支持 ANSI 字符串。

若要注册触发器事件,服务使用 SERVICE_CONFIG_TRIGGER_INFO 调用 ChangeServiceConfig2 并提供SERVICE_TRIGGER_INFO结构。 SERVICE_TRIGGER_INFO结构指向一个SERVICE_TRIGGER结构的数组,每个数组指定一个触发器。

如果在系统启动时触发条件为 true,或者当系统运行时触发条件为 true,则执行指定的触发器操作。 例如,如果某个服务注册为在特定设备可用时启动,则当系统已插入计算机时,系统会启动该服务;如果用户在系统运行时插入设备,则服务将启动。

如果触发器具有特定于触发器的数据项,则仅当触发器事件随附的数据项与服务使用触发器指定的其中一个数据项匹配时,才会执行触发器操作。 二进制数据匹配是通过按位比较完成的。 字符串匹配不区分大小写。 如果数据项是多字符串,则多字符串中的所有字符串都必须匹配。

当服务在响应触发器事件时,服务在其 ServiceMain 回调函数中接收SERVICE_TRIGGER_STARTED_ARGUMENT为 argv[1]。 Argv[0] 始终是服务的短名称。

注册以响应触发器事件的服务可能会在服务没有工作时空闲超时后停止自身。 停止自身的服务必须准备好处理在服务停止时到达 SERVICE_CONTROL_TRIGGEREVENT 控制请求。 每当服务处于运行状态时发生新的触发器事件时,SCM 就会发送 SERVICE_CONTROL_TRIGGEREVENT 控制请求。 为了避免丢失触发器事件,服务应返回 ERROR_SHUTDOWN_IN_PROGRESS ,以便在服务从运行到停止时到达的任何 SERVICE_CONTROL_TRIGGEREVENT 控制请求。 这指示 SCM 对触发器事件进行排队,并等待服务进入停止状态。 然后,SCM 执行与排队触发器事件关联的操作,例如启动服务。

当服务准备好再次处理触发器事件时,它会在其控件接受的掩码中设置对 SetServiceStatus 的调用中的SERVICE_ACCEPT_TRIGGEREVENT。 当服务使用 SERVICE_RUNNING 调用 SetServiceStatus 时,通常会执行此操作。 然后,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]

以下示例查询平板电脑输入服务的触发器配置,该配置配置为在 GUID {4d1e55b2-f16f-11cf-88cb-001111000030} 和任何指定的 HID 设备 ID 到达时启动。

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