现在的位置: 首页 > 移动开发 > 正文

wmi 查找BIOS信息

2019年01月12日 移动开发 ⁄ 共 3259字 ⁄ 字号 评论关闭
1.初始化COM
WMI提供的API是基于COM的,所以必须首先执行CoInitializeEx
CoInitializeSecurity
函数,以便访问WMI
 
这里需要如下定义和头文件:
#define_WIN32_DCOM
#include<windows.h>
 
#include<comdef.h>
#include<wbemidl.h>
#pragmacomment(lib,"wbemuuid.lib")
 
#include<iostream>
usingnamespace
std;
 
·CoInitializeEx函数初始化COM接口:
HRESULThr=
CoInitializeEx(0,COINIT_MULTITHREADED);
if(FAILED(hr))
{
    returnFALSE;
}
注意这个FAILED的定义是:
#defineFAILED(hr)(((HRESULT)(hr))<
0)
 
·CoInitializeSecurity函数注册并设置进程的默认的安全值:
hr=CoInitializeSecurity(
       
NULL
,                      
// Security descriptor   
        -1,                           // COM negotiates authentication service
       
NULL
,                      
// Authentication services
       
NULL
,                      
// Reserved
       
RPC_C_AUTHN_LEVEL_DEFAULT
, // Default authentication level for proxies
       
RPC_C_IMP_LEVEL_IMPERSONATE
,// Default Impersonation level for proxies
       
NULL
,                 
// Authentication info
       
EOAC_NONE
,         
// Additional capabilities of the client or server
       
NULL
);             
// Reserved
 
if(FAILED(hr))
{
    CoUninitialize();
    returnFALSE;                 
}
 
2.创建一个到WMI命名空间的连接
WMI并不是运行在我们自己的进程中,需要在WMI和我们的程序中创建一个连接。
 
·CoCreateInstance函数来初始化IwbemLocator接口
IWbemLocator*pLoc
= 0;
hr=
CoCreateInstance(
       
CLSID_WbemLocator
,
        0,
       
CLSCTX_INPROC_SERVER
,
       
IID_IWbemLocator
,
        (LPVOID*)
&pLoc
        );
 
if(FAILED(hr))
{
    CoUninitialize();
    returnFALSE;    
}
 
·IWbemLocator::ConnectServer方法连接到WMI
ConnectServer方法返回一个IWbemServices接口的代理,可以用来访问本地或是远程WMI命名空间。
IWbemServices*pSvc
= 0;
hr=
pLoc->ConnectServer(
       
BSTR
(L"root\\CIMV2"),
       
NULL
,
       
NULL
,
        0,
       
NULL
,
        0,
        0,
        &pSvc
        );
 
if(FAILED(hr))
{
    pLoc->Release();
    CoUninitialize();
    returnFALSE;     
}
3. 设置WMI连接的安全属性
因为IWbemServices代理允许使用进程外对象,但是在COM中,如果没有设置安全属性,是不允许进程间互相访问的。所以需要用CoSetProxyBlanket函数设置IWbemServices代理的安全值。
hr=
CoSetProxyBlanket(
       
pSvc
,
       
RPC_C_AUTHN_WINNT
,
       
RPC_C_AUTHZ_NONE
,
       
NULL
,
       
RPC_C_AUTHN_LEVEL_CALL
,
       
RPC_C_IMP_LEVEL_IMPERSONATE
,
       
NULL
,
       
EOAC_NONE
        );
 
if(FAILED(hr))
{
    pSvc->Release();
    pLoc->Release();    
    CoUninitialize();
    returnFALSE; 
}
 
4.执行自己需要的操作
WMI通过COM提供了许多用来访问系统数据的接口,这里我们要读取系统的BIOS信息。
·IWbemServices指针向WMI发送请求,获取Win32_BIOS类的实例集合
IEnumWbemClassObject*pEnumerator
= NULL;
hr=
pSvc->ExecQuery(
       
bstr_t
("WQL"),
       
bstr_t
("Select * FROM Win32_BIOS"),
       
WBEM_FLAG_FORWARD_ONLY
|
WBEM_FLAG_RETURN_IMMEDIATELY
,
       
NULL
,
        &pEnumerator
        );
 
if(FAILED(hr))
{
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    returnFALSE;
}
 
·遍历IEnumWbemClassObject,输出信息
IWbemClassObject*pclsObj=NULL;
while(pEnumerator)
{
    ULONGuReturn
= 0;
    hr=
pEnumerator->Next(
           
WBEM_INFINITE
,
           
1,
           
&
pclsObj,
           
&
uReturn
           
);
 
    if(0==
uReturn)
           
break
;
 
    VARIANTvtProp;
    hr=
pclsObj->Get(L"Name",0,
&vtProp,0,
0);
    wcout<<
vtProp.bstrVal<<
endl;
    hr=
pclsObj->Get(L"Manufacturer",0,
&vtProp,0,
0);
    wcout<<
vtProp.bstrVal<<
endl;
    hr=
pclsObj->Get(L"Version",0,
&vtProp,0,
0);
    wcout<<
vtProp.bstrVal<<
endl;
    hr=
pclsObj->Get(L"CurrentLanguage",0,
&vtProp,0,
0);
    wcout<<
vtProp.bstrVal<<
endl;
    VariantClear(&vtProp);
}
 
if(pclsObj!=NULL){
    pclsObj->Release();
}
if(pEnumerator!=NULL){
    pEnumerator->Release();
}
 
5.释放资源
pSvc->Release();
pLoc->Release();
CoUninitialize();

抱歉!评论已关闭.