SWbemSink 개체
SWbemSink 개체는 비동기 작업 및 이벤트 알림의 결과를 수신하기 위해 클라이언트 애플리케이션에서 구현됩니다. 비동기 호출을 하려면 SWbemSink 개체의 인스턴스를 만들고 ObjWbemSink 매개 변수로 전달해야 합니다. SWbemSink 구현의 이벤트는 상태 또는 결과가 반환되거나 호출이 완료될 때 트리거됩니다. VBScript CreateObject 호출은 이 개체를 만듭니다.
SWbemSink 개체에는 다음과 같은 형식의 멤버가 있습니다.
SWbemSink 개체에는 이러한 메서드가 있습니다.
메서드 | 설명 |
---|---|
취소 | 이 싱크와 연결된 모든 비동기 작업을 취소합니다. |
비동기 콜백을 사용하면 인증되지 않은 사용자가 싱크에 데이터를 제공할 수 있습니다. 이로 인해 스크립트 및 애플리케이션에 보안 위험이 발생할 수 있습니다. 위험을 제거하려면 반동기 통신 또는 동기 통신을 사용합니다. 자세한 내용은 메서드 호출을 참조하세요.
이벤트가 트리거될 때 호출할 서브루틴을 구현할 수 있습니다. 예를 들어 SWbemServices.ExecQueryAsync와 같은 비동기 쿼리 호출에서 반환되는 각 개체를 처리하려는 경우 다음 예제와 같이 비동기 호출에 지정된 싱크를 사용하여 서브루틴을 만듭니다.
Sub SinkName_OnObjectReady(objObject, objAsyncContext)
다음 표를 참조로 사용하여 이벤트를 식별하고 설명을 트리거합니다.
이벤트 | 설명 |
---|---|
OnCompleted | 비동기 작업이 완료되면 트리거됩니다. |
OnObjectPut | 비동기 Put 작업이 완료되면 트리거됩니다. |
OnObjectReady | 비동기 호출에서 제공하는 개체를 사용할 수 있을 때 트리거됩니다. |
OnProgress | 비동기 작업의 상태를 제공하도록 트리거됩니다. |
이벤트 로그 통계 비동기 검색
WMI는 비동기 및 반동기 스크립트를 모두 지원합니다. 이벤트 로그에서 이벤트를 검색할 때 비동기 스크립트는 이 데이터를 훨씬 더 빠르게 검색하는 경우가 많습니다.
비동기 스크립트에서 쿼리가 발행되고 컨트롤이 스크립트로 즉시 반환됩니다. 스크립트가 반환되는 정보에 대해 즉시 작동하기 시작하는 동안 쿼리는 별도의 스레드에서 계속 처리됩니다. 비동기 스크립트는 이벤트 기반입니다. 이벤트 레코드를 검색할 때마다 OnObjectReady 이벤트가 발생합니다. 쿼리가 완료되면 OnCompleted 이벤트가 실행되고 사용 가능한 모든 레코드가 반환된 사실에 따라 스크립트를 계속할 수 있습니다.
반면, 반동기 스크립트에서는 쿼리가 발행되고 스크립트에서 작업을 진행하기 전에 검색된 대량의 정보를 큐에 대기시킵니다. 많은 개체의 경우 반동기 처리가 적절합니다. 예를 들어 디스크 드라이브에 속성에 대해 쿼리할 때 쿼리가 발행된 시간과 정보가 반환되고 동작하는 시간 사이에 1초 정도만 걸릴 수 있습니다. 이는 반환되는 정보의 양이 상대적으로 적기 때문입니다.
그러나 이벤트 로그를 쿼리할 때 쿼리가 발행된 시간과 반동기 스크립트가 반환을 완료하고 정보에 대한 작업을 완료할 수 있는 시간 사이의 간격은 몇 시간이 걸릴 수 있습니다. 무엇보다도 스크립트로 인해 메모리가 부족해져 완료하기 전에 자체적으로 실패할 수 있습니다.
레코드 수가 많은 이벤트 로그의 경우 처리 시간의 차이가 상당할 수 있습니다. 이벤트 로그에 레코드가 2,000개 있는 Windows 2000 기반 테스트 컴퓨터에서 모든 이벤트를 검색하고 명령 창에 표시하는 반동기 쿼리에는 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 |