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


Объект SWbemSink

Объект SWbemSink реализуется клиентскими приложениями для получения результатов асинхронных операций и уведомлений о событиях. Чтобы выполнить асинхронный вызов, необходимо создать экземпляр объекта SWbemSink и передать его в качестве параметра ObjWbemSink . События в реализации SWbemSink активируются при возврате состояния или результатов или при завершении вызова. Вызов VBScript CreateObject создает этот объект.

Элементы

Объект SWbemSink имеет следующие типы элементов:

Методы

Объект SWbemSink содержит эти методы.

Метод Описание
Отменить Отменяет все асинхронные операции, связанные с этим приемником.

Комментарии

Асинхронный обратный вызов позволяет пользователю, не прошедшему проверку подлинности, предоставлять данные в приемник. Это создает угрозу безопасности для сценариев и приложений. Чтобы избежать рисков, используйте полусинхронный или синхронный обмен данными. Дополнительные сведения см. в разделе Вызов метода .

События

Вы можете реализовать подпрограммы, которые будут вызываться при активации событий. Например, если вы хотите обработать каждый объект, возвращаемый асинхронным вызовом запроса, таким как SWbemServices.ExecQueryAsync, создайте подпрограмму с помощью приемника, указанного в асинхронном вызове, как показано в следующем примере.

Sub SinkName_OnObjectReady(objObject, objAsyncContext)

Используйте следующую таблицу в качестве ссылки для определения событий и описаний триггеров.

Событие Описание
OnCompleted Активируется при завершении асинхронной операции.
OnObjectPut Активируется при завершении асинхронной операции Put.
OnObjectReady Активируется, когда доступен объект, предоставленный асинхронным вызовом.
OnProgress Активируется для предоставления состояния асинхронной операции.

Асинхронный получение статистики журнала событий

WMI поддерживает как асинхронные, так и полусинхронные скрипты. При извлечении событий из журналов событий асинхронные скрипты часто извлекают эти данные гораздо быстрее.

В асинхронном скрипте выполняется запрос, и элемент управления немедленно возвращается в скрипт. Запрос продолжает обрабатываться в отдельном потоке, в то время как скрипт начинает немедленно реагировать на возвращаемые сведения. Асинхронные скрипты управляются событиями: каждый раз при извлечении записи события запускается событие OnObjectReady. После завершения запроса срабатывает событие OnCompleted, и сценарий может продолжить работу, исходя из того факта, что были возвращены все доступные записи.

В полусинхронном сценарии, напротив, выполняется запрос, а затем скрипт помещает в очередь большой объем полученных сведений, прежде чем действовать с ним. Для многих объектов достаточно полусинхронной обработки; Например, при запросе к диску его свойств между моментом выполнения запроса и временем возврата сведений и выполнения действий может быть только секунда. Это в значительной части связано с тем, что объем возвращаемой информации относительно мал.

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

Для журналов событий с большим количеством записей разница во времени обработки может быть значительной. На тестовом компьютере под управлением Windows 2000 с 2000 записями в журнале событий полусинхронный запрос, который извлек все события и отображал их в командном окне, занимал 10 минут 45 секунд. Асинхронный запрос, выполняющий ту же операцию, занял одну минуту 54 секунды.

Примеры

Следующий VBScript асинхронно запрашивает журналы событий для всех записей.

Const POPUP_DURATION = 10
Const OK_BUTTON = 0
Set objWSHShell = Wscript.CreateObject("Wscript.Shell")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.InstancesOfAsync objSink, "Win32_NTLogEvent"
errReturn = objWshShell.Popup("Retrieving events", POPUP_DURATION, _
"Event Retrieval", OK_BUTTON)
Sub SINK_OnCompleted(iHResult, objErrorObject, objAsyncContext)
 WScript.Echo "Asynchronous operation is done."
End Sub
Sub SINK_OnObjectReady(objEvent, objAsyncContext)
 Wscript.Echo "Category: " & objEvent.Category
 Wscript.Echo "Computer Name: " & objEvent.ComputerName
 Wscript.Echo "Event Code: " & objEvent.EventCode
 Wscript.Echo "Message: " & objEvent.Message
 Wscript.Echo "Record Number: " & objEvent.RecordNumber
 Wscript.Echo "Source Name: " & objEvent.SourceName
 Wscript.Echo "Time Written: " & objEvent.TimeWritten
 Wscript.Echo "Event Type: " & objEvent.Type
 Wscript.Echo "User: " & objEvent.User
End Sub

Требования

Требование Значение
Минимальная версия клиента
Windows Vista
Минимальная версия сервера
Windows Server 2008
Заголовок
Wbemdisp.h
IDL
Wbemdisp.idl
DLL
Wbemdisp.dll
CLSID
CLSID_SWbemSink
CLSID_SWbemSinkEvents
IID
IID_ISWbemSink
IID_ISWbemSinkEvents

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

Создание скриптов для объектов API