转载:http://www.cnblogs.com/renyuan/archive/2012/12/29/2838716.html

转载:http://blog.csdn.net/jhqin/article/details/5548656

转载:http://blog.csdn.net/dongdan_002/article/details/42460343

头文件WMIInfo.h

 /*************************************************************************************************
*
* File Name : WMIInof.h
*
* Created : 2016/10/10
*
* Author : weidongdong
*
* Model :
*
* Description : [[CN]] 获取系统硬件配置信息 [[CN]]
*
**************************************************************************************************/
#ifndef _WMIINFO_H_
#define _WMIINFO_H_ #include <WbemIdl.h>
#pragma comment(lib,"WbemUuid.lib") class CWmiInfo
{
public:
CWmiInfo();
~CWmiInfo(); public:
HRESULT InitWmi(); //初始化WMI
HRESULT ReleaseWmi(); //释放 /*获取一个类成员
*@param [in ] ClassName Example: "Win32_Processor"
*@param [in ] ClassMember Example: "SerialNumber"
*@param [out] chRetValue
*@param return TRUE success; false fail Example:
CString strRetValue;
GetSingleItemInfo(_T("Win32_Processor"),_T("Caption"),strRetValue);
*/
BOOL GetSingleItemInfo(CString ClassName,CString ClassMember,CString &chRetValue); /*获取一个类的多个成员
*@param [in ] ClassName Example: "Win32_Processor"
*@param [in ] ClassMember Example: "SerialNumber"
*@param [in ] n 成员个数
*@param [out] chRetValue
*@param return TRUE success; false fail Example:
CString strRetValue;CString [] strClassMem = {_T("Caption"),_T("CurrentClockSpeed"),_T("DeviceID"),_T("Manufacturer"),_T("Manufacturer")};
GetGroupItemInfo(_T("Win32_Processor"),strClassMem,5,strRetValue);
*/
BOOL GetGroupItemInfo(CString ClassName,CString ClassMember[],int n,CString &chRetValue); private:
void VariantToString(const LPVARIANT,CString &) const;//将Variant类型的变量转换为CString private:
IEnumWbemClassObject* m_pEnumClsObj;
IWbemClassObject* m_pWbemClsObj;
IWbemServices* m_pWbemSvc;
IWbemLocator* m_pWbemLoc;
};
#endif

实现文件WMIInfo.cpp

 #include "stdafx.h"
#include "WmiInfo.h" CWmiInfo::CWmiInfo(void)
{
m_pWbemSvc=NULL;
m_pWbemLoc=NULL;
m_pEnumClsObj = NULL;
} CWmiInfo::~CWmiInfo(void)
{
m_pWbemSvc=NULL;
m_pWbemLoc=NULL;
m_pEnumClsObj = NULL;
} HRESULT CWmiInfo::InitWmi()
{
HRESULT hr; //一、初始化COM组件
//初始化COM
hr=::CoInitializeEx(,COINIT_MULTITHREADED);
if (SUCCEEDED(hr) || RPC_E_CHANGED_MODE == hr)
{
//设置进程的安全级别,(调用COM组件时在初始化COM之后要调用CoInitializeSecurity设置进程安全级别,否则会被系统识别为病毒)
hr=CoInitializeSecurity(NULL,
-,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL);
//VERIFY(SUCCEEDED(hr)); //二、创建一个WMI命名空间连接
//创建一个CLSID_WbemLocator对象
hr=CoCreateInstance(CLSID_WbemLocator,
,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID*)&m_pWbemLoc);
// VERIFY(SUCCEEDED(hr)); //使用m_pWbemLoc连接到"root\cimv2"并设置m_pWbemSvc的指针
hr=m_pWbemLoc->ConnectServer(CComBSTR(L"ROOT\\CIMV2"),
NULL,
NULL,
,
NULL,
,
,
&m_pWbemSvc);
// VERIFY(SUCCEEDED(hr)); //三、设置WMI连接的安全性
hr=CoSetProxyBlanket(m_pWbemSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE);
// VERIFY(SUCCEEDED(hr)); }
return(hr);
} HRESULT CWmiInfo::ReleaseWmi()
{
HRESULT hr; if (NULL != m_pWbemSvc)
{
hr=m_pWbemSvc->Release();
}
if (NULL != m_pWbemLoc)
{
hr=m_pWbemLoc->Release();
}
if (NULL != m_pEnumClsObj)
{
hr=m_pEnumClsObj->Release();
} ::CoUninitialize(); return(hr);
} BOOL CWmiInfo::GetSingleItemInfo(CString ClassName,CString ClassMember,CString &chRetValue)
{
USES_CONVERSION; CComBSTR query("SELECT * FROM ");
VARIANT vtProp;
ULONG uReturn;
HRESULT hr;
BOOL bRet = FALSE; if (NULL != m_pWbemSvc)
{
//查询类ClassName中的所有字段,保存到m_pEnumClsObj中
query+=CComBSTR(ClassName);
hr=m_pWbemSvc->ExecQuery(CComBSTR("WQL"),query,WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
,&m_pEnumClsObj);
if (SUCCEEDED(hr))
{
//初始化vtProp值
VariantInit(&vtProp);
uReturn=; //返回从当前位置起的第一个对象到m_pWbemClsObj中
hr=m_pEnumClsObj->Next(WBEM_INFINITE,,&m_pWbemClsObj,&uReturn);
if(SUCCEEDED(hr)&&uReturn>)
{
//从m_pWbemClsObj中找出ClassMember标识的成员属性值,并保存到vtProp变量中
hr=m_pWbemClsObj->Get(CComBSTR(ClassMember),,&vtProp,,);
if (SUCCEEDED(hr))
{
VariantToString(&vtProp,chRetValue);
VariantClear(&vtProp);//清空vtProp
bRet = TRUE;
}
}
}
}
if(NULL != m_pEnumClsObj)
{
hr=m_pEnumClsObj->Release();
m_pEnumClsObj = NULL;
}
if(NULL != m_pWbemClsObj)
{
hr=m_pWbemClsObj->Release();
m_pWbemClsObj = NULL;
}
return bRet;
} BOOL CWmiInfo::GetGroupItemInfo(CString ClassName,CString ClassMember[],int n,CString &chRetValue)
{
USES_CONVERSION; CComBSTR query("SELECT * FROM ");
CString result,info;
VARIANT vtProp;
ULONG uReturn;
HRESULT hr;
int i;
BOOL bRet = FALSE;
if (NULL != m_pWbemSvc)
{
query+=CComBSTR(ClassName);
hr=m_pWbemSvc->ExecQuery(CComBSTR("WQL"),query,WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,,&m_pEnumClsObj);
if (SUCCEEDED(hr))
{
VariantInit(&vtProp); //初始化vtProp变量
if(m_pEnumClsObj)
{
Sleep();
uReturn=;
hr=m_pEnumClsObj->Next(WBEM_INFINITE,,&m_pWbemClsObj,&uReturn);
if (SUCCEEDED(hr) &&uReturn>)
{
for(i=;i<n;++i)
{
hr=m_pWbemClsObj->Get(CComBSTR(ClassMember[i]),,&vtProp,,);
if (SUCCEEDED(hr))
{
VariantToString(&vtProp,info);
chRetValue+=info+_T("\t");
VariantClear(&vtProp);
bRet = TRUE;
}
}
chRetValue+=_T("\r\n");
}
}
}
} if(NULL != m_pEnumClsObj)
{
hr=m_pEnumClsObj->Release();
m_pEnumClsObj=NULL;
}
if(NULL != m_pWbemClsObj)
{
hr=m_pWbemClsObj->Release();
m_pWbemClsObj=NULL;
}
return bRet;
} void CWmiInfo::VariantToString(const LPVARIANT pVar,CString &chRetValue) const
{
USES_CONVERSION; CComBSTR HUGEP* pBstr;
BYTE HUGEP* pBuf;
LONG low,high,i;
HRESULT hr; switch(pVar->vt)
{
case VT_BSTR:
{
chRetValue=W2T(pVar->bstrVal);
}
break;
case VT_BOOL:
{
if(VARIANT_TRUE==pVar->boolVal)
chRetValue="是";
else
chRetValue="否";
}
break;
case VT_I4:
{
chRetValue.Format(_T("%d"),pVar->lVal);
}
break;
case VT_UI1:
{
chRetValue.Format(_T("%d"),pVar->bVal);
}
break;
case VT_UI4:
{
chRetValue.Format(_T("%d"),pVar->ulVal);
}
break; case VT_BSTR|VT_ARRAY:
{
hr=SafeArrayAccessData(pVar->parray,(void HUGEP**)&pBstr);
hr=SafeArrayUnaccessData(pVar->parray);
chRetValue=W2T(pBstr->m_str);
}
break; case VT_I4|VT_ARRAY:
{
SafeArrayGetLBound(pVar->parray,,&low);
SafeArrayGetUBound(pVar->parray,,&high); hr=SafeArrayAccessData(pVar->parray,(void HUGEP**)&pBuf);
hr=SafeArrayUnaccessData(pVar->parray);
CString strTmp;
high=min(high,MAX_PATH*-);
for(i=low;i<=high;++i)
{
strTmp.Format(_T("%02X"),pBuf[i]);
chRetValue+=strTmp;
}
}
break;
default:
break;
}
}

调用

 #include "stdafx.h"
#include <iostream>
#include "WMIInfo.h" int main()
{
CWmiInfo WMI;
WMI.InitWmi(); // 网卡原生MAC地址
CString strNetwork;
WMI.GetSingleItemInfo(L"Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))",L"PNPDeviceID",strNetwork);
if (!strNetwork.IsEmpty())
{
wcout << "网卡原生MAC地址: "<< strNetwork.GetBuffer() << endl;
} // 硬盘序列号
CString strDiskDrive;
WMI.GetSingleItemInfo(L"Win32_DiskDrive WHERE (SerialNumber IS NOT NULL) AND (MediaType LIKE 'Fixed hard disk%')",L"SerialNumber",strDiskDrive); if (!strDiskDrive.IsEmpty())
{
wcout << "硬盘序列号 : " << strDiskDrive.GetBuffer() << endl;
} // 主板序列号
CString strBaseBoard;
WMI.GetSingleItemInfo(L"Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)",L"SerialNumber",strBaseBoard); if (!strBaseBoard.IsEmpty())
{
wcout << "主板序列号 : " << strBaseBoard.GetBuffer() << endl;
} // 处理器ID
CString strProcessorID;
WMI.GetSingleItemInfo(L"Win32_Processor WHERE (ProcessorId IS NOT NULL)",L"ProcessorId",strProcessorID); if (!strProcessorID.IsEmpty())
{
wcout << "处理器ID : " << strProcessorID.GetBuffer() << endl;
} // BIOS序列号
CString strBIOS;
WMI.GetSingleItemInfo(L"Win32_BIOS WHERE (SerialNumber IS NOT NULL)",L"SerialNumber",strBIOS); if (!strBIOS.IsEmpty())
{
wcout << "BIOS序列号 : " << strBIOS.GetBuffer() << endl;
} // 主板型号
CString strBaseBoardType;
WMI.GetSingleItemInfo(L"Win32_BaseBoard WHERE (Product IS NOT NULL)",L"Product",strBaseBoardType); if (!strBaseBoardType.IsEmpty())
{
wcout << "主板型号 : " << strBaseBoardType.GetBuffer() << endl;
} // 网卡当前MAC地址
CString strCurrentNetwork;
WMI.GetSingleItemInfo(L"Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))",L"MACAddress",strCurrentNetwork); if (!strCurrentNetwork.IsEmpty())
{
wcout << "网卡当前MAC地址: " << strCurrentNetwork.GetBuffer() << endl;
}
WMI.ReleaseWmi(); getchar();
return ;
}

C/C++通过WMI和系统API函数获取获取系统硬件配置信息的更多相关文章

  1. ucos ii 46个系统API函数解析

    源: ucos ii 46个系统API函数解析

  2. 【转载】 Windows系统电脑通过设备管理器查看电脑配置信息

    在采购电脑或者使用电脑的过程中,有时候我们需要查看到电脑的所有设备硬件信息,此时就可以通过Windows系统自带的设备管理器界面来查看该电脑所有的设备配置信息,包括CPU型号频率.内存.硬盘型号以及容 ...

  3. 阻止系统自动睡眠的小软件,附C#制作过程(执行SetThreadExecutionState API函数,让系统误判)

    因为有时下载东西的时候,不想让电脑自动深入睡眠,所以就开启了离开模式.这样不但不节能环保,而且到真正想要睡眠的时候就是一翻蛋疼. 改过自新,关闭了离开模式,同时无操作30分钟后也会进入睡眠模式.但是在 ...

  4. Linux系统查看系统硬件配置信息

    1.查看CPU信息 # 查看cpu负载 uptime # cpu使用率 (没有sar 则yum -y install sysstat) sar top bn1 |grep %Cpu # 每个cpu使用 ...

  5. Ubuntu系统如何查看硬件配置信息

    查看ubuntu硬件信息 1, 主板信息 .查看主板的序列号 -------------------------------------------------- #使用命令 dmidecode | ...

  6. FreeRTOS系列第20篇---FreeRTOS信号量API函数

    FreeRTOS的信号量包括二进制信号量.计数信号量.相互排斥信号量(以后简称相互排斥量)和递归相互排斥信号量(以后简称递归相互排斥量).我们能够把相互排斥量和递归相互排斥量看成特殊的信号量. 信号量 ...

  7. 检测API函数的InlineHook

    BOOL GetProcHookStatus(LPCSTR lpModuleName, LPCSTR lpProcName) { HMODULE hModule = GetModuleHandleA( ...

  8. 分享:Oracle 系统变量函数用法说明

    在Oracle数据库中,Oracle系统变量函数是经常会使用到的函数,分享下Oracle系统变量函数的用法. Oracle函数多种多样,系统变量函数就是其中之一,介绍三种最常见的系统变量函数. Ora ...

  9. VC++ 获取windows系统的版本类型

    vc中获取windows版本信息,一般是调用GetVersionEx 这个API函数来获取的,这个API需要OSVERSIONINFOEX 这个结构体作为参数,OSVERSIONINFOEX 的对应的 ...

随机推荐

  1. 变形--扭曲 skew()

    变形--扭曲 skew() 扭曲skew()函数能够让元素倾斜显示.它可以将一个对象以其中心位置围绕着X轴和Y轴按照一定的角度倾斜.这与rotate()函数的旋转不同,rotate()函数只是旋转,而 ...

  2. spark streaming - kafka updateStateByKey 统计用户消费金额

    场景 餐厅老板想要统计每个用户来他的店里总共消费了多少金额,我们可以使用updateStateByKey来实现 从kafka接收用户消费json数据,统计每分钟用户的消费情况,并且统计所有时间所有用户 ...

  3. oracle的散列聚簇表

    在簇表中,Oracle使用存储在索引中的键值来定位表中的行, 而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行. 创建散 ...

  4. c语言 typedef

      在C和C++编程语言中,typedef是一个关键字.它用来对一个资料类型取一个新名字.目的是为了使源代码更易于阅读和理解. 来看以下程式码: int coxes; int jaffa; ... c ...

  5. Ubentu搭建nfs服务器

    搭建nfs服务    功能:完成在线调试程序,远程挂载,在线调试    NFS(Network FileSystem,网络文件系统)是由SUN公司发展,并于1984年推出的技术,用于不同机器,不同操作 ...

  6. 【和小强学移动app测试2】移动终端app测试点归纳(持续更新)

      以下所有测试最后必须在真机上完整的执行 1.安装.卸载测试 在真机上的以及通过91等第三方的安装与卸载 安装在手机上还是sd卡上 2.启动app测试 3.升级测试 数字签名.升级覆盖安装.下载后手 ...

  7. JS货币数字转换中文

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

  8. 在路由器 RT-AC68U 安装迅雷远程过程

    赶紧记录下,省得时间久了忘记.  步骤如下: 1.下载迅雷远程的 Linux 组件: http://pan.baidu.com/s/1jGqYPnw . 解压缩. 2.ssh 登录au68u 路由器 ...

  9. Java的多线程+Socket

    客户端: package com.wulala; import java.io.FileOutputStream;import java.io.IOException;import java.io.I ...

  10. java几道简单的面试题目

    1.   请问以下程序会输出什么? public   class   Test   {  public   static   void   main(String[]   args)   {  Par ...