Получение синхронных и полусинхронных уведомлений о событиях
Используйте SWbemServices.ExecQuery для запроса всех существующих событий.
В следующем примере кода показано, как запрашивать события в журнале.
Select * from Win32_NTLogEvent
Дополнительные сведения см. в разделах Определение типа события для получения, получение уведомлений о событиях и WQL (SQL для WMI).
Вызов SWbemServices.ExecNotificationQuery по умолчанию использует полусинхронное взаимодействие. Параметр iflags имеет флаги wbemFlagForwardOnly и wbemFlagReturnImmediately , установленные по умолчанию. Дополнительные сведения см. в разделе Вызов метода .
В следующей процедуре описывается получение полусинхронных уведомлений о событиях с помощью VBScript.
Получение полусинхронного уведомления о событиях в VBScript
Создайте запрос для типа события, которое требуется получить. Дополнительные сведения см. в разделе Определение типа события для получения.
При запросе типа экземпляра события, такого как __InstanceCreationEvent, укажите в запросе тип целевого экземпляра, например Win32_LogicalDisk.
При необходимости укажите экземпляр, например имя пространства имен при запросе будущих экземпляров __NamespaceModificationEvent для определенного пространства имен.
Укажите интервал опроса для инструментария управления Windows (WMI) в запросе, например "WITHIN 10", для опроса каждые 10 секунд. Дополнительные сведения см. в разделе Предложение WITHIN.
Вызовите SWbemServices.ExecNotificationQuery с помощью запроса.
Циклически просматривайте полученную коллекцию.
В следующем примере показано, как отслеживать вставку и удаление дисков с дискеты на локальном компьютере. Скрипт запрашивает экземпляры ___InstanceModificationEvent для диска гибких дисков Win32_LogicalDisk экземпляре и опрашивает новые экземпляры каждые 10 секунд. Этот скрипт является примером временного потребителя событий и продолжает выполняться до остановки в диспетчере задач или перезагрузки системы. Дополнительные сведения см. в разделе Получение событий для длительности приложения.
Const FLOPPY_DISK = 2
Set colMonitoredDisks = GetObject("Winmgmts:").ExecNotificationQuery _
("Select * from __InstanceModificationEvent within 10 WHERE " _
& "TargetInstance ISA 'Win32_LogicalDisk'")
i = 0
Do While i = 0
Set strDiskChange = colMonitoredDisks.NextEvent
If strDiskChange.TargetInstance.DriveType = FLOPPY_DISK Then
If strDiskChange.TargetInstance.Size > 0 Then
Wscript.Echo "A disk has been inserted" & _
" into the floppy drive."
Else
Wscript.Echo "A disk has been removed" & _
" from the floppy drive."
End If
End If
Loop
В следующей процедуре описывается получение полусинхронных уведомлений о событиях с помощью C++.
Получение полусинхронных уведомлений о событиях в C++
Настройте приложение с помощью вызовов функций CoInitializeEx и CoInitializeSecurity .
Так как WMI основан на COM, вызов CoInitializeEx и CoInitializeSecurity является обязательным шагом для приложения WMI. Дополнительные сведения см. в статье Создание приложения или скрипта WMI.
Определите тип событий, которые вы хотите получить.
WMI поддерживает встроенные и внешние события. Встроенное событие — это событие, предопределенное WMI. Событие extrinsic — это событие, определенное сторонним поставщиком. Дополнительные сведения см. в разделе Определение типа события для получения.
Зарегистрируйтесь для получения определенного класса событий с помощью вызова метода IWbemServices::ExecNotificationQuery .
Сделайте каждый запрос очень конкретным. Целью регистрации является регистрация для получения только необходимых уведомлений. Уведомления, которые не требуют затрат времени обработки и доставки.
Можно спроектировать потребитель события для получения нескольких событий. Например, потребитель может потребовать уведомления о событиях изменения экземпляра для определенного класса устройств и событий нарушения безопасности. В этом случае задачи, выполняемые потребителем при получении события изменения экземпляра, отличаются для этих двух событий. Таким образом, потребитель должен выполнить один вызов IWbemServices::ExecNotificationQuery для регистрации событий изменения экземпляра, а другой вызов ExecNotificationQuery для регистрации событий нарушения безопасности.
В вызове ExecNotificationQuery задайте для параметра lFlagsзначение WBEM_FLAG_RETURN_IMMEDIATELY и WBEM_FLAG_FORWARD_ONLY. Флаг WBEM_FLAG_RETURN_IMMEDIATELY запрашивает полусинхронную обработку, а флаг WBEM_FLAG_FORWARD_ONLY — перечислитель только для пересылки. Дополнительные сведения см. в разделе Вызов метода . Функция ExecNotificationQuery возвращает указатель на интерфейс IEnumWbemClassObject .
Опрашивает зарегистрированные уведомления о событиях, выполняя повторные вызовы метода IEnumWbemClassObject::Next .
По завершении отпустите перечислитель, указывающий на объект IEnumWbemClassObject .
Вы можете освободить указатель IWbemServices, связанный с регистрацией. Освобождение указателя IWbemServices приводит к тому, что WMI перестает доставлять события всем связанным временным потребителям.