#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. iOS中使用RNCryptor对资源文件加密

    原文:http://blog.csdn.net/chenpolu/article/details/46277587 RNCryptor源码https://github.com/RNCryptor/RN ...

  2. Android学习——SharedPreferences

    接下来的几个博文,来介绍安卓中的数据存储方式,安卓中的数据存储主要有四种方式: 1.SharedPreferences 2.SQLite 3.Content Provider 4.File 这篇博文主 ...

  3. asyncio标准库3 HTTP client example

    import aiohttp import asyncio import async_timeout async def fetch(session, url): async with async_t ...

  4. C#设计模式之代理模式(四)

    15.7 代理模式效果与适用场景 代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制.代理模式类型较多,其中远程代理.虚拟代理.保护代理等在软件开发中应 ...

  5. phpunit 单元测试之代码覆盖率

    最近团队在不断完善项目中的单元测试用例,会用到代码覆盖率分析,本来以为 homestead 应该默认安装了 xdebug ,所以使用 phpunit --coverage-html ./tests/c ...

  6. HCNA调整RIP的运行版本

    1.拓扑图 2.实验配置 R1配置RIPv1 md5加密认证 Please press enter to start cmd line! ############################### ...

  7. 织梦Dedecms主要文件夹目录及模板文件说明

    虽然织梦DedeCMS因为安全问题被人所诟病,但瑕不掩瑜,无论从用户群数量还是时间等各方面,织梦DedeCMS都是国内排名前几的CMS建站程序.如果你想学习CMS的二次开发,织梦DedeCMS是必须需 ...

  8. tensorflow报错 Key Conv/biases not found in checkpoint

    可能的解决方法: 删除训练文件夹中的旧模型

  9. jQuery的datatable的destroy属性,和$("#test").dataTable().fnDestroy();区别,两者的区别

    jQuery的datatable的destroy属性,和$("#test").dataTable().fnDestroy();区别,两者的区别. 1 destroy属性是,销毁实例 ...

  10. CF25E Test

    嘟嘟嘟 因为只有三个字符串,所以就有一个比较暴力的做法:枚举这三个串所有排列,然后对于每一个排列,减去这三个串两两的公共部分的长度,更新答案. 求公共部分自然想到kmp:比如s[1]接在s[0]后面, ...