Получение синхронных и полусинхронных уведомлений о событиях

Используйте SWbemServices.ExecQuery для запроса всех существующих событий.

В следующем примере кода показано, как запрашивать события в журнале.

Select * from Win32_NTLogEvent

Дополнительные сведения см. в разделах Определение типа события для получения, получение уведомлений о событиях и WQL (SQL для WMI).

Вызов SWbemServices.ExecNotificationQuery по умолчанию использует полусинхронное взаимодействие. Параметр iflags имеет флаги wbemFlagForwardOnly и wbemFlagReturnImmediately , установленные по умолчанию. Дополнительные сведения см. в разделе Вызов метода .

В следующей процедуре описывается получение полусинхронных уведомлений о событиях с помощью VBScript.

Получение полусинхронного уведомления о событиях в VBScript

  1. Создайте запрос для типа события, которое требуется получить. Дополнительные сведения см. в разделе Определение типа события для получения.

  2. При запросе типа экземпляра события, такого как __InstanceCreationEvent, укажите в запросе тип целевого экземпляра, например Win32_LogicalDisk.

  3. При необходимости укажите экземпляр, например имя пространства имен при запросе будущих экземпляров __NamespaceModificationEvent для определенного пространства имен.

  4. Укажите интервал опроса для инструментария управления Windows (WMI) в запросе, например "WITHIN 10", для опроса каждые 10 секунд. Дополнительные сведения см. в разделе Предложение WITHIN.

  5. Вызовите SWbemServices.ExecNotificationQuery с помощью запроса.

  6. Циклически просматривайте полученную коллекцию.

В следующем примере показано, как отслеживать вставку и удаление дисков с дискеты на локальном компьютере. Скрипт запрашивает экземпляры ___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++

  1. Настройте приложение с помощью вызовов функций CoInitializeEx и CoInitializeSecurity .

    Так как WMI основан на COM, вызов CoInitializeEx и CoInitializeSecurity является обязательным шагом для приложения WMI. Дополнительные сведения см. в статье Создание приложения или скрипта WMI.

  2. Определите тип событий, которые вы хотите получить.

    WMI поддерживает встроенные и внешние события. Встроенное событие — это событие, предопределенное WMI. Событие extrinsic — это событие, определенное сторонним поставщиком. Дополнительные сведения см. в разделе Определение типа события для получения.

  3. Зарегистрируйтесь для получения определенного класса событий с помощью вызова метода 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 .

  4. Опрашивает зарегистрированные уведомления о событиях, выполняя повторные вызовы метода IEnumWbemClassObject::Next .

  5. По завершении отпустите перечислитель, указывающий на объект IEnumWbemClassObject .

    Вы можете освободить указатель IWbemServices, связанный с регистрацией. Освобождение указателя IWbemServices приводит к тому, что WMI перестает доставлять события всем связанным временным потребителям.