确定要接收的事件类型
在注册接收事件之前,必须确定要接收的事件类型:内部事件或外部事件。 若要详细了解如何接收事件,请参阅接收 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;