QT/C++获取电脑系统,主板型号,CPU型号,硬盘型号,内存大小等相关信息(二)通过Windows Server (WMI)查询

Qt/C++调用windows Api库通过wmi的方式查询电脑能获取更多详细信息,也更加合理有技术性。
建议使用MSCV编译器,如MSCV 2017 ,Qt版本 : 5.13.1

目录导读

    • 关于 WMI
    • 示例:创建 WMI 应用程序
    • 示例:打印Wmi执行的查询项的所有属性
      • 头文件引用项:
      • 输出类型转换
      • 执行查询
    • 通过Windows PowerShell 查询WMI 属性
    • 示例:通过WMI 查询电脑属性
      • 查询磁盘 盘符信息:
      • 获取当前系统版本
      • 获取主板型号
      • 获取CPU型号
      • 获取显卡型号
      • 获取内存大小
      • 获取电脑类型
      • 获取硬盘型号
    • 示例源码

关于 WMI

关于 WMI:
Windows Management Instrumentation (WMI) 是 Microsoft 对基于 Web 的企业管理 (WBEM) 的实现,WBEM 是一项业界倡议,用于为访问企业环境中的管理信息开发一项标准技术。 WMI 使用通用信息模型 (CIM) 行业标准来表示系统、应用程序、网络、设备和其他托管组件

示例:创建 WMI 应用程序

创建 WMI 应用程序
官方代码示例:后续调用基本参照这种格式,值得注意的是需要把COINIT_MULTITHREADED 改为:COINIT_APARTMENTTHREADED
参考详见:
Qt中使用WMI时遇到的那些坑
示例:从本地计算机获取 WMI 数据
CIMWin32 WMI 提供程序-计算机系统硬件类

示例:打印Wmi执行的查询项的所有属性

通过获取第一条数据的属性字段名称,打印输出所有属性:

头文件引用项:

#include <iostream>
#include <comdef.h>
#include <WbemIdl.h>
#include <comutil.h>
#include <Windows.h>
#include <QStorageInfo>
#pragma comment(lib, "wbemuuid.lib")
#pragma comment(lib, "comsuppw.lib")

输出类型转换

QString check_vatiant_type(VARIANT Value,CIMTYPE _enum_type)
{switch ( _enum_type ){case CIM_ILLEGAL ://值: 0xfff非法值。return QString::fromWCharArray(Value.bstrVal);case CIM_EMPTY : //值: 0 空 (null) 值。return "NULL";case CIM_SINT8 : //值: 16//8 位有符号整数。return  QString::number(Value.iVal);case CIM_SINT16 : //值: 2//16 位带符号整数。return  QString::number(Value.iVal);case CIM_SINT32 : //值: 3//32 位带符号整数。return  QString::number(Value.intVal);case CIM_SINT64 : //值: 20//64 位带符号整数。return  QString::number(Value.llVal,10);case CIM_UINT8 : //值: 17//8 位无符号整数。return  QString::number(Value.uiVal);case CIM_UINT16 : //值: 18//16 位无符号整数。return  QString::number(Value.uintVal);case CIM_UINT32 : //值: 19//32 位无符号整数。return  QString::number(Value.uintVal);case CIM_UINT64 : //值: 21//64 位无符号整数。return  QString::number(Value.ullVal,10);case CIM_REAL32 : //值: 4//32 位实数。return  QString::number(Value.intVal);case CIM_REAL64 : //值: 5//64 位实数。return  QString::number(Value.ullVal,10);case CIM_BOOLEAN : //值: 11//一个布尔值。return Value.boolVal?"TRUE":"FALSE";case CIM_STRING : // 值: 8// 字符串值。return QString::fromWCharArray(Value.bstrVal);case CIM_DATETIME : //值: 101//一个日期时间值。case CIM_REFERENCE : //值: 102//另一个对象的引用 (__Path) 。case CIM_CHAR16 : //值: 103//16 位字符值。case CIM_OBJECT : //值: 13//Object 值 。case CIM_FLAG_ARRAY : // 值: 0x2000//数组值。return QString::fromWCharArray(Value.bstrVal);default:return QString::fromWCharArray(Value.bstrVal);}
}

执行查询

///输入 table_name /表名称 如: Win32_Refrigeration
void SelectWmi(QString table_name)
{HRESULT hres;// Step 1: --------------------------------------------------// Initialize COM. ------------------------------------------hres =  CoInitializeEx(0, COINIT_APARTMENTTHREADED);if (FAILED(hres)){//Qt中使用WMI时遇到的那些坑儿//https://blog.csdn.net/wangshubo1989/article/details/51869644qDebug() << "Failed to initialize COM library. Error code = 0x"<< hex << hres << endl;return ;                  // Program has failed.}// Step 2: --------------------------------------------------// Set general COM security levels --------------------------hres =  CoInitializeSecurity(NULL,-1,                          // COM authenticationNULL,                        // Authentication servicesNULL,                        // ReservedRPC_C_AUTHN_LEVEL_DEFAULT,   // Default authenticationRPC_C_IMP_LEVEL_IMPERSONATE, // Default ImpersonationNULL,                        // Authentication infoEOAC_NONE,                   // Additional capabilitiesNULL                         // Reserved);if ((hres != RPC_E_TOO_LATE) && FAILED(hres)){qDebug() << "Failed to initialize security. Error code = 0x"<< hex << hres << endl;CoUninitialize();return ;                    // Program has failed.}// Step 3: ---------------------------------------------------// Obtain the initial locator to WMI -------------------------IWbemLocator *pLoc = NULL;hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator, (LPVOID *) &pLoc);if (FAILED(hres)){qDebug() << "Failed to create IWbemLocator object."<< " Err code = 0x"<< hex << hres << endl;CoUninitialize();return ;                 // Program has failed.}// Step 4: -----------------------------------------------------// Connect to WMI through the IWbemLocator::ConnectServer methodIWbemServices *pSvc = NULL;// Connect to the root\cimv2 namespace with// the current user and obtain pointer pSvc// to make IWbemServices calls.hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespaceNULL,                    // User name. NULL = current userNULL,                    // User password. NULL = current0,                       // Locale. NULL indicates currentNULL,                    // Security flags.0,                       // Authority (for example, Kerberos)0,                       // Context object&pSvc                    // pointer to IWbemServices proxy);if (FAILED(hres)){qDebug() << "Could not connect. Error code = 0x"<< hex << hres << endl;pLoc->Release();CoUninitialize();return ;                // Program has failed.}qDebug() << "Connected to ROOT\\CIMV2 WMI namespace" << endl;// Step 5: --------------------------------------------------// Set security levels on the proxy -------------------------hres = CoSetProxyBlanket(pSvc,                        // Indicates the proxy to setRPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxxRPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxxNULL,                        // Server principal nameRPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxxRPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxxNULL,                        // client identityEOAC_NONE                    // proxy capabilities);if (FAILED(hres)){qDebug() << "Could not set proxy blanket. Error code = 0x"<< hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return ;               // Program has failed.}// Step 6: --------------------------------------------------// Use the IWbemServices pointer to make requests of WMI ----// For example, get the name of the operating systemIEnumWbemClassObject* pEnumerator = NULL;hres = pSvc->ExecQuery(bstr_t("WQL"),bstr_t(QString("SELECT * FROM "+table_name.trimmed()).toStdWString().c_str()),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);if (FAILED(hres)){qDebug() << "Query for operating system name failed."<< " Error code = 0x"<< hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return ;               // Program has failed.}// Step 7: -------------------------------------------------// Get the data from the query in step 6 -------------------//IWbemClassObject 接口包含和操作类定义和类对象实例。///属性字段列表QList<BSTR> Headerlist;///属性值 全部转换成字符串 用于显示到界面QList<QStringList> Datas;IWbemClassObject *pclsObj = NULL;while (pEnumerator){ULONG uReturn = 0;HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);if(0 == uReturn || pclsObj == NULL){break;}if(Headerlist.count()==0){SAFEARRAY* pNames;hres=pclsObj->GetNames(L"",WBEM_FLAG_ALWAYS,NULL,&pNames);if (FAILED(hres)){qDebug()<<"获取属性名称失败!";}qDebug()<<"lLbound : "<<pNames->cDims;qDebug()<<"cbElements : "<<pNames->cbElements;BSTR HUGEP *pbstr;// Get a pointer to the elements of the array.hr = SafeArrayAccessData(pNames, (void HUGEP**)&pbstr);if (FAILED(hr))continue;for (int i = 0; i < pNames->rgsabound->cElements; i++){BSTR bstrTemp = pbstr[i];Headerlist.append(bstrTemp);}SafeArrayDestroy(pNames);}if(Headerlist.count()==0)continue;QStringList _Data;foreach (BSTR name , Headerlist) {VARIANT vtProp;CIMTYPE  pType= CIM_EMPTY;VariantInit(&vtProp);hr = pclsObj->Get(name, 0, &vtProp, &pType, 0);if(FAILED(hr)){_Data.append("ERROR");}else_Data.append(check_vatiant_type(vtProp,pType));VariantClear(&vtProp);}Datas.append(_Data);pclsObj->Release();}emit SendTabValues(Headerlist,Datas);// Cleanup// ========pSvc->Release();pLoc->Release();pEnumerator->Release();CoUninitialize();
}

通过Windows PowerShell 查询WMI 属性

在WMI 众多查询项中,如果需要预先简要查看相关属性,可以通过Windows PowerShell输入查询;
windows+ X 选择Windows PowerShell (管理员)查询:
以查询磁盘为例:
输入:Get-WmiObject -query "SELECT * FROM Win32_DiskDrive"
在这里插入图片描述
指定项查询:Get-WmiObject -query "SELECT name,Partitions,DeviceID,Model,Size,Caption,SystemName FROM WIN32_DiskDrive"
在这里插入图片描述

示例:通过WMI 查询电脑属性

查询磁盘 盘符信息:

代码:select DeviceID,DriveType,FreeSpace,Size,VolumeName,FileSystem from Win32_LogicalDisk
在这里插入图片描述

获取当前系统版本

代码:SELECT Caption,Name,OSArchitecture FROM Win32_OperatingSystem
在这里插入图片描述

获取主板型号

代码:SELECT Product From Win32_BaseBoard
在这里插入图片描述

获取CPU型号

代码:SELECT Name FROM Win32_Processor

获取显卡型号

代码:select Name from Win32_VideoController

获取内存大小

代码:SELECT TotalPhysicalMemory FROM Win32_ComputerSystem

获取电脑类型

代码:SELECT ChassisTypes FROM Win32_SystemEnclosure

获取硬盘型号

代码:SELECT Model From Win32_DiskDrive

示例源码

链接: https://pan.baidu.com/s/1QEGau1LQalW7HXv0E3kejA
提取码: 666v
双击查询电脑常用详细属性
编译器:MSCV2017 | QtCreator 5.13.1
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/101012.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于缓冲原理计算轨迹相似度

目录 前言预备知识思路与核心代码优缺点分析数值实验参考文献 前言 接上文&#xff0c;我们已经知道如何利用夹角余弦来计算两条轨迹的相似度&#xff0c;也知道其中优势和劣势&#xff0c;夹角余弦方法作为一个基础的baseline有其存在的价值&#xff0c;很多学者也提出了各式…

【autodesk】浏览器中渲染rvt模型

使用Forge完成渲染 Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。在Forge平台中&#xff0c;有一个名为"Model Derivative"的服务&#xff0c;它可以将包括RVT&#xff08;Revit&#xff09;在内的多种BIM&#xff08…

学习笔记二十:Pod生命周期-启动钩子、停止钩子

Pod生命周期-启动钩子、停止钩子 Pod生命周期pod在整个生命周期的过程中总会处于以下几个状态&#xff1a;pod生命周期的重要行为&#xff1a;容器探测三种探针用于Pod检测 容器的重启策略定义是否重启Pod对象pod的终止过程 Init容器初始化容器与主容器区别是:初始化容器使用 P…

人工智能客服:是跨境电商未来的趋势吗?

随着跨境电商的快速发展&#xff0c;客户服务成为了商家们越来越关注的焦点。而在客户服务领域中&#xff0c;人工智能客服正逐渐崭露头角。那么&#xff0c;人工智能客服是否是跨境电商未来的趋势呢&#xff1f;本文将探讨这个问题&#xff0c;并揭示人工智能客服的潜力和优势…

用python开发一个炸金花小游戏

众所周知&#xfeff;扑克牌可谓是居家旅行、桌面交友的必备道具&#xff0c; 今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏&#xff0c;先来看一下基本的游戏规则。 炸&#xff08;诈&#xff09;金花又叫三张牌&#xff0c;是在全国广泛流传的一种民间多人纸牌游戏…

win11 系统 Internet Connection Sharing (ICS) 服务无法关闭-问题解决

问题出现在matebook ego ,出现一个问题就是一连上电源&#xff0c;运行ipconfig &#xff0c;WLAN 2就会自动给配上一个192.168.137.1的ip,一断开电源这个ip就会小时&#xff0c;因为我要创建一个热点&#xff0c;如果这个ip有了那么热点会创建失败&#xff01;于是开始排查&am…

vue小测试之拖拽、自定义事件

在开始之前我去复习了一下&#xff0c;clientX、clientY、pageX、pageY的区别&#xff0c;对于不熟悉offsetLeft和offsetTop的也可以在这里去复习一下。 vue拖拽指令之offsetX、clientX、pageX、screenX_wade3po的博客-CSDN博客_vue offset 客户区坐标位置&#xff08;clientX&…

远程访问公司局域网怎么设置

远程访问公司 LAN&#xff08;局域网&#xff09;计算机需要设置安全的远程访问方法&#xff0c;以确保数据的机密性和完整性。远程访问公司局域网计算机的步骤如下&#xff1a; 1、获得许可 确保您拥有远程访问公司 LAN 资源所需的权限和授权。这可能需要 IT 或网络管理员的…

如何关闭一个tcp连接 阻塞和等待的区别 b树查找的过程

如何关闭一个 TCP 连接 可能大家第一反应是「杀掉进程」不就行了吗&#xff1f; 是的&#xff0c;这个是最粗暴的方式&#xff0c;杀掉客户端进程和服务端进程影响的范围会有所不同&#xff1a; • 在客户端杀掉进程的话&#xff0c;就会发送 FIN 报文&#xff0c;来断开这个客…

conda的使用教程

conda的介绍 简单来说&#xff0c;conda软件就是来管理包的软件。以Python为例&#xff0c;在实际生活中&#xff0c;我们要处理多个不同的项目&#xff0c;因此&#xff0c;要安装不同的项目所需要的包&#xff0c;为了管理方便&#xff0c;conda就是用来打理不同项目的包&…

DGIOT-Modbus-RTU控制指令05、06的配置与下发

[小 迪 导 读]&#xff1a;伴随工业物联网在实际应用中普及&#xff0c;Modbus-RTU作为行业内的标准化通讯协议。在为物联网起到采集作用的同时&#xff0c;设备的控制也是一个密不可分的环节。 场景解析&#xff1a;在使用Modbus对设备进行采集后&#xff0c;可以通过自动控制…

Vuepress样式修改内容宽度

1、相关文件 一般所在目录node_modules\vuepress\theme-default\styles\wrapper.styl 2、调整宽度&#xff0c;截图中是已经调整好的&#xff0c;在我电脑上显示刚刚好。