CC通过WMI和系统API函数获取获取系统硬件配置信息转.docx
《CC通过WMI和系统API函数获取获取系统硬件配置信息转.docx》由会员分享,可在线阅读,更多相关《CC通过WMI和系统API函数获取获取系统硬件配置信息转.docx(6页珍藏版)》请在冰点文库上搜索。
CC通过WMI和系统API函数获取获取系统硬件配置信息转
CC++通过WMI和系统API函数获取获取系统硬件配置信息(转)
前段时间由于项目需要,要求做一个服务器的实时性能监控(CPU、内存、网络利用率等)和读取服务器的硬件配置参数的接口供项目组使用,就是一个类似于鲁大师之类的东东吧...
当然第一想法肯定是利用Windows提供的系统标准API函数来完成所需的功能,当然这也应该是当前最理想最有效率的选择了。
但是如果你对API编程不是很熟练的话...那就相当蛋疼了!
你知道用API可以做到但是不知道用哪个API,好啊,可以查MSDN。
问题是你连API名字都不知道...当然,如果你们公司允许你们上国内局域网的话那就好办多了,因为有无数强大的网友会帮你找到答案。
使用API编程的另一个问题是如果你仍旧对API不熟悉的话调用起来相当困难、很不顺手。
还有一种方案就是--->“强大”的WMI,.net平台的程序员可能对这个比较熟悉,WMI即windows管理规范。
通过它可以访问、配置、管理和监视几乎所有的Windows资源。
当然对于程序员而言在WMI体系结构中我们最需要关心的就是WMI提供的程序和接口。
WMI提供程序在WMI和托管资源之间扮演着中间方的角色。
提供程序代表使用者应用程序和脚本从WMI托管资源请求信息,并发送指令到WMI托管资源。
下面是我们利用WMI编程经常要用到的WMI内置提供程序清单,以供编程参考。
1.ActiveDirectory提供程序
链接库文件:
dsprov.dll
命名空间:
root\directory\ldap
作用:
将ActiveDirectory对象映射到WMI。
2.事件日志提供程序
链接库文件:
ntevt.dll
命名空间:
root\cimv2
作用:
管理Windows事件日志,例如,读取、备份、清除、复制、删除、监视、重命名、压缩、解压缩和更改事件日志设置。
3.注册表提供程序
链接库文件:
stdprov.dll
命名空间:
root\default
作用:
读取、写入、枚举、监视、创建、删除注册表项和值。
4.Win32提供程序
链接库文件:
cimwin32.dll
命名空间:
root\cimv2
作用:
提供关于计算机、磁盘、外围设备、文件、文件夹、文件系统、网络组件、操作系统、打印机、进程、安全性、服务、共享、SAM用户及组,以及更多资源的信息。
5.Windows安装程序提供程序
链接库文件:
msiprov.dll
命名空间:
root\cimv2
作用:
提供对已安装软件信息的访问。
以上可以看出WMI中的类被分组到不同的命名空间中,所以我们在调用相应的程序库时要注意引入对应的命名空间~~~我们今天用到的库就是cimwin32.dll库(第4个)。
好,废话到此为止,还有不懂的自己下去慢慢研究:
现在看代码...
一、基于API方式的实现代码,简单的对部分API函数的封装:
1、GetSysInfo.h文件
pragmaonce#include<afxtempl.h>classGetSysInfo
{
public:
GetSysInfo(void);
~GetSysInfo(void);public:
/********获取操作系统版本,Servicepack版本、系统类型************/
voidGetOSVersion(CString&strOSVersion,CString&strServiceVersion);
BOOLIsWow64();//判断是否为64位操作系统/***********获取网卡数目和名字***********/
intGetInterFaceCount();
voidGetInterFaceName(CString&InterfaceName,intpNum);/***获取物理内存和虚拟内存大小***/
voidGetMemoryInfo(CString&dwTotalPhys,CString&dwTotalVirtual);/****获取CPU名称、内核数目、主频*******/
voidGetCpuInfo(CString&chProcessorName,CString&chProcessorType,DWORD&dwNum,DWORD&dwMaxClockSpeed);/****获取硬盘信息****/
voidGetDiskInfo(DWORD&dwNum,CStringchDriveInfo[]);/****获取显卡信息*****/
voidGetDisplayCardInfo(DWORD&dwNum,CStringchCardName[]);
private:
CStringListInterfaces;//保存所有网卡的名字
CList<DWORD,DWORD&>Bandwidths;//各网卡的带宽
CList<DWORD,DWORD&>TotalTraffics;//各网卡的总流量
};2.GetSysInfo.cpp文件
#include"StdAfx.h"
#include"GetSysInfo.h"
#include"float.h"
#include"winperf.h"
GetSysInfo:
:
GetSysInfo(void)
{
}
GetSysInfo:
:
~GetSysInfo(void)
{
}
voidGetSysInfo:
:
GetOSVersion(CString&strOSVersion,CString&strServiceVersion)
{
CStringstr;
OSVERSIONINFOEXosvi;
SYSTEM_INFOsi;
BOOLbOsVersionInfoEx;
ZeroMemory(&si,sizeof(SYSTEM_INFO));
ZeroMemory(&osvi,sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
if(!
(bOsVersionInfoEx=GetVersionEx((OSVERSIONINFO*)&osvi)))
{
osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx((OSVERSIONINFO*)&osvi);
}
GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
"GetNativeSystemInfo");
GetSystemInfo(&si);
switch(osvi.dwPlatformId)
{
caseVER_PLATFORM_WIN32_NT:
if(osvi.dwMajorVersion==6&&osvi.dwMinorVersion==0)
{
if(osvi.wProductType==VER_NT_WORKSTATION)
{
str.Format(_T("WindowsVista"));
}
else
{
str.Format(_T("WindowsServer\"Longhorn\""));
}
}
if(osvi.dwMajorVersion==5&&osvi.dwMinorVersion==2)
{
if(GetSystemMetrics(SM_SERVERR2))
{
str.Format(_T("MicrosoftWindowsServer2003\"R2\""));
}
elseif(osvi.wProductType==VER_NT_WORKSTATION&&
si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
{
str.Format(_T("MicrosoftWindowsXPProfessionalx64Edition"));
}
else
{
str.Format(_T("MicrosoftWindowsServer2003,"));
}
}
if(osvi.dwMajorVersion==5&&osvi.dwMinorVersion==1)
{
str.Format(_T("MicrosoftWindowsXP"));
}
if(osvi.dwMajorVersion==5&&osvi.dwMinorVersion==0)
str.Format(_T("MicrosoftWindows2000"));
if(osvi.dwMajorVersion<=4)
{
str.Format(_T("MicrosoftWindowsNT"));
}
//TestforspecificproductonWindowsNT4.0SP6andlater.
if(bOsVersionInfoEx)
{
//将ServicePack版本保存
strServiceVersion.Format(_T("ServicePack%d"),osvi.wServicePackMajor);
//Testfortheworkstationtype.
if(osvi.wProductType==VER_NT_WORKSTATION&&
si.wProcessorArchitecture!
=PROCESSOR_ARCHITECTURE_AMD64)
{
if(osvi.dwMajorVersion==4)
str=str+_T("Workstation4.0");
elseif(osvi.wSuiteMask&VER_SUITE_PERSONAL)
str=str+_T("HomeEdition");
elsestr=str+_T("Professional");
}
//Testfortheservertype.
elseif(osvi.wProductType==VER_NT_SERVER||
osvi.wProductType==VER_NT_DOMAIN_CONTROLLER)
{
if(osvi.dwMajorVersion==5&&osvi.dwMinorVersion==2)
{
if(si.wProcessorArchitecture==
PROCESSOR_ARCHITECTURE_IA64)
{
if(osvi.wSuiteMask&VER_SUITE_D