以获取主板信息为例
typedef CComPtr<IWbemServices> IWbemServicesPtr;
BOOL GetWmiObject(IWbemServicesPtr &WmiServer) {
CComPtr<IWbemLocator> WbemLocator;
if (SUCCEEDED(CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (PVOID*)&WbemLocator))) {
if (SUCCEEDED(WbemLocator->ConnectServer(CComBSTR(_T("ROOT\\CIMV2")), NULL, NULL, NULL, 0, NULL, NULL, &WmiServer))) {
if (SUCCEEDED(CoSetProxyBlanket(WmiServer, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE))) {
return TRUE;
}
WmiServer.Release();
}
}
return FALSE;
}
BOOL WmiQueryEx(CONST IWbemServicesPtr &WbemServices, CONST LPTSTR wql, CONST std::vector<std::wstring> &propNames, std::vector<CComVariant> &propValues) {
CComPtr<IEnumWbemClassObject> EnumWbemClassObject;
if (SUCCEEDED(WbemServices->ExecQuery(CComBSTR(_T("WQL")), CComBSTR(wql), WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &EnumWbemClassObject))) {
CComPtr<IWbemClassObject> WbemClassObject;
ULONG cbCount;
if (SUCCEEDED(EnumWbemClassObject->Next(WBEM_INFINITE, 1, &WbemClassObject, &cbCount)) && (cbCount == 1)) {
propValues.clear();
for (size_t i = 0; i < propNames.size(); i++) {
CComVariant v;
if (!SUCCEEDED(WbemClassObject->Get(propNames[i].c_str(), 0, &v, NULL, NULL))) {
return FALSE;
}
propValues.push_back(v);
}
return TRUE;
}
}
return FALSE;
}
BOOL WmiQueryBiosDetail(IWbemServicesPtr &WbemServices, std::string &Detail) {
std::vector<std::wstring> Names;
std::vector<CComVariant> Values;
Names.push_back(L"Manufacturer");
Names.push_back(L"Product");
Names.push_back(L"SerialNumber");
if (WmiQueryEx(WbemServices, _T("SELECT * FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)"), Names, Values)) {
CStringW IdsW;
CStringA IdsA;
IdsW.Format(L"%s;%s;%s;", Values[0].bstrVal, Values[1].bstrVal, Values[2].bstrVal);
IdsA = UCS2_TO_UTF8(IdsW);
if (IdsA.GetLength() > 0) {
Detail.clear();
Detail.append(IdsA.GetBuffer());
return TRUE;
}
}
return FALSE;
}
更多主板信息字段参阅: Win32_BaseBoard