C++ で WMI クラスを使う

WMI は、普段、スクリプトで使うことがほとんどだと思いますが、C++ で使ってみようということで
コーディング方法を紹介します。VB でもなく、.NET でもなく、あえて C++ です…。
COM プログラミングなので、後処理(Release() を呼ぶのが面倒)を楽にするために、ATL のスマートポインタを使います。

今回の例は、WMI の Win32_OperatingSystem クラスを使って、コンピューター種別を調べてみようというシナリオです。
具体的には、Win32_OperatingSystem クラスの ProductType メンバーの値を参照して調べるというものです。
(一部、エラー処理を省いています)

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    HRESULT hRes;

    hRes = CoInitializeSecurity(NULL,
        -1,
        NULL,
        NULL,
        RPC_C_AUTHN_LEVEL_PKT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE,
        0);
    if (SUCCEEDED(hRes))
    {
        CComPtr<IWbemLocator> pIWbemLocator = NULL;
        CComPtr<IWbemServices> pWbemServices = NULL;

        hRes = pIWbemLocator.CoCreateInstance(CLSID_WbemAdministrativeLocator,
            NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER);
        if (SUCCEEDED(hRes))
        {
            CComBSTR bstrNamespace = (L"root\\cimv2");
            hRes = pIWbemLocator->ConnectServer(
                        bstrNamespace,
                        NULL,
                        NULL,
                        NULL,
                        0,
                        NULL,
                        NULL,
                        &pWbemServices);

            CComBSTR strQuery = L"Select * from Win32_OperatingSystem";
            CComBSTR strQL = L"WQL";
            CComPtr<IEnumWbemClassObject> pEnumObject = NULL;

            hRes = pWbemServices->ExecQuery(strQL, strQuery, WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumObject);

            ULONG uCount = 1, uReturned;
            CComPtr<IWbemClassObject> pClassObject = NULL;

            hRes = pEnumObject->Reset();
            hRes = pEnumObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned);

            CComVariant var;
            CComBSTR strClassProp = L"ProductType";
            hRes = pClassObject->Get(strClassProp, 0, &var, 0, 0);
            switch (var.intVal)
            {
            case 1: printf("This Computer is Workstation.\n"); break;
            case 2: printf("This Computer is Domain Controller.\n"); break;
            case 3: printf("This Computer is Server.\n"); break;
            default: printf("This Computer is UnKnown Type.\n"); break;
            }
        }
    }

    CoUninitialize();
    return 0;
}

C++ で WMI クラスを使う機会は少ないと思いますが、こんな方法で使うことができます。
他の WMI クラスも上記を参考にすれば、使えると思います。
こういうのを知ると、スクリプトって便利だなって思いますね。

ちなみにですが、WMI 開発の際に使えそうな便利ツールが Microsoft から提供されています。

  1. WMI Code Creator
    スクリプトで WMI を使ってみようなんて思ったら、ぜひ、これを使ってみてください。
    スクリプトコードのサンプルを出力してくれますし、C# や VB.NET のコードも生成できちゃったりします。
  2. WMI Administrative Tools
    この中にある WMI CIM Studio が有益なツールです。WMI の名前空間やクラス構造を調べるのに使うと便利です。

なお、これらのツールは、Windows Vista/Windows 7 でも動きます。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。