SWbemSink 对象

SWbemSink 对象由客户端应用程序实现,用于接收异步操作和事件通知的结果。 若要进行异步调用,必须创建 SWbemSink 对象的实例,并将其作为 ObjWbemSink 参数传递。 返回状态或结果或调用完成后,将触发 SWbemSink 实现中的事件。 VBScript CreateObject 调用将创建此对象。

成员

SWbemSink 对象具有以下类型的成员:

方法

SWbemSink 对象具有这些方法。

方法 说明
取消 取消与此接收器关联的所有异步操作。

注解

异步回调允许未经身份验证的用户向接收器提供数据。 这会给脚本和应用程序带来安全风险。 若要消除风险,请使用半异步通信或同步通信。 有关详细信息,请参阅 调用方法

事件

可以在触发事件时实现要调用的子例程。 例如,如果要处理异步查询调用(如 SWbemServices.ExecQueryAsync)返回的每个对象,请使用异步调用中指定的接收器创建子例程,如以下示例所示。

Sub SinkName_OnObjectReady(objObject, objAsyncContext)

使用下表作为标识事件和触发器说明的引用。

事件 说明
OnCompleted 异步操作完成后触发。
OnObjectPut 异步 Put 操作完成时触发。
OnObjectReady 当异步调用提供的对象可用时触发。
OnProgress 触发以提供异步操作的状态。

异步检索事件日志统计信息

WMI 支持异步和半同步脚本。 从事件日志中检索事件时,异步脚本通常会更快地检索此数据。

在异步脚本中,发出查询并立即将控件返回到脚本。 该查询继续在单独的线程上处理,而脚本开始立即处理返回的信息。 异步脚本是事件驱动的:每次检索事件记录时,都会触发 OnObjectReady 事件。 查询完成后,OnCompleted 事件将触发,并且脚本可以继续,具体取决于返回所有可用记录的事实。

相比之下,在半同步脚本中,发出查询,然后脚本在对其执行操作之前对大量检索的信息进行排队。 对于许多对象,半同步处理足够;例如,在查询磁盘驱动器的属性时,在发出查询的时间和返回信息的时间之间可能只有一个拆分秒。 这在很大程度上是由于返回的信息量相对较小。

但是,查询事件日志时,发出查询的时间与半同步脚本完成返回和处理信息所需的时间之间的间隔可能需要几个小时。 除此之外,脚本可能会耗尽内存,并在完成之前自行失败。

对于包含大量记录的事件日志,处理时间的差异可能相当大。 在事件日志中具有 2,000 条记录的基于 2000 Windows的测试计算机上,检索所有事件的半同步查询,并在命令窗口中显示它们需要 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 对象的脚本