Compartilhar via


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.

Membros

O objeto SWbemSink tem estes tipos de membros:

Métodos

O objeto SWbemSink tem esses métodos.

Método Descrição
Cancelar Cancela todas as operações assíncronas associadas a esse coletor.

Comentários

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.

Eventos

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.

Exemplos

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

Requisitos

Requisito Valor
Cliente mínimo com suporte
Windows Vista
Servidor mínimo com suporte
Windows Server 2008
Cabeçalho
Wbemdisp.h
IDL
Wbemdisp.idl
DLL
Wbemdisp.dll
CLSID
CLSID_SWbemSink
CLSID_SWbemSinkEvents
IID
IID_ISWbemSink
IID_ISWbemSinkEvents

Confira também

Criar script de objetos de API