スポンサーサイト

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

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

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

現在ゲームオーバー処理中(;´-`)y-~~

そういえばCマガをみたらなにやらSTL.NETを開発(開発終了)しているらしい……
ん~面白そうだけど.NETでプログラムするならC#選択するかな……

早くVS2005でないかなorz



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

さて今回は WMI を使用してさまざまなプロパティを取得してみたいと思います。

※WMIはなんぞや? という方はこちら

WMIの利点は
・リモート上のコンピュータのさまざまな情報を取得できる
・クエリーを変更するだけでさまざまなPC上の情報を取得できる
といったところでしょうか。

ちなみに私がC++でWMIを使用することになったきっかけは
最初VBでお手軽に情報の取得をしていたのですが
どうにも遅いのが気になりました。
(特にサーバのイベントログを取得しようとした時に限界を感じました^^;)
最初WMI自体が遅いのか? とも思ったのですが
ためしにC++で組んだところ5~10倍近い速度差がでてしまい……というわけですorz

というわけで早速サンプルソースです。
これはとあるプログラム関係の掲示板に載せたものです。

このまま使用せずにラッパークラスを作った方が後々楽でしょう。
なおコンパイルするにはWMI SDKが必要です。

#define _WIN32_DCOM
#include
#include
#include
using namespace std;

#pragma comment(lib, "wbemuuid.lib")

int main(int argc, char **argv)
{
IWbemLocator *wbem_locator = NULL;
IWbemServices *wbem_services = NULL;
IEnumWbemClassObject *wbem_enumerator = NULL;

// 各種初期化
CoInitializeEx(0, COINIT_MULTITHREADED);

CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE, NULL);

CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator,
reinterpret_cast(&wbem_locator));

// 接続開始
wbem_locator->ConnectServer(_bstr_t(L"\\\\.\\ROOT\\CIMV2"),
NULL, NULL, 0, NULL,
0, 0, &wbem_services);

CoSetProxyBlanket(wbem_services,
RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

wbem_services->ExecQuery(bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_ComputerSystem"),
WBEM_FLAG_RETURN_IMMEDIATELY |
WBEM_FLAG_FORWARD_ONLY ,
NULL, &wbem_enumerator);

// プロパティ読み込み
IWbemClassObject *wbem_object;
ULONG returned = 0;

while(wbem_enumerator)
{
wbem_enumerator->Next(WBEM_INFINITE, 1,
&wbem_object, &returned);

if(0 == returned)
break;

_bstr_t property_name[] = {L"Name", L"UserName", L"Domain"};

for(int item = 0; item < 3; item++)
{
VARIANT property_value;
_bstr_t display_name;
VariantInit(&property_value);
wbem_object->Get(property_name[item], 0,
&property_value, 0, 0);
display_name = property_value;
cout << static_cast(property_name[item]) <<
" : " << static_cast(display_name) << endl;
VariantClear(&property_value);
}
}

wbem_services->Release();
wbem_locator->Release();
wbem_enumerator->Release();
wbem_object->Release();

CoUninitialize();

return 0;
}


しかしこのままでは芸がありません(ぁ
なので次回はイントラネット内の同一ドメインに所属する全てのコンピュータから
IPアドレスを取得するプログラムを解説します。

スポンサーサイト

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

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

コメント

コメントの投稿


秘密にする

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


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