Objeto SWbemSink
O objeto SWbemSink é implementado por aplicativos cliente para receber os resultados de operações assíncronas e notificações de eventos. Para fazer uma chamada assíncrona, você deve criar uma instância de um objeto SWbemSink e passá-la como o parâmetro ObjWbemSink. Os eventos em sua implementação de SWbemSink são disparados quando o status ou os resultados são retornados ou quando a chamada é concluída. A chamada CreateObject do VBScript cria esse objeto.
O objeto SWbemSink tem estes tipos de membros:
O objeto SWbemSink tem esses métodos.
Método | Descrição |
---|---|
Cancelar | Cancela todas as operações assíncronas associadas a esse coletor. |
Um retorno de chamada assíncrono permite que um usuário não autenticado forneça dados ao coletor. Isso representa riscos de segurança para seus scripts e aplicativos. Para eliminar os riscos, use comunicação semissíncrona ou síncrona. Para obter mais informações, consulte Chamar um método.
Você pode implementar sub-rotinas a serem chamadas quando os eventos são disparados. Por exemplo, se você quiser processar cada objeto retornado por uma chamada de consulta assíncrona, como SWbemServices.ExecQueryAsync, crie uma sub-rotina usando o coletor especificado na chamada assíncrona, conforme mostrado no exemplo a seguir.
Sub SinkName_OnObjectReady(objObject, objAsyncContext)
Use a tabela a seguir como referência para identificar eventos e descrições de gatilho.
Evento | Descrição |
---|---|
OnCompleted | Disparado quando uma operação assíncrona é concluída. |
OnObjectPut | Disparado quando uma operação Put assíncrona é concluída. |
OnObjectReady | Disparado quando um objeto fornecido por uma chamada assíncrona está disponível. |
OnProgress | Disparado para fornecer o status de uma operação assíncrona. |
Recuperar estatísticas de log de eventos de maneira assíncrona
O WMI dá suporte a scripts assíncronos e semissíncronos. Ao recuperar eventos dos logs de eventos, os scripts assíncronos geralmente recuperam esses dados muito mais rapidamente.
Em um script assíncrono, uma consulta é emitida e o controle é imediatamente retornado ao script. A consulta continua a ser processada em um thread separado enquanto o script começa a atuar imediatamente sobre as informações retornadas. Scripts assíncronos são controlados por eventos: sempre que um registro de evento é recuperado, o evento OnObjectReady é acionado. Quando a consulta for concluída, o evento OnCompleted será acionado e o script poderá continuar com base no fato de que todos os registros disponíveis foram retornados.
Em um script semissíncrono, por outro lado, uma consulta é emitida e o script enfileira uma grande quantidade de informações recuperadas antes de atuar nelas. Para muitos objetos, o processamento semissíncrono é adequado; por exemplo, ao consultar as propriedades de uma unidade de disco, pode haver apenas uma fração de segundo entre o momento em que a consulta é emitida e a hora em que as informações são retornadas e processadas. Isso se deve, em grande parte, ao fato de que a quantidade de informações retornadas é relativamente pequena.
No entanto, ao consultar um log de eventos, o intervalo entre a hora em que a consulta é emitida e a hora em que um script semissíncrono pode terminar de retornar e processar as informações pode levar horas. Além disso, o script pode ficar sem memória e falhar por conta própria antes de ser concluído.
Em logs de eventos com um grande número de registros, a diferença no tempo de processamento pode ser considerável. Em um computador de teste baseado no Windows 2000 com 2 mil registros no log de eventos, uma consulta semissíncrona que recuperou todos os eventos e os exibiu em uma janela de comando levou 10 minutos e 45 segundos. Uma consulta assíncrona que executou a mesma operação levou um minuto e 54 segundos.
O VBScript a seguir consulta de maneira assíncrona os logs de eventos de todos os 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
Requisito | Valor |
---|---|
Cliente mínimo com suporte |
Windows Vista |
Servidor mínimo com suporte |
Windows Server 2008 |
Cabeçalho |
|
IDL |
|
DLL |
|
CLSID |
CLSID_SWbemSink CLSID_SWbemSinkEvents |
IID |
IID_ISWbemSink IID_ISWbemSinkEvents |