确定要接收的事件的类型
在注册以接收事件之前,必须确定要接收的事件类型: 内部 事件或 外在事件。 有关如何接收事件的详细信息,请参阅 接收 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 | 在发生方法调用事件时通知使用者。 |
Extrinsic 事件
外在事件是预定义的匹配项,不能直接链接到 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;