WMIにネームスペース追加

[戻る]
くるぶし 2006/05/10(水) 00:30:32
いつも勉強させて頂いております。
くるぶし@未熟者です。

さて、本日は・・・
WMIについて質問があります。
WMIに関しては多少場違いな気がしますが、ご了承ください。

開発環境:Visual Studio 2005
開発言語:C++(Win32)
開発アプリケーション:コンソールアプリケーション

○やりたい事:
WMIに独自の名前空間(ネームスペース)を追加したい。
(Root\MyNamespace という名前空間(ネームスペース)を作成したい。)

ここで言う「WMIの名前空間(ネームスペース)」とは、

------------------------------------------------
Root\CIMV2
  ^^^^^^←この部分です。
------------------------------------------------

○調べた事:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/com_api_for_wmi.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/updating_an_entire_instance.asp
この辺りのMSDNを読んで以下のコードを記述しました。(下記参照)

また、WMIのRootクラスに"__NAMESPACE"というシステムクラスがあり、そのクラスのプロ
パティ(Name)に、追加したい名前空間(ネームスペース)を入れるのかなぁ・・・?
という所まで調べ、コーディングしました。

○実際に書いたコード(一部抜粋・一部省略)
------------------------------------------------
hr = pIWbemLocator->ConnectServer( (L"ROOT"),・・・(省略)

HRESULT hRes = pIWbemServices->GetObject( L"__NAMESPACE", 0, pCtx, &pNewClass,
&pResult );

VARIANT v;
VariantInit(&v);
hRes = pNewClass->Get( L"Name", 0, &v, 0, 0 );
V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"MyNameSpace");
hRes = pNewClass->Put( L”Name”, 0, &v, CIM_STRING );
VariantInit(&v);

hRes = pIWbemServices->PutInstance( pNewClass, 0, pCtx, &pResult );
pNewClass->Release();
------------------------------------------------
このコードで実行すると、hResは全てS_OKが返却されます。
しかし、WMIに指定した名前空間(ネームスペース)が登録されていません。
------------------------------------------------

○知りたい事
・根本的に調査内容や、コードの方向性は正しいかどうか。
・コードで間違っている箇所があるかどうか。(間違っているから実現できていないわけ
ですが・・・)

以上乱文長文で申し訳ございませんがよろしくご教授お願いいたします。

#WMIに関して資料が少ないので少しでも手がかりが欲しいです。
#よろしくお願いいたします。

くるぶし 2006/05/10(水) 11:23:28
[[解決]]
どうも寝て起きるといろいろと見えてくるようです。
改めてコード、方向性を見直すと重大な事に気がつきました。
自己解決です。お騒がせしました。

ご参考までに・・・
----------------------------------------------------------------
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/wmisdk/wmi/creating_and_declaring_an_instance_using_c_.asp

"__NAMESPACE"クラスのプロパティ(Name)にデータを設定するのではなく、インスタン
スを追加する。
インスタンス追加方法は上記参照。

----------------------------------------------------------------
記述したコード
----------------------------------------------------------------
HRESULT hr;
IWbemLocator* pIWbemLocator;
IWbemServices* pIWbemServices;
IWbemClassObject* pIWbemObject;

pIWbemLocator = NULL;
pIWbemServices = NULL;
pIWbemObject = NULL;
hr = E_FAIL;

hr = CoInitialize(NULL);
hr = CoInitializeSecurity(NULL,-
1,NULL,NULL,RPC_C_AUTHN_LEVEL_DEFAULT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NON
E,NULL);
hr = CoCreateInstance
(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator,(LPVOID *)
&pIWbemLocator);
hr = pIWbemLocator->ConnectServer
((L"ROOT"),NULL,NULL,0,NULL,0,0,&pIWbemServices);
hr = CoSetProxyBlanket
(pIWbemServices,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL,RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE);


IWbemClassObject *pNewInstance = 0;
IWbemContext *pCtx = 0;
IWbemCallResult *pResult = 0;

hr = pIWbemServices->GetObject( L"__NAMESPACE", 0, pCtx, &pIWbemObject, 
&pResult );
hr = pIWbemObject->SpawnInstance( 0, &pNewInstance );
pIWbemObject->Release();

VARIANT v;
VariantInit(&v);
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(L"MyNameSpace");

hr = pNewInstance->Put( L"Name", 0, &v, CIM_STRING );
VariantInit(&v);

hr = pIWbemServices->PutInstance( pNewInstance, WBEM_FLAG_CREATE_OR_UPDATE, 
pCtx, &pResult );
pNewInstance->Release();

if( pIWbemLocator != NULL )pIWbemLocator->Release();
if( pIWbemServices != NULL )pIWbemServices->Release();
CoUninitialize();

古いスレッドには追加発言できません。