IWbemEventSink
COM公式ドキュメント
制限されたクエリのセットを使用して、イベントプロバイダーとの通信を開始します。
解説(Remarks)
イベントサブスクリプションのシンク(IWbemObjectSink または IWbemEventSink)を実装する場合、シンクオブジェクトのメソッド内から WMI を呼び出さないでください。たとえば、IWbemEventSink::SetSinkSecurity の実装内から IWbemServices::CancelAsyncCall を呼び出してシンクをキャンセルすると、WMI の状態に悪影響を及ぼす可能性があります。イベントサブスクリプションをキャンセルするには、フラグを設定し、別のスレッドまたは別のオブジェクトから IWbemServices::CancelAsyncCall を呼び出してください。オブジェクト、列挙、クエリの取得など、イベントシンクに関連しない実装では、WMI をコールバックできます。
イベント通知を配信する WMI スレッドは、シンクオブジェクトが処理を完了するまで他の作業を行えないため、シンクの実装ではイベント通知を 100 ミリ秒以内に処理してください。通知に多くの処理を要する場合は、シンク内部のキューを使用して別のスレッドに処理を任せることができます。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
シンクを通過するすべてのイベントに対して、セキュリティ記述子 (SD) を設定するために使用します。
| lSDLength | INT | in | セキュリティ記述子の長さ。 |
| pSD | BYTE* | in | セキュリティ記述子 (DACL)。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下の一覧は、HRESULT に含まれる値を示します。
解説(Remarks)
SD の DACL は、イベントへのアクセス権を持つ対象を定義します。シンクに配信されるイベントへのアクセスを求めるコンシューマーのアクセス制御エントリ (ACE) は、pSD パラメーターで WBEM_RIGHT_SUBSCRIBE が設定された ACE と一致している必要があります。SD の所有者とグループは、イベントを発生させる際に使用される ID を指定します。この ID は、イベントを発生させるアカウントの ID と異なっていてもかまいません。ただし、フィルターの SD に対してイベントのアクセスを確認する際には、ユーザーの ID と所有者フィールドに指定された ID の両方についてアクセスが確認されます。詳細については、 __EventFilter クラスの EventAccess プロパティを参照してください。SD のグループフィールドは設定する必要がありますが、SACL フィールドは使用されません。イベントのセキュリティと、このメソッドを使用すべきタイミングの詳細については、Securing WMI Events を参照してください。
イベントの提供に関する詳細については、Writing an Event Provider を参照してください。
例
次のコード例は、シンクを通じて提供されるすべてのイベントに SD を設定します。このコードには、以下の #include ステートメントと参照が必要です。
#define _WIN32_WINNT 0x0500
#define SECURITY_WIN32
#pragma comment(lib, "wbemuuid.lib")
#pragma comment(lib, "Secur32.lib")
#include <windows.h>
#include <sddl.h>
#include <wbemidl.h>
#include <security.h>
#include <iostream>
using namespace std;
HRESULT CMyEventProvider::ProvideEvents( IWbemObjectSink *pSink,
long lFlags )
{
IWbemEventSink *pEventSink = NULL;
//Create SD with allowing only administrators
// to receive events. O:BAG:BAD:(A;;0x40;;;BA)
long lMask = WBEM_RIGHT_SUBSCRIBE;
WCHAR wBuf[MAX_PATH];
_ltow( lMask, wBuf, 16 );
wstring wstrSD = L"O:BAG:BAD:(A;;0x";
wstrSD += lMask;
wstrSD += L";;;BA)";
ULONG ulSize = 0;
PSECURITY_DESCRIPTOR pSD = NULL;
ConvertStringSecurityDescriptorToSecurityDescriptorW(
wstrSD.c_str(), SDDL_REVISION_1, &pSD, &ulSize );
HRESULT hRes = pSink->QueryInterface( IID_IWbemEventSink,
(void**)pEventSink );
if( SUCCEEDED(hRes) )
hRes = pEventSink->SetSinkSecurity( ulLength, pSD );
LocalFree(pSD );
return hRes;
}
IWbemEventSink::IsActive メソッドは、シンクがフィルタリングしているイベントに対する関心が存在するかどうかを、プロバイダーが判断するために使用します。
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下の一覧は、HRESULT に含まれる値を示します。
IWbemEventSink::GetRestrictedSink メソッドは、制限付きイベントシンクを取得します。制限付きイベントシンクとは、イベントプロバイダーの登録で定義されたイベントのサブセットをフィルタリングするシンクです。
| lNumQueries | INT | in | 配列内のクエリの数。 |
| awszQueries | LPWSTR* | in | イベントクエリの配列。 |
| pCallback | IUnknown* | in | イベントプロバイダー用のコールバックへのポインター。 |
| ppSink | IWbemEventSink** | out | 作成された IWbemEventSink オブジェクトへのポインター。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下の一覧は、HRESULT に含まれる値を示します。
IWbemEventSink::SetBatchingParameters メソッドは、イベントバッファーの最大サイズと、それに関連する処理待ち時間の値を設定するために使用します。
| lFlags | INT | in | バッチ処理の動作を決定します。 WBEM_FLAG_BATCH_IF_NEEDED (0)バッチ処理を使用するかどうかをシステムが判断します。 WBEM_FLAG_MUST_BATCH (0x1)バッチ処理が必須です。 WBEM_FLAG_MUST_NOT_BATCH (0x2)バッチ処理を行いません。 |
| dwMaxBufferSize | DWORD | in | バッチバッファーの最大サイズ。最大のバッチサイズを指定するには MAX_INT を使用します。 |
| dwMaxSendLatency | DWORD | in | バッチ送信の最大待ち時間。無限のタイムアウトを指定するには WBEM_INFINITE を使用します。 |
戻り値
このメソッドは、メソッド呼び出しの状態を示す HRESULT を返します。以下の一覧は、HRESULT に含まれる値を示します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWbemEventSink "{3AE0080A-7E3A-4366-BF89-0FEEDC931659}" #usecom global IWbemEventSink IID_IWbemEventSink "{}" #comfunc global IWbemEventSink_SetSinkSecurity 5 int,var #comfunc global IWbemEventSink_IsActive 6 #comfunc global IWbemEventSink_GetRestrictedSink 7 int,var,sptr,sptr #comfunc global IWbemEventSink_SetBatchingParameters 8 int,int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWbemEventSink "{3AE0080A-7E3A-4366-BF89-0FEEDC931659}" #usecom global IWbemEventSink IID_IWbemEventSink "{}" #comfunc global IWbemEventSink_SetSinkSecurity 5 int,sptr #comfunc global IWbemEventSink_IsActive 6 #comfunc global IWbemEventSink_GetRestrictedSink 7 int,sptr,sptr,sptr #comfunc global IWbemEventSink_SetBatchingParameters 8 int,int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。