#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(, COINIT_MULTITHREADED);
if (FAILED(hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return ; // Program has failed.
} // 第二步:设置COM安全级别
hres = CoInitializeSecurity(
NULL,
-, // 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 ; // Program has failed.
} // 第三步:获取初始化本地WMI
IWbemLocator *pLoc = NULL; hres = CoCreateInstance(CLSID_WbemLocator, , CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc); if (FAILED(hres))
{
cout << "创建IWbemLocator对象失败,错误代码 = 0x" << hex << hres << endl;
CoUninitialize();
return ; // Program has failed.
} // 第四步:通过 IWbemLocator::ConnectServer 方法连接WMI
IWbemServices *pSvc = NULL; // 使用IWbemServices 连接 root\cimv2 命名空间
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // 对象路径
NULL, // 用户名为空默认当前用户
NULL, // 用户密码为空默认当前密码
, // 本地,NULL表示当前
NULL, // 安全标志
, // 授权人
, // 上下文对象
&pSvc // IWbemServices代理指针
); if (FAILED(hres))
{
cout << "无法连接,错误代码 = 0x" << hex << hres << endl;
pLoc->Release();
CoUninitialize();
return ; // 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 ; // 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 ; // Program has failed.
} // 第七步:获取查询数据
IWbemClassObject *pclsObj = NULL;
ULONG uReturn = ; while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, ,&pclsObj, &uReturn); if ( == uReturn)
{
break;
} VARIANT vtProp; // 获取Name属性值
hr = pclsObj->Get(L"Name", , &vtProp, , );
wcout << " 系统名 : " << vtProp.bstrVal << endl;
VariantClear(&vtProp); pclsObj->Release();
} // 清理工作
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
system("pause");
return ; // Program successfully completed. }

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

C++调用WMI类查询获取操作系统名的更多相关文章

  1. java中遍历实体类,获取属性名和属性值

    方式一(实体类): //java中遍历实体类,获取属性名和属性值 public static void testReflect(Object model) throws Exception{ for ...

  2. python调用aapt工具直接获取包名和tagertSdkversion

    背景: 每次海外游戏上架都需要符合google的上架规则,其中适配方面tagetSdkversion有硬性要求,比如需要适配安卓q就需要tagetSdkversion达到28,水平太渣的我每次调用aa ...

  3. Java工具类(获取当前主机操作系统名)

    package com.fly.jenkins.util; /** * 操作系统类: 获取System.getProperty("os.name")对应的操作系统 * * @aut ...

  4. 使用bat脚本调用py文件直接获取应用的包名和targetversion

    背景: 在上一篇已经介绍过如何利用python调用aapt获取包名 https://www.cnblogs.com/reseelei-despair/p/11078750.html 但是因为每次都要修 ...

  5. server.port 在单元测试中,调用的类或者方法这个地方获取到的端口号就会变成-1

    @Value("${server.port}") 本文链接:https://blog.csdn.net/weixin_38342534/article/details/886985 ...

  6. 在dwr的调用类里获取请求信息

    在dwr的调用类里获取请求的相关信息HttpSession session = WebContextFactory.get().getSession();HttpServletResponse res ...

  7. 使用子查询获取,使用 all 关键字获取比所有“国内短线游”价格高的线路信息,按照线路类型、线路价格升序显示线路编号、线路名和价格

    查看本章节 查看作业目录 需求说明: 使用子查询获取"国内短线游"及"国内长线游"的线路信息,按照线路类型.线路价格升序显示线路编号.线路名和价格 使用 all ...

  8. C# 获取操作系统相关的信息

    本文通过一个Demo,讲解如何通过C#获取操作系统相关的信息,如内存大小,CPU大小,机器名,环境变量等操作系统软件.硬件相关信息,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: Envir ...

  9. Hibernate三大类查询总结

    Hibernate目前总共分为三大类查询:cretiria,hql,本地sql [以下篇章搜集于网络,感谢作者] 第一:关于cretiria的查询 具有一个直观的.可扩展的条件查询API是Hibern ...

随机推荐

  1. FontSize sp 和 dp 的区别

    dp不会随着“设置->显示->字体大小”的改变而改变,sp会. sp会随着configeration的配置来scale, dp不会. 所以,什么时候用sp, 什么时候用dp需要斟酌.

  2. HashMap put、get方法源码分析

    HashMap.java的实现是面试必问的问题. JDK版本 java version "1.8.0_91" Java(TM) SE Runtime Environment (bu ...

  3. js异步流程控制-回调

    f1为耗时操作,f2依赖f1的数据,因此f2必须在f1之后执行: 个人理解是:将f2(回调函数)的代码放在异步函数内部的最后执行,相当于把同步操作的代码融合到异步函数内部的最后: let tag = ...

  4. csharp: DataTable结构相同的比较

    )
 ) * pageSize;
 ; i++)
 {
 DataRow newdr = newdt.NewRow();
 DataRow dr = dt.Rows[i];
 foreach (Dat ...

  5. jQuery:mouseover and Increase the Size of an Image

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. IntelliJ IDEA 2017.3.5 安装 lombok-plugin-0.17 失败,通过网络下载总是超时

    1.问题: IntelliJ IDEA 2017.3.5 安装 lombok-plugin-0.17 失败,通过网络下载总是超时: 2.原因:IntelliJ IDEA 2017.3.5 目前还不支持 ...

  7. 从list中随机选出几个数,并按照原来的顺序排列

    需求: 从list中随机选出几个数,并按照原来的顺序排列(比如从list中随机选出6个数) 方案一: //若对象size大于6,则随机去除6个对象,并按照原来的顺序排列 while(list.size ...

  8. HTML基础内容(持续更新...)

    1.<!DOCTYPE html>声明有助于浏览器中正确显示网页 HTML5<!DOCTYPE html>HTML 4.01<!DOCTYPE HTML PUBLIC & ...

  9. FUNCTION_POWER

    1.power function Definition:The Oracle PL/SQL, the POWER function is a built in function which takes ...

  10. com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException 异常

    MySQL完整性约束破坏异常:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException 在单向多对一关联关系 ...