Skip to content

Instantly share code, notes, and snippets.

@bg1bgst333
Created March 8, 2022 02:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bg1bgst333/b68608392304317848356405082cc0ce to your computer and use it in GitHub Desktop.
Save bg1bgst333/b68608392304317848356405082cc0ce to your computer and use it in GitHub Desktop.
IWbemClassObject#IWbemClassObject
// ヘッダファイルのインクルード
#define _WIN32_DCOM // DCOMの定義
#include <windows.h> // 標準WindowsAPI
#include <tchar.h> // TCHAR対応
#include <stdio.h> // C標準入出力
#include <objbase.h> // COM
#include <wbemidl.h> // WBEM
// _tmain関数の定義
int _tmain(int argc, TCHAR *argv[]){ // main関数のTCHAR版.
// 変数の宣言と初期化.
HRESULT hr; // COMの初期化の結果を格納するhr.
HRESULT hr2; // セキュリティ初期化の結果を格納するhr2.
HRESULT hr3; // IWbemLocatorの生成結果を格納するhr3.
HRESULT hr4; // IWbemLocator::ConnectServerの結果を格納するhr4.
HRESULT hr5; // CoSetProxyBlanketの結果を格納するhr5.
HRESULT hr6; // IWbemServices::ExecQueryの結果を格納するhr6.
HRESULT hr7; // IEnumWbemClassObject::Nextの結果を格納するhr7.
IWbemLocator *pLocator = NULL; // IWbemLocatorインターフェースポインタpLocatorをNULLで初期化.
IWbemServices *pServices = NULL; // IWbemServicesインターフェースポインタpServicesをNULLで初期化.
IEnumWbemClassObject *pEnumerator = NULL; // IEnumWbemClassObjectインターフェースポインタpEnumeratorをNULLで初期化.
IWbemClassObject *pClassObject = NULL; // IWbemClassObjectインターフェースポインタpClassObjectをNULLで初期化.
// MTA(マルチスレッドアパートメント)に属するように設定.
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); // CoInitializeExにCOINIT_MULTITHREADEDを指定して初期化.
if (FAILED(hr)){ // FAILEDマクロで判定.
_tprintf(_T("FAILED!\n")); // "FAILED!"と出力.
return -1; // -1を返して異常終了.
}
// セキュリティ初期化.
hr2 = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); // CoInitializeSecurityでセキュリティ初期化.
if (FAILED(hr2)){ // FAILEDマクロで判定.
_tprintf(_T("FAILED!\n")); // "FAILED!"と出力.
CoUninitialize(); // CoUninitializeで終了処理.
return -2; // -2を返して異常終了.
}
// IWbemLocatorインターフェースの生成.
hr3 = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLocator); // CoCreateInstanceで, IWbemLocatorインターフェースを生成.
if (FAILED(hr3)){ // FAILEDマクロで判定.
_tprintf(_T("FAILED!\n")); // "FAILED!"と出力.
CoUninitialize(); // CoUninitializeで終了処理.
return -3; // -3を返して異常終了.
}
// CoCreateInstanceは成功.
_tprintf(_T("CoCreateInstance OK!\n")); // "CoCreateInstance OK!"と出力.
// 取得したIWbemLocatorインターフェースポインタpLocatorを出力.
_tprintf(_T("pLocator = 0x%08x\n"), (unsigned long)pLocator); // pLocatorを出力.
// WMIへの接続.
BSTR strNetworkResource = SysAllocString(L"ROOT\\CIMV2"); // SysAllocStringでstrNetworkResourceを"ROOT\\CIMV2"で初期化.
hr4 = pLocator->ConnectServer(strNetworkResource, NULL, NULL, 0, NULL, 0, 0, &pServices); // IWbemLocator::ConnectServerで接続.
if (FAILED(hr4)){ // FAILEDマクロで判定.
_tprintf(_T("FAILED!\n")); // "FAILED!"と出力.
SysFreeString(strNetworkResource); // SysFreeStringでstrNetworkResourceを解放.
pLocator->Release(); // IWbemLocator::Releaseで解放.
CoUninitialize(); // CoUninitializeで終了処理.
return -4; // -4を返して異常終了.
}
// pLocator->ConnectServerは成功.
_tprintf(_T("pLocator->ConnectServer OK!\n")); // "pLocator->ConnectServer OK!"と出力.
// 取得したIWbemServicesインターフェースポインタpServicesを出力.
_tprintf(_T("pServices = 0x%08x\n"), (unsigned long)pServices); // pServicesを出力.
// プロキシでのセキュリティレベル設定.
hr5 = CoSetProxyBlanket(pServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE); // CoSetProxyBlanketでプロキシセキュリティレベル設定.
if (FAILED(hr5)){ // FAILEDマクロで判定.
_tprintf(_T("FAILED!\n")); // "FAILED!"と出力.
pServices->Release(); // IWbemServices::Releaseで解放.
SysFreeString(strNetworkResource); // SysFreeStringでstrNetworkResourceを解放.
pLocator->Release(); // IWbemLocator::Releaseで解放.
CoUninitialize(); // CoUninitializeで終了処理.
return -5; // -5を返して異常終了.
}
// CoSetProxyBlanketは成功.
_tprintf(_T("CoSetProxyBlanket OK!\n")); // "CoSetProxyBlanket OK!"と出力.
// クエリの実行.
BSTR strQueryLanguage = SysAllocString(L"WQL"); // SysAllocStringでstrQueryLanguageを"WQL"で初期化.
BSTR strQuery = SysAllocString(L"SELECT * FROM Win32_OperatingSystem"); // SysAllocStringでstrQueryを"SELECT * FROM Win32_OperatingSystem"で初期化.
hr6 = pServices->ExecQuery(strQueryLanguage, strQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); // IWbemServices::ExecQueryでクエリ実行.
if (FAILED(hr6)){ // FAILEDマクロで判定.
_tprintf(_T("FAILED!\n")); // "FAILED!"と出力.
SysFreeString(strQuery); // SysFreeStringでstrQueryを解放.
SysFreeString(strQueryLanguage); // SysFreeStringでstrQueryLanguageを解放.
pServices->Release(); // IWbemServices::Releaseで解放.
SysFreeString(strNetworkResource); // SysFreeStringでstrNetworkResourceを解放.
pLocator->Release(); // IWbemLocator::Releaseで解放.
CoUninitialize(); // CoUninitializeで終了処理.
return -6; // -6を返して異常終了.
}
// pServices->ExecQueryは成功.
_tprintf(_T("pServices->ExecQuery OK!\n")); // "pServices->ExecQuery OK!"と出力.
// 取得したIEnumWbemClassObjectインターフェースポインタpEnumeratorを出力.
_tprintf(_T("pEnumerator = 0x%08x\n"), (unsigned long)pEnumerator); // pEnumeratorを出力.
// pEnumeratorの各要素を列挙.
ULONG uReturn = 0;
while (pEnumerator){ // pEnumeratorがNULLで無い限り続ける.
hr7 = pEnumerator->Next(WBEM_INFINITE, 1, &pClassObject, &uReturn); // IEnumWbemClassObject::Nextで次の要素を取得.
if (uReturn == 0){ // 終了.
break;
}
if (SUCCEEDED(hr7)){ // SUCCEEDEDマクロで判定.
// pEnumerator->Nextは成功.
_tprintf(_T("pEnumerator->Next OK!\n")); // "pEnumerator->Next OK!"と出力.
// 取得したIWbemClassObjectインターフェースポインタpClassObjectを出力.
_tprintf(_T("pClassObject = 0x%08x\n"), (unsigned long)pClassObject); // pClassObjectを出力.
}
pClassObject->Release(); // IWbemClassObject::Releaseで解放.
}
// COMの終了処理.
pEnumerator->Release(); // IEnumWbemClassObject::Releaseで解放.
SysFreeString(strQuery); // SysFreeStringでstrQueryを解放.
SysFreeString(strQueryLanguage); // SysFreeStringでstrQueryLanguageを解放.
pServices->Release(); // IWbemServices::Releaseで解放.
SysFreeString(strNetworkResource); // SysFreeStringでstrNetworkResourceを解放.
pLocator->Release(); // IWbemLocator::Releaseで解放.
CoUninitialize(); // CoUninitializeで終了処理.
// プログラムの終了.
return 0; // 0を返して終了.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment