SERVICE_TRIGGER 结构 (winsvc.h)

表示服务触发器事件。 此结构由 SERVICE_TRIGGER_INFO 结构使用。

语法

typedef struct _SERVICE_TRIGGER {
  DWORD                               dwTriggerType;
  DWORD                               dwAction;
  GUID                                *pTriggerSubtype;
  DWORD                               cDataItems;
  PSERVICE_TRIGGER_SPECIFIC_DATA_ITEM pDataItems;
} SERVICE_TRIGGER, *PSERVICE_TRIGGER;

成员

dwTriggerType

触发器事件类型。 此成员可以是以下值之一。

含义
SERVICE_TRIGGER_TYPE_CUSTOM
20
事件是由 Windows (ETW) 提供程序 的事件跟踪 生成的自定义事件。 此触发器事件可用于启动或停止服务。

pTriggerSubtype 成员指定事件提供程序的 GUID。

pDataItems 成员指定提供程序定义的特定于触发器的数据。

SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL
1
当指定设备接口类的设备到达或在系统启动时存在时,将触发 事件。 此触发器事件通常用于启动服务。

pTriggerSubtype 成员指定设备接口类 GUID。 这些 GUID 在 Windows 驱动程序工具包 (WDK) 提供的特定于设备的头文件中定义。

pDataItems 成员为设备接口类指定一个或多个硬件 ID 和兼容的 ID 字符串。 字符串必须是 Unicode。 如果指定了多个字符串,则当其中任何一个字符串匹配时,将触发该事件。 例如,当设备接口类的设备GUID_DEVINTERFACE_DISK {53f56307-b6bf-11d0-94f2-00a0c91efb8b} 且硬件 ID 字符串 "USBSTOR\GenDisk" 到达时,将启动 Wpdbusenum 服务。

SERVICE_TRIGGER_TYPE_DOMAIN_JOIN
3
当计算机加入或离开域时,将触发 该事件。 此触发器事件可用于启动或停止服务。

pTriggerSubtype 成员指定DOMAIN_JOIN_GUID或DOMAIN_LEAVE_GUID。

不使用 pDataItems 成员。

SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT
4
当防火墙端口打开或防火墙端口关闭后大约 60 秒时,将触发该事件。 此触发器事件可用于启动或停止服务。

pTriggerSubtype 成员指定FIREWALL_PORT_OPEN_GUID或FIREWALL_PORT_CLOSE_GUID。

pDataItems 成员指定侦听事件的服务的端口、协议以及可执行路径和用户信息, (SID 字符串或名称) 。 可以使用“RPC”令牌代替端口来指定 RPC 使用的任何侦听套接字。 可以使用“系统”令牌代替可执行路径,以指定由 Windows 内核创建和侦听的端口。

仅当所有字符串都匹配时,才会触发该事件。 例如,如果在端口 UDP 5001 打开时触发 MyServiceProcess.exe 内托管的 MyService,则特定于触发器的数据将是 的 "5001\0UDP\0%programfiles%\MyApplication\MyServiceProcess.exe\0MyService\0\0"Unicode 表示形式。

注意 在注册此事件之前,基本筛选引擎 (BFE) 服务,并且必须停止依赖它的所有服务。 注册事件后,可以重启 BFE 服务和依赖于它的服务。 有关详细信息,请参阅“备注”。
 
SERVICE_TRIGGER_TYPE_GROUP_POLICY
5
发生计算机策略或用户策略更改时,将触发 该事件。 此触发器事件通常用于启动服务。

pTriggerSubtype 成员指定MACHINE_POLICY_PRESENT_GUID或USER_POLICY_PRESENT_GUID。

不使用 pDataItems 成员。

SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY
2
当 TCP/IP 网络堆栈上的第一个 IP 地址可用或堆栈上的最后一个 IP 地址不可用时,将触发该事件。 此触发器事件可用于启动或停止服务。

pTriggerSubtype 成员指定NETWORK_MANAGER_FIRST_IP_ADDRESS_ARRIVAL_GUID或NETWORK_MANAGER_LAST_IP_ADDRESS_REMOVAL_GUID。

不使用 pDataItems 成员。

SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT
6
当数据包或请求到达特定网络协议时,将触发该事件。 此请求通常用于启动在空闲超时后自行停止的服务,当没有工作要做时。

Windows 7 和 Windows Server 2008 R2: 在Windows 8和Windows Server 2012之前,不支持此触发器类型。

pTriggerSubtype 成员指定以下值之一:RPC_INTERFACE_EVENT_GUID 或 NAMED_PIPE_EVENT_GUID。

pDataItems 成员指定终结点或接口 GUID。 字符串必须是 Unicode。 如果字符串完全匹配,则事件将触发。

dwAction 成员必须SERVICE_TRIGGER_ACTION_SERVICE_START。

dwAction

发生指定的触发器事件时要执行的操作。 此成员可以是以下值之一。

含义
SERVICE_TRIGGER_ACTION_SERVICE_START
1
在发生指定的触发器事件时启动服务。
SERVICE_TRIGGER_ACTION_SERVICE_STOP
2
在发生指定的触发器事件时停止服务。

pTriggerSubtype

指向标识触发器事件子类型的 GUID。 此成员的值取决于 dwTriggerType 成员的值。

如果 dwTriggerType SERVICE_TRIGGER_TYPE_CUSTOM, 则 pTriggerSubtype 是标识自定义事件提供程序的 GUID。

如果 dwTriggerType SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL, 则 pTriggerSubtype 是标识设备接口类的 GUID。

如果 dwTriggerType SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT, 则 pTriggerSubtype 为以下值之一。

含义
NAMED_PIPE_EVENT_GUID
1F81D131-3FAC-4537-9E0C-7E7B0C2F4B55
当发出打开 由 pDataItems 指定的命名管道的请求时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT。 dwAction 成员必须SERVICE_TRIGGER_ACTION_SERVICE_START。
RPC_INTERFACE_EVENT_GUID
BC90D167-9470-4139-A9BA-BE0BBBF5B74D
当终结点解析请求到达 pDataItems 指定的 RPC 接口 GUID 时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT。 dwAction 成员必须SERVICE_TRIGGER_ACTION_SERVICE_START。
 

对于其他触发器事件类型, pTriggerSubType 可以是以下值之一。

含义
DOMAIN_JOIN_GUID
1ce20aba-9851-4421-9430-1ddeb766e809
当计算机加入域时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_DOMAIN_JOIN。
DOMAIN_LEAVE_GUID
ddaf516e-58c2-4866-9574-c3b615d42ea1
当计算机离开域时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_DOMAIN_JOIN。
FIREWALL_PORT_OPEN_GUID
b7569e07-8421-4ee0-ad10-86915afdad09
当打开指定的防火墙端口时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT。
FIREWALL_PORT_CLOSE_GUID
a144ed38-8e12-4de4-9d96-e64740b1a524
在指定的防火墙端口关闭后大约 60 秒触发该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT。
MACHINE_POLICY_PRESENT_GUID
659FCAE6-5BDB-4DA9-B1FF-CA2A178D46E0
当计算机策略发生更改时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_GROUP_POLICY。
NETWORK_MANAGER_FIRST_IP_ADDRESS_ARRIVAL_GUID
4f27f2de-14e2-430b-a549-7cd48cbc8245
当 TCP/IP 网络堆栈上的第一个 IP 地址可用时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY。
NETWORK_MANAGER_LAST_IP_ADDRESS_REMOVAL_GUID
cc4ba62a-162e-4648-847a-b6bdf993e335
当 TCP/IP 网络堆栈上的最后一个 IP 地址不可用时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_IP_ADDRESS_AVAILABILITY。
USER_POLICY_PRESENT_GUID
54FB46C8-F089-464C-B1FD-59D1B62C3B50
当用户策略发生更改时,将触发 该事件。 dwTriggerType 成员必须SERVICE_TRIGGER_TYPE_GROUP_POLICY。

cDataItems

pDataItems 指向的数组中的SERVICE_TRIGGER_SPECIFIC_DATA_ITEM结构数。

仅当 dwDataType 成员SERVICE_TRIGGER_TYPE_CUSTOM、SERVICE_TRIGGER_TYPE_DEVICE_ARRIVAL、SERVICE_TRIGGER_TYPE_FIREWALL_PORT_EVENT或SERVICE_TRIGGER_TYPE_NETWORK_ENDPOINT时,此成员才有效。

pDataItems

指向包含特定于触发器的数据 的SERVICE_TRIGGER_SPECIFIC_DATA_ITEM 结构的数组的指针。

注解

在加入域的系统上,安全策略设置可能会阻止 BFE 服务及其依赖服务停止或导致它们自动重启。 在这种情况下,需要禁用服务,然后在注册事件后重新启用它们。 若要以编程方式执行此操作,请存储每个服务的原始启动类型,将服务启动类型更改为SERVICE_DISABLED,注册事件,然后还原服务的原始启动类型。 有关更改服务的启动类型的信息,请参阅 ChangeServiceConfig

若要使用 SC 命令行工具禁用服务,请使用 命令 sc config bfe start= disabled 禁用 BFE 服务及其依赖服务,然后使用命令 net stop bfe /Y 来停止它们。 若要重新启用服务,请使用 命令 sc config bfe start= auto。有关 SC 命令行工具的详细信息,请参阅 使用 SC 控制服务

如果无法禁用服务,则可能需要在安装注册事件的服务后重启系统。 在这种情况下,请勿在重启系统之前禁用 BFE 服务及其依赖服务,因为如果这些服务保持禁用状态,系统可能无法正常工作。

要求

要求
最低受支持的客户端 Windows 7 [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 R2 [仅限桌面应用]
标头 winsvc.h

另请参阅

ChangeServiceConfig2

QueryServiceConfig2

SERVICE_TRIGGER_INFO

SERVICE_TRIGGER_SPECIFIC_DATA_ITEM

服务触发器事件