Поделиться через


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

Используйте 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) в запросе, например "В пределах 10" для опроса каждые 10 секунд. Дополнительные сведения см. в предложении WITHIN.

  5. Вызовите SWbemServices.ExecNotificationQuery, используя запрос.

  6. Цикл по полученной коллекции.

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

  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 доставки событий всем связанным временным потребителям.