确定要接收的事件类型

在注册接收事件之前,必须确定要接收的事件类型:内部事件外部事件。 若要详细了解如何接收事件,请参阅接收 WMI 事件。 若要详细了解如何提供事件,请参阅开发 WMI 提供程序编写事件提供程序。 若要详细了解有关接收和提供事件的安全的注意事项,请参阅保护 WMI 事件

内部事件

内部事件是为响应在标准 WMI 数据模型中所做的更改而发生的事件。 每个内部事件类都表示特定类型的更改,并且在 WMI 或提供程序创建、删除或修改命名空间、类或类实例时发生。 例如,创建 Win32_LogicalDisk 实例会生成 __InstanceCreationEvent 实例。

WMI 会为存储在 WMI 存储库中的对象创建内部事件。 提供程序会为动态类生成内部事件,但是如果没有提供程序可用,WMI 可为动态类创建实例。 WMI 使用轮询来检测更改。 下表列出了 WMI 用于报告内部事件的系统类。

系统类 说明
__ClassCreationEvent 创建类时通知使用者。
__ClassDeletionEvent 删除类时通知使用者。
__ClassModificationEvent 修改类时通知使用者。
__InstanceCreationEvent 创建类实例时通知使用者。
__InstanceOperationEvent 在发生任何实例事件(例如创建、删除或修改实例)时通知使用者。 可以在查询中使用此类来获取与实例关联的所有类型事件。
__InstanceDeletionEvent 删除实例时通知使用者。
__InstanceModificationEvent 修改实例时通知使用者。
__NamespaceCreationEvent 创建命名空间时通知使用者。
__NamespaceDeletionEvent 删除命名空间时通知使用者。
__NamespaceModificationEvent 修改命名空间时通知使用者。
__ConsumerFailureEvent 当由于事件使用者失败而删除某个其他事件时,通知使用者。
__EventDroppedEvent 当删除某个其他事件而不是传递到请求的事件使用者时,通知使用者。
__EventQueueOverflowEvent 由于传递队列溢出而删除事件时,通知使用者。
__MethodInvocationEvent 发生方法调用事件时通知使用者。

 

外部事件

外部事件是预定义事件,不能直接链接到 WMI 数据模型中的更改。 因此,WMI 使事件提供程序能够定义描述事件的事件类。 例如,描述计算机切换到待机模式的事件是一个外部事件。 提供程序从 __ExtrinsicEvent 系统类派生外部事件,该类是 __Event 系统类的子类。 系统注册表SNMP 提供程序定义了外部事件类,例如 RegistryKeyChangeEvent,它在注册表项更改时通知使用者。 有关详细信息,请参阅注册系统注册表事件编写事件提供程序

在以下示例中,事件提供程序向一个或多个生成项报告安全冲突。 可为表示安全冲突的外部事件定义以下类。

class SecurityViolationEvent : __ExtrinsicEvent
{
   string Building;           // building where violation occurred
   sint32 EntranceNumber;     // entrance where violation occurred
   datetime TimeOfDetection;  // date and time of violation
}

若要接收安全冲突通知,使用者需要注册 SecurityViolationEvent 事件类型。 除非另有说明,否则使用者会在所有时间和所有生成项内收到所有安全冲突的通知。 事件类还包含使用者可用于请求更多特定事件的信息。

在以下示例中,查询仅为生成项 24 中的安全冲突事件注册使用者。

SELECT * FROM SecurityViolationEvent WHERE Building = 24;