⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmiinfo.cpp

📁 随着计算机信息技术的飞速发展
💻 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 + -