C++调用WMI类查询获取操作系统名(实例)
2023-09-14 09:13:26 时间
#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;
// 第一步:初始化COM
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
// 第二步:设置COM安全级别
hres = CoInitializeSecurity(
NULL,
-1, // COM 认证
NULL, // 服务认证
NULL, // 保留NULL
RPC_C_AUTHN_LEVEL_DEFAULT, // 默认权限
RPC_C_IMP_LEVEL_IMPERSONATE, // 默认模拟
NULL, // 认证信息
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres))
{
cout << "安全级别初始化失败,错误代码 = 0x" << hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
// 第三步:获取初始化本地WMI
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
if (FAILED(hres))
{
cout << "创建IWbemLocator对象失败,错误代码 = 0x" << hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
// 第四步:通过 IWbemLocator::ConnectServer 方法连接WMI
IWbemServices *pSvc = NULL;
// 使用IWbemServices 连接 root\cimv2 命名空间
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // 对象路径
NULL, // 用户名为空默认当前用户
NULL, // 用户密码为空默认当前密码
0, // 本地,NULL表示当前
NULL, // 安全标志
0, // 授权人
0, // 上下文对象
&pSvc // IWbemServices代理指针
);
if (FAILED(hres))
{
cout << "无法连接,错误代码 = 0x" << hex << hres << endl;
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
cout << "已连接到 ROOT\\CIMV2 WMI 命名空间" << endl;
// 第五步:设置代理安全级别
hres = CoSetProxyBlanket(
pSvc, // 要设置的代理指针
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // 委托服务名
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // 客户端身份
EOAC_NONE // 代理能力
);
if (FAILED(hres))
{
cout << "代理设置失败,错误代码 = 0x" << hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
// 第六步:使用 IWbemServices 指针获取系统名
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 << "查询系统名失败,错误代码 = 0x" << hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
// 第七步:获取查询数据
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 << " 系统名 : " << vtProp.bstrVal << endl;
VariantClear(&vtProp);
pclsObj->Release();
}
// 清理工作
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
system("pause");
return 0; // Program successfully completed.
}
说明都在源码注释里,效果图:
相关文章
- 手把手带你学C++,set是个啥,有什么用?
- c语言createthread函数,C++中CreateThread函数创建线程的用法和实例
- C++ Primer Plus习题及答案-第七章
- C/C++获取当前系统时间的方法
- 在 C++ 中标记字符串与getline() 函数和字符数组
- c++的链表-链表入门(C++)
- 开心档之C++ 多态
- C++实例解析哈夫曼树详解编程语言
- 树和二叉树的存储结构的实现(C/C++实现)详解编程语言
- C++ STL move_iterator移动迭代器用法详解
- C++实现:螺旋矩阵的实例代码
- C++嵌套类与局部类详细解析
- C++流操作之fstream用法介绍
- 关于C++静态成员函数访问非静态成员变量的问题
- linux系统中c++写日志文件功能分享
- C++模板类的用法实例
- C++中DeviceIoCteatol的用法实例
- C++采用openfilename打开文件对话框用法实例
- C++中I/O模型之select模型实例
- C++计算ICMP头的校验和实例
- C++形参与实参的区别实例解析
- C++的try块与异常处理及调试技术实例解析
- C++利用stringstream进行数据类型转换实例
- C++遗传算法类文件实例分析
- C++实现DES加密算法实例解析
- C++虚函数表实例分析