编程通过WMI获取系统信息

WMI在硬件信息管理中的应用实践 本文还有配套的精品资源,点击获取 简介:WMI是一个在Windows系统中用于获取和管理系统、硬件及应用程序信息的强大工具。本资源“WMI获取硬件信息.rar”详细介绍了如何利用WMI获取包括主板、网卡、显卡和CPU在内的关键硬件组件信息。内容涵盖了WMI基础、硬件信息查询方法、编程接口使用、脚本和工具应用、权限管理、性能优化以及WMI在实际场景中的应用。通过学习这些内容,... 阅读详情
 

要了解WMI,请查阅:

http://www.microsoft.com/china/technet/community/scriptcenter/resources/wmifaq.mspx#EJC 。

       WMI是一组COM对象,其接口比较多,详细请参考:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/com_api_for_wmi.asp

       WMI的使用平台包括:NT sp4/2000/XP/2003,98可能需要另外安装。一些软件,如优化大师,就是通过该技术获取到本机所有硬件信息。

 

       MSDN上有使用范例:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/ example__getting_wmi_data_from_the_local_computer.asp

 

 

      

要获取硬件信息的步骤:

1、 所需头文件,库

#include <wbemidl.h>

#include <Wbemcli.h>

#pragma comment(lib,"Wbemuuid.lib")  

 

2、初始化 COM 接口:

访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。

 

3、获取访问 WMI 权限:

CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,

          RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);

   如果这个函数返回 S_OK 获取权限成功, 否则为失败。

 

4、通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息:

 

 

 

 

我整理的完整代码:

 

LRESULT _getWmiInfo(IWbemClassObject *pClassObject)

{

         SAFEARRAY *pvNames = NULL;

if( pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS |

WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK )

         {

                   long vbl, vbu;

        SafeArrayGetLBound(pvNames, 1, &vbl);

        SafeArrayGetUBound(pvNames, 1, &vbu);

        for(long i = vbl ; i<= vbu; i++ )

                   {

                            long index = i ;

                            WCHAR *wsName = NULL ;

                            CComVariant varValue ;

                            SafeArrayGetElement( pvNames, &index , &wsName ) ;

 

 

                            CComBSTR bstrName ( wsName ) ;

                            if( pClassObject->Get( bstrName , 0 , &varValue , NULL , 0 ) == S_OK )

                            {

                                                                                                      

                                     CString str ;

                                     if( varValue.vt & VT_BSTR )

                                     {

                                               str = varValue.bstrVal ;

                                     }

                                     else if( varValue.vt & VT_ARRAY )

                                     {

                                              

                                               long iLowBound = 0 , iUpBound = 0 ;

                                              SafeArrayGetLBound( varValue.parray , 1 , &iLowBound ) ;

                                              SafeArrayGetUBound( varValue.parray , 1 , &iUpBound ) ;

 

                                              for( long j = iLowBound ; j <= iUpBound ; j ++ )

                                               {

                                                        VARIANT *pvar = NULL ;

                                                        long temp = j ;

                                                        if( SafeArrayGetElement( varValue.parray , &temp , pvar ) == S_OK &&

                                                pvar )

                                                        {

                                                                 CComVariant varTemp ;

                                                                 if( varTemp.ChangeType( VT_BSTR , pvar ) == S_OK )

                                                                 {

                                                                          if( !str.IsEmpty() )

                                                                                    str += _T(",") ;

                                                                           str += varTemp.bstrVal ;

                                                                 }                                                               

                                                        }

 

                                               }

                                     }

                                     else

                                     {

                                              if( varValue.ChangeType( VT_BSTR ) == S_OK )

                                                        str = varValue.bstrVal ;

                                     }

                                    

 

                                     // 打印出硬件信息

                                     TRACE( "%s=%s/n" , CString(bstrName) , str ) ;

                            }                           

                   }

         }

 

 

         if(pvNames)

         {

                  SafeArrayDestroy(pvNames);

                   return S_OK ;

         }

                

         return E_FAIL ;

}

 

HRESULT GetWmiInfo( LPCTSTR lpszClass )

{

         CoInitialize(NULL);

        

         //

         // 获取访问 WMI 权限

         //

         if( CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,

RPC_C_IMP_LEVEL_IMPERSONATE,NULL, EOAC_NONE, 0 )

== S_OK )

         {

                   //

                   // 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息

                   //

                  CComPtr<IWbemLocator> spWbemLocator ;

                  if( spWbemLocator.CoCreateInstance( CLSID_WbemAdministrativeLocator , 0 ,

                                                                                            CLSCTX_INPROC_SERVER|

                                                                                           CLSCTX_LOCAL_SERVER ) == S_OK )

                   {

                            CComPtr<IWbemServices> spWbemServices ;

                            if( spWbemLocator->ConnectServer( L"root//cimv2" , NULL, NULL, NULL, 0,

NULL, NULL, &spWbemServices ) == S_OK )

                            {

                                     //

                                     // 检索指定信息

                                     //

                                     USES_CONVERSION ;

                                     CComPtr<IEnumWbemClassObject> spEnumWbemClassObject ;

                                     CComBSTR bstrQuery ( L"Select * from " ) ;

                                     bstrQuery += T2OLE(lpszClass) ;

                                              

                                     if( spWbemServices->ExecQuery( L"WQL" , bstrQuery ,

WBEM_FLAG_RETURN_IMMEDIATELY ,

                                                                                             NULL, &spEnumWbemClassObject ) == S_OK )

                                     {

                                              ULONG uCount = 1, uReturned;

                                              CComPtr<IWbemClassObject> spClassObject ;

 

                                              if( spEnumWbemClassObject->Reset()  == S_OK )

                                               {

                                                        int iEnumIdx = 0;

                                        while( spEnumWbemClassObject->Next( WBEM_INFINITE,

uCount, &spClassObject, &uReturned) == S_OK )

                                                        {

                                                                 _getWmiInfo( spClassObject ) ;

 

                                                                 spClassObject.Release() ;

                                                        }

 

                                               }

 

                                              

                                     }

                            }

                   }

         }

 

         CoUninitialize();

}

 

以上代码参考自http://www.cppfans.com/articles/system/bcb_wmi.asp ,先向此文作者表示感谢。代码中在读取硬件信息并转换成字符串的方式可能有不妥之处(即红色字体的代码),你可以根据需要自行修改,如果有好的写法欢迎向我发邮件。

上面有两个函数: _getWmiInfo 和GetWmiInfo ,前者由后者调用,只是为了缩减后者的代码量。后者的参数是你要获取的硬件信息,有效的值有:

 

Win32_1394Controller

   Win32_BaseBoard

   Win32_Battery

   Win32_BIOS

   Win32_Bus

   Win32_CacheMemory

   Win32_CDROMDrive

   Win32_CurrentProbe

   Win32_DesktopMonitor

   Win32_DeviceMemoryAddress

   Win32_DiskDrive

   Win32_DisplayConfiguration

   Win32_DisplayControllerConfiguration

   Win32_DMAChannel

   Win32_Fan

   Win32_FloppyController

   Win32_FloppyDrive

   Win32_HeatPipe

   Win32_IDEController

   Win32_InfraredDevice

   Win32_IRQResource

   Win32_Keyboard

   Win32_MemoryArray

   Win32_MemoryDevice

   Win32_MotherboardDevice

   Win32_NetworkAdapter

   Win32_NetworkAdapterConfiguration

   Win32_OnBoardDevice

   Win32_ParallelPort

   Win32_PCMCIAController

   Win32_PhysicalMemory

   Win32_PhysicalMemoryArray

   Win32_PnPEntity

   Win32_PointingDevice

   Win32_PortableBattery

   Win32_PortConnector

   Win32_PortResource

   Win32_POTSModem

   Win32_PowerManagementEvent

   Win32_Printer

   Win32_PrinterConfiguration

   Win32_PrintJob

   Win32_Processor

   Win32_Refrigeration

   Win32_SerialPort

   Win32_SerialPortConfiguration

   Win32_SMBIOSMemory

   Win32_SoundDevice

   Win32_SystemEnclosure

   Win32_SystemMemoryResource

   Win32_SystemSlot

   Win32_TapeDrive

   Win32_TemperatureProbe

   Win32_UninterruptiblePowerSupply

   Win32_USBController

   Win32_VideoConfiguration

   Win32_VideoController

   Win32_VoltageProbe

最后是我写的例子,只打印了CPU、主板和硬盘三种硬件信息。例子下载

wmicGet:使用 WMIC 在 Windows 上获取计算机和操作系统信息-matlab开发 wmicGet返回Windows平台上的计算机和操作系统信息。 wmicGet 是调用 Windows 管理规范命令行 (WMIC) 的包装函数。 wmicGet 还可以使用 WQL 语法的“where”子句来执行更高级的查询。 例子: infos = wmicGet('cpu'); infos = wmicGet('win32_logicaldisk', {'DeviceID' 'FreeSpace' 'Size'}, ... '哪里',{'' 'DeviceID' 'C:' true ; '或' '设备 ID' 'D:' 真}) 有关更多示例和指向 Microsoft 文档的链接,请参阅 wmicGet.m 标头。 立即下载

相关推荐

wmicGetHardwareInfo​s:使用 WMIC 在 Windows 上获取计算机硬件信息-matlab开发

wmicGetHardwareInfos 查询有关计算机硬件(OS、CPU、GPU、RAM、磁盘)的信息它在命令窗口或文本文件中显示结果。 wmicGetHardwareInfos 需要 wmicGet(在文件交换中提交 #47858)。

通过WMI获取系统信息

要了解WMI,请查阅:http://www.microsoft.com/china/technet/community/scriptcenter/resources/wmifaq.mspx#EJC 。       WMI是一组COM对象,其接口比较多,详细请参考:http://msdn.microsoft.com/library/default.asp?url=/library/en-

lbird 4444

ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合

本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。

weixin_29206669的博客 200

Windows--Wmic/Get-CimInstance

zeronil

hee_mee的博客 3310

赛灵思Xilinx 7系列FPGA硬件设计知识总结

本文讲述了赛灵思7系列FPGA硬件设计的关键点,为使用该系列FPGA提供硬件设计参考。

csdn_dsw的博客 3621

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 664

wmic命令学习

wmic命令学习

shy的博客 1248

html一号店项目代码,项目一号店素材(html模板)

【实例简介】【实例截图】【核心代码】oneShop├── css│ ├── ShopShow.css│ ├── base.css│ ├── load.css│ ├── logo.css│ ├── register.css│ └── style.css├── detail.html├── images│ ├── Thumbs.db│ ├── a_close.png│...

weixin_35390150的博客 4990

【收藏】通过 WMI 获取系统信息

通过 WMI 获取系统信息 摘要:WMI: Windows Management Instrumentation (Windows 管理工具)        通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 利用这个工具可以管理本地或客户端系统中几乎所有的信息。很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具,

crystal521(云淡风轻)的专栏 2162

WebRTC音频传输实战:从采集到播放的完整链路解析(附RTP包处理细节)

本文深入解析了WebRTC音频传输的完整链路,从麦克风采集、音频处理与编码,到RTP打包、网络发送,再到接收端的NetEQ抗抖动处理与最终播放。文章以Linux PulseAudio为例,详细剖析了线程模型、缓冲区管理及RTP包处理等关键细节,旨在帮助开发者优化实时音频应用的延迟、卡顿与回声问题。

tea88的博客 853

45.qt quick-qml虚拟软键盘详解(一)

1.qml虚拟键盘介绍 Qt虚拟键盘的主要功能包括: 可定制的键盘布局和风格与动态切换。 带有单词选择的预测性文本输入。 角色预览和替代角色视图。 自动大小写和空格插入。 不同分辨率的可伸缩性。 支持不同的字符集(拉丁,简体/繁体中文,印地语,日语,阿拉伯语,希伯来语,韩语和其他)。 支持大多数常见的输入语言,可以轻松扩展语言支持。 从左到右和从右到左的输入。 硬件键支持2路和5路导航。 手写支持,带有全屏输入的手势。 音频反馈。 跨平台功能。 支持多国语言,高达40多个语言 本

抵抗时间扭曲,坚持做一件有意义的事 3561

C++通过WMI-CIMV2获取系统相应类的信息操作代码(通过WMI获取磁盘信息、获取系统时间)

1.添加对应的头文件和加载lib库 #include&lt;WbemCli.h&gt; #include&lt;intsafe.h&gt; #define SAFE_RELEASE(p) { if(p) { (p)-&gt;Release(); (p)=NULL; } } #pragma comment(lib, "wbemuuid.lib") 2.初始化连接至ROOT\CIMV2 B...

zggzgw的博客 3140

2 中望CAD二次开发-绘制图形(ZRX C++)

本文讲解中望CAD二次开发,关于块的概念及基本图形的绘制

cilvsuanna的博客 412

win32 wmi编程获取系统信息

//GetSysInfo.h #pragma once #include class GetSysInfo { public: GetSysInfo(void); ~GetSysInfo(void); public: /********获取操作系统版本,Service pack版本、系统类型************/ void GetOSVersion(CString &strOSV

Gone_HuiLin的博客 832

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

关于用WMI获取系统信息——编程实现(转)

关于用WMI获取系统信息——编程实现(转)[@more@]  一直以来都没有用过WMI, 都是用的PDH来获取系统信息.感觉两者很些相似,都是类似于性能数据库,基本的一些什么硬件软件信息都可以比较全面的获得.只是用VC来调用相对...

cuanjun1153的博客 311

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Windows WMI 方面编程资料集

 可以参考下列内容:msdn WMI SDK:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_start_page.aspWMI使用说明(csdn):http://www.youkuaiyun.com/develop/article/15/15346.shtmWMI技术的应用 for .net(cs

953

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

wmi获取硬件信息c语言,通过WMI获取硬件信息

#define _WIN32_DCOM#include using namespace std;#include #include #pragma comment(lib, "wbemuuid.lib")int main(int argc, char **argv){HRESULT hres;// Step 1: ------------------------------------------...

weixin_35980160的博客 266

wmi获取硬件信息c语言,【C++】WMI获取系统硬件信息(CPU/DISK/NetWork etc)

#define_WIN32_DCOM#includeusingnamespacestd;#include#include#pragmacomment(lib,"wbemuuid.lib")intmain(intargc,char**argv){HRESULThres;//Step1:------------------------------------------...

weixin_29092031的博客 396

WMI 例子,获取MAC地址

private voidbutton1_Click(objectsender,System.EventArgse) { stringstrsearch=string.Format(@"SELECTMACAddressFROMWin32_NetworkAdapterWHERE((MACAddressIsNotNULL)AND(Manufacturer<&...

weixin_30306905的博客 467

C++程序获取系统信息方法

c++程序获取系统信息

dc_show的专栏 2538

C# 通过WMI接口获取硬件ID

WMI通过提供一组对象模型和命名空间来表示操作系统中的各个组件和功能,开发人员可以使用这些对象和命名空间来访问和操作系统中的各种资源。WMI提供了一种强大而灵活的方式来管理和监控Windows操作系统,使开发人员能够编写自动化脚本、系统管理工具和监控应用程序,从而简化管理任务、提高效率并实现系统的自动化管理。方法用于获取网卡的MAC地址,通过查询网络适配器配置信息,找到启用IP的网卡,并提取出MAC地址。方法用于获取本机的IP地址,同样通过查询网络适配器配置信息,找到启用IP的网卡,并提取出IP地址。

微软技术分享 1万+

C# 获取系统信息

使用System.Management类获取系统信息:  using System.Management; namespace test_cpuid { class Program { static private void GetInfo() { string cpuInfo = "";//cpu序列号

gaiazhang‘s blog 7884

搜集一些获取windows系统软硬件信息的资料

获取硬盘序列号 http://www.winsim.com/diskid32/diskid32.html WMI获取系统信息 http://blog.youkuaiyun.com/woshidaniu/article/details/8879687 C#的  通过WMI获取硬件和系统信息 http://daimajishu.iteye.com/blog/1087539 WM

thanklife的专栏 2122

C#获取本地计算机名,IP,MAC地址,硬盘ID

windows 查看CPU序列号命令 “wmic CPU get ProcessorID” 由于编程时根据cpu序列号给软件授权! “ipconfig /all”命令查看本机ip地址和mac地址 C#获取本地计算机名,IP,MAC地址,硬盘ID using System; using System.Data; using System.Configuration...

weixin_30491641的博客 97

2008.1.14

 net中的WMI编程(一):WMI介绍及简单应用 http://blog.youkuaiyun.com/zhoufoxcn/archive/2008/01/14/2042697.aspxvbs真是方便啊!

hefenghhhh的专栏 413
上一篇: MS06-040 Remote Code Execution Proof of Concept
下一篇: MS06-040 Remote Code Execution Proof of Concept
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值