C++调用WMI类查询获取操作系统名

Posted biaoge140

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++调用WMI类查询获取操作系统名相关的知识,希望对你有一定的参考价值。

  1 #define _WIN32_DCOM
  2 #include <iostream>
  3 #include <comdef.h>
  4 #include <Wbemidl.h>
  5 
  6 using namespace std;
  7 
  8 #pragma comment(lib, "wbemuuid.lib")
  9 
 10 int main(int argc, char **argv)
 11 {
 12     HRESULT hres;
 13 
 14     // 第一步:初始化COM
 15     hres = CoInitializeEx(0, COINIT_MULTITHREADED);
 16     if (FAILED(hres))
 17     {
 18         cout << "Failed to initialize COM library. Error code = 0x"
 19             << hex << hres << endl;
 20         return 1;                  // Program has failed.
 21     }
 22 
 23     // 第二步:设置COM安全级别
 24     hres = CoInitializeSecurity(
 25         NULL,
 26         -1,                          // COM 认证
 27         NULL,                        // 服务认证
 28         NULL,                        // 保留NULL
 29         RPC_C_AUTHN_LEVEL_DEFAULT,   // 默认权限
 30         RPC_C_IMP_LEVEL_IMPERSONATE, // 默认模拟
 31         NULL,                        // 认证信息
 32         EOAC_NONE,                   // Additional capabilities 
 33         NULL                         // Reserved
 34         );
 35 
 36 
 37     if (FAILED(hres))
 38     {
 39         cout << "安全级别初始化失败,错误代码 = 0x" << hex << hres << endl;
 40         CoUninitialize();
 41         return 1;                    // Program has failed.
 42     }
 43 
 44     // 第三步:获取初始化本地WMI
 45     IWbemLocator *pLoc = NULL;
 46 
 47     hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
 48 
 49     if (FAILED(hres))
 50     {
 51         cout << "创建IWbemLocator对象失败,错误代码 = 0x" << hex << hres << endl;
 52         CoUninitialize();
 53         return 1;                 // Program has failed.
 54     }
 55 
 56     // 第四步:通过 IWbemLocator::ConnectServer 方法连接WMI
 57     IWbemServices *pSvc = NULL;
 58 
 59     // 使用IWbemServices 连接 root\\cimv2 命名空间 
 60     hres = pLoc->ConnectServer(
 61         _bstr_t(L"ROOT\\\\CIMV2"), // 对象路径
 62         NULL,                    // 用户名为空默认当前用户
 63         NULL,                    // 用户密码为空默认当前密码
 64         0,                       // 本地,NULL表示当前
 65         NULL,                    // 安全标志
 66         0,                       // 授权人
 67         0,                       // 上下文对象
 68         &pSvc                    // IWbemServices代理指针
 69         );
 70 
 71     if (FAILED(hres))
 72     {
 73         cout << "无法连接,错误代码 = 0x" << hex << hres << endl;
 74         pLoc->Release();
 75         CoUninitialize();
 76         return 1;                // Program has failed.
 77     }
 78 
 79     cout << "已连接到 ROOT\\\\CIMV2 WMI 命名空间" << endl;
 80 
 81 
 82     // 第五步:设置代理安全级别
 83 
 84     hres = CoSetProxyBlanket(
 85         pSvc,                        // 要设置的代理指针
 86         RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
 87         RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
 88         NULL,                        // 委托服务名
 89         RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
 90         RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
 91         NULL,                        // 客户端身份
 92         EOAC_NONE                    // 代理能力
 93         );
 94 
 95     if (FAILED(hres))
 96     {
 97         cout << "代理设置失败,错误代码 = 0x" << hex << hres << endl;
 98         pSvc->Release();
 99         pLoc->Release();
100         CoUninitialize();
101         return 1;               // Program has failed.
102     }
103 
104     // 第六步:使用 IWbemServices 指针获取系统名
105     IEnumWbemClassObject* pEnumerator = NULL;
106     hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
107 
108     if (FAILED(hres))
109     {
110         cout << "查询系统名失败,错误代码 = 0x" << hex << hres << endl;
111         pSvc->Release();
112         pLoc->Release();
113         CoUninitialize();
114         return 1;               // Program has failed.
115     }
116 
117     // 第七步:获取查询数据
118     IWbemClassObject *pclsObj = NULL;
119     ULONG uReturn = 0;
120 
121     while (pEnumerator)
122     {
123         HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,&pclsObj, &uReturn);
124 
125         if (0 == uReturn)
126         {
127             break;
128         }
129 
130         VARIANT vtProp;
131 
132         // 获取Name属性值
133         hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
134         wcout << " 系统名 : " << vtProp.bstrVal << endl;
135         VariantClear(&vtProp);
136 
137         pclsObj->Release();
138     }
139 
140     // 清理工作
141     pSvc->Release();
142     pLoc->Release();
143     pEnumerator->Release();
144     CoUninitialize();
145     system("pause");
146     return 0;   // Program successfully completed.
147 
148 }

说明都在源码注释里,效果图:

技术图片

以上是关于C++调用WMI类查询获取操作系统名的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中 WMI 中的 OUT 参数获取值

使用 WMI 查询的 perfmon 计数器值问题

主板 ID - WMI C++ - 可靠吗?

WMI:获取已安装软件的列表

C++ 类成员函数地址

C++实现查询本机信息并且上报