C++调用WMI类查询获取操作系统名(实例)
生活随笔
收集整理的這篇文章主要介紹了
C++调用WMI类查询获取操作系统名(实例)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#define _WIN32_DCOM
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>using namespace std;#pragma comment(lib, "wbemuuid.lib")int main(int argc, char **argv)
{HRESULT hres;// 第一步:初始化COMhres = CoInitializeEx(0, COINIT_MULTITHREADED);if (FAILED(hres)){cout << "Failed to initialize COM library. Error code = 0x"<< hex << hres << endl;return 1; // Program has failed.}// 第二步:設(shè)置COM安全級別hres = CoInitializeSecurity(NULL,-1, // COM 認(rèn)證NULL, // 服務(wù)認(rèn)證NULL, // 保留NULLRPC_C_AUTHN_LEVEL_DEFAULT, // 默認(rèn)權(quán)限RPC_C_IMP_LEVEL_IMPERSONATE, // 默認(rèn)模擬NULL, // 認(rèn)證信息EOAC_NONE, // Additional capabilitiesNULL // Reserved);if (FAILED(hres)){cout << "安全級別初始化失敗,錯誤代碼 = 0x" << hex << hres << endl;CoUninitialize();return 1; // Program has failed.}// 第三步:獲取初始化本地WMIIWbemLocator *pLoc = NULL;hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);if (FAILED(hres)){cout << "創(chuàng)建IWbemLocator對象失敗,錯誤代碼 = 0x" << hex << hres << endl;CoUninitialize();return 1; // Program has failed.}// 第四步:通過 IWbemLocator::ConnectServer 方法連接WMIIWbemServices *pSvc = NULL;// 使用IWbemServices 連接 root\cimv2 命名空間hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), // 對象路徑NULL, // 用戶名為空默認(rèn)當(dāng)前用戶NULL, // 用戶密碼為空默認(rèn)當(dāng)前密碼0, // 本地,NULL表示當(dāng)前NULL, // 安全標(biāo)志0, // 授權(quán)人0, // 上下文對象&pSvc // IWbemServices代理指針);if (FAILED(hres)){cout << "無法連接,錯誤代碼 = 0x" << hex << hres << endl;pLoc->Release();CoUninitialize();return 1; // Program has failed.}cout << "已連接到 ROOT\\CIMV2 WMI 命名空間" << endl;// 第五步:設(shè)置代理安全級別hres = CoSetProxyBlanket(pSvc, // 要設(shè)置的代理指針RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxxRPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxxNULL, // 委托服務(wù)名RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxxRPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxxNULL, // 客戶端身份EOAC_NONE // 代理能力);if (FAILED(hres)){cout << "代理設(shè)置失敗,錯誤代碼 = 0x" << hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return 1; // Program has failed.}// 第六步:使用 IWbemServices 指針獲取系統(tǒng)名IEnumWbemClassObject* pEnumerator = NULL;hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);if (FAILED(hres)){cout << "查詢系統(tǒng)名失敗,錯誤代碼 = 0x" << hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return 1; // Program has failed.}// 第七步:獲取查詢數(shù)據(jù)IWbemClassObject *pclsObj = NULL;ULONG uReturn = 0;while (pEnumerator){HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,&pclsObj, &uReturn);if (0 == uReturn){break;}VARIANT vtProp;// 獲取Name屬性值hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);wcout << " 系統(tǒng)名 : " << vtProp.bstrVal << endl;VariantClear(&vtProp);pclsObj->Release();}// 清理工作pSvc->Release();pLoc->Release();pEnumerator->Release();CoUninitialize();system("pause");return 0; // Program successfully completed.}
說明都在源碼注釋里,效果圖:
總結(jié)
以上是生活随笔為你收集整理的C++调用WMI类查询获取操作系统名(实例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义控件 - 流式布局:TagFlow
- 下一篇: py---------面向对象进阶