Objeto SWbemSink
Las aplicaciones cliente implementan el objeto SWbemSink para recibir los resultados de operaciones asincrónicas y notificaciones de eventos. Para realizar una llamada asincrónica, debe crear una instancia de un objeto SWbemSink y pasarla como parámetro ObjWbemSink. Los eventos de la implementación de SWbemSink se desencadenan cuando se devuelven el estado o los resultados, o cuando se completa la llamada. La llamada CreateObject de VBScript crea este objeto.
Miembros
El objeto SWbemSink contiene estos tipos de miembros:
Métodos
El objeto SWbemSink tiene estos métodos.
Método | Descripción |
---|---|
Cancelar | Cancela todas las operaciones asincrónicas asociadas a este receptor. |
Comentarios
Una devolución de llamada asincrónica permite a un usuario no autenticado proporcionar datos al receptor. Esto supone riesgos de seguridad para los scripts y las aplicaciones. Para eliminar los riesgos, use comunicación semisincrónica o sincrónica. Para obtener más información, consulte Llamada a un método.
Eventos
Puede implementar subrutinas a las que se llamará cuando se desencadenen eventos. Por ejemplo, si quiere procesar cada objeto devuelto por una llamada de consulta asincrónica, como SWbemServices.ExecQueryAsync, cree una subrutina mediante el receptor especificado en la llamada asincrónica, como se muestra en el ejemplo siguiente.
Sub SinkName_OnObjectReady(objObject, objAsyncContext)
Use la tabla siguiente como referencia para identificar eventos y descripciones de desencadenadores.
Evento | Descripción |
---|---|
OnCompleted | Se desencadena cuando se completa una operación asincrónica. |
OnObjectPut | Se desencadena cuando se completa una operación Put asincrónica. |
OnObjectReady | Se desencadena cuando un objeto proporcionado por una llamada asincrónica está disponible. |
OnProgress | Se desencadena para proporcionar el estado de una operación asincrónica. |
Recuperación asincrónica de estadísticas del registro de eventos
WMI admite scripts asincrónicos y semisincrónicos. Al recuperar eventos de los registros de eventos, los scripts asincrónicos suelen recuperar estos datos con mucha mayor rapidez.
En un script asincrónico, se emite una consulta y el control se devuelve inmediatamente al script. La consulta continúa el proceso en un subproceso independiente mientras el script comienza a actuar inmediatamente sobre la información que se devuelve. Los scripts asincrónicos están controlados por eventos: cada vez que se recupera un registro de eventos, se desencadena el evento OnObjectReady. Cuando se haya completado la consulta, se desencadenará el evento OnCompleted y el script podrá continuar, dado que se han devuelto todos los registros disponibles.
En un script semisincrónico, por el contrario, se emite una consulta y, posteriormente, el script pone en cola una gran cantidad de información recuperada antes de actuar sobre él. Para muchos objetos, el procesamiento semisincrónico es adecuado; por ejemplo, al consultar una unidad de disco para sus propiedades, puede haber solo un segundo dividido entre el momento en que se emite la consulta y la hora en que se devuelve y se actúa sobre la información. Esto se debe en gran parte al hecho de que la cantidad de información devuelta es relativamente pequeña.
Sin embargo, al consultar un registro de eventos, el intervalo entre el momento en que se emite la consulta y el tiempo que un script semisincrónico puede terminar de devolver y actuar sobre la información puede tardar horas. Además, el script podría agotar la memoria y producir un error por sí mismo antes de completarse.
En el caso de los registros de eventos con un gran número de registros, la diferencia en el tiempo de procesamiento puede ser considerable. En un equipo de prueba basado en Windows 2000 con 2000 registros en el registro de eventos, una consulta semisincrónica tardó 10 minutos 45 segundos en recuperar todos los eventos y mostrarlos en una ventana de comandos. Una consulta asincrónica tardó un minuto y 54 segundos en realizar la misma operación.
Ejemplos
El siguiente VBScript consulta de forma asincrónica los registros de eventos de todos los registros.
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
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible |
Windows Vista |
Servidor mínimo compatible |
Windows Server 2008 |
Encabezado |
|
IDL |
|
Archivo DLL |
|
CLSID |
CLSID_SWbemSink CLSID_SWbemSinkEvents |
IID |
IID_ISWbemSink IID_ISWbemSinkEvents |