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 的测试计算机上,事件日志中有 2,000 条记录,检索所有事件并将其显示在命令窗口中的半同步查询花费了 10 分 45 秒。 执行相同操作的异步查询花费了 1 分 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 |