📄 wmiinfo.cpp
字号:
#include "StdAfx.h"
#include "wmiinfo.h"
CWmiInfo::CWmiInfo(void)
{
m_pWbemSvc=0;
m_pWbemLoc=0;
}
CWmiInfo::~CWmiInfo(void)
{
m_pWbemSvc=0;
m_pWbemLoc=0;
}
HRESULT CWmiInfo::InitWmi()
{
HRESULT hr;
hr=CoInitializeEx(0,COINIT_MULTITHREADED);
VERIFY(SUCCEEDED(hr));
hr=CoInitializeSecurity(0,-1,0,0,RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,0,EOAC_NONE,0);
VERIFY(SUCCEEDED(hr));
hr=CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,
IID_IWbemLocator,(LPVOID*)&m_pWbemLoc);
VERIFY(SUCCEEDED(hr));
hr=m_pWbemLoc->ConnectServer(CComBSTR(L"ROOT\\CIMV2"),0,0,0,0,0,0,&m_pWbemSvc);
VERIFY(SUCCEEDED(hr));
hr=CoSetProxyBlanket(m_pWbemSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,0,
RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,0,EOAC_NONE);
VERIFY(SUCCEEDED(hr));
return(hr);
}
HRESULT CWmiInfo::ClearWmi()
{
HRESULT hr;
hr=m_pWbemSvc->Release();
hr=m_pWbemLoc->Release();
CoUninitialize();
return(hr);
}
CString CWmiInfo::GetWmiItemInfo(CString ClassName,CString ClassMember)
{
USES_CONVERSION;
CComBSTR query("SELECT * FROM ");
CString result,info;
VARIANT vtProp;
ULONG uReturn;
HRESULT hr;
m_pEnumClsObj=0;
m_pWbemClsObj=0;
query+=CComBSTR(ClassName);
hr=m_pWbemSvc->ExecQuery(CComBSTR("WQL"),query,WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
0,&m_pEnumClsObj);
VariantInit(&vtProp);
uReturn=0;
hr=m_pEnumClsObj->Next(WBEM_INFINITE,1,&m_pWbemClsObj,&uReturn);
if(SUCCEEDED(hr)&&uReturn>0) hr=m_pWbemClsObj->Get(CComBSTR(ClassMember),0,&vtProp,0,0);
else return(info);
info=AnalizeVariant(&vtProp);
VariantClear(&vtProp);
if(m_pEnumClsObj) hr=m_pEnumClsObj->Release();
if(m_pWbemClsObj) hr=m_pWbemClsObj->Release();
m_pEnumClsObj=0;
m_pWbemClsObj=0;
return(info);
}
CString CWmiInfo::GetWmiGroupInfo(CString ClassName,CString ClassMember[],int n)
{
USES_CONVERSION;
CComBSTR query("SELECT * FROM ");
CString result,info;
VARIANT vtProp;
ULONG uReturn;
HRESULT hr;
int i;
m_pEnumClsObj=0;
m_pWbemClsObj=0;
query+=CComBSTR(ClassName);
hr=m_pWbemSvc->ExecQuery(CComBSTR("WQL"),query,WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
0,&m_pEnumClsObj);
VariantInit(&vtProp);
while(m_pEnumClsObj)
{
uReturn=0;
hr=m_pEnumClsObj->Next(WBEM_INFINITE,1,&m_pWbemClsObj,&uReturn);
for(i=0;i<n;++i)
{
if(SUCCEEDED(hr)&&uReturn>0) hr=m_pWbemClsObj->Get(CComBSTR(ClassMember[i]),0,&vtProp,0,0);
else return(result);
info=AnalizeVariant(&vtProp);
result+=info+"\t";
}
result+="\r\n";
}
VariantClear(&vtProp);
if(m_pEnumClsObj) hr=m_pEnumClsObj->Release();
if(m_pWbemClsObj) hr=m_pWbemClsObj->Release();
m_pEnumClsObj=0;
m_pWbemClsObj=0;
return(result);
}
CString CWmiInfo::AnalizeVariant(const LPVARIANT pVar) const
{
USES_CONVERSION;
CComBSTR HUGEP* pBstr;
BYTE HUGEP* pBuf;
CString info,tip;
LONG low,high,i;
HRESULT hr;
switch(pVar->vt)
{
case VT_BSTR:
info=W2T(pVar->bstrVal);
break;
case VT_BOOL:
if(VARIANT_TRUE==pVar->boolVal) info="是";
else info="否";
break;
case VT_I4:
info.Format("%d",pVar->lVal);
break;
case VT_UI1:
info.Format("%d",pVar->bVal);
break;
case VT_UI4:
info.Format("%d",pVar->ulVal);
break;
case VT_BSTR|VT_ARRAY:
hr=SafeArrayAccessData(pVar->parray,(void HUGEP**)&pBstr);
hr=SafeArrayUnaccessData(pVar->parray);
info=W2T(pBstr->m_str);
break;
case VT_I4|VT_ARRAY:
SafeArrayGetLBound(pVar->parray,1,&low);
SafeArrayGetUBound(pVar->parray,1,&high);
hr=SafeArrayAccessData(pVar->parray,(void HUGEP**)&pBuf);
hr=SafeArrayUnaccessData(pVar->parray);
high=min(high,MAX_PATH*2-1);
for(i=low;i<=high;++i)
{
tip.Format("%02X ",pBuf[i]);
info+=tip;
}
break;
default:
break;
}
return(info);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -