Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте SWbemServices.ExecQuery для запроса всех существующих событий.
В следующем примере кода показано, как запрашивать события в журнале.
Select * from Win32_NTLogEvent
Дополнительные сведения см. в Определение типа события для получения, Получение уведомлений о событияхи WQL (SQL для WMI).
По умолчанию вызов SWbemServices.ExecNotificationQuery использует полусинхронное взаимодействие. Параметр iflags имеет флаги wbemFlagForwardOnly и wbemFlagReturnImmediately, которые установлены по умолчанию. Дополнительные сведения см. в статье Вызов метода.
В следующей процедуре описывается получение полусинхронного уведомления о событиях с помощью VBScript.
Получать уведомления о полусинхронных событиях в VBScript
Создайте запрос типа события, которое требуется получить. Для получения дополнительной информации см. Определение типа получаемого события.
Если вы запрашиваете тип события, например __InstanceCreationEvent, укажите в запросе тип целевого экземпляра, например Win32_LogicalDisk.
При необходимости укажите экземпляр, например имя пространства имен при запросе будущих экземпляров __NamespaceModificationEvent для определенного пространства имен.
Укажите интервал опроса для инструментария управления Windows (WMI) в запросе, например "В пределах 10" для опроса каждые 10 секунд. Дополнительные сведения см. в предложении WITHIN.
Вызовите SWbemServices.ExecNotificationQuery, используя запрос.
Цикл по полученной коллекции.
В следующем примере показано, как отслеживать вставку и удаление дисков с диска 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++
Настройте приложение с вызовами функций CoInitializeEx и CoInitializeSecurity.
Так как WMI основан на COM, вызов CoInitializeEx и CoInitializeSecurity является обязательным шагом для приложения WMI. Дополнительные сведения см. в статье Создание приложения или скрипта WMI.
Определите тип событий, которые требуется получить.
WMI поддерживает встроенные и внешние события. Встроенное событие — это событие, предопределенное WMI. Экстринсическое событие — это событие, определенное сторонним поставщиком. Дополнительные сведения см. в определении типа события для получения.
Зарегистрируйтесь для получения определенного класса событий с вызовом метода 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 доставки событий всем связанным временным потребителям.