C++通过WMI-CIMV2获取系统相应类的信息操作代码(通过WMI获取磁盘信息、获取系统时间)

1.添加对应的头文件和加载lib库

#include<WbemCli.h>
#include<intsafe.h>
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
#pragma comment(lib, "wbemuuid.lib")

2.初始化连接至ROOT\CIMV2

	BOOL IsEnabledWmi=FALSE;
	IWbemLocator*			pIWbemLocator = NULL;
	IWbemServices*			pIWbemServices = NULL;
	IEnumWbemClassObject*	pEnumCOMDevs = NULL;
	IEnumWbemClassObject*	pEnumCOMDevs2 = NULL;
	IWbemClassObject*		pCOMDev = NULL;
	OSVERSIONINFOEX m_Os;
	HRESULT hRes = S_OK;
	ZeroMemory(&m_Os, sizeof(OSVERSIONINFOEX));
	CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
		RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
	if (FAILED(CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
		IID_IWbemLocator, (LPVOID *)&pIWbemLocator)))
	{
		//	CoUninitialize();
		return;
	}
	else
	{
		long securityFlag = 0;
		if (m_Os.dwMajorVersion >= 6 // Vista or later
									 //	|| (m_Os.dwMajorVersion == 5 && m_Os.dwMinorVersion >= 1) // XP or later
			)
		{
			securityFlag = WBEM_FLAG_CONNECT_USE_MAX_WAIT;
		}

		if (FAILED(pIWbemLocator->ConnectServer(_bstr_t(L"\\\\.\\root\\cimv2"),
			NULL, NULL, 0L,
			securityFlag,
			NULL, NULL, &pIWbemServices)))
		{
			//	CoUninitialize();
			return;
		}
		else
		{
			hRes = CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
				NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
			if (FAILED(hRes))
			{
				//	CoUninitialize();
				CString cstr;
				cstr.Format(_T("NG:WMI Init - %08X"), hRes);
			}
			else
			{
				IsEnabledWmi = TRUE;
			}
		}
		SAFE_RELEASE(pIWbemLocator);
	}
	ULONG   uReturned = 1;
	int workaround = 0;

3.如果IsEnabledWmi为TRUE表示连接成功可以开始进行获取相应类的系统信息了,

类名可参考:《https://mp.csdn.net/postedit/83053935

4. 获取示例 :

      4.1:获取电脑插入的磁盘相应信息对应代码为(类为:Win32_DiskDrive):

        

	hRes = pIWbemServices->ExecQuery(_bstr_t(L"WQL"),
		_bstr_t(L"SELECT * FROM Win32_DiskDrive"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumCOMDevs);
	if (FAILED(hRes))
	{
		return;
	}
	if (!pEnumCOMDevs)
	{
		return;
	}
	while (SUCCEEDED(pEnumCOMDevs->Next(10000, 1, &pCOMDev, &uReturned)))
	{
		if (uReturned != 1)
		{
			break;
		}
		CString mapping1, mapping2;
		CString model, deviceId, diskSize, mediaType, interfaceTypeWmi, pnpDeviceId, firmware;
		INT physicalDriveId = -1, scsiPort = -1, scsiTargetId = -1, scsiBus = -1;
		BOOL flagTarget = FALSE;
		BOOL flagBlackList = FALSE;
		BOOL flagInterfaceTypeUASP = FALSE;
		DWORD siliconImageType = 0;

		try
		{
			VARIANT pVal;
			VariantInit(&pVal);
			if (pCOMDev->Get(L"Size", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				diskSize = pVal.bstrVal;
				VariantClear(&pVal);
			}

			if (pCOMDev->Get(L"DeviceID", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				deviceId = pVal.bstrVal;
				deviceId.Replace(_T("\\"), _T("\\\\"));
				if (_ttoi(deviceId.Right(2)) >= 10)
				{
					physicalDriveId = _ttoi(deviceId.Right(2));
				}
				else
				{
					physicalDriveId = _ttoi(deviceId.Right(1));
				}
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"Model", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				model = pVal.bstrVal;
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"FirmwareRevision", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				firmware = pVal.bstrVal;
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"SCSIPort", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				scsiPort = pVal.intVal;
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"SCSITargetId", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				scsiTargetId = pVal.intVal;
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"SCSIBus", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				scsiBus = pVal.intVal;
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"MediaType", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				mediaType = pVal.bstrVal;
				mediaType.MakeLower();
				VariantClear(&pVal);

				cmd=one;no=994;id=diskinfo#994
				if (model.Find(_T("SanDisk Extreme")) == 0)
				{
					flagTarget = TRUE;
				}
				cmd=one;no=1198;id=diskinfo#1198
				else if (model.Find(_T("Kingston DT Ultimate")) == 0)
				{
					flagTarget = TRUE;
				}
				//else if (FlagUsbMemory)
				//{
				//	flagTarget = TRUE;
				//	detectUSBMemory = TRUE;
				//}
				else if (mediaType.Find(_T("removable")) >= 0 || mediaType.IsEmpty())
				{
					flagTarget = FALSE;
				}
				else
				{
					flagTarget = TRUE;
				}
			}
			if (pCOMDev->Get(L"InterfaceType", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				interfaceTypeWmi = pVal.bstrVal;
				VariantClear(&pVal);
			}

			// Added 3.3.1 (Controller Black List Support)
			if (pCOMDev->Get(L"PNPDeviceID", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				pnpDeviceId = pVal.bstrVal;
				pnpDeviceId.MakeUpper();
				VariantClear(&pVal);

				// Is UAS Controller (5.2.0-)


				// Is Silicon Image Controller


	

			}

			SAFE_RELEASE(pCOMDev);

		
		}
		catch (...)
		{
		}
	}

4.2获取系统时间(类为:Win32_CurrentTime):

   

	hRes = pIWbemServices->ExecQuery(_bstr_t(L"WQL"),
		_bstr_t(L"select * from Win32_CurrentTime"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumCOMDevs);
	if (FAILED(hRes))
	{
		return;
	}
	if (!pEnumCOMDevs)
	{
		return;
	}
	while (SUCCEEDED(pEnumCOMDevs->Next(10000, 1, &pCOMDev, &uReturned)))
	{
		if (uReturned != 1)
		{
			break;
		}
		CString year,month,day, hour, minute,second, quarter, dayOfWeek,weekInMonth;
		CString model, deviceId, diskSize, mediaType, interfaceTypeWmi, pnpDeviceId, firmware;
		INT physicalDriveId = -1, scsiPort = -1, scsiTargetId = -1, scsiBus = -1;
		BOOL flagTarget = FALSE;
		BOOL flagBlackList = FALSE;
		BOOL flagInterfaceTypeUASP = FALSE;
		DWORD siliconImageType = 0;

		try
		{
			VARIANT pVal;
			VariantInit(&pVal);
			if (pCOMDev->Get(L"Day", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				day.Format(L"%d", pVal.intVal) ;
				VariantClear(&pVal);
			}

			if (pCOMDev->Get(L"DayOfWeek", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				
				dayOfWeek.Format(L"%d", pVal.intVal);
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"Hour", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				hour.Format(L"%d", pVal.intVal);
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"Minute", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				minute.Format(L"%d", pVal.intVal);
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"Month", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				month.Format(L"%d", pVal.intVal);
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"Quarter", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				quarter.Format(L"%d", pVal.intVal);
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"Second", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				second.Format(L"%d", pVal.intVal);
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"Year", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				year.Format(L"%d", pVal.intVal);
				VariantClear(&pVal);
			}
			if (pCOMDev->Get(L"WeekInMonth", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL)
			{
				weekInMonth.Format(L"%d", pVal.intVal);
				VariantClear(&pVal);
			}
			SAFE_RELEASE(pCOMDev);
			CString currentTime;
			currentTime.Format(L"现在是%s年%s月%s日,时间:%s:%s:%s 星期 %s,%s月第%s周",year,month,day,hour,minute,second,dayOfWeek, month,weekInMonth);
		    //L"现在是2018年10月15日,时间:11:22:51 星期 1,10月第3周"
		}
		catch (...)
		{
		}
	}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值