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


Метод SWbemServices.ExecNotificationQuery

Метод ExecNotificationQuery объекта SWbemServices выполняет запрос для получения событий. Вызов возвращается немедленно. Пользователь может опрашив возвращаемый перечислитель на наличие событий по мере их поступления.

Метод вызывается в полусинхронном режиме. Дополнительные сведения см. в разделе Вызов метода .

Описание этого синтаксиса см. в разделе Соглашения о документах для API сценариев.

Синтаксис

objwbemEventsource = .ExecNotificationQuery( _
  ByVal strQuery, _
  [ ByVal strQueryLanguage ], _
  [ ByVal iFlags ], _
  [ ByVal objWbemNamedValueSet ] _
)

Параметры

strQuery

Обязательный. Строка, содержащая текст запроса, связанного с событиями. Этот параметр не может быть пустым. Дополнительные сведения о создании строк запросов WMI см. в разделах Запросы с помощью WQL и Справочник по WQL .

strQueryLanguage [необязательно]

Строка, содержащая используемый язык запросов. Если он указан, это значение должно быть WQL.

iFlags [необязательно]

Это целое число, определяющее поведение запроса. Значение по умолчанию — wbemFlagReturnImmediately + wbemFlagForwardOnly. Если вы укажете этот параметр, для этого параметра необходимо задать как wbemFlagReturnImmediately , так и wbemFlagForwardOnly , иначе вызов завершается ошибкой. Этот параметр может принимать следующие значения.

wbemFlagForwardOnly (32 (0x20))

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

wbemFlagReturnImmediately (16 (0x10))

Вызывает немедленный возврат вызова.

objWbemNamedValueSet [необязательно]

Как правило, это не определено. В противном случае это объект SWbemNamedValueSet , элементы которого представляют сведения контекста, которые могут использоваться поставщиком, обслуживающим запрос. Поставщик, поддерживающий или требующий таких сведений, должен документировать имена распознаваемых значений, тип данных значения, допустимые значения и семантику.

Возвращаемое значение

Если ошибки не возникает, этот метод возвращает объект SWbemEventSource . Вы можете вызвать метод SWbemEventSource.NextEvent для получения событий по мере их поступления.

Коды ошибок

После завершения метода ExecNotificationQuery объект Err может содержать один из кодов ошибок в следующем списке.

wbemErrAccessDenied — 2147749891 (0x80041003)

Текущий пользователь не имеет прав на просмотр результирующих наборов.

wbemErrFailed — 2147749889 (0x80041001)

Незаданная ошибка.

wbemErrInvalidParameter — 2147749896 (0x80041008)

Указан недопустимый параметр.

wbemErrInvalidQuery — 2147749911 (0x80041017)

Недопустимый синтаксис запроса.

wbemErrInvalidQueryType — 2147749912 (0x80041018)

Запрошенный язык запросов не поддерживается.

wbemErrOutOfMemory — 2147749894 (0x80041006)

Недостаточно памяти для завершения операции.

Комментарии

В отличие от метода SWbemServices.ExecQueryAsync , ExecNotificationQuery возвращает объекты типа событий, созданные будущими событиями, а не существующими объектами. Объекты событий, запрашиваемые ExecNotificationQuery , могут быть встроенными (например , __InstanceCreationEvent) или extrinsic (например, событиями поставщика реестра, такими как RegistryKeyChangeEvent или события SNMP). Дополнительные сведения см. в разделе Определение типа событий для получения и получения уведомлений о событиях.

Существуют ограничения на количество ключевых слов AND и OR , которые можно использовать в WQL-запросах. Большое количество ключевых слов WQL, используемых в сложном запросе, может привести к возврату WMI кода ошибки WBEM_E_QUOTA_VIOLATION в качестве значения HRESULT . Ограничение ключевых слов WQL зависит от сложности запроса.

Примеры

В следующем примере кода VBScript отслеживается изменение томов на локальном компьютере. Обратите внимание, что Win32_VolumeChangeEvent является событием, которое определяется поставщиком, а не внутренним событием, определяемым WMI. Дополнительные сведения см. в разделе Определение типа события для получения.

Set colMonitoredEvents = _
   GetObject("Winmgmts:").ExecNotificationQuery_
      ("Select * from Win32_VolumeChangeEvent")

Do While i = 0
   Set strLatestEvent = colMonitoredEvents.NextEvent
   Wscript.Echo strLatestEvent.DriveName & "Time Created = " _
      & strLatestEvent.Time_Created

    Select Case strLatestEvent.EventType 
       Case 1        
            WScript.Echo "EventType = Configuration Changed"
       Case 2
            WScript.Echo "EventType = Device Arrival"
       Case 3
            WScript.Echo "EventType = Device Removal"
       Case 4
            WScript.Echo "EventType = Docking"

       Case Else
            WScript.Echo "Unrecognized EventType"
       End Select
Loop

В следующем примере кода VBScript выполняется мониторинг удаления процесса. Если удалить процесс в диспетчере задач или закрыть приложение, скрипт отобразит сообщение. Обратите внимание, что этот скрипт запрашивает встроенное событие, определенное WMI — __InstanceDeletionEvent.

Set objWMIService = GetObject( _
    "Winmgmts:{impersonationLevel=impersonate}" )
Set colMonitoredProcesses = _
    objWMIService.ExecNotificationQuery( _
    "SELECT * FROM __InstanceDeletionEvent WITHIN 10 WHERE " _
    & "TargetInstance ISA 'Win32_Process'")
i = 0
Do While i < 11
    Set strLatestProcess = colMonitoredProcesses.NextEvent
    WScript.Echo strLatestProcess.TargetInstance.Name
    WScript.Sleep 10000
    i= i + 1
Loop

Требования

Требование Значение
Минимальная версия клиента
Windows Vista
Минимальная версия сервера
Windows Server 2008
Заголовок
Wbemdisp.h
Библиотека типов
Wbemdisp.tlb
DLL
Wbemdisp.dll
CLSID
CLSID_SWbemServices
IID
IID_ISWbemServices

См. также раздел

SWbemServices

SWbemEventSource.NextEvent

SWbemServices.ExecQuery

Получение события WMI

Запросы с помощью WQL

WQL (SQL для WMI)

Определение типа получаемого события