none
WMIのWin32_ProcessのGetOwnerをネイティブ(CLRを用いない)方法で呼び出すのはどうしたら? RRS feed

  • 質問

  • WMIのWin32_ProcessのGetOwnerをネイティブ(CLRを用いない)方法で呼び出すのはどうしたらうまくいくのでしょう?

    // WbemLocator取得
    IWbemLocator* pwl = NULL;
    HRESULT hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pwl));

    // WbemServices取得
    IWbemServices* pws = NULL;
    hr = pwl->ConnectServer(_bstr_t("\\\\.\\ROOT\\CIMV2"), NULL, NULL, NULL, 0, NULL, NULL, &pws);

    // authentication
    hr = CoSetProxyBlanket(pws, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);

    // クエリ実行
    IEnumWbemClassObject* pewso = NULL;
    hr = pws->ExecQuery(_bstr_t("WQL"), _bstr_t("Select * From Win32_Process"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pewso);

    // メソッド取得(引数と戻り値)
    IWbemClassObject* pc= NULL;
    hr = pws->GetObject(_bstr_t("Win32_Process"), 0, NULL, &pc, NULL);
    IWbemClassObject* pwcrGetOwnerIn= NULL;
    IWbemClassObject* pwcrGetOwnerOut = NULL;
    hr = pc->GetMethod(_bstr_t("GetOwner"), 0, &pwcrGetOwnerIn, &pwcrGetOwnerOut);

    for ( ; ; ) {
        ULONG uReturned = 0;
        IWbemClassObject* wco = NULL;
        pewso->Next(WBEM_INFINITE, 1, &wco, &uReturned);
        if (uReturned != 1)
            break;  // オワタ\(^o^)/
       
        ここでGetOwnerしたい
    }

    GetMethodで引数と戻り値は取っていますが、GetOwnerしたいのはfor文の中でpewso->Nextで取得したwcoに対してなんです。
    が、どうやって呼べばいいのか・・・
    何も考えず
    IWbemClassObject* pOutParams = NULL;
    hr = pws->ExecMethod(_bstr_t("Win32_Process"), _bstr_t("GetOwner"), 0, NULL, NULL, &pOutParams, NULL);
    とかやると、引数が変って怒られます。(GetMethodでは引数なしって言われます。実際も引数なし。)

    #「BSTRにいちいち_bstr_tを使っているのはどーなのよ」とか「開放とかエラーチェック全然してないけどどーなのよ」などのツッコミはご容赦ください(テスト的に書いたコードの抜粋です)
    ##COM嫌い

    2010年4月28日 5:35

回答

  • WCHAR path[] = L"Win32_Process.Handle=1234"; // みたいな文字列をswprintf()で作る
    hr = pc->ExecMethod(_bstr_t(path), _bstr_t(L"GetOwner"), 0, NULL, NULL, &pOutParams, NULL );
    _variant_t user;
    hr = pOutParams->Get( L"User", 0, &user, NULL, 0 );
    _variant_t domain;
    hr = pOutParams->Get( L"Domain", 0, &domain, NULL, 0 );

    かなぁ? 何も試してません。やっぱり.NETでやったほうが楽ですよ。VBScriptやJScriptでもいいですが。

    2010年4月28日 7:58

すべての返信

  • WCHAR path[] = L"Win32_Process.Handle=1234"; // みたいな文字列をswprintf()で作る
    hr = pc->ExecMethod(_bstr_t(path), _bstr_t(L"GetOwner"), 0, NULL, NULL, &pOutParams, NULL );
    _variant_t user;
    hr = pOutParams->Get( L"User", 0, &user, NULL, 0 );
    _variant_t domain;
    hr = pOutParams->Get( L"Domain", 0, &domain, NULL, 0 );

    かなぁ? 何も試してません。やっぱり.NETでやったほうが楽ですよ。VBScriptやJScriptでもいいですが。

    2010年4月28日 7:58
  • うまくいきました、ありがとうございます。

    やっぱり.NETでやったほうが楽ですよ。VBScriptやJScriptでもいいですが。

    もちろんわかった上でのネイティブです。
    #WTSEnumerateProcessesとLookupAccountSidで似たようなものがとれるのもわかっています。

    2010年4月28日 8:47