Метод SWbemServices.ExecNotificationQueryAsync
Метод ExecNotificationQueryAsync объекта SWbemServices выполняет запрос для получения событий. Этот вызов возвращается немедленно, а результаты и состояние возвращаются вызывающей через события, доставляемые в приемник, указанный в objWbemSink.
События, указанные в запросе, могут быть встроенными событиями инструментария управления Windows (WMI), такими как __InstanceCreationEvent, или событиями внешних событий, такими как Win32_IP4RouteTableEvent или RegistryKeyChangeEvent. Дополнительные сведения см. в разделе Определение типа получаемого события.
Метод вызывается в асинхронном режиме. Дополнительные сведения см. в разделе Вызов метода.
Описание этого синтаксиса см. в разделе Соглашения о документах для API скриптов.
Синтаксис
SWbemServices.ExecNotificationQueryAsync( _
ByVal objWbemSink, _
ByVal strQuery, _
[ ByVal strQueryLanguage ], _
[ ByVal iFlags ], _
[ ByVal objwbemNamedValueSet ], _
[ ByVal objWbemAsyncContext ] _
)
Параметры
-
objWbemSink
-
Обязательный. Приемник объектов, получающий уведомление о событиях асинхронно. Создайте объект SWbemSink для получения объектов .
-
strQuery
-
Обязательный. Строка, содержащая текст запроса, связанного с событиями. Этот параметр не может быть пустым. Дополнительные сведения о создании строк запросов WMI см. в разделах Запросы с помощью WQL и Справочник по WQL .
-
strQueryLanguage [необязательно]
-
Строка, содержащая используемый язык запросов. Если этот параметр указан, это значение должно иметь значение WQL.
-
iFlags [необязательно]
-
Целое число, определяющее поведение запроса. Для этого параметра можно задать следующие значения.
-
wbemFlagSendStatus (128 (0x80))
-
Вызывает асинхронные вызовы для отправки обновлений состояния в обработчик событий OnProgress для приемника объекта.
-
wbemFlagDontSendStatus (0 (0x0))
-
Запрещает асинхронным вызовам отправлять обновления состояния в обработчик событий OnProgress для приемника объектов.
objwbemNamedValueSet [необязательно]
Как правило, это не определено. В противном случае это объект SWbemNamedValueSet , элементы которого представляют сведения контекста, которые могут использоваться поставщиком, который обслуживает запрос. Поставщик, который поддерживает или требует такие сведения, должен документировать имена распознаваемых значений, тип данных значения, допустимые значения и семантику.
objWbemAsyncContext [необязательно]
Это объект SWbemNamedValueSet , который возвращается в приемник объекта для определения источника исходного асинхронного вызова. Используйте этот параметр для выполнения нескольких асинхронных вызовов с использованием одного и того же приемника объектов. Чтобы использовать этот параметр, создайте объект SWbemNamedValueSet и используйте метод SWbemNamedValueSet.Add , чтобы добавить значение, определяющее асинхронный вызов, который вы выполняете. Объект SWbemNamedValueSet возвращается в приемник объекта, а источник вызова можно извлечь с помощью метода SWbemNamedValueSet.Item . Дополнительные сведения см. в разделе Вызов метода.
Возвращаемое значение
Этот метод не возвращает значение. В случае успешного выполнения приемник получает событие OnObjectReady для каждого экземпляра. После последнего экземпляра приемник объекта получает событие OnCompleted .
Коды ошибок
После завершения метода ExecNotificationQueryAsync объект Err может содержать один из кодов ошибок, указанных в следующем списке.
-
wbemErrAccessDenied — 2147749891 (0x80041003)
-
Текущий пользователь не авторизован для просмотра результирующих наборов.
-
wbemErrFailed — 2147749889 (0x80041001)
-
Незаданная ошибка.
-
wbemErrInvalidParameter — 2147749896 (0x80041008)
-
Указан недопустимый параметр.
-
wbemErrInvalidQuery — 2147749911 (0x80041017)
-
Недопустимый синтаксис запроса.
-
wbemErrInvalidQueryType — 2147749912 (0x80041018)
-
Запрошенный язык запросов не поддерживается.
-
wbemErrOutOfMemory — 2147749894 (0x80041006)
-
Недостаточно памяти для завершения операции.
Комментарии
Метод ExecNotificationQueryAsync возвращает объекты типа событий, создаваемые будущими событиями. Объекты событий, запрашиваемые ExecNotificationQueryAsync , могут быть встроенными (например, __InstanceCreationEvent) или внешними (например, События RegistryKeyChangeEvent или SNMP). Дополнительные сведения см. в разделе Определение типа получаемого события.
Вызов ExecNotificationQueryAsync возвращается немедленно. Запрошенные объекты и состояние возвращаются вызывающей объекту через обратные вызовы, доставляемые в приемник, указанный в objWbemSink. Чтобы обработать каждый объект при его возвращении, создайте objWbemSink. Подпрограмма события OnObjectReady . После возврата всех объектов выполните окончательную обработку для реализации objWbemSink. Событие OnCompleted .
Асинхронный обратный вызов позволяет пользователю, не прошедшему проверку подлинности, предоставлять данные в приемник. Это создает угрозы безопасности для сценариев и приложений. Сведения об устранении рисков см. в статье Настройка безопасности при асинхронном вызове.
Существуют ограничения на количество ключевых слов AND и OR , которые можно использовать в WQL-запросах. Большое количество ключевых слов WQL, используемых в сложном запросе, может привести к тому, что WMI вернет код ошибки WBEM_E_QUOTA_VIOLATION как значение HRESULT . Ограничение ключевых слов WQL зависит от сложности запроса.
Примеры
В следующем примере кода VBScript показан скрипт, ожидающий уведомления о событии WMI, которое указывает на завершение процесса. Он ожидает встроенного события WMI, экземпляра класса событий __InstanceDeletionEvent. __InstanceDeletionEvent должно представлять удаление экземпляра Win32_Process. Дополнительные сведения о встроенных событиях WMI см. в разделе Определение типа получаемого события.
Следующий скрипт выполняется неограниченно долго, пока компьютер не перезагрузится, не будет остановлен инструментарий WMI или пока скрипт не будет остановлен. Чтобы остановить скрипт вручную, используйте диспетчер задач, чтобы остановить процесс. Чтобы остановить его программным способом, используйте метод Terminate в классе Win32_Process.
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & _strComputer & "\root\CIMV2")
Set MySink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIservice.ExecNotificationQueryAsync MySink, "SELECT * FROM __InstanceCreationEvent WITHIN 1 " _
& "WHERE TargetInstance ISA 'Win32_Process'"
WScript.Echo "Waiting for events..."
While (True)
Wscript.Sleep(1000)
Wend
Sub SINK_OnObjectReady(objObject, objAsyncContext)
WScript.Echo "Event occurred."
End Sub
Sub SINK_OnCompleted(objObject, objAsyncContext)
WScript.Echo "Event call complete."
End Sub
Требования
Требование | Значение |
---|---|
Минимальная версия клиента |
Windows Vista |
Минимальная версия сервера |
Windows Server 2008 |
Заголовок |
|
Библиотека типов |
|
DLL |
|
CLSID |
CLSID_SWbemServices |
IID |
IID_ISWbemServices |