スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

WMIプログラムC++編-4

ん~ CSS の white-space で pre を指定しても
IE だとうまく表示されない(スペースが無視される)ことがありますね……

日別で表示させて更新させればうまく表示されることがあるので
それでかんべんしてorz

あと前回のサンプルプログラムですがフォトショップ形式(PSD)
存在するフォルダを指定すると落ちます(ノ∀`*)

原因はそのうち調査するかもしれません……




WMIプログラムC++編-4

VB で EXE を作成するとドメインアドミニストレータ権限で実行しなくても
リモート上の PC の情報を見ることができるので C++ でもできそうだけどなあ~……

とぼやきつつ、今回はレジストリの操作をやってみたいと思います。
やっぱり WMI を使うからにはレジストリの情報を見れなければ
魅力が半減すると思います(ぇ

プログラム自体はWMIプログラムC++編-3とたいして変わりません。

違うところといえばメソッド実行後に値の取得を行うところでしょうか。

ただ注意点が一つだけあります。
今まで扱ってきたクラスは //root/cimv2 というネームスペースに属していましたが
レジストリは //root/default ネームスペースに属しています。
ConnectServer 時のパラメータに気をつけましょう(´・ω・`)b

以下はソースとなります。

enum ENUM_REGISTRY_PARAMETER{
REG_BINARY_VALUE = 0x00,
REG_DWORD_VALUE = 0x01,
REG_EXPANDED_STRING_VALUE = 0x02,
REG_MULTI_STRING_VALUE = 0x03,
REG_STRING_VALUE = 0x04,
};

_variant_t
CWMI::GetRegistry(HKEY Root, BSTR SubKey, BSTR Value,
ENUM_REGISTRY_PARAMETER Type)
{
VARIANT property;
::VariantInit(&property);

// レジストリクラスオブジェクトを取得
IWbemClassObject* registry = NULL;
if(m_WbemServices->GetObject(_bstr_t(L"StdRegProv"),
0,
NULL,
&registry,
NULL) != WBEM_S_NO_ERROR)
{
return property;
}

// メソッドの取得
// 何故か海外のサンプルは OUT メソッドでインスタンスを作成してた……
IWbemClassObject* in_method = NULL;
IWbemClassObject* out_method = NULL;
BSTR parameter[] = {L"GetBinaryValue",
L"GetDWORDValue",
L"GetExpandedStringValue",
L"GetMultiStringValue",
L"GetStringValue"};

if(registry->GetMethod(_bstr_t(parameter[Type]),
0,
&in_method,
&out_method) != WBEM_S_NO_ERROR)
{
registry->Release();
return property;
}

// インスタンスの作成
IWbemClassObject* instance = NULL;
if(in_method->SpawnInstance(0, &instance) != WBEM_S_NO_ERROR)
{
in_method->Release();
out_method->Release();
registry->Release();
return property;
}

// 取得するレジストリ項目のセット
// ルート、サブキーネーム、バリューネーム
VARIANT root;
::VariantInit(&root);
root.vt = VT_I4;
root.lVal = reinterpret_cast<unsigned long>(Root);
instance->Put(_bstr_t(L"hDefKey"), 0, &root, 0);
::VariantClear(&root);

VARIANT sub_key;
::VariantInit(&sub_key);
sub_key.vt = VT_BSTR;
sub_key.bstrVal = _bstr_t(SubKey);
instance->Put(_bstr_t(L"sSubKeyName"), 0, &sub_key, 0);
::VariantClear(&sub_key);

VARIANT value_name;
::VariantInit(&value_name);
value_name.vt = VT_BSTR;
value_name.bstrVal = _bstr_t(Value);
instance->Put(_bstr_t(L"sValueName"), 0, &value_name, 0);
::VariantClear(&value_name);

// メソッドの実行
IWbemClassObject* param = NULL;
if(m_WbemServices->ExecMethod(_bstr_t(L"StdRegProv"),
_bstr_t(parameter[Type]),
0,
NULL,
instance,
&param,
NULL) != WBEM_S_NO_ERROR)
{
instance->Release();
out_method->Release();
in_method->Release();
registry->Release();
return property;
}

// 値の取得
_bstr_t value;
switch(Type)
{
case REG_BINARY_VALUE:
case REG_DWORD_VALUE:
value = L"uValue";
break;

case REG_EXPANDED_STRING_VALUE:
case REG_MULTI_STRING_VALUE:
case REG_STRING_VALUE:
value = L"sValue";
break;

default:
return property;
}
param->Get(value, 0, &property, 0, 0);

param->Release();
instance->Release();
out_method->Release();
in_method->Release();
registry->Release();

return property;
}


いやはや Release が鬱陶しいですね(笑)
例外処理で throw してしまえば綺麗になるんですが
分かりやすくするためこんな感じにしてます。
(過去ログ見てると Release してないところが結構ある(汗))

セキュリティの設定やら WMI の初期化やらは省略しました。
このサンプルを改良すればレジストリへの書き込みもできますが
私は WMI はクライアント情報の管理機構だとおもってるのでお奨めはしません。

社内クライアント全体のレジストリの変更などは
グループポリシーテンプレートなどにお任せしたほうがいいでしょう。

スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2005.12.19 | Comments(0) | Trackback(0) | プログラム

コメント

コメントの投稿


秘密にする

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。