Объект 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 |
Заголовок |
|
IDL |
|
DLL |
|
CLSID |
CLSID_SWbemSink CLSID_SWbemSinkEvents |
IID |
IID_ISWbemSink IID_ISWbemSinkEvents |