SWbemSink オブジェクト
SWbemSink オブジェクトは、クライアント アプリケーションが非同期操作とイベント通知の結果を受け取るために実装します。 非同期呼び出しを行うには、SWbemSink オブジェクトのインスタンスを作成し、ObjWbemSink パラメーターとして渡す必要があります。 SWbemSink の実装内のイベントは、状態または結果が返されたとき、または呼び出しが完了したときにトリガーされます。 このオブジェクトは、VBScript の CreateObject 呼び出しで作成されます。
SWbemSink オブジェクトには、これらの種類のメンバーがあります。
SWbemSink オブジェクトには、これらのメソッドがあります。
メソッド | 説明 |
---|---|
キャンセル | このシンクに関連付けられているすべての非同期操作を取り消します。 |
非同期コールバックを使用すると、認証されていないユーザーがシンクにデータを提供できます。 これにより、スクリプトとアプリケーションにセキュリティ リスクが発生します。 リスクを排除するには、半同期通信と同期通信のいずれかを使用します。 詳細については、メソッドの呼び出しに関するページを参照してください。
イベントがトリガーされたときに呼び出されるサブルーチンを実装できます。 たとえば、SWbemServices.ExecQueryAsync などの非同期クエリ呼び出しから返された各オブジェクトを処理する必要がある場合、次の例のように、非同期呼び出しの中で指定されているシンクを使用してサブルーチンを作成します。
Sub SinkName_OnObjectReady(objObject, objAsyncContext)
イベントとトリガーの説明については、次の表を参考にしてください。
Event | 説明 |
---|---|
OnCompleted | 非同期操作が完了したときにトリガーされます。 |
OnObjectPut | 非同期 Put 操作が完了したときにトリガーされます。 |
OnObjectReady | 非同期呼び出しによって提供されるオブジェクトが使用可能な状態になったときにトリガーされます。 |
OnProgress | 非同期操作の状態を提供するためにトリガーされます。 |
イベント ログの統計情報を非同期的に取得する
WMI では、非同期スクリプトと半同期スクリプトの両方がサポートされています。 イベント ログからイベントを取得する際、データが取得される速度は、通常、非同期スクリプトの方がはるかに高速です。
非同期スクリプトでは、クエリの発行後、すぐにスクリプトに制御が返されます。 クエリは別のスレッドで動作し続けますが、スクリプトは返された情報に対してすぐに処理を開始します。 非同期スクリプトはイベント ドリブンです。つまり、イベント レコードが取得されるたびに、OnObjectReady イベントが発生します。 クエリが完了すると、OnCompleted イベントが発生し、使用可能なすべてのレコードが返されたという事実に基づいてスクリプトは処理を続行できます。
これに対し、半同期スクリプトは、クエリの発行後、取得した大量の情報をキューに格納したうえで、それに対して処理を行います。 多くのオブジェクトでは、半同期処理が適しています。たとえば、ディスク ドライブのプロパティを照会するとき、クエリが発行されてから、情報が返されて処理されるまでに、コンマ数秒しかかからないということがあります。 これは、返される情報の量が比較的少ないことが大きな要因です。
一方、イベント ログに対してクエリを実行するときは、クエリが発行されてから、半同期スクリプトが情報の返しと処理を完了するまでに数時間かかることがあります。 加えて、スクリプトがメモリ不足になり、完了する前に単独で失敗する可能性もあります。
多数のレコードを含むイベント ログの場合、処理時間の差はかなり大きくなる可能性があります。 イベント ログに 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 |
Header |
|
IDL |
|
[DLL] |
|
CLSID |
CLSID_SWbemSink CLSID_SWbemSinkEvents |
IID |
IID_ISWbemSink IID_ISWbemSinkEvents |