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.youkuaiyun.com/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 (...)
{
}
}