// (Usually internal) method to perform usb drive search bool DeviceFinder::MappingUsbstorToDeviceNumber(std::map<std::string, int>& usbStorToDeviceMap) { HRESULT hr; // Clear list of drive names usbStorToDeviceMap.clear(); // Ensure pSvc is initialized if (!Initialize()) { Log(0, "ERROR: Unable to initialize for usbstor-deviceNumber mapping.\n"); return false; } // Use the IWbemServices pointer to make a WMI request for Win32_SerialPort IEnumWbemClassObject* pEnumerator = NULL; IWbemServices *pServices = (IWbemServices *)pSvc; // Cast required as the public API doesn't include the type information if (pServices == NULL) { Log(0, "ERROR: Unable to get usbstor-deviceNumber mapping.\n"); return false; } hr = pServices->ExecQuery(bstr_t("WQL"), bstr_t("SELECT PNPDeviceID, DeviceID FROM Win32_DiskDrive WHERE InterfaceType='USB'"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hr)) { Log(0, "ERROR: Query for Win32_DiskDrive has failed: 0x%08x\n", hr); return false; } // Get the data from the query if (pEnumerator) { for (;;) { // Get next item in enumeration IWbemClassObject *pclsObj; ULONG uReturn = 0; hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); // If no more items, exit loop if (uReturn == 0) { break; } // Get value of the "PNPDeviceID" property VARIANT vtProp; hr = pclsObj->Get(L"PNPDeviceID", 0, &vtProp, 0, 0); char usbstorId[256] = { 0 }; wcstombs_s(NULL, usbstorId, vtProp.bstrVal, 255); // Convert to ASCII VariantClear(&vtProp); //cerr << "[DRIVE:USBSTOR] " << usbstorId << endl; // Get value of the "DeviceID" property hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0); char deviceId[256] = { 0 }; wcstombs_s(NULL, deviceId, vtProp.bstrVal, 255); // Convert to ASCII unsigned int deviceNumber = GetDeviceNumber(vtProp.bstrVal); VariantClear(&vtProp); //cerr << "[DRIVE:DEVICEID] " << deviceId << endl; //cerr << "[DRIVE:DEVICENUMBER] " << deviceNumber << endl; //DiskDriveToLogicalDrive(deviceId); #ifdef DEBUG_PRINT Log(3, "[USBSTOR->DEVICEID->DEVICENUMBER] %s -> %s -> %u\n", usbstorId, deviceId, deviceNumber); #endif usbStorToDeviceMap[usbstorId] = deviceNumber; pclsObj->Release(); } pEnumerator->Release(); } return true; }
// Adapted mostly as-is from http://www.gamedev.net/topic/495075-how-to-retrieve-info-about-videocard/?view=findpost&p=4229170 // so credit goes to that post's author, and in turn, the author of the site mentioned in that post (which seems to be down?). std::string GetVideoCardDriverVersion() { std::string retvalue = ""; HRESULT hr; hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (FAILED(hr)) { return retvalue; } IWbemLocator *pIWbemLocator = NULL; hr = CoCreateInstance(__uuidof(WbemLocator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IWbemLocator), (LPVOID *)&pIWbemLocator); if (FAILED(hr)) { CoUninitialize(); return retvalue; } BSTR bstrServer = SysAllocString(L"\\\\.\\root\\cimv2"); IWbemServices *pIWbemServices; hr = pIWbemLocator->ConnectServer(bstrServer, NULL, NULL, 0L, 0L, NULL, NULL, &pIWbemServices); if (FAILED(hr)) { pIWbemLocator->Release(); SysFreeString(bstrServer); CoUninitialize(); return retvalue; } hr = CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL,EOAC_DEFAULT); BSTR bstrWQL = SysAllocString(L"WQL"); BSTR bstrPath = SysAllocString(L"select * from Win32_VideoController"); IEnumWbemClassObject* pEnum; hr = pIWbemServices->ExecQuery(bstrWQL, bstrPath, WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum); ULONG uReturned; VARIANT var; IWbemClassObject* pObj = NULL; if (!FAILED(hr)) { hr = pEnum->Next(WBEM_INFINITE, 1, &pObj, &uReturned); } if (!FAILED(hr) && uReturned) { hr = pObj->Get(L"DriverVersion", 0, &var, NULL, NULL); if (SUCCEEDED(hr)) { char str[MAX_PATH]; WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, str, sizeof(str), NULL, NULL); retvalue = str; } } pEnum->Release(); SysFreeString(bstrPath); SysFreeString(bstrWQL); pIWbemServices->Release(); pIWbemLocator->Release(); SysFreeString(bstrServer); CoUninitialize(); return retvalue; }
/* * Solution by: Simon Mourier * From: http://stackoverflow.com/questions/5327203/how-to-access-cpus-heat-sensors * * For linking use: Wbemuuid.lib * Running info: application must run under administrator privileges! */ double SystemInfo::DiagnosticMgr::getCpuTemp() { LONG result; LPLONG pTemperature = &result; *pTemperature = -1; HRESULT ci = CoInitialize(NULL); // needs comdef.h HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); if (SUCCEEDED(hr)) { IWbemLocator *pLocator; // needs Wbemidl.h & Wbemuuid.lib hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER , IID_IWbemLocator, (LPVOID*)&pLocator); if (SUCCEEDED(hr)) { IWbemServices *pServices; BSTR ns = SysAllocString(L"root\\WMI"); hr = pLocator->ConnectServer(ns, NULL, NULL, NULL, 0, NULL, NULL, &pServices); pLocator->Release(); SysFreeString(ns); if (SUCCEEDED(hr)) { BSTR query = SysAllocString(L"SELECT * FROM MSAcpi_ThermalZoneTemperature"); BSTR wql = SysAllocString(L"WQL"); IEnumWbemClassObject *pEnum; hr = pServices->ExecQuery(wql, query, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum); SysFreeString(wql); SysFreeString(query); pServices->Release(); if (SUCCEEDED(hr)) { IWbemClassObject *pObject; ULONG returned; hr = pEnum->Next(-1, 1, &pObject, &returned); pEnum->Release(); if (SUCCEEDED(hr)) { BSTR temp = SysAllocString(L"CurrentTemperature"); VARIANT v; VariantInit(&v); hr = pObject->Get(temp, 0, &v, NULL, NULL); pObject->Release(); SysFreeString(temp); if (SUCCEEDED(hr)) { *pTemperature = V_I4(&v); } VariantClear(&v); } } } if (ci == S_OK) { CoUninitialize(); } } } double tempInTensOfKelvins = (double)*pTemperature; return (tempInTensOfKelvins > 0.0) ? ((double)*pTemperature / 10.0) - 273.15 : 0.0; }
/** * Test to see whether we are running on a system with Hyper-V enabled. * We consider Hyper-V to be running (and can export per vm stats) if * the Hyper-V related services (nvspwmi, vmm, vhdsvc) are running and * we can access the WMI namespace root\virtualization (ie v1 for Win 2008). * We do not check for the v2 namespace, since this is not required for * per vm stats. * The ability connect to the sFlow filter for export of packet samples * and counter samples for the virtual switch is made separately. */ BOOL testForHyperv() { BSTR path = SysAllocString(WMI_CIMV2_NS); HRESULT hr = S_FALSE; IWbemServices *pNamespace = NULL; hr = connectToWMI(path, &pNamespace); SysFreeString(path); if (WBEM_S_NO_ERROR != hr) { myLog(LOG_ERR,"testForHyperv: connectToWMI failed for namespace %S", path); return false; } //Test for Hyper-V services BOOL gotHyperV = false; BSTR queryLang = SysAllocString(L"WQL"); BSTR query = SysAllocString(L"SELECT * FROM Win32_Service WHERE Name=\"nvspwmi\" OR Name=\"vmms\" OR Name=\"vhdsvc\""); IEnumWbemClassObject *serviceEnum = NULL; hr = pNamespace->ExecQuery(queryLang, query, WBEM_FLAG_FORWARD_ONLY, NULL, &serviceEnum); SysFreeString(query); SysFreeString(queryLang); if (WBEM_S_NO_ERROR != hr) { myLog(LOG_ERR, "testForHyperv: ExecQuery() failed for %S error=0x%x", query, hr); } else { IWbemClassObject *serviceObj = NULL; ULONG uReturned = 0; BOOL gotHyperVSvc = false; hr = serviceEnum->Next(WBEM_INFINITE, 1, &serviceObj, &uReturned); if (SUCCEEDED(hr)) { if (uReturned == 1) { gotHyperVSvc = true; serviceObj->Release(); } } serviceEnum->Release(); pNamespace->Release(); if (gotHyperVSvc) { //now check that we have the v1 virtualization namespace CoUninitialize(); path = SysAllocString(WMI_VIRTUALIZATION_NS_V1); hr = connectToWMI(path, &pNamespace); SysFreeString(path); if (WBEM_NO_ERROR == hr) { gotHyperV = true; pNamespace->Release(); } } } CoUninitialize(); myLog(LOG_INFO, "testForHyperv: HyperV=%u", gotHyperV); return gotHyperV; }
int get_interfaces() { HRESULT hres; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl; return 1; // Program has failed. } // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- // Note: If you are using Windows 2000, you need to specify - // the default authentication credentials for a user by using // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ---- // parameter of CoInitializeSecurity ------------------------ hres = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); if (FAILED(hres)) { cout << "Failed to initialize security. Error code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres)) { cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { cout << "Could not connect. Error code = 0x" << hex << hres << endl; pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } //cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl; // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- // For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { cout << "Query for operating system name failed." << " Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"IPAddress", 0, &vtProp, 0, 0); wcout << " IP Address : " << vtProp.uintVal << endl; VariantClear(&vtProp); pclsObj->Release(); } // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); pclsObj->Release(); CoUninitialize(); return 0; // Program successfully completed. }
bool CheckVendor(void) { //Habilitar para testes ... //return true; HRESULT hres; char * v; char t[9]; t[0]='0x0'; strcpy(t, "Itautec"); //strcpy(t, "System"); //strcat(t, "t"); //strcat(t, "a"); //strcat(t, "u"); //strcat(t, "t"); //strcat(t, "e"); //strcat(t, "c"); //t[7]='0x0'; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl; return 1; // Program has failed. } // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- // Note: If you are using Windows 2000, you need to specify - // the default authentication credentials for a user by using // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ---- // parameter of CoInitializeSecurity ------------------------ hres = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); if (FAILED(hres)) { cout << "Failed to initialize security. Error code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres)) { cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { cout << "Could not connect. Error code = 0x" << hex << hres << endl; pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl; // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- // For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), //bstr_t("SELECT * FROM Win32_OperatingSystem"), bstr_t("SELECT * FROM Win32_ComputerSystemProduct"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { cout << "Query for operating system name failed." << " Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(0 == uReturn) { break; } VARIANT vtProp; //string Caption; //string Description; //string IdentifyingNumber; //string Name; //string SKUNumber; //string UUID; //string Vendor; //string Version; // Get the value of the Name property //hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); //wcout << " Name : " << vtProp.bstrVal << endl; //VariantClear(&vtProp); //hr = pclsObj->Get(L"UUID", 0, &vtProp, 0, 0); //wcout << " UUID: " << vtProp.bstrVal << endl; //VariantClear(&vtProp); hr = pclsObj->Get(L"Vendor", 0, &vtProp, 0, 0); //wcout << " Vendor: " << vtProp.bstrVal << endl; v = _com_util::ConvertBSTRToString(vtProp.bstrVal); VariantClear(&vtProp); //SAFEARRAY //hr = pclsObj->Get(L"IdentifyingNumber", 0, &vtProp, 0, 0); //wcout << " IdentifyingNumber:" << vtProp.bstrVal << endl; //VariantClear(&vtProp); //hr = pclsObj->Get(L"Version", 0, &vtProp, 0, 0); //wcout << " Version: " << vtProp.bstrVal << endl; //VariantClear(&vtProp); } //cin.get(); // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); pclsObj->Release(); CoUninitialize(); if (!strstr(v, t)) { //MessageBoxA ( 0L , (LPSTR)v, (LPSTR)t, MB_OK); return false; } else return true; }
void EnumSerialFromWMI(std::vector<int> &ports, std::vector<std::string> &friendlyNames) { ports.clear(); friendlyNames.clear(); HRESULT hr; IWbemLocator *pLocator = NULL; IWbemServices *pServicesSystem = NULL; hr = CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLocator); if (FAILED(hr)) { return; } hr = pLocator->ConnectServer(L"root\\CIMV2", NULL, NULL, NULL, 0, NULL, NULL, &pServicesSystem); if (pServicesSystem == NULL) { pLocator->Release(); return; } int dindex = 0; std::string query = "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\""; IEnumWbemClassObject* pEnumerator = NULL; hr = pServicesSystem->ExecQuery(L"WQL", bstr_t(query.c_str()), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (!FAILED(hr)) { // Get the data from the query IWbemClassObject *pclsObj = NULL; while (pEnumerator) { ULONG uReturn = 0; HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (FAILED(hr) || (0 == uReturn)) { break; } VARIANT vtProp; VariantInit(&vtProp); HRESULT hrGet = pclsObj->Get(L"Name", 0, &vtProp, NULL, NULL); if (SUCCEEDED(hrGet) && (vtProp.vt == VT_BSTR) && (wcslen(vtProp.bstrVal) > 3)) { std::string itemName = _bstr_t(vtProp.bstrVal); VariantClear(&vtProp); size_t spos = itemName.find("(COM"); if (spos != std::string::npos) { std::string tmpstr = itemName.substr(spos + 4); spos = tmpstr.find(")"); if (spos != std::string::npos) { tmpstr = tmpstr.substr(0, spos); int nPort = atoi(tmpstr.c_str()); ports.push_back(nPort); friendlyNames.push_back(itemName); } } } pclsObj->Release(); } pEnumerator->Release(); } pServicesSystem->Release(); pLocator->Release(); }
void QtWMI::OnQueryWMI() { CString strQuery; strQuery.Format(L"select * from Win32_%s", ui.cboWMIClasses->currentText().toStdWString().c_str() ); IWbemLocator *pLoc = NULL; IWbemServices *pSvc = NULL; IEnumWbemClassObject* pEnumerator = NULL; IWbemClassObject *pclsObj=NULL; HRESULT hr=E_FAIL; do { hr=CoCreateInstance(CLSID_WbemLocator,0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hr) ) break; hr=pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc); if (FAILED(hr) ) break; hr=CoSetProxyBlanket( pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); if (FAILED(hr) ) break; hr=pSvc->ExecQuery( _bstr_t(L"WQL"), bstr_t(strQuery), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hr) ) break; ULONG uReturn=0; variant_t vtProp; vtProp.Clear(); SAFEARRAY* psaNames=NULL; LONG nLower=0, nUpper=0; _bstr_t PropName; CString s; while (pEnumerator) { pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(!uReturn) break; hr=pclsObj->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY, NULL, &psaNames); if (hr==WBEM_S_NO_ERROR ) { nLower=nUpper=0; SafeArrayGetLBound(psaNames, 1, &nLower); SafeArrayGetUBound(psaNames, 1, &nUpper); ui.lbDebug->clear(); for (long i = nLower; i <= nUpper; i++) { SafeArrayGetElement(psaNames, &i, &PropName); s.Format(L"%s", PropName); hr = pclsObj->Get(s, 0, &vtProp, 0, 0); if (hr==WBEM_S_NO_ERROR) DisplayVariantValues(s, vtProp); vtProp.Clear(); } } if (psaNames) ::SafeArrayDestroy(psaNames); SAFE_RELEASE(pclsObj); } } while (0); SAFE_RELEASE(pEnumerator); SAFE_RELEASE(pclsObj); SAFE_RELEASE(pSvc); SAFE_RELEASE(pLoc); }
tstring CCliMgr::GetWmiInfo( LPCTSTR lpszClass,LPCTSTR lpszField) { tstring SysInfo,strtmp; HRESULT ret; ret = CoInitialize(NULL); ret = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0 ); if (ret == S_OK || ret== RPC_E_TOO_LATE ) { IWbemLocator * pIWbemLocator = NULL; IWbemServices * pWbemServices = NULL; IEnumWbemClassObject * pEnumObject = NULL; BSTR bstrNamespace = (L"root\\cimv2");// 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息 if(CoCreateInstance (CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown ,(void**)&pIWbemLocator) == S_OK) { if(pIWbemLocator->ConnectServer( bstrNamespace, // Namespace NULL, // Userid NULL, // PW NULL, // Locale 0, // flags NULL, // Authority NULL, // Context &pWbemServices ) == S_OK) { HRESULT hRes; _bstr_t strQuery = (L"Select * from Win32_OperatingSystem"); hRes = pWbemServices->ExecQuery(_bstr_t("WQL"), strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); if(hRes == S_OK) { ULONG uCount = 1, uReturned; IWbemClassObject * pClassObject = NULL; hRes = pEnumObject->Reset(); if(hRes == S_OK) { hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); if(hRes == S_OK) { strtmp = "操作系统的名称: "+_getWmiInfo(pClassObject,"Caption")+"\r\n"; SysInfo = SysInfo + strtmp; } if (pClassObject != NULL) pClassObject->Release(); } } strQuery = (L"Select * from Win32_DiskDrive"); hRes = pWbemServices->ExecQuery(_bstr_t("WQL"), strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); if(hRes == S_OK) { ULONG uCount = 1, uReturned; IWbemClassObject * pClassObject = NULL; hRes = pEnumObject->Reset(); if(hRes == S_OK) { hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); if(hRes == S_OK) { strtmp = "硬盘的Model: "+_getWmiInfo(pClassObject,"Model")+"\r\n"; SysInfo = SysInfo + strtmp; m_pLogger->WriteLog(LM_INFO, TEXT("硬盘的Model: %s"),_getWmiInfo(pClassObject,"Model").c_str()); } if (pClassObject != NULL) pClassObject->Release(); } } strQuery = (L"Select * from Win32_LogicalDisk"); hRes = pWbemServices->ExecQuery(_bstr_t("WQL"), strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); if(hRes == S_OK) { ULONG uCount = 1, uReturned; IWbemClassObject * pClassObject = NULL; hRes = pEnumObject->Reset(); if(hRes == S_OK) { while( pEnumObject->Next( WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK ) { if (atoi(_getWmiInfo(pClassObject,"DriveType").c_str()) != 3) continue; tstring str; str =_getWmiInfo(pClassObject,"Name"); strtmp = "盘符: " +str+" "; m_pLogger->WriteLog(LM_INFO, TEXT("盘符: %s"),str.c_str()); tstring drv; drv += toupper(str[0]); if(m_Hy.IsDriverProtected((char *)drv.c_str())) { strtmp = strtmp+ "还原状态: 保护 "; m_pLogger->WriteLog(LM_INFO, TEXT("还原状态: 保护 ")); } else { strtmp = strtmp+ "还原状态: 未保护 "; m_pLogger->WriteLog(LM_INFO, TEXT("还原状态: 未保护 ")); } strtmp = strtmp+ " 剩余空间: "+_getWmiInfo(pClassObject,"FreeSpace")+"\r\n"; SysInfo = SysInfo + strtmp; m_pLogger->WriteLog(LM_INFO, TEXT("剩余空间: %s"),_getWmiInfo(pClassObject,"FreeSpace").c_str()); } if (pClassObject != NULL) pClassObject->Release(); } } strQuery = (L"Select * from Win32_processor"); hRes = pWbemServices->ExecQuery(_bstr_t("WQL"), strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); if(hRes == S_OK) { ULONG uCount = 1, uReturned; IWbemClassObject * pClassObject = NULL; hRes = pEnumObject->Reset(); if(hRes == S_OK) { hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); if(hRes == S_OK) { strtmp = "处理器的制造厂商: "+_getWmiInfo(pClassObject,"Manufacturer") + "\r\n"; strtmp = strtmp + "处理器的名称: "+_getWmiInfo(pClassObject,"Caption") + "\r\n"; SysInfo = SysInfo + strtmp; m_pLogger->WriteLog(LM_INFO, TEXT("处理器的制造厂商: %s"),_getWmiInfo(pClassObject,"Manufacturer").c_str()); m_pLogger->WriteLog(LM_INFO, TEXT("处理器的名称: %s"),_getWmiInfo(pClassObject,"Caption").c_str()); } if (pClassObject != NULL) pClassObject->Release(); } } strQuery = (L"Select * from Win32_LogicalMemoryConfiguration"); hRes = pWbemServices->ExecQuery(_bstr_t("WQL"), strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); if(hRes == S_OK) { ULONG uCount = 1, uReturned; IWbemClassObject * pClassObject = NULL; hRes = pEnumObject->Reset(); if(hRes == S_OK) { hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); if(hRes == S_OK) { strtmp = "物理内存大小: "+_getWmiInfo(pClassObject,"TotalPhysicalMemory") + "\r\n"; strtmp = strtmp + "页面文件大小: "+_getWmiInfo(pClassObject,"TotalPageFileSpace") + "\r\n"; strtmp = strtmp + "虚拟内存大小: "+_getWmiInfo(pClassObject,"TotalVirtualMemory") + "\r\n"; SysInfo = SysInfo + strtmp; m_pLogger->WriteLog(LM_INFO, TEXT("物理内存大小: %s"),_getWmiInfo(pClassObject,"TotalPhysicalMemory").c_str()); m_pLogger->WriteLog(LM_INFO, TEXT("页面文件大小: %s"),_getWmiInfo(pClassObject,"TotalPageFileSpace").c_str()); m_pLogger->WriteLog(LM_INFO, TEXT("虚拟内存大小: %s"),_getWmiInfo(pClassObject,"TotalVirtualMemory").c_str()); } if (pClassObject != NULL) pClassObject->Release(); } } strQuery = (L"Select * from Win32_VideoController"); hRes = pWbemServices->ExecQuery(_bstr_t("WQL"), strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); if(hRes == S_OK) { ULONG uCount = 1, uReturned; IWbemClassObject * pClassObject = NULL; hRes = pEnumObject->Reset(); if(hRes == S_OK) { hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); if(hRes == S_OK) { strtmp = "显卡名称: "+_getWmiInfo(pClassObject,"Name") + "\r\n"; SysInfo = SysInfo + strtmp; m_pLogger->WriteLog(LM_INFO, TEXT("显卡名称: %s"),_getWmiInfo(pClassObject,"Name").c_str()); } if (pClassObject != NULL) pClassObject->Release(); } } strQuery = (L"Select * from Win32_NetworkAdapter where (Netconnectionstatus = 2)"); hRes = pWbemServices->ExecQuery(_bstr_t("WQL"), strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); if(hRes == S_OK) { ULONG uCount = 1, uReturned; IWbemClassObject * pClassObject = NULL; hRes = pEnumObject->Reset(); if(hRes == S_OK) { while( pEnumObject->Next( WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK ) { tstring str; str =_getWmiInfo(pClassObject,"MACAddress"); if (!str.empty()) { str =_getWmiInfo(pClassObject,"PNPDeviceID"); size_t pos = str.find("PCI",0); if (pos != tstring::npos) { tstring str = _getWmiInfo(pClassObject,"Caption"); size_t pos = str.find(']'); if (pos != tstring::npos) str = str.substr(pos+1); strtmp = "网卡名称: "+str + "\r\n"; SysInfo = SysInfo + strtmp; m_pLogger->WriteLog(LM_INFO, "网卡名称: %s" , str.c_str()) ; } } } if (pClassObject != NULL) pClassObject->Release(); } } } } if (pIWbemLocator) pIWbemLocator->Release(); if (pWbemServices) pWbemServices->Release(); if (pEnumObject) pEnumObject->Release(); } CoUninitialize(); if (!SysInfo.empty()) { m_SysInfo = SysInfo; } return SysInfo; }
/** * Enumerates the adapters for this host from WMI Win32_NetworkAdapter * where NetConnectionStatus=2 (to exclude tunnels, ras, wan miniports etc). * Uses the information to populate the sp->adaptorList structure. * adapter->deviceName = Win32_NetworkAdapter.GUID (converted to * lowercase char with enclosing {} removed) * adapter->ifIndex = Win32_NetworkAdapter.InterfaceIndex * this is the interface index used in the route table (rather than Index * which is the index for the interface in the registry). * adapter->userData->countersInstance = Win32_NetworkAdapter.Name * (with reserved chars replaced) * adapter->userData->isVirtual = (Win32_NetworkAdapter.ServiceName == "VMSMP") * Optionally gets the IP address (v4 and/or v6) from the associated * Win32_NetworkAdapterConfiguration. This is only required when trying * to identify the IP addresses that could be used as the agent address. * Returns true on success, false on failure. */ static BOOL readInterfacesWin32(SFLAdaptorList *adaptorList, BOOL getIpAddr) { BSTR path = SysAllocString(WMI_CIMV2_NS); HRESULT hr = S_FALSE; IWbemServices *pNamespace = NULL; hr = connectToWMI(path, &pNamespace); SysFreeString(path); if (WBEM_S_NO_ERROR != hr) { myLog(LOG_ERR,"readInterfacesWin32: connectToWMI failed for namespace %S", path); return FALSE; } BSTR queryLang = SysAllocString(L"WQL"); BSTR query = SysAllocString(L"SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2"); IEnumWbemClassObject *adapterEnum = NULL; hr = pNamespace->ExecQuery(queryLang, query, WBEM_FLAG_FORWARD_ONLY, NULL, &adapterEnum); SysFreeString(queryLang); if (!SUCCEEDED(hr)) { myLog(LOG_ERR,"readInterfacesWin32: ExecQuery() failed for query %S error=0x%x", query, hr); SysFreeString(query); pNamespace->Release(); return FALSE; } SysFreeString(query); IWbemClassObject *adapterObj = NULL; VARIANT ifIndexVal; hr = WBEM_S_NO_ERROR; while (WBEM_S_NO_ERROR == hr) { ULONG adapterCount = 1; hr = adapterEnum->Next(WBEM_INFINITE, 1, &adapterObj, &adapterCount); if (0 == adapterCount) { break; } wchar_t *guidString = stringFromWMIProperty(adapterObj, PROP_GUID); wchar_t *macString = stringFromWMIProperty(adapterObj, PROP_MAC); if (guidString != NULL && macString != NULL) { u_char deviceName[FORMATTED_GUID_LEN+1]; guidToString(guidString, deviceName, FORMATTED_GUID_LEN); u_char mac[13]; wchexToBinary(macString, mac, 13); SFLAdaptor *adaptor = adaptorListAdd(adaptorList, (char *)deviceName, mac, sizeof(HSPAdaptorNIO)); // clear the mark so we don't free it later adaptor->marked = FALSE; if (WBEM_S_NO_ERROR == adapterObj->Get(PROP_IFINDEX, 0, &ifIndexVal, 0, 0) && (V_VT(&ifIndexVal) == VT_I4 || V_VT(&ifIndexVal) == VT_UI4)) { adaptor->ifIndex = ifIndexVal.ulVal; } HSPAdaptorNIO *userData = (HSPAdaptorNIO *)adaptor->userData; if (userData->countersInstance != NULL) { my_free(userData->countersInstance); } wchar_t *counterName = stringFromWMIProperty(adapterObj, PROP_NAME); if (counterName != NULL) { cleanCounterName(counterName, UTNETWORK_INTERFACE); userData->countersInstance = counterName; } wchar_t *svcName = stringFromWMIProperty(adapterObj, PROP_SVC_NAME); if (svcName != NULL) { userData->isVirtual = (_wcsicmp(VMSMP, svcName) == 0); my_free(svcName); } if (getIpAddr) { userData->ipPriority = IPSP_NONE; readIpAddressesWin32(pNamespace, adapterObj, adaptor); } myLog(LOG_INFO,"ReadInterfacesWin32:\n\tAdapterName:\t%s\n\tifIndex:\t%lu\n\tCounterName:\t%S\n\tisVirtual\t%u", adaptor->deviceName, adaptor->ifIndex, userData->countersInstance, userData->isVirtual); } if (guidString != NULL) { my_free(guidString); } if (macString != NULL) { my_free(macString); } adapterObj->Release(); VariantClear(&ifIndexVal); } adapterEnum->Release(); pNamespace->Release(); return TRUE; }
static char * getWmiInfo (int mode) { /* for more details about this wonderful API, see http://msdn.microsoft.com/en-us/site/aa394138 http://msdn.microsoft.com/en-us/site/aa390423 http://msdn.microsoft.com/en-us/library/windows/desktop/aa394138%28v=vs.85%29.aspx http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/d6420012-e432-4964-8506-6f6b65e5a451 */ char *buffer = (char *) malloc (128); HRESULT hres; HRESULT hr; IWbemLocator *pLoc = NULL; IWbemServices *pSvc = NULL; IEnumWbemClassObject *pEnumerator = NULL; IWbemClassObject *pclsObj; ULONG uReturn = 0; hres = CoInitializeEx (0, COINIT_APARTMENTTHREADED | COINIT_SPEED_OVER_MEMORY); if (FAILED (hres)) { strcpy (buffer, "Error Code 0"); return buffer; } hres = CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); /* mysteriously failing after the first execution, but only when used as a plugin, skip it */ /*if (FAILED (hres)) { CoUninitialize (); strcpy (buffer, "Error Code 1"); return buffer; }*/ hres = CoCreateInstance (CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED (hres)) { CoUninitialize (); strcpy (buffer, "Error Code 2"); return buffer; } hres = pLoc->ConnectServer (_bstr_t (L"root\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc); if (FAILED (hres)) { pLoc->Release (); CoUninitialize (); strcpy (buffer, "Error Code 3"); return buffer; } hres = CoSetProxyBlanket (pSvc, 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)) { pSvc->Release (); pLoc->Release (); CoUninitialize (); strcpy (buffer, "Error Code 4"); return buffer; } switch (mode) { case 0: hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); break; case 1: hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_Processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); break; case 2: hres = pSvc->ExecQuery (_bstr_t ("WQL"), _bstr_t ("SELECT * FROM Win32_VideoController"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); break; } if (FAILED (hres)) { pSvc->Release (); pLoc->Release (); CoUninitialize (); strcpy (buffer, "Error Code 5"); return buffer; } while (pEnumerator) { hr = pEnumerator->Next (WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; switch (mode) { case 0: hr = pclsObj->Get (L"Caption", 0, &vtProp, 0, 0); break; case 1: hr = pclsObj->Get (L"Name", 0, &vtProp, 0, 0); break; case 2: hr = pclsObj->Get (L"Name", 0, &vtProp, 0, 0); break; } WideCharToMultiByte (CP_ACP, 0, vtProp.bstrVal, -1, buffer, SysStringLen (vtProp.bstrVal)+1, NULL, NULL); VariantClear (&vtProp); } pSvc->Release (); pLoc->Release (); pEnumerator->Release (); pclsObj->Release (); CoUninitialize (); return buffer; }
static unsigned int getclock(void) { unsigned int clock; #ifdef KONOHA_ON_MACOSX int cpu_sels[2] = { CTL_HW, HW_CPU_FREQ }; size_t len = sizeof(int); sysctl(cpu_sels, 2, &clock, &len, NULL, 0); clock = (unsigned int) clock / (1000 * 1000); #elif defined(KONOHA_ON_WINDOWS) HRESULT hres; hres = CoInitializeEx(0, COINIT_MULTITHREADED); hres = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); IWbemServices *pSvc = NULL; hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); IWbemClassObject *pclsObj; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn ); if (uReturn == 0) { break; } VARIANT vtProp; hr = pclsObj->Get(L"MaxClockSpeed", 0, &vtProp, 0, 0); clock = (unsigned int)vtProp.bstrVal; VariantClear(&vtProp); pclsObj->Release(); } pSvc->Release(); pLoc->Release(); pEnumerator->Release(); CoUninitialize(); #elif defined(KONOHA_ON_LINUX) char buf[64] = {'\0'}, *data = buf; const char *cpumhz = "cpu MHz"; size_t len = strlen(cpumhz); FILE *fp = fopen("/proc/cpuinfo","r"); while (fgets( buf, 64, fp ) != NULL){ if ( strncmp(buf, cpumhz, len) == 0){ data = strstr(buf, cpumhz); break; } } while (!isdigit(*data)) { data++; } clock = (unsigned int) atoi(data) / 1000; fclose(fp); #else TODO(); #endif return clock; }
// 基于Windows Management Instrumentation(Windows管理规范) INT WMI_DeviceQuery( INT iQueryType, T_DEVICE_PROPERTY *properties, INT iSize ) { HRESULT hres; INT iTotal = 0; // 判断查询类型是否支持 if( (iQueryType < 0) || (iQueryType >= sizeof(szWQLQuery)/sizeof(T_WQL_QUERY)) ) { return -1; // 查询类型不支持 } // 初始化COM hres = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ); if( FAILED(hres) ) { return -2; } // 设置COM的安全认证级别 hres = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); if(hres != S_OK && hres != RPC_E_TOO_LATE) { CoUninitialize(); return -2; } // 获得WMI连接COM接口 IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLoc) ); if( FAILED(hres) ) { CoUninitialize(); return -2; } // 通过连接接口连接WMI的内核对象名"ROOT\\CIMV2" IWbemServices *pSvc = NULL; hres = pLoc->ConnectServer( _bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pSvc ); if( FAILED(hres) ) { pLoc->Release(); CoUninitialize(); return -2; } // 设置请求代理的安全级别 hres = CoSetProxyBlanket( pSvc, 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) ) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return -2; } // 通过请求代理来向WMI发送请求 IEnumWbemClassObject *pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t( szWQLQuery[iQueryType].szSelect ), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if( FAILED(hres) ) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return -3; } // 循环枚举所有的结果对象 while( pEnumerator ) { IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; if( (properties != NULL) && (iTotal >= iSize) ) { break; } pEnumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn ); if( uReturn == 0 ) { StringCchCopy( properties[iTotal].szProperty, PROPERTY_MAX_LEN, W2T(L"None") ); break; } if( properties != NULL ) { // 获取属性值 VARIANT vtProperty; VariantInit( &vtProperty ); pclsObj->Get( szWQLQuery[iQueryType].szProperty, 0, &vtProperty, NULL, NULL ); StringCchCopy( properties[iTotal].szProperty, PROPERTY_MAX_LEN, W2T(vtProperty.bstrVal) ); VariantClear( &vtProperty ); // 对属性值做进一步的处理 if( WMI_DoWithProperty(iQueryType, properties[iTotal].szProperty, PROPERTY_MAX_LEN ) ) { iTotal++; } } else { iTotal++; } pclsObj->Release(); } // End While // 释放资源 pEnumerator->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); return iTotal; }
//https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa390423%28v=vs.85%29.asp list<tuple<wstring, wstring, bool>> WMI::execute(const wstring& root, const wstring& query, const tuple<const wstring&, const wstring&, const wstring&>& names) { HRESULT hres; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { throw exception(); // Program has failed. } // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- if (!is_security_initialized_) { init_security(); } // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc); if (FAILED(hres)) { CoUninitialize(); throw exception(); // Program has failed. } // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(root.c_str()), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (for example, Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { pLoc->Release(); CoUninitialize(); throw exception(); // Program has failed. } // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); throw exception(); // Program has failed. } // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- // For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t(query.c_str()), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); throw exception(); // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; list<tuple<wstring, wstring, bool>> result; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; hr = pclsObj->Get(get<0>(names).c_str(), 0, &vtProp, 0, 0); auto t0 = wstring(vtProp.bstrVal, SysStringLen(vtProp.bstrVal)); hr = pclsObj->Get(get<1>(names).c_str(), 0, &vtProp, 0, 0); auto t1 = wstring(vtProp.bstrVal, SysStringLen(vtProp.bstrVal)); hr = pclsObj->Get(get<2>(names).c_str(), 0, &vtProp, 0, 0); auto t2 = vtProp.boolVal; result.push_back(make_tuple(t0, t1, t2)); VariantClear(&vtProp); pclsObj->Release(); } // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); CoUninitialize(); return result; }
bool WMI::call(const wstring& root, const wstring& query, const wstring& method) { HRESULT hres; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { throw exception(); // Program has failed. } // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- if (!is_security_initialized_) { init_security(); } // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc); if (FAILED(hres)) { CoUninitialize(); throw exception(); // Program has failed. } // Step 4: --------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the local root\cimv2 namespace // and obtain pointer pSvc to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(root.c_str()), NULL, NULL, 0, NULL, 0, 0, &pSvc ); if (FAILED(hres)) { pLoc->Release(); CoUninitialize(); throw exception(); // Program has failed. } // Step 5: -------------------------------------------------- // Set security levels for the proxy ------------------------ hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); throw exception(); // Program has failed. } // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- BSTR MethodName = SysAllocString(method.c_str()); IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t(query.c_str()), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); throw exception(); // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pClass = NULL; ULONG uReturn = 0; bool result; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClass, &uReturn); if (uReturn == 0) { break; } VARIANT vtPath; VariantInit(&vtPath); if (FAILED(pClass->Get(L"__Path", 0, &vtPath, NULL, NULL))) { pClass->Release(); } IWbemClassObject* pResult = NULL; if (FAILED(hres = pSvc->ExecMethod(vtPath.bstrVal, MethodName, 0, NULL, NULL, &pResult, NULL))) { SysFreeString(MethodName); pClass->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); } else { VARIANT vtRet; VariantInit(&vtRet); if (FAILED(hres = pResult->Get(L"ReturnValue", 0, &vtRet, NULL, 0))) { VariantClear(&vtRet); SysFreeString(MethodName); pClass->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); } else { result = vtRet.boolVal; VariantClear(&vtRet); pResult->Release(); break; } VariantClear(&vtRet); pResult->Release(); } if (FAILED(hres)) { SysFreeString(MethodName); pClass->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); throw exception(); // Program has failed. } } // Clean up //-------------------------- SysFreeString(MethodName); pClass->Release(); pLoc->Release(); pSvc->Release(); CoUninitialize(); return result; }
SystemInfo::ProcessInfo SystemInfo::getProcessInfo(int pid) { SystemInfo::ProcessInfo info; info.pid = -1; // invalid info.schedPolicy = -1; info.schedPriority = -1; #if defined(__linux__) FILE *file; char cmdline[256] = {0}; char filename[256]; sprintf(filename, "/proc/%d/cmdline", pid); file = fopen(filename, "r"); if (file) { char *p = fgets(cmdline, sizeof(cmdline) / sizeof(*cmdline), file); fclose(file); if (p != YARP_NULLPTR) { while (*p) { p += strlen(p); if (*(p + 1)) *p = ' '; p++; } info.pid = pid; // split the cmdline to find the arguments info.name = cmdline; size_t index = info.name.find(' '); if(index != info.name.npos) { info.name = info.name.substr(0, index); info.arguments = cmdline; info.arguments = info.arguments.substr(index+1); } } } // scheduling params struct sched_param param; if( sched_getparam(pid, ¶m) == 0 ) info.schedPriority = param.__sched_priority; info.schedPolicy = sched_getscheduler(pid); #elif defined(WIN32) HANDLE hnd = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); if(hnd) { TCHAR filename[MAX_PATH]; if (GetModuleBaseName(hnd, 0, filename, MAX_PATH)) { info.name = filename; info.pid = pid; } CloseHandle(hnd); } // reterieving arguments HRESULT hr = 0; IWbemLocator *WbemLocator = YARP_NULLPTR; IWbemServices *WbemServices = YARP_NULLPTR; IEnumWbemClassObject *EnumWbem = YARP_NULLPTR; //initializate the Windows security hr = CoInitializeEx(0, COINIT_MULTITHREADED); hr = CoInitializeSecurity(YARP_NULLPTR, -1, YARP_NULLPTR, YARP_NULLPTR, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, YARP_NULLPTR, EOAC_NONE, YARP_NULLPTR); hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &WbemLocator); if(WbemLocator != YARP_NULLPTR) { //connect to the WMI hr = WbemLocator->ConnectServer(L"ROOT\\CIMV2", YARP_NULLPTR, YARP_NULLPTR, 0, 0, 0, 0, &WbemServices); if(WbemServices != YARP_NULLPTR) { //Run the WQL Query hr = WbemServices->ExecQuery(L"WQL", L"SELECT ProcessId,CommandLine FROM Win32_Process", WBEM_FLAG_FORWARD_ONLY, YARP_NULLPTR, &EnumWbem); // Iterate over the enumerator if (EnumWbem != YARP_NULLPTR) { IWbemClassObject *result = YARP_NULLPTR; ULONG returnedCount = 0; while((hr = EnumWbem->Next(WBEM_INFINITE, 1, &result, &returnedCount)) == S_OK) { VARIANT ProcessId; VARIANT CommandLine; // access the properties hr = result->Get(L"ProcessId", 0, &ProcessId, 0, 0); hr = result->Get(L"CommandLine", 0, &CommandLine, 0, 0); if (!(CommandLine.vt==VT_NULL) && ProcessId.uintVal == (unsigned int) pid) { // covert BSTR to std::string int res = WideCharToMultiByte(CP_UTF8, 0, CommandLine.bstrVal, -1, YARP_NULLPTR, 0, YARP_NULLPTR, YARP_NULLPTR); info.arguments.resize(res); WideCharToMultiByte(CP_UTF8, 0, CommandLine.bstrVal, -1, &info.arguments[0], res, YARP_NULLPTR, YARP_NULLPTR); size_t idx = info.arguments.find(' '); if(idx == info.arguments.npos) { info.arguments.clear(); } else { info.arguments = info.arguments.substr(idx+2); // it seems windows adds two spaces after the program name } info.pid = pid; VariantClear(&ProcessId); VariantClear(&CommandLine); break; } result->Release(); } // end while EnumWbem->Release(); } // end if EnumWbem WbemServices->Release(); } // end if WbemServices WbemLocator->Release(); } // end if WbemLocator CoUninitialize(); #elif defined(__APPLE__) kinfo_proc procInfo; size_t length = sizeof(procInfo); int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid}; if (!sysctl(mib, 4, &procInfo, &length, YARP_NULLPTR, 0)) { info.name = procInfo.kp_proc.p_comm; info.pid = procInfo.kp_proc.p_pid; //Some info here: https://gist.github.com/nonowarn/770696 mib[1] = KERN_PROCARGS; mib[2] = pid; char *proc_argv; size_t argv_len; //getting length of execute string int result = sysctl(mib, 3, YARP_NULLPTR, &argv_len, YARP_NULLPTR, 0); //now getting the string proc_argv = (char*)malloc(sizeof(char) * argv_len); result = sysctl(mib, 3, proc_argv, &argv_len, YARP_NULLPTR, 0); //looking for '\0', i.e. NULL char //skip first string which is the executable size_t index = 0; while (index < argv_len && proc_argv[index] != '\0') { index++; } index++; //now we have to split the remaining string //Note: this is not easy. We don't know the format //See: http://lists.apple.com/archives/darwin-kernel/2012/Mar/msg00025.html //for example, I get both arguments and environment variables std::stringstream arguments; while (index < argv_len) { if (proc_argv[index] == '\0' && index != argv_len - 1) { arguments << " "; } else { arguments << proc_argv[index]; } index++; } free(proc_argv); info.arguments = arguments.str(); } #endif return info; }
/****************************************************************************** * * * Function: zbx_wmi_get_variant * * * * Purpose: retrieves WMI value and stores it in the provided memory location * * * * Parameters: wmi_namespace [IN] - object path of the WMI namespace (UTF-8) * * wmi_query [IN] - WQL query (UTF-8) * * vtProp [OUT] - pointer to memory for the queried value * * * * Return value: SYSINFO_RET_OK - *vtProp contains the retrieved WMI value * * SYSINFO_RET_FAIL - retreiving WMI value failed * * * * Comments: *vtProp must be initialized with VariantInit(), * * wmi_* must not be NULL. The callers must convert value to the * * intended format using VariantChangeType() * * * ******************************************************************************/ extern "C" int zbx_wmi_get_variant(const char *wmi_namespace, const char *wmi_query, VARIANT *vtProp) { IWbemLocator *pLoc = 0; IWbemServices *pService = 0; IEnumWbemClassObject *pEnumerator = 0; IWbemClassObject *pclsObj = 0; ULONG uReturn = 0; int ret = SYSINFO_RET_FAIL; HRESULT hres; wchar_t *wmi_namespace_wide; wchar_t *wmi_query_wide; /* obtain the initial locator to Windows Management on a particular host computer */ hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres)) { zabbix_log(LOG_LEVEL_DEBUG, "cannot obtain WMI locator service"); goto out; } wmi_namespace_wide = zbx_utf8_to_unicode(wmi_namespace); hres = pLoc->ConnectServer(_bstr_t(wmi_namespace_wide), NULL, NULL, 0, NULL, 0, 0, &pService); zbx_free(wmi_namespace_wide); if (FAILED(hres)) { zabbix_log(LOG_LEVEL_DEBUG, "cannot obtain %s WMI service", wmi_namespace); goto out; } /* set the IWbemServices proxy so that impersonation of the user (client) occurs */ hres = CoSetProxyBlanket(pService, 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)) { zabbix_log(LOG_LEVEL_DEBUG, "cannot set IWbemServices proxy"); goto out; } wmi_query_wide = zbx_utf8_to_unicode(wmi_query); hres = pService->ExecQuery(_bstr_t("WQL"), _bstr_t(wmi_query_wide), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); zbx_free(wmi_query_wide); if (FAILED(hres)) { zabbix_log(LOG_LEVEL_DEBUG, "failed to execute WMI query %s", wmi_query); goto out; } hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) goto out; hres = pclsObj->BeginEnumeration(WBEM_FLAG_NONSYSTEM_ONLY); if (FAILED(hres)) { zabbix_log(LOG_LEVEL_DEBUG, "cannot start WMI query result enumeration"); goto out; } hres = pclsObj->Next(0, NULL, vtProp, 0, 0); pclsObj->EndEnumeration(); if (FAILED(hres) || hres == WBEM_S_NO_MORE_DATA) goto out; ret = SYSINFO_RET_OK; out: if (0 != pclsObj) pclsObj->Release(); if (0 != pEnumerator) pEnumerator->Release(); if (0 != pService) pService->Release(); if (0 != pLoc) pLoc->Release(); return ret; }
HRESULT CSystemInfo::GetDisplayMem(CString& strMem) { HRESULT hResult = E_FAIL; HRESULT hRetCode = E_FAIL; int nCoInitFlag = false; IWbemLocator *pWbemLocator = NULL; IWbemServices *pWbemServices = NULL; IEnumWbemClassObject *pEnumerator = NULL; ULONG ulDispalyCardCount = 0; IWbemClassObject *pWbemClassObj[MAX_DISPLAY_NUM] = {0}; VARIANT vtProp; CString strNumber; hRetCode = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); KG_COM_PROCESS_ERROR(hRetCode); nCoInitFlag = true; hRetCode = ::CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pWbemLocator ); KG_COM_PROCESS_ERROR(hRetCode); KG_PROCESS_ERROR(pWbemLocator); hRetCode = pWbemLocator->ConnectServer( _bstr_t("\\\\.\\root\\cimv2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pWbemServices // pointer to IWbemServices proxy ); KG_COM_PROCESS_ERROR(hRetCode); KG_PROCESS_ERROR(pWbemServices); hRetCode = CoSetProxyBlanket( pWbemServices, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); KG_COM_PROCESS_ERROR(hRetCode); hRetCode = pWbemServices->ExecQuery( bstr_t("WQL"), L"SELECT * FROM Win32_VideoController", WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pEnumerator ); KG_COM_PROCESS_ERROR(hRetCode); KG_PROCESS_ERROR(pEnumerator); hRetCode = pEnumerator->Next( WBEM_INFINITE, MAX_DISPLAY_NUM, pWbemClassObj, &ulDispalyCardCount ); KG_COM_PROCESS_ERROR(hRetCode); for (unsigned i =0; i < ulDispalyCardCount; i++) { hRetCode = pWbemClassObj[i]->Get(L"AdapterRAM", 0, &vtProp, 0, 0); if (FAILED(hRetCode)) break; strNumber.Format("%d", vtProp.lVal / 1024 / 1024); if (i != 0) strMem.Append("&"); strMem.Append(strNumber); } hResult = S_OK; Exit0: for (int i = 0; i < MAX_DISPLAY_NUM; i++) { KG_COM_RELEASE(pWbemClassObj[i]); } KG_COM_RELEASE(pEnumerator); KG_COM_RELEASE(pWbemServices); KG_COM_RELEASE(pWbemLocator); if (nCoInitFlag) { CoUninitialize(); nCoInitFlag = false; } return hResult; }
HRESULT QuerySecurityCenterProducts(char *query, list<struct productInfo> *productList, WHISKER_PRODUCT_TYPE productType) { HRESULT hres; // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres)) { cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl; return hres; // Program has failed. } // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\SECURITYCENTER"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { cout << "Could not connect to ROOT\\SECURITYCENTER. Error code = 0x" << hex << hres << endl; pLoc->Release(); return hres; // Program has failed. } //cout << "Connected to ROOT\\SECURITYCENTER WMI namespace" << endl; // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); return 1; // Program has failed. } // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t(query), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { cout << "Query '" << query << "' failed." << " Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); return hres; // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(0 == uReturn) { break; } // A place to store our product data. struct productInfo product; memset(&product, 0x0, sizeof(struct productInfo)); VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"displayName", 0, &vtProp, 0, 0); wcout << "Product Name: " << vtProp.bstrVal << endl; product.displayName = vtProp.bstrVal; VariantClear(&vtProp); hr = pclsObj->Get(L"instanceGuid", 0, &vtProp, 0, 0); //wcout << "Instance GUID: " << vtProp.bstrVal << endl; product.instanceGuid = vtProp.bstrVal; VariantClear(&vtProp); hr = pclsObj->Get(L"companyName", 0, &vtProp, 0, 0); wcout << "Company Name: " << vtProp.bstrVal << endl; product.companyName = vtProp.bstrVal; VariantClear(&vtProp); hr = pclsObj->Get(L"productEnabled", 0, &vtProp, 0, 0); wcout << "Product Enabled: " << (vtProp.boolVal ? L"Yes" : L"No") << endl; product.productEnabled = (vtProp.boolVal != 0); VariantClear(&vtProp); hr = pclsObj->Get(L"productHasNotifiedUser", 0, &vtProp, 0, 0); wcout << "Product Has Notified User: "******"Yes" : L"No") << endl; product.productHasNotifiedUser = (vtProp.boolVal != 0); VariantClear(&vtProp); hr = pclsObj->Get(L"productUptoDate", 0, &vtProp, 0, 0); wcout << "Product Up to Date: " << (vtProp.boolVal ? L"Yes" : L"No") << endl; product.productUptoDate = (vtProp.boolVal != 0); VariantClear(&vtProp); hr = pclsObj->Get(L"productWantWscNotifications", 0, &vtProp, 0, 0); wcout << "Product Wants WSC Notifications: " << (vtProp.boolVal ? L"Yes" : L"No") << endl; product.productWantsWscNotifications = (vtProp.boolVal != 0); VariantClear(&vtProp); hr = pclsObj->Get(L"versionNumber", 0, &vtProp, 0, 0); wcout << "Version Number: " << vtProp.bstrVal << endl; product.versionNumber = vtProp.bstrVal; VariantClear(&vtProp); hr = pclsObj->Get(L"productState", 0, &vtProp, 0, 0); int byte4 = (vtProp.intVal & 0xFF000000) >> 24; int byte3 = (vtProp.intVal & 0x00FF0000) >> 16; int byte2 = (vtProp.intVal & 0x0000FF00) >> 8; int byte1 = (vtProp.intVal & 0x000000FF); wcout << "Legacy WSC State" << endl; wcout << "Product State: " << dec << vtProp.intVal << endl; wcout << "Product State (hex): " << hex << vtProp.intVal << endl; wcout << "Byte 4: " << hex << byte4 << endl; wcout << "Byte 3: " << hex << byte3 << endl; wcout << "Byte 2: " << hex << byte2 << endl; wcout << "Byte 1: " << hex << byte1 << endl; wcout << "Product Type (Legacy): " << securityProviderGuess(vtProp.intVal).c_str() << endl; wcout << "Realtime Protection (Legacy): " << scannerActiveGuess(vtProp.intVal).c_str() << endl; wcout << "DAT File (Legacy): " << datFileGuess(vtProp.intVal).c_str() << endl; product.legacyProductState = vtProp.intVal; product.productType = productType; productList->push_back(product); VariantClear(&vtProp); // Hack together a product state that is compatible with newer WSC: switch(product.productType) { case PRODUCT_TYPE_AV: product.productState = WSC_SECURITY_PROVIDER_ANTIVIRUS << 16; break; case PRODUCT_TYPE_AS: product.productState = WSC_SECURITY_PROVIDER_ANTISPYWARE << 16; break; case PRODUCT_TYPE_FW: product.productState = WSC_SECURITY_PROVIDER_FIREWALL << 16; break; }; if(product.productEnabled) { product.productState += REAL_TIME_PROTECTION_ENABLED; } if(product.productUptoDate == false) { product.productState += DAT_FILE_OUT_OF_DATE; } byte4 = (product.productState & 0xFF000000) >> 24; byte3 = (product.productState & 0x00FF0000) >> 16; byte2 = (product.productState & 0x0000FF00) >> 8; byte1 = (product.productState & 0x000000FF); wcout << "New WSC State" << endl; wcout << "Product State: " << dec << product.productState << endl; wcout << "Product State (hex): " << hex << product.productState << endl; wcout << "Byte 4: " << hex << byte4 << endl; wcout << "Byte 3: " << hex << byte3 << endl; wcout << "Byte 2: " << hex << byte2 << endl; wcout << "Byte 1: " << hex << byte1 << endl; wcout << "Product Type: " << securityProviderGuess(product.productState).c_str() << endl; wcout << "Realtime Protection: " << scannerActiveGuess(product.productState).c_str() << endl; wcout << "DAT File: " << datFileGuess(product.productState).c_str() << endl; pclsObj->Release(); } // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); return S_OK; }
string CComputerInfo::GetOSInfo() { string OSName; string OSServPack; string OSCode; HRESULT hres; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED); if (FAILED(hres)) { ostringstream err; err<< "Failed to initialize COM library. Error code = 0x" << hex << hres; return err.str(); // Program has failed. } // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- // Note: If you are using Windows 2000, you need to specify - // the default authentication credentials for a user by using // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ---- // parameter of CoInitializeSecurity ------------------------ hres = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); if (FAILED(hres)) { ostringstream err; err<< "Failed to initialize security. Error code = 0x" << hex << hres ; CoUninitialize(); return err.str(); // Program has failed. } // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres)) { ostringstream err; err<< "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres ; CoUninitialize(); return err.str(); // Program has failed. } // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { ostringstream err; err<< "Could not connect. Error code = 0x" << hex << hres ; pLoc->Release(); CoUninitialize(); return err.str(); // Program has failed. } // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { ostringstream err; err<< "Could not set proxy blanket. Error code = 0x" << hex << hres ; pSvc->Release(); pLoc->Release(); CoUninitialize(); return err.str(); // Program has failed. } // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- // For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { ostringstream err; err<< "Query for operating system name failed." << " Error code = 0x" << hex << hres ; pSvc->Release(); pLoc->Release(); CoUninitialize(); return err.str(); // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj; ULONG uReturn = 0; if (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(0 != uReturn) { VARIANT vtProp; char* tcode; // Get the value of the Name property hr = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0); tcode = _com_util::ConvertBSTRToString(vtProp.bstrVal) ; OSName = tcode; GfkSafeDelete(tcode); VariantClear(&vtProp); hr = pclsObj->Get(L"CSDVersion", 0, &vtProp, 0, 0); tcode = _com_util::ConvertBSTRToString(vtProp.bstrVal); OSServPack = tcode; GfkSafeDelete(tcode); VariantClear(&vtProp); } } ////////////////////////////////////////////////////////////////////////// pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_ComputerSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { ostringstream err; err<< "Query for processor name failed." << " Error code = 0x" << hex << hres ; return err.str(); } // Get the data from the query uReturn = 0; if(pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if ( SUCCEEDED( hres ) ) { if(uReturn > 0) { VARIANT vtProp; VariantInit(&vtProp); // Get the value of the Name property hr = pclsObj->Get(L"SystemType", 0, &vtProp, 0, 0); char* tcode = _com_util::ConvertBSTRToString(vtProp.bstrVal) ; OSCode = tcode; GfkSafeDelete(tcode); VariantClear(&vtProp); } } } // successfully completed. pEnumerator->Release(); ////////////////////////////////////////////////////////////////////////// // Cleanup // ======== pSvc->Release(); pLoc->Release(); pclsObj->Release(); CoUninitialize(); string OsInfo; OsInfo += OSName +":"+ OSServPack +":"+OSCode; return OsInfo; }
unsigned long long loadngo::data::GetMachineId() { // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ // HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); // if (hr == S_OK) // { BSTR objectPath = SysAllocString(L"ROOT\\CIMV2"); std::vector<char> container; // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- // Note: If you are using Windows 2000, you need to specify - // the default authentication credentials for a user by using // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ---- // parameter of CoInitializeSecurity ------------------------ HRESULT hr = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); if (hr == S_OK) { // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hr = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc); if (hr == S_OK) { // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hr = pLoc->ConnectServer( objectPath, // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (hr == S_OK) { // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hr = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (hr == S_OK) { // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- BSTR wql = SysAllocString(L"WQL"); BSTR query = SysAllocString(L"SELECT * FROM Win32_BIOS"); // For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = NULL; hr = pSvc->ExecQuery( wql, query, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (hr == S_OK) { // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } if(pclsObj->BeginEnumeration(0) == S_OK) { BSTR name = nullptr; VARIANT var; while (pclsObj->Next(0, &name, &var, nullptr, nullptr) == WBEM_S_NO_ERROR) { Insert(container, name); SysFreeString(name); InsertVariant(container, var); VariantClear(&var); } } pclsObj->Release(); } } pEnumerator->Release(); } pSvc->Release(); pSvc = 0; } pLoc->Release(); } } SysFreeString(objectPath); // CoUninitialize(); //} return util::FNV1a(&container[0], container.size()); }
S32 LLMachineID::init() { memset(static_unique_id,0,sizeof(static_unique_id)); S32 ret_code = 0; #if LL_WINDOWS # pragma comment(lib, "wbemuuid.lib") size_t len = sizeof(static_unique_id); // algorithm to detect BIOS serial number found at: // http://msdn.microsoft.com/en-us/library/aa394077%28VS.85%29.aspx // we can't use the MAC address since on Windows 7, the first returned MAC address changes with every reboot. HRESULT hres; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << hres << LL_ENDL; return 1; // Program has failed. } // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- // Note: If you are using Windows 2000, you need to specify - // the default authentication credentials for a user by using // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ---- // parameter of CoInitializeSecurity ------------------------ hres = CoInitializeSecurity( NULL, -1, // COM authentication NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); if (FAILED(hres)) { LL_DEBUGS("AppInit") << "Failed to initialize security. Error code = 0x" << hex << hres << LL_ENDL; CoUninitialize(); return 1; // Program has failed. } // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres)) { LL_DEBUGS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << LL_ENDL; CoUninitialize(); return 1; // Program has failed. } // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { LL_DEBUGS("AppInit") << "Could not connect. Error code = 0x" << hex << hres << LL_ENDL; pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } LL_DEBUGS("AppInit") << "Connected to ROOT\\CIMV2 WMI namespace" << LL_ENDL; // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { LL_DEBUGS("AppInit") << "Could not set proxy blanket. Error code = 0x" << hex << hres << LL_ENDL; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- // For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { LL_DEBUGS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << hex << hres << LL_ENDL; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(0 == uReturn) { break; } VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); LL_DEBUGS("AppInit") << " Serial Number : " << vtProp.bstrVal << LL_ENDL; // use characters in the returned Serial Number to create a byte array of size len BSTR serialNumber ( vtProp.bstrVal); unsigned int j = 0; while( vtProp.bstrVal[j] != 0) { for (unsigned int i = 0; i < len; i++) { if (vtProp.bstrVal[j] == 0) break; static_unique_id[i] = (unsigned int)(static_unique_id[i] + serialNumber[j]); j++; } } VariantClear(&vtProp); pclsObj->Release(); pclsObj = NULL; break; } // Cleanup // ======== if (pSvc) pSvc->Release(); if (pLoc) pLoc->Release(); if (pEnumerator) pEnumerator->Release(); CoUninitialize(); ret_code=0; #else unsigned char * staticPtr = (unsigned char *)(&static_unique_id[0]); ret_code = LLUUID::getNodeID(staticPtr); #endif has_static_unique_id = true; return ret_code; }
int main(int argc, char **argv) { HRESULT hres; // Initialize COM. hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { cout << "Failed to initialize COM library. " << "Error code = 0x" << hex << hres << endl; return 1; // Program has failed. } // Initialize hres = CoInitializeSecurity( NULL, -1, // COM negotiates service NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation NULL, // Authentication info EOAC_NONE, // Additional capabilities NULL // Reserved ); if (FAILED(hres)) { cout << "Failed to initialize security. " << "Error code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } // Obtain the initial locator to Windows Management // on a particular host computer. IWbemLocator *pLoc = 0; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); if (FAILED(hres)) { cout << "Failed to create IWbemLocator object. " << "Error code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } IWbemServices *pSvc = 0; // Connect to the root\cimv2 namespace with the // current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // WMI namespace NULL, // User name NULL, // User password 0, // Locale NULL, // Security flags 0, // Authority 0, // Context object &pSvc // IWbemServices proxy ); if (FAILED(hres)) { cout << "Could not connect. Error code = 0x" << hex << hres << endl; pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl; // Set the IWbemServices proxy so that impersonation // of the user (client) occurs. hres = CoSetProxyBlanket( pSvc, // the proxy to set RPC_C_AUTHN_WINNT, // authentication service RPC_C_AUTHZ_NONE, // authorization service NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // authentication level RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Use the IWbemServices pointer to make requests of WMI. // Make requests here: // For example, query for all the running processes IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Process"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { cout << "Query for processes failed. " << "Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } else { IWbemClassObject *pclsObj; ULONG uReturn = 0; while (pEnumerator) { hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(0 == uReturn) { break; } VARIANT vtProp; // Get the value of the Name property hres = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); wcout << "Process Name : " << vtProp.bstrVal << endl; VariantClear(&vtProp); } } // Cleanup // ======== pSvc->Release(); pLoc->Release(); CoUninitialize(); return 0; // Program successfully completed. }
/*! * @brief Perform a WMI query. * @param lpwRoot Name of the root object that is to be queried against. * @param lpwQuery The filter to use when reading objects (LDAP style). * @param response The response \c Packet to add the results to. */ DWORD wmi_query(LPCWSTR lpwRoot, LPWSTR lpwQuery, Packet* response) { HRESULT hResult; dprintf("[WMI] Initialising COM"); if ((hResult = CoInitializeEx(NULL, COINIT_MULTITHREADED)) == S_OK) { dprintf("[WMI] COM initialised"); IWbemLocator* pLocator = NULL; IWbemServices* pServices = NULL; IEnumWbemClassObject* pEnumerator = NULL; IWbemClassObject* pSuperClass = NULL; IWbemClassObject* pObj = NULL; Tlv* valueTlvs = NULL; char* values = NULL; VARIANT** fields = NULL; do { if (FAILED(hResult = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0))) { dprintf("[WMI] Failed to initialize security: %x", hResult); break; } dprintf("[WMI] Security initialised"); if (FAILED(hResult = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pLocator)))) { dprintf("[WMI] Failed to create WbemLocator: %x", hResult); break; } dprintf("[WMI] WbemLocator created."); if (FAILED(hResult = pLocator->ConnectServer(_bstr_t(lpwRoot), NULL, NULL, NULL, WBEM_FLAG_CONNECT_USE_MAX_WAIT, NULL, NULL, &pServices))) { dprintf("[WMI] Failed to create WbemServices at %S: %x", lpwRoot, hResult); break; } dprintf("[WMI] WbemServices created."); if (FAILED(hResult = pServices->ExecQuery(L"WQL", lpwQuery, WBEM_FLAG_FORWARD_ONLY, NULL, &pEnumerator))) { dprintf("[WMI] Failed to create Enumerator for query %S: %x", lpwQuery, hResult); break; } dprintf("[WMI] Enumerated created."); ULONG numFound; if (FAILED(hResult = pEnumerator->Next(ENUM_TIMEOUT, 1, &pObj, &numFound))) { dprintf("[WMI] Failed to get the first query element: %x", lpwQuery, hResult); break; } dprintf("[WMI] First result read. hr=%x p=%p", hResult, pObj); if (hResult == WBEM_S_FALSE) { // this is not an error dprintf("[WMI] No results found!"); break; } // get the names of the fields out of the first object before doing anything else. LPSAFEARRAY pFieldArray = NULL; if (FAILED(hResult = pObj->GetNames(NULL, WBEM_FLAG_ALWAYS, NULL, &pFieldArray))) { dprintf("[WMI] Failed to get field names: %x", hResult); break; } dprintf("[WMI] Field Names extracted. hr=%x p=%p", hResult, pFieldArray); // lock the array if (FAILED(hResult = SafeArrayLock(pFieldArray))) { dprintf("[WMI] Failed to get array dimension: %x", hResult); break; } dprintf("[WMI] Field name array locked."); do { dprintf("[WMI] Array dimensions: %u", SafeArrayGetDim(pFieldArray)); // this array is just one dimension, let's get the bounds of the first dimension LONG lBound, uBound; if (FAILED(hResult = SafeArrayGetLBound(pFieldArray, 1, &lBound)) || FAILED(hResult = SafeArrayGetUBound(pFieldArray, 1, &uBound))) { dprintf("[WMI] Failed to get array dimensions: %x", hResult); break; } dprintf("[WMI] Bounds: %u to %u", lBound, uBound); LONG fieldCount = uBound - lBound - SYSTEM_FIELD_COUNT - 1; dprintf("[WMI] Query results in %u fields", fieldCount); fields = (VARIANT**)malloc(fieldCount * sizeof(VARIANT**)); valueTlvs = (Tlv*)malloc(fieldCount * sizeof(Tlv)); values = (char*)malloc(fieldCount * FIELD_SIZE); memset(fields, 0, fieldCount * sizeof(VARIANT**)); memset(valueTlvs, 0, fieldCount * sizeof(Tlv)); memset(values, 0, fieldCount * FIELD_SIZE); for (LONG i = 0; i < fieldCount; ++i) { LONG indices[1] = { i + SYSTEM_FIELD_COUNT }; char* fieldName = values + (i * FIELD_SIZE); SafeArrayPtrOfIndex(pFieldArray, indices, (void**)&fields[i]); _bstr_t bstr(fields[i]->bstrVal); strncpy_s(fieldName, FIELD_SIZE, (const char*)bstr, FIELD_SIZE - 1); valueTlvs[i].header.type = TLV_TYPE_EXT_WMI_FIELD; valueTlvs[i].header.length = (UINT)strlen(fieldName) + 1; valueTlvs[i].buffer = (PUCHAR)fieldName; dprintf("[WMI] Added header field: %s", fieldName); } dprintf("[WMI] added all field headers"); // add the field names to the packet packet_add_tlv_group(response, TLV_TYPE_EXT_WMI_FIELDS, valueTlvs, fieldCount); dprintf("[WMI] processing values..."); // with that horrible pain out of the way, let's actually grab the data do { if (FAILED(hResult)) { dprintf("[WMI] Loop exited via %x", hResult); break; } memset(valueTlvs, 0, fieldCount * sizeof(Tlv)); memset(values, 0, fieldCount * FIELD_SIZE); for (LONG i = 0; i < fieldCount; ++i) { char* value = values + (i * FIELD_SIZE); valueTlvs[i].header.type = TLV_TYPE_EXT_WMI_VALUE; valueTlvs[i].buffer = (PUCHAR)value; VARIANT varValue; VariantInit(&varValue); _bstr_t field(fields[i]->bstrVal); dprintf("[WMI] Extracting value for %s", (char*)field); if (SUCCEEDED(pObj->Get(field, 0, &varValue, NULL, NULL))) { variant_to_string(_variant_t(varValue), value, FIELD_SIZE); } valueTlvs[i].header.length = (UINT)strlen(value) + 1; dprintf("[WMI] Added value for %s: %s", (char*)_bstr_t(fields[i]->bstrVal), value); } // add the field values to the packet packet_add_tlv_group(response, TLV_TYPE_EXT_WMI_VALUES, valueTlvs, fieldCount); pObj->Release(); pObj = NULL; } while ((hResult = pEnumerator->Next(ENUM_TIMEOUT, 1, &pObj, &numFound)) != WBEM_S_FALSE); } while (0); SafeArrayUnlock(pFieldArray); } while (0); if (fields) { free(fields); } if (values) { free(values); } if (valueTlvs) { free(valueTlvs); } if (pObj) { pObj->Release(); } if (pEnumerator) { pEnumerator->Release(); } if (pServices) { pServices->Release(); } if (pLocator) { pLocator->Release(); } CoUninitialize(); if (SUCCEEDED(hResult)) { hResult = S_OK; dprintf("[WMI] Things appeard to go well!"); } } else { dprintf("[WMI] Failed to initialize COM"); } if (FAILED(hResult)) { // if we failed, we're going to convert the error to a string, add it and still return success, but we'll // also include the hresult. char errorMessage[1024]; memset(errorMessage, 0, 1024); _com_error comError(hResult); _snprintf_s(errorMessage, 1024, 1023, "%s (0x%x)", comError.ErrorMessage(), hResult); dprintf("[WMI] returning error -> %s", errorMessage); packet_add_tlv_string(response, TLV_TYPE_EXT_WMI_ERROR, errorMessage); hResult = S_OK; } return (DWORD)hResult; }
int main(int argc, char **argv) { HRESULT hres; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(nullptr, COINIT_MULTITHREADED); if (FAILED(hres)) { cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl; return 1; // Program has failed. } // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- hres = CoInitializeSecurity( nullptr, -1, // COM authentication nullptr, // Authentication services nullptr, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation nullptr, // Authentication info EOAC_NONE, // Additional capabilities nullptr // Reserved ); if (FAILED(hres)) { cout << "Failed to initialize security. Error code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } // Step 3: --------------------------------------------------- // Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = nullptr; hres = CoCreateInstance( CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID *>(&pLoc)); if (FAILED(hres)) { cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = nullptr; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace nullptr, // User name. NULL = current user nullptr, // User password. NULL = current nullptr, // Locale. NULL indicates current NULL, // Security flags. nullptr, // Authority (for example, Kerberos) nullptr, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { cout << "Could not connect. Error code = 0x" << hex << hres << endl; pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } //cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl; // Step 5: -------------------------------------------------- // Set security levels on the proxy ------------------------- hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx nullptr, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx nullptr, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 6: -------------------------------------------------- // Use the IWbemServices pointer to make requests of WMI ---- // For example, get the name of the operating system IEnumWbemClassObject* pEnumerator = nullptr; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Process"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, nullptr, &pEnumerator); if (FAILED(hres)) { cout << "Query for processes failed." << " Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- IWbemClassObject *pclsObj = nullptr; ULONG uReturn = 0; int i = 0; while (pEnumerator) { i++; HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtId; pclsObj->Get(L"ProcessId", 0, &vtId, nullptr, nullptr); wprintf_s(L"%d\n", vtId.intVal); VARIANT vtName; pclsObj->Get(L"Name", 0, &vtName, nullptr, nullptr); if (vtName.bstrVal != nullptr) wprintf_s(L"%ls\n", vtName.bstrVal); else wprintf_s(L"\n"); VARIANT vtCmd; pclsObj->Get(L"CommandLine", 0, &vtCmd, nullptr, nullptr); if (vtCmd.bstrVal != nullptr) wprintf_s(L"%ls\n", vtCmd.bstrVal); else wprintf_s(L"\n"); VariantClear(&vtId); VariantClear(&vtName); VariantClear(&vtCmd); pclsObj->Release(); } // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); CoUninitialize(); return 0; // Program successfully completed. }
JSON* GetSystemSpecs() { JSON* specs = JSON::CreateObject(); HRESULT hres; IWbemLocator* pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc); if (FAILED(hres)) { return specs; // Program has failed. } IWbemServices* pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace NULL, // User name. NULL = current user NULL, // User password. NULL = current 0, // Locale. NULL indicates current NULL, // Security flags. 0, // Authority (for example, Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { pLoc->Release(); return specs; // Program has failed. } hres = CoSetProxyBlanket( pSvc, // Indicates the proxy to set RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx NULL, // Server principal name RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // client identity EOAC_NONE // proxy capabilities ); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); return specs; // Program has failed. } IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT Caption FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); return specs; // Program has failed. } IWbemClassObject* pclsObj; ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0); specs->AddStringItem("Operating System", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); pclsObj->Release(); } pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT Name FROM Win32_processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); return specs; // Program has failed. } uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); specs->AddStringItem("Processor", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); pclsObj->Release(); } pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t( "SELECT Name , AdapterRam, DriverVersion, VideoModeDescription FROM Win32_VideoController"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); return specs; // Program has failed. } JSON* graphicsadapters = JSON::CreateArray(); uReturn = 0; while (pEnumerator) { JSON* graphicscard = JSON::CreateObject(); HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); graphicscard->AddStringItem("Name", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); // Get the value of the Name property hr = pclsObj->Get(L"AdapterRam", 0, &vtProp, 0, 0); uint32_t capacity = vtProp.uintVal; graphicscard->AddNumberItem("Video Controller RAM (MB)", capacity / 1048576); VariantClear(&vtProp); // get driver version hr = pclsObj->Get(L"DriverVersion", 0, &vtProp, 0, 0); graphicscard->AddStringItem("Driver Version", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); // get resolution hr = pclsObj->Get(L"VideoModeDescription", 0, &vtProp, 0, 0); graphicscard->AddStringItem("Video Mode", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); pclsObj->Release(); graphicsadapters->AddArrayElement(graphicscard); } specs->AddItem("Graphics Adapters", graphicsadapters); pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT Capacity FROM Win32_PhysicalMemory"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); return specs; // Program has failed. } uint64_t totalram = 0; uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"Capacity", 0, &vtProp, 0, 0); uint64_t capacity = QString::fromWCharArray(vtProp.bstrVal).toLongLong(); totalram += capacity; VariantClear(&vtProp); pclsObj->Release(); } specs->AddNumberItem("Total RAM (GB)", totalram / 1073741824.0); JSON* usbtree = JSON::CreateArray(); QMap<QString, QStringList> antecedents; pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT Antecedent,Dependent FROM Win32_USBControllerDevice"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); return specs; // Program has failed. } VARIANT vtProp; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } // Get the reference value of the Antecedent property. There is not a function to dereference // the value. hr = pclsObj->Get(L"Antecedent", 0, &vtProp, 0, 0); BSTR name = vtProp.bstrVal; // sanitize the string input to just the output QString antecedent = QString::fromWCharArray(name).split("=")[1].replace("\"", ""); VariantClear(&vtProp); // Get the reference value of the Dependent property. There is not a function to dereference // the value. hr = pclsObj->Get(L"Dependent", 0, &vtProp, 0, 0); name = vtProp.bstrVal; // sanitize the string input to just the output QString dependent = QString::fromWCharArray(name).split("=")[1].replace("\"", ""); antecedents[antecedent].append(dependent); VariantClear(&vtProp); } for (int ant = 0; ant < antecedents.size(); ant++) { QString antecedent_name = antecedents.keys()[ant]; // get antecedent object in a new enumerator IEnumWbemClassObject* pEnumerator2 = NULL; IWbemClassObject* pclsObj2; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t( "SELECT Manufacturer, Name, DeviceID, Caption FROM WIN32_USBController where deviceid = '") + bstr_t(antecedent_name.toUtf8()) + bstr_t("'"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator2); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); return specs; // Program has failed. } JSON* USBAntecedent = JSON::CreateObject(); while (pEnumerator2) { HRESULT hr = pEnumerator2->Next(WBEM_INFINITE, 1, &pclsObj2, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; // Get the value of the Name property hr = pclsObj2->Get(L"Name", 0, &vtProp, 0, 0); USBAntecedent->AddStringItem("name", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); // Get the value of the DeviceID property hr = pclsObj2->Get(L"DeviceID", 0, &vtProp, 0, 0); USBAntecedent->AddStringItem("deviceid", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); // Get the value of the caption property hr = pclsObj2->Get(L"Caption", 0, &vtProp, 0, 0); USBAntecedent->AddStringItem("caption", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); // Get the value of the manufacturer property hr = pclsObj2->Get(L"Manufacturer", 0, &vtProp, 0, 0); USBAntecedent->AddStringItem("manufacturer", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); pclsObj2->Release(); } JSON* devices = JSON::CreateArray(); for (int dev = 0; dev < antecedents[antecedent_name].size(); ++dev) { // get antecedent object in a new enumerator pEnumerator2 = NULL; if (!pclsObj2) pclsObj2->Release(); hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT Manufacturer,Name FROM Win32_PnPEntity where DeviceID = '") + bstr_t(antecedents[antecedent_name][dev].toUtf8()) + bstr_t("'"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator2); if (FAILED(hres)) { pSvc->Release(); pLoc->Release(); return specs; // Program has failed. } while (pEnumerator2) { HRESULT hr = pEnumerator2->Next(WBEM_INFINITE, 1, &pclsObj2, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; JSON* properties = JSON::CreateObject(); // Get the value of the Manufacturer property hr = pclsObj2->Get(L"Manufacturer", 0, &vtProp, 0, 0); properties->AddStringItem("manufacturer", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); // Get the value of the Manufacturer property hr = pclsObj2->Get(L"Name", 0, &vtProp, 0, 0); properties->AddStringItem("name", WCHAR_TO_OVR_STRING(vtProp.bstrVal)); VariantClear(&vtProp); pclsObj2->Release(); devices->AddArrayElement(properties); } } USBAntecedent->AddItem("Devices", devices); usbtree->AddArrayElement(USBAntecedent); } specs->AddItem("USB Tree", usbtree); // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); if (!pclsObj) pclsObj->Release(); return specs; }
/** * Gets the switch port info from WMI (switch port friendly name, ifSpeed) * and merges into the list of existing ports. */ void readWMISwitchPorts(HSP *sp) { BSTR path = SysAllocString(WMI_VIRTUALIZATION_NS_V2); HRESULT hr = S_FALSE; IWbemServices *pNamespace = NULL; hr = connectToWMI(path, &pNamespace); if (FAILED(hr)) { //only try the v2 namespace since this will only be present //with the extensible switch that supports sampling. //don't try to get counters if there is no sampling. SysFreeString(path); myLog(LOG_INFO, "readWMISwitchPorts: virtualization namespace v2 not found"); return; } else { SysFreeString(path); } BSTR queryLang = SysAllocString(L"WQL"); wchar_t *query = L"SELECT * FROM Msvm_EthernetSwitchPort"; IEnumWbemClassObject *switchPortEnum = NULL; hr = pNamespace->ExecQuery(queryLang, query, WBEM_FLAG_FORWARD_ONLY, NULL, &switchPortEnum); SysFreeString(queryLang); if (FAILED(hr)) { myLog(LOG_ERR,"readWMISwitchPorts: ExecQuery() failed for query %S error=0x%x", query, hr); pNamespace->Release(); return; } if (sp->vAdaptorList == NULL) { sp->vAdaptorList = adaptorListNew(); } IWbemClassObject *switchPortObj = NULL; hr = WBEM_S_NO_ERROR; while (WBEM_S_NO_ERROR == hr) { SFLAdaptor *vAdaptor = NULL; ULONG uReturned = 1; hr = switchPortEnum->Next(WBEM_INFINITE, 1, &switchPortObj, &uReturned); if (0 == uReturned) { break; } wchar_t *guidString = stringFromWMIProperty(switchPortObj, PROP_NAME); if (guidString != NULL) { char portGuid[FORMATTED_GUID_LEN+1]; guidToString(guidString, (UCHAR *)portGuid, FORMATTED_GUID_LEN); myLog(LOG_INFO, "readWMISwitchPorts: portGuid=%s", portGuid); my_free(guidString); vAdaptor = adaptorListGet(sp->vAdaptorList, portGuid); } if (vAdaptor != NULL) { HVSVPortInfo *portInfo = (HVSVPortInfo *)vAdaptor->userData; wchar_t *switchName = stringFromWMIProperty(switchPortObj, PROP_SYSTEM_NAME); if (switchName != NULL) { if (portInfo->switchName != NULL) { my_free(portInfo->switchName); } portInfo->switchName = switchName; } wchar_t *friendlyName = stringFromWMIProperty(switchPortObj, PROP_ELEMENT_NAME); if (friendlyName != NULL) { if (portInfo->portFriendlyName != NULL) { my_free(portInfo->portFriendlyName); } portInfo->portFriendlyName = friendlyName; } setPortCountersInstance(vAdaptor); wchar_t *speedString = stringFromWMIProperty(switchPortObj, PROP_SPEED); if (speedString != NULL) { ULONGLONG ifSpeed = _wcstoui64(speedString, NULL, 10); vAdaptor->ifSpeed = ifSpeed; my_free(speedString); } //could also get ifDirection but FullDuplex=True always //Get the MACs and VM system name when we enumerate the vms. myLog(LOG_INFO, "readWMISwitchPorts: updated switch port %s %S portId=%u ifIndex=%u ifSpeed=%llu counterName=%S", vAdaptor->deviceName, portInfo->portFriendlyName, portInfo->portId, vAdaptor->ifIndex, vAdaptor->ifSpeed, portInfo->portCountersInstance); } else { myLog(LOG_INFO, "readWMISwitchPorts: vAdapter not found"); } switchPortObj->Release(); } switchPortEnum->Release(); pNamespace->Release(); }
// // 函数: GetOSName(PWSTR, DWORD) // // 目的: 获取当前操作系统的名字(例如:"Microsoft Windows 7 企业版"). // // 参数: // * pszName - 存放操作系统名的缓冲区. // * cch - 由pszName所指向的缓冲区大小,以字符形式. // // 返回值: 如果函数成功返回TRUE. // BOOL GetOSName(PWSTR pszName, DWORD cch) { HRESULT hr = S_OK; IWbemLocator *pLoc = NULL; IWbemServices *pSvc = NULL; IEnumWbemClassObject *pEnumerator = NULL; PCWSTR pszMachineName = L"."; // 通过调用 CoInitializeEx初始化COM参数. hr = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hr)) { return FALSE; } // 通过调用CoInitializeSecurity初始化COM进程安全. hr = CoInitializeSecurity( NULL, -1, // COM 认证 NULL, // 认证服务 NULL, // 保留 RPC_C_AUTHN_LEVEL_DEFAULT, // 默认认证 RPC_C_IMP_LEVEL_IDENTIFY, // 默认身份 NULL, // 认证信息 EOAC_NONE, // 额外的能力 NULL // 保留 ); if (FAILED(hr)) { goto Cleanup; } // 通过调用CoCreateInstance获得WMI的初始定位器. hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID *>(&pLoc)); if (FAILED(hr)) { goto Cleanup; } // 通过IWbemLocator::ConnectServer连接到WMI. wchar_t szPath[200]; hr = StringCchPrintf(szPath, ARRAYSIZE(szPath), L"\\\\%s\\root\\cimv2", pszMachineName); if (FAILED(hr)) { goto Cleanup; } hr = pLoc->ConnectServer( bstr_t(szPath), // WMI名空间的路径 NULL, // 用户名 NULL, // 用户密码 NULL, // 本地 NULL, // 安全标志 NULL, // 权限 NULL, // 上下文对象 &pSvc // IWbemServices 代理 ); if (FAILED(hr)) { goto Cleanup; } // 在WMI连接中设置安全级别. hr = CoSetProxyBlanket( pSvc, // 指明代理来设置 RPC_C_AUTHN_DEFAULT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_DEFAULT, // RPC_C_AUTHZ_xxx COLE_DEFAULT_PRINCIPAL, // 主要服务器名字 RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // 客户身份 EOAC_NONE // 代理功能 ); if (FAILED(hr)) { goto Cleanup; } // 使用IWbemServices指针提出WMI请求. // 查询指明当前操作系统名的Win32_OperatingSystem.Caption. hr = pSvc->ExecQuery(bstr_t(L"WQL"), bstr_t(L"SELECT Caption FROM Win32_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hr)) { goto Cleanup; } // 确保枚举代理. hr = CoSetProxyBlanket( pEnumerator, // 指明代理来设置 RPC_C_AUTHN_DEFAULT, // RPC_C_AUTHN_xxx RPC_C_AUTHZ_DEFAULT, // RPC_C_AUTHZ_xxx COLE_DEFAULT_PRINCIPAL, // 主要服务器名字 RPC_C_AUTHN_LEVEL_PKT_PRIVACY, // RPC_C_AUTHN_LEVEL_xxx RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx NULL, // 客户身份 EOAC_NONE // 代理功能 ); if (FAILED(hr)) { goto Cleanup; } // 通过以上的查询来获取数据. IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; while (pEnumerator) { // 获得一个对象. HRESULT hrTmp = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; // 获取Win32_OperatingSystem.Caption属性的值. hrTmp = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0); if (SUCCEEDED(hrTmp)) { hr = StringCchCopy(pszName, cch, vtProp.bstrVal); VariantClear(&vtProp); } pclsObj->Release(); pclsObj = NULL; } Cleanup: // 集中清理所以的已分配资源. if (pLoc) { pLoc->Release(); pLoc = NULL; } if (pSvc) { pSvc->Release(); pSvc = NULL; } if (pEnumerator) { pEnumerator->Release(); pEnumerator = NULL; } CoUninitialize(); return SUCCEEDED(hr); }
int MyMacAddress::WMI_GetMacAddress(int iQueryType, int iSize) { ZeroMemory(PermanentAddress, sizeof(PermanentAddress)); ZeroMemory(MACAddress, sizeof(MACAddress)); HRESULT hres; int iTotal = 0; if( (iQueryType < 0) || (iQueryType >= sizeof(szWQLQuery)/sizeof(T_WQL_QUERY)) ) { return -1; } hres = CoInitializeEx( NULL, COINIT_MULTITHREADED); if( FAILED(hres) ) { return -2; } hres = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); if( FAILED(hres)) { CoUninitialize(); return -2; } IWbemLocator *pLoc = NULL; hres = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast <LPVOID*>(&pLoc)); if( FAILED(hres)) { CoUninitialize(); return -2; } IWbemServices *pSvc = NULL; hres = pLoc->ConnectServer(_bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pSvc); if( FAILED(hres)) { pLoc->Release(); CoUninitialize(); return -2; } // 设置请求代理的安全级别 hres = CoSetProxyBlanket(pSvc, 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)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return -2; } IEnumWbemClassObject *pEnumerator = NULL; hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t( szWQLQuery[iQueryType].szSelect), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if(FAILED(hres)) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return -3; } while(pEnumerator) { IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; if(iTotal >= iSize) { break; } pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if( uReturn == 0 ) { break; } VARIANT vtProperty; TCHAR szProperty[128]; // 获取网卡范例ID VariantInit( &vtProperty); pclsObj->Get( szWQLQuery[iQueryType].szProperty, 0, &vtProperty, NULL, NULL ); StringCchCopy( szProperty, sizeof(szProperty)/sizeof(TCHAR), W2T(vtProperty.bstrVal) ); VariantClear( &vtProperty ); if( GetPNPDeviceID( szProperty)) { iTotal++; } pclsObj->Release(); } // 释放资源 pEnumerator->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); return iTotal; }
STDAPI RetrieveGUIDForApplication( WCHAR* szPathToGDFdll, GUID* pGUID ) { HRESULT hr; IWbemLocator* pIWbemLocator = NULL; IWbemServices* pIWbemServices = NULL; BSTR pNamespace = NULL; IEnumWbemClassObject* pEnum = NULL; bool bFound = false; CoInitialize(0); hr = CoCreateInstance( __uuidof(WbemLocator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IWbemLocator), (LPVOID*) &pIWbemLocator ); if( SUCCEEDED(hr) && pIWbemLocator ) { // Using the locator, connect to WMI in the given namespace. pNamespace = SysAllocString( L"\\\\.\\root\\cimv2\\Applications\\Games" ); hr = pIWbemLocator->ConnectServer( pNamespace, NULL, NULL, 0L, 0L, NULL, NULL, &pIWbemServices ); if( SUCCEEDED(hr) && pIWbemServices != NULL ) { // Switch security level to IMPERSONATE. CoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0 ); BSTR bstrQueryType = SysAllocString( L"WQL" ); // Double up the '\' marks for the WQL query WCHAR szDoubleSlash[2048]; int iDest = 0, iSource = 0; for( ;; ) { if( szPathToGDFdll[iSource] == 0 || iDest > 2000 ) break; szDoubleSlash[iDest] = szPathToGDFdll[iSource]; if( szPathToGDFdll[iSource] == L'\\' ) { iDest++; szDoubleSlash[iDest] = L'\\'; } iDest++; iSource++; } szDoubleSlash[iDest] = 0; WCHAR szQuery[1024]; StringCchPrintf( szQuery, 1024, L"SELECT * FROM GAME WHERE GDFBinaryPath = \"%s\"", szDoubleSlash ); BSTR bstrQuery = SysAllocString( szQuery ); hr = pIWbemServices->ExecQuery( bstrQueryType, bstrQuery, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum ); if( SUCCEEDED(hr) ) { IWbemClassObject* pGameClass = NULL; DWORD uReturned = 0; BSTR pPropName = NULL; // Get the first one in the list hr = pEnum->Next( 5000, 1, &pGameClass, &uReturned ); if( SUCCEEDED(hr) && uReturned != 0 && pGameClass != NULL ) { VARIANT var; // Get the InstanceID string pPropName = SysAllocString( L"InstanceID" ); hr = pGameClass->Get( pPropName, 0L, &var, NULL, NULL ); if( SUCCEEDED(hr) && var.vt == VT_BSTR ) { bFound = true; if( pGUID ) StringToGuid( pGUID, (const char *)var.cVal ); } if( pPropName ) SysFreeString( pPropName ); } SAFE_RELEASE( pGameClass ); } SAFE_RELEASE( pEnum ); } if( pNamespace ) SysFreeString( pNamespace ); SAFE_RELEASE( pIWbemServices ); } SAFE_RELEASE( pIWbemLocator ); #ifdef SHOW_DEBUG_MSGBOXES WCHAR sz[1024]; StringCchPrintf( sz, 1024, L"szPathToGDFdll=%s bFound=%d", szPathToGDFdll, bFound ); MessageBox( NULL, sz, L"RetrieveGUIDForApplicationW", MB_OK ); #endif return (bFound) ? S_OK : E_FAIL; }