std::shared_ptr<CHardware> CHardwareFactory::newOpticalDiscDrive() const { /* * IWbemServices::ExecQuery http://msdn.microsoft.com/en-us/library/windows/desktop/aa392107%28v=VS.85%29.aspx * IWbemClassObject::Next http://msdn.microsoft.com/en-us/library/windows/desktop/aa391453%28v=VS.85%29.aspx * IWbemClassObject::Get http://msdn.microsoft.com/en-us/library/windows/desktop/aa391442%28v=VS.85%29.aspx * Win32_CDROMDrive class http://msdn.microsoft.com/en-us/library/windows/desktop/aa394081%28v=VS.85%29.aspx * * Creating a WMI Application Using C++ http://msdn.microsoft.com/en-us/library/windows/desktop/aa389762%28v=VS.85%29.aspx */ IEnumWbemClassObject* enumerator = 0; HRESULT hr = mWbemServices->ExecQuery(BSTR(L"WQL"), BSTR(L"SELECT * FROM Win32_CDROMDrive"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 0, &enumerator); if (FAILED(hr)) { throw CBasicException("ExecQuery failed"); } std::list<std::string> opticalDriveList; while(enumerator) { IWbemClassObject* obj = 0; ULONG ret = 0; hr = enumerator->Next(WBEM_INFINITE, 1, &obj, &ret); if (ret == 0 || FAILED(hr)) { break; } VARIANT vtProp; hr = obj->Get(L"Caption", 0, &vtProp, 0, 0); if (FAILED(hr)) { continue; } opticalDriveList.push_back(CUtils::str2utf8(vtProp.bstrVal)); VariantClear(&vtProp); obj->Release(); } enumerator->Release(); return std::shared_ptr<CHardware>(new CHardware(CHardware::OPTICALDISCDRIVE, opticalDriveList)); }
/** * 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; }
/* Check VMWare bios using WMI */ BOOL vmware_wmi() { IWbemServices *pSvc = NULL; IWbemLocator *pLoc = NULL; IEnumWbemClassObject* pEnumerator = NULL; BOOL bStatus = FALSE; HRESULT hr; // Init WMI bStatus = InitWMI(&pSvc, &pLoc); if (bStatus) { // If success, execute the desired query bStatus = ExecWMIQuery(&pSvc, &pLoc, &pEnumerator, _T("SELECT * FROM Win32_PnPEntity")); if (bStatus) { // Get the data from the query IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; VARIANT vtProp; while (pEnumerator) { hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) break; // Get the value of the Name property hr = pclsObj->Get(_T("DeviceId"), 0, &vtProp, 0, 0); //_tprintf(_T("DeviceId : %s"), vtProp.bstrVal); // release the current result object VariantClear(&vtProp); pclsObj->Release(); } } } // Cleanup pSvc->Release(); pLoc->Release(); pEnumerator->Release(); CoUninitialize(); return TRUE; }
static bool TryAddress(const std::string& ipAddress) { IEnumWbemClassObject* enumerator = 0; std::wstring query(L"SELECT * FROM Win32_PingStatus WHERE (Address=\""); query.append(::UTF8ToWide(ipAddress)); query.append(L"\")"); BSTR queryBstr = SysAllocString(query.c_str()); HRESULT result = service->ExecQuery(L"WQL", queryBstr, WBEM_FLAG_FORWARD_ONLY, 0, &enumerator); SysFreeString(queryBstr); if (FAILED(result)) { HandleHResultError("Failed to execute address query", result); return false; } ULONG count; IWbemClassObject* ping = 0; result = enumerator->Next(WBEM_INFINITE, 1L, &ping, &count); if (FAILED(result)) { HandleHResultError("Failed to get ping data", result); enumerator->Release(); return false; } if (count < 1) { LogError("Did not find ping result"); enumerator->Release(); ping->Release(); return false; } variant_t pingValue; result = ping->Get(L"StatusCode", 0, &pingValue, 0, 0); if (FAILED(result)) { HandleHResultError("Could not get ping StatusCode value", result); enumerator->Release(); ping->Release(); return false; } ping->Release(); return static_cast<int>(pingValue) == 0; }
bool ReadACL(IWbemServices *pNamespace) { bool bRet = false; _bstr_t InstPath(L"__systemsecurity=@"); _bstr_t MethName(L"GetSD"); IWbemClassObject * pOutParams = NULL; // The security descriptor is returned via the GetSD method HRESULT hr = pNamespace->ExecMethod(InstPath, MethName, 0, NULL, NULL, &pOutParams, NULL); if(SUCCEEDED(hr)) { // The output parameters has a property which has the descriptor _bstr_t prop(L"sd"); _variant_t var; hr = pOutParams->Get(prop, 0, &var, NULL, NULL); if(SUCCEEDED(hr)) { if(var.vt != (VT_ARRAY | VT_UI1)) return false; SAFEARRAY * psa = var.parray; PSECURITY_DESCRIPTOR pSD; hr = SafeArrayAccessData(psa, (void HUGEP* FAR*)&pSD); if(hr != 0) return false; // Dump out some information DumpSD(pSD); // Given that the security desciptor is now present, the code could use standard // nt functions to add or remove ace's. There are also various libraries available // that can make the job a bit easier. This sample does not change the security // descriptor, but does write it back unchanged as an example. StoreSD(pNamespace, pSD); SafeArrayUnaccessData(psa); bRet = true; } } return bRet; }
int getTimeProcessors(IWbemServices *pSvc,ULONG *ulVal ,int n) { int nError = 0; IEnumWbemClassObject* pEnumerator = NULL; HRESULT hres = pSvc->ExecQuery( L"WQL", L"SELECT * FROM Win32_PerfRawData_PerfOS_Processor", WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { ShowMessage("Query for operating system name failed."); return 1; } IWbemClassObject *pclsObj; ULONG uReturn = 0; int nCtr = 0; while (nCtr<n) { pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(0 == uReturn) { break; } VARIANT vtProp; VariantInit(&vtProp); pclsObj->Get(L"PercentProcessorTime", 0, &vtProp, 0, 0); ulVal[nCtr] = _wtol(vtProp.bstrVal); VariantClear(&vtProp); pclsObj->Get(L"TimeStamp_Sys100NS", 0, &vtProp, 0, 0);// время в милисекундах прошедших с получночи 1 января 1970 года ulVal[nCtr+1] = _wtol(vtProp.bstrVal); VariantClear(&vtProp); nCtr+=2; } pclsObj->Release(); pEnumerator->Release(); return nError; }
void ListClasses(IWbemServices *pNamespace) { HRESULT hr; IEnumWbemClassObject *pEnum = NULL; hr = pNamespace->CreateClassEnum(NULL, 0, NULL, &pEnum); if(SUCCEEDED(hr)) { // Note that even though security was set on the namespace pointer, it must // also be set on this pointer since COM will revert back to the default // settings for any new pointers! hr = SetProxySecurity(pEnum); if(SUCCEEDED(hr)) { IWbemClassObject* Array[1]; Array[0] = NULL; ULONG uRet = 0; while (SUCCEEDED(hr = pEnum->Next(10000, 1, Array, &uRet)) && Array[0]) { // Note that IWbemClassObjects are inproc and thus have no proxy. // Therefore, they never need CoSetProxyBlanket. BSTR strText; IWbemClassObject* pObj = Array[0]; hr = pObj->GetObjectText(0, &strText); if(SUCCEEDED(hr) && strText) { printf("\nGot class %S", strText); SysFreeString(strText); } pObj->Release(); Array[0] = NULL; } } else printf("\nFAILED TO SET SECURITY FOR ENUMERATOR!!!!! hr = 0x%x", hr); pEnum->Release(); } }
HRESULT GetInputParameters(__in IWbemServices* pSvc, __in PCWSTR pClassName, __in PCWSTR pMethodName, __out IWbemClassObject** ppInParams) { HRESULT hr; IWbemClassObject* pClass = NULL; IWbemClassObject* pInParamsDefinition = NULL; IWbemClassObject* pInParamsLocal = NULL; hr = pSvc->GetObject(_bstr_t(pClassName), 0, NULL, &pClass, NULL); if(HB_FAILED(hr)) { goto cleanexit; } hr = pClass->GetMethod(_bstr_t(pMethodName), 0, &pInParamsDefinition, NULL); if(HB_FAILED(hr)) { goto cleanexit; } hr = pInParamsDefinition->SpawnInstance(0, &pInParamsLocal); if(HB_FAILED(hr)) { goto cleanexit; } *ppInParams = pInParamsLocal; pInParamsLocal = NULL; cleanexit: HB_SAFE_RELEASE(pClass); HB_SAFE_RELEASE(pInParamsDefinition); HB_SAFE_RELEASE(pInParamsLocal); return hr; }
BOOL _GetClassObjectValue(IEnumWbemClassObject* pEnumerator, const CString& cstrValueName, VARIANT& vt) { BOOL bRet = FALSE; IWbemClassObject *pclsObj = NULL; if (pEnumerator != NULL) { ULONG uReturn = 0; while (pEnumerator) { HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if(0 == uReturn || pclsObj == NULL) { break; } VARIANT vtProp; hr = pclsObj->Get(cstrValueName, 0, &vtProp, 0, 0); if (FAILED(hr)) { continue; } vt = vtProp; bRet = TRUE; break; } } if (pclsObj) { pclsObj->Release(); } return bRet; }
/** * 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; }
bool CSMBiosTable::FetchSMBiosDataByCom( unsigned char ** p ) { BOOL bRet = FALSE; HRESULT hres; // Initialize COM. hres = CoInitializeEx( 0, COINIT_MULTITHREADED ); if( FAILED(hres) ) { return FALSE; // 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) ) { CoUninitialize(); return FALSE; // Program has failed. } IWbemServices *pSvc = 0; // Connect to the root\cimv2 namespace with the z // current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\WMI"), // WMI namespace NULL, // User name NULL, // User password 0, // Locale NULL, // Security flags 0, // Authority 0, // Context object &pSvc // IWbemServices proxy ); if( FAILED(hres) ) { pLoc->Release(); CoUninitialize(); return FALSE; // Program has failed. } // 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) ) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return FALSE; // Program has failed. } IEnumWbemClassObject* pEnumerator = NULL; hres = pSvc->CreateInstanceEnum( L"MSSMBios_RawSMBiosTables", 0, NULL, &pEnumerator); if( FAILED(hres) ) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return FALSE; // Program has failed. } else { do { IWbemClassObject* pInstance = NULL; ULONG dwCount = NULL; hres = pEnumerator->Next( WBEM_INFINITE, 1, &pInstance, &dwCount); if( SUCCEEDED(hres) ) { VARIANT varBIOSData; VariantInit(&varBIOSData); CIMTYPE type; hres = pInstance->Get(bstr_t("SmbiosMajorVersion"),0,&varBIOSData,&type,NULL); if( FAILED(hres) ) { VariantClear(&varBIOSData); } else { m_smbiosbuffer.nSMBIOSMajorVersion = varBIOSData.iVal; VariantInit(&varBIOSData); hres = pInstance->Get( bstr_t("SmbiosMinorVersion"), 0, &varBIOSData, &type, NULL ); if( FAILED(hres) ) { VariantClear( &varBIOSData ); } else { m_smbiosbuffer.nSMBIOSMinorVersion = varBIOSData.iVal; VariantInit(&varBIOSData); hres = pInstance->Get( bstr_t("SMBiosData"), 0, &varBIOSData, &type, NULL ); if( SUCCEEDED(hres) ) { if( ( VT_UI1 | VT_ARRAY ) != varBIOSData.vt ) { } else { SAFEARRAY *parray = NULL; parray = V_ARRAY(&varBIOSData); BYTE* pbData = (BYTE*)parray->pvData; m_smbiosbuffer.nLength = parray->rgsabound[0].cElements; (*p) = new unsigned char[m_smbiosbuffer.nLength]; memcpy_s( (*p), m_smbiosbuffer.nLength, pbData, m_smbiosbuffer.nLength ); bRet = TRUE; } } VariantClear( &varBIOSData ); } } break; } }while( hres == WBEM_S_NO_ERROR ); } // Cleanup // ======== pSvc->Release(); pLoc->Release(); CoUninitialize(); return bRet; }
HRESULT ExecuteMethod3InInstance( __in IWbemServices* WbemServices, __in IWbemClassObject* ClassObj, __in const BSTR InstancePath, __in ULONG InData1, __in ULONG InData2 ) { HRESULT status; IWbemClassObject* inputParamsObj = NULL; IWbemClassObject* inputParamsInstanceObj = NULL; IWbemClassObject* outputParamsInstanceObj = NULL; const BSTR methodName = SysAllocString(TOASTER_METHOD_3); VARIANT funcParam; // // Get the input parameters class objects for the method. // status = ClassObj->GetMethod(methodName, 0, &inputParamsObj, NULL); if (FAILED(status)) { goto exit; } // // Spawn an instance of the input parameters class object. // status = inputParamsObj->SpawnInstance(0, &inputParamsInstanceObj); if (FAILED(status)) { goto exit; } // // Set the input variables values (i.e., inData1, inData2 for ToasterMethod3). // funcParam.vt = VT_I4; funcParam.ulVal = InData1; status = inputParamsInstanceObj->Put(L"InData1", 0, &funcParam, 0); if (FAILED(status)) { goto exit; } funcParam.vt = VT_I4; funcParam.ulVal = InData2; status = inputParamsInstanceObj->Put(L"InData2", 0, &funcParam, 0); if (FAILED(status)) { goto exit; } // // Call the method. // printf("\n"); printf("Instance Path .: %ws\n", (wchar_t*)InstancePath); printf(" Method Name..: %ws\n", (wchar_t*)methodName); status = WbemServices->ExecMethod(InstancePath, methodName, 0, NULL, inputParamsInstanceObj, &outputParamsInstanceObj, NULL); if (FAILED(status)) { goto exit; } // // Get the "in" Parameter values from the input parameters object. // status = inputParamsInstanceObj->Get(L"InData1", 0, &funcParam, NULL, NULL); if (FAILED(status)) { goto exit; } printf(" InData1...: %d\n", funcParam.ulVal); status = inputParamsInstanceObj->Get(L"InData2", 0, &funcParam, NULL, NULL); if (FAILED(status)) { goto exit; } printf(" InData2...: %d\n", funcParam.ulVal); // // Get the "out" Parameter values from the output parameters object. // status = outputParamsInstanceObj->Get(L"OutData1", 0, &funcParam, NULL, NULL); if (FAILED(status)) { goto exit; } printf(" OutData1..: %d\n", funcParam.ulVal); status = outputParamsInstanceObj->Get(L"OutData2", 0, &funcParam, NULL, NULL); if (FAILED(status)) { goto exit; } printf(" OutData2..: %d\n", funcParam.ulVal); exit: if (methodName != NULL) { SysFreeString(methodName); } if (inputParamsObj != NULL) { inputParamsObj->Release(); } if (inputParamsInstanceObj != NULL) { inputParamsInstanceObj->Release(); } if (outputParamsInstanceObj != NULL) { outputParamsInstanceObj->Release(); } return status; }
HRESULT ExecuteMethodsInClass( __in IWbemServices* WbemServices, __in_opt PWCHAR UserId, __in_opt PWCHAR Password, __in_opt PWCHAR DomainName ) /*++ Routine Description: This routine enumerates the instances of the Toaster method class and executes the methods in the class for each instance. Arguments: WbemServices - Pointer to the WBEM services interface used for accessing the WMI services. UserId - Pointer to the user id information or NULL. Password - Pointer to password or NULL. If the user id is not specified, this parameter is ignored. DomainName - Pointer to domain name or NULL. If the user id is not specified, this parameter is ignored. Return Value: HRESULT Status code. --*/ { HRESULT status = S_OK; IEnumWbemClassObject* enumerator = NULL; IWbemClassObject* classObj = NULL; IWbemClassObject* instanceObj = NULL; const BSTR className = SysAllocString(TOASTER_METHOD_CLASS); VARIANT pathVariable; _bstr_t instancePath; ULONG nbrObjsSought = 1; ULONG nbrObjsReturned; // // Create an Enumeration object to enumerate the instances of the given class. // status = WbemServices->CreateInstanceEnum(className, WBEM_FLAG_SHALLOW | WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator); if (FAILED(status)) { goto exit; } // // Set authentication information for the interface. // status = SetInterfaceSecurity(enumerator, UserId, Password, DomainName); if (FAILED(status)) { goto exit; } // // Get the class object for the method definition. // status = WbemServices->GetObject(className, 0, NULL, &classObj, NULL); if (FAILED(status)) { goto exit; } do { // // Get the instance object for each instance of the class. // status = enumerator->Next(WBEM_INFINITE, nbrObjsSought, &instanceObj, &nbrObjsReturned); if (status == WBEM_S_FALSE) { status = S_OK; break; } if (FAILED(status)) { if (status == WBEM_E_INVALID_CLASS) { printf("ERROR: Toaster driver may not be active on the system.\n"); } goto exit; } // // To obtain the object path of the object for which the method has to be // executed, query the "__PATH" property of the WMI instance object. // status = instanceObj->Get(_bstr_t(L"__PATH"), 0, &pathVariable, NULL, NULL); if (FAILED(status)) { goto exit; } instancePath = pathVariable.bstrVal; instanceObj->Release(); instanceObj = NULL; // // Execute the methods in this instance of the class. // status = ExecuteMethod1InInstance(WbemServices, classObj, instancePath, IN_DATA1_VALUE); if (FAILED(status)) { goto exit; } status = ExecuteMethod2InInstance(WbemServices, classObj, instancePath, IN_DATA1_VALUE, IN_DATA2_VALUE); if (FAILED(status)) { goto exit; } status = ExecuteMethod3InInstance(WbemServices, classObj, instancePath, IN_DATA1_VALUE, IN_DATA2_VALUE); if (FAILED(status)) { goto exit; } } while (!FAILED(status)); exit: if (className != NULL) { SysFreeString(className); } if (classObj != NULL) { classObj->Release(); } if (enumerator != NULL) { enumerator->Release(); } if (instanceObj != NULL) { instanceObj->Release(); } return status; }
bool WMIVideoInfo::_queryPropertyWMI( const PVIQueryType queryType, const U32 adapterId, String *outValue ) { if( mServices == NULL ) return false; BSTR bstrWQL = SysAllocString(L"WQL"); BSTR bstrPath = SysAllocString(L"select * from Win32_VideoController"); IEnumWbemClassObject* enumerator; // Use the IWbemServices pointer to make requests of WMI HRESULT hr = mServices->ExecQuery(bstrWQL, bstrPath, WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator); if( FAILED( hr ) ) return false; IWbemClassObject *adapter = NULL; ULONG uReturned; // Get the appropriate adapter. for ( S32 i = 0; i <= adapterId; i++ ) { hr = enumerator->Next(WBEM_INFINITE, 1, &adapter, &uReturned ); if ( FAILED( hr ) || uReturned == 0 ) { enumerator->Release(); return false; } } // Now get the property VARIANT v; hr = adapter->Get( smPVIQueryTypeToWMIString[queryType], 0, &v, NULL, NULL ); bool result = SUCCEEDED( hr ); if ( result ) { switch( v.vt ) { case VT_I4: { LONG longVal = v.lVal; if( queryType == PVI_VRAM ) longVal = longVal >> 20; // Convert to megabytes *outValue = String::ToString( (S32)longVal ); break; } case VT_UI4: { *outValue = String::ToString( (U32)v.ulVal ); break; } case VT_BSTR: { *outValue = String( v.bstrVal ); break; } case VT_LPSTR: case VT_LPWSTR: break; } } // Cleanup adapter->Release(); enumerator->Release(); return result; }
// ************************************************************************** // // CAdvClientDlg::OnEnumdisks() // // Description: // Enumerates all the disks on a machine. Demonstrates getting // known properties directly. // // Parameters: // None. // // Returns: // Nothing. // // Globals accessed: // None. // // Globals modified: // None. // //=========================================================================== void CAdvClientDlg::OnEnumdisks() { // these are for enumerating. HRESULT hRes; ULONG uReturned; IWbemClassObject *pStorageDev = NULL; IEnumWbemClassObject *pEnumStorageDevs = NULL; // these help get properties. VARIANT pVal; BSTR propName = NULL; CString buf; // here's what we're looking for. // NOTE: make sure you specify a class that has a Provider() // specified for it in the mof file. All other classes are // abstract and wont be found using HMM_FLAG_SHALLOW. They // will be found using HMM_FLAG_DEEP. BSTR className = SysAllocString(L"Win32_LogicalDisk"); if (!className) { TRACE(_T("SysAllocString failed: not enough memory\n")); return; } // setup for the "__RELPATH" system property. propName = SysAllocString(L"__RELPATH"); if (!propName) { SysFreeString(className); TRACE(_T("SysAllocString failed: not enough memory\n")); return; } VariantInit(&pVal); m_outputList.ResetContent(); m_outputList.AddString(_T("working...")); TRACE(_T("Going for class\n")); //--------------------------- // get the list of logical storage devices. if ((hRes = m_pIWbemServices->CreateInstanceEnum(className, WBEM_FLAG_SHALLOW, NULL, &pEnumStorageDevs)) == S_OK) { TRACE(_T("good enumerator\n")); m_outputList.ResetContent(); uReturned = 1; while(uReturned == 1) { //--------------------------- // enumerate through the resultset. hRes = pEnumStorageDevs->Next(TIMEOUT, 1, &pStorageDev, &uReturned); TRACE(_T("Next() %d:%s\n"), uReturned, ErrorString(hRes)); // was one found? if((hRes == S_OK) && (uReturned == 1)) { TRACE(_T("Got a device class\n")); VariantClear(&pVal); // Add the path if (pStorageDev->Get(propName, 0L, &pVal, NULL, NULL) == S_OK) { TRACE(_T("Got a device path\n")); buf = V_BSTR(&pVal); } // add to the output listbox. m_outputList.AddString(buf); // cleanup for next loop VariantInit(&pVal); // Done with this object. if (pStorageDev) { pStorageDev->Release(); // NOTE: pStorageDev MUST be set to NULL for the next all to Next(). pStorageDev = NULL; } } // endif (hRes == S_OK) } // endwhile TRACE(_T("done enumming: %s\n"), ErrorString(hRes)); // Done with this enumerator. if (pEnumStorageDevs) { pEnumStorageDevs->Release(); pEnumStorageDevs = NULL; } } else // CreateInstanceEnum() failed. { TRACE(_T("CreateInstanceEnum() failed: %s\n"), ErrorString(hRes)); } // endif CreateInstanceEnum() TRACE(_T("returning\n")); }
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 WMIMonitor(ScriptValue &s, ScriptValue *args) { HRESULT hr; int i; for (i=0; i<numWmiServers; i++) { if (!scriptstrcmp(args[0].stringVal, wmiServers[i].name)) break; } if (i == numWmiServers) { if (!srealloc(wmiServers, sizeof(WMIServer)*(numWmiServers+1))) return; InitCom(); if (FAILED(CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_SECURE_REFS, NULL))) { return; } IWbemLocator *locator; hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &locator); if (FAILED(hr)) { locator = 0; UninitCom(); return; } wmiServers[i].name = args[0].stringVal; BSTR bstr = UTF8toBSTR(args[0].stringVal->value, &args[0].stringVal->len); if (!bstr) { locator->Release(); UninitCom(); return; } wmiServers[i].services = 0; hr = locator->ConnectServer(bstr, 0, 0, 0, WBEM_FLAG_CONNECT_USE_MAX_WAIT, 0, 0, &wmiServers[i].services); freeBSTR(bstr); if (FAILED(hr)) { locator->Release(); UninitCom(); return; } args[0].stringVal->AddRef(); numWmiServers++; } wmiServers[i].refs++; BSTR bstr = UTF8toBSTR(args[1].stringVal->value, &args[1].stringVal->len); if (bstr) { IEnumWbemClassObject *penum; HRESULT res = wmiServers[i].services->CreateInstanceEnum(bstr, 0, 0, &penum); if (WBEM_S_NO_ERROR == res) { IWbemClassObject *obj; ULONG returned; while ((res=penum->Next(INFINITE, 1, &obj, &returned)) == WBEM_NO_ERROR) { obj->Release(); } penum->Release(); } //wmiServers[i].services->GetObjectW(bstr, 0, 0, freeBSTR(bstr); } }
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. }
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; }
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()); }
LRESULT CALLBACK //static IPodDetector::WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { IPodDetector* ipd = s_hwndMap[ hwnd ]; switch( uMsg ) { case WM_DEVICECHANGE: { HRESULT result = PostMessage( hwnd, WM_USER, wParam, lParam ); if( FAILED( result ) ) LOGL( 3, "error: PostMessage WM_USER failed: " << ::GetLastError() ) } break; case WM_USER: switch( wParam ) { case DBT_DEVICEARRIVAL: { std::string deviceId = ipd->getDBTDeviceInfo( lParam ); LOGL( 3, "Device arrived - id: " << deviceId ) IEnumWbemClassObject* enumerator; ipd->queryByDeviceID( deviceId, &enumerator ); IWbemClassObject* object; ULONG retCount; int count = 0; while( enumerator ) { enumerator->Next( WBEM_INFINITE, 1, &object, &retCount ); if( 0 == retCount ) break; ipd->onDeviceConnected( object ); object->Release(); count++; } if( count > 0 ) { LOGL( 3, count << " ipods found with this deviceId" ); } else { LOGL( 3, "no ipods found with this deviceid - presumeably a non-ipod has been plugged in!" ) } enumerator->Release(); } break; case DBT_DEVICEREMOVECOMPLETE: { //std::string deviceId = ipd->getDBTDeviceInfo( lParam ); LOGL( 3, "DBT device removal detected - checking for disconnected iPod.." ); ipd->onDeviceRemoved(); } break; default: { // LOGL( 3, "Unknown WM_DEVICECHANGE wParam: " << wParam ); } break; } break; default: return DefWindowProc( hwnd, uMsg, wParam, lParam ); break; } return 0; }
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; }
// ************************************************************************** // // CAdvClientDlg::OnDiskdetails() // // Description: // Enumerates the properties of the C: drive using the 'GetNames()' // technique. The technique uses safearrays. // // Parameters: // None. // // Returns: // Nothing. // // Globals accessed: // None. // // Globals modified: // None. // //=========================================================================== void CAdvClientDlg::OnDiskdetails() { HRESULT hRes; long lLower, lUpper, lCount; SAFEARRAY *psaNames = NULL; BSTR PropName = NULL; VARIANT varString, pVal; WCHAR *pBuf; CString clMyBuff; IWbemClassObject *pDriveInst = NULL; IWbemQualifierSet *pQualSet = NULL; VariantInit(&varString); VariantInit(&pVal); m_outputList.ResetContent(); m_outputList.AddString(_T("working...")); //------------------------------- // Get the instance for C: drive. BSTR driveName = SysAllocString(L"Win32_LogicalDisk.DeviceID=\"C:\""); if (!driveName) { TRACE(_T("SysAllocString failed: not enough memory\n")); return; } BSTR cimType = SysAllocString(L"CIMTYPE"); if (!cimType) { SysFreeString(driveName); TRACE(_T("SysAllocString failed: not enough memory\n")); return; } BSTR keyQual = SysAllocString(L"key"); if (!keyQual) { SysFreeString(driveName); SysFreeString(cimType); TRACE(_T("SysAllocString failed: not enough memory\n")); return; } if((hRes = m_pIWbemServices->GetObject(driveName, 0L, NULL, &pDriveInst, NULL)) == S_OK) { m_outputList.ResetContent(); //------------------------------- // Get the property names if((hRes = pDriveInst->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY, NULL, &psaNames)) == S_OK) { //------------------------------- // Get the upper and lower bounds of the Names array if((hRes = SafeArrayGetLBound(psaNames, 1, &lLower)) != S_OK) { TRACE(_T("Couldn't get safe array lbound\n")); SafeArrayDestroy(psaNames); return; } //------------------------------- if((hRes = SafeArrayGetUBound(psaNames, 1, &lUpper)) != S_OK) { TRACE(_T("Couldn't get safe array ubound\n")); SafeArrayDestroy(psaNames); return; } //------------------------------- // For all properties... for (lCount = lLower; lCount <= lUpper; lCount++) { //----------------------------------------------- // I'm formatting each property as: // name (type) ==> value //----------------------------------------------- //------------------------------- // get the property name for this element if((hRes = SafeArrayGetElement(psaNames, &lCount, &PropName)) == S_OK) { clMyBuff = PropName; // print variable type for property value clMyBuff += _T(" ("); // Get pointer to property qualifiers // this mess is due to the fact that system properties don't have qualifiers if ((pDriveInst->GetPropertyQualifierSet(PropName, &pQualSet)) == S_OK) { // Get and print syntax attribute (if any) if ((pQualSet->Get(cimType, 0L, &pVal, NULL)) == S_OK) { clMyBuff += V_BSTR(&pVal); } else if (hRes != WBEM_E_NOT_FOUND) { // some other error TRACE(_T("Could not get syntax qualifier\n")); break; } VariantClear(&pVal); //------------------------------- // If this is a key field, print an asterisk if(((hRes = pQualSet->Get(keyQual, 0L, &pVal, NULL)) == S_OK) && (pVal.boolVal)) { // Yes, it's a key clMyBuff += _T(")*"); } else if (hRes == WBEM_E_NOT_FOUND) { // not a key qualifier clMyBuff += _T(")"); } else { // some other error TRACE(_T("Could not get key qualifier\n")); break; } // done with the qualifierSet. if (pQualSet) { pQualSet->Release(); pQualSet = NULL; } } else { clMyBuff += _T(")"); } //endif pDriveClass->GetPropertyQualifierSet() //------------------------------- // Get the value for the property. if((hRes = pDriveInst->Get(PropName, 0L, &varString, NULL, NULL)) == S_OK) { // Print the value clMyBuff += _T(" ==> "); clMyBuff += ValueToString(&varString, &pBuf); m_outputList.AddString(clMyBuff); free(pBuf); // allocated by ValueToString() } else { TRACE(_T("Couldn't get Property Value\n")); break; } //endif pDriveClass->Get() VariantClear(&varString); VariantClear(&pVal); } else // SafeArrayGetElement() failed { TRACE(_T("Couldn't get safe array element\n")); break; } //endif SafeArrayGetElement() } // endfor // cleanup. SysFreeString(PropName); SysFreeString(keyQual); SysFreeString(cimType); SafeArrayDestroy(psaNames); VariantClear(&varString); VariantClear(&pVal); } else // pDriveClass->GetNames() failed { TRACE(_T("Couldn't GetNames\n")); } //endif pDriveClass->GetNames() // done with drive instance. if (pDriveInst) { pDriveInst->Release(); pDriveInst = NULL; } } //endif GetObject() }
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. }
/** * 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(); }
HRESULT GetAndSetValuesInClass( _In_ IWbemServices* WbemServices, _In_opt_ PWSTR UserId, _In_opt_ PWSTR Password, _In_opt_ PWSTR DomainName ) /*++ Routine Description: This routine enumerates the instances of the Toaster Device Information class and gets/sets the value of one of its Properties. Arguments: WbemServices - Pointer to the WBEM services interface used for accessing the WMI services. UserId - Pointer to the user id information or NULL. Password - Pointer to password or NULL. If the user id is not specified, this parameter is ignored. DomainName - Pointer to domain name or NULL. If the user id is not specified, this parameter is ignored. Return Value: HRESULT Status code. --*/ { HRESULT status = S_OK; IEnumWbemClassObject* enumerator = NULL; IWbemClassObject* classObj = NULL; IWbemClassObject* instanceObj = NULL; const BSTR className = SysAllocString(TOASTER_DEVICE_INFO_CLASS); VARIANT instProperty; ULONG nbrObjsSought = 1; ULONG nbrObjsReturned; // // Create an Enumeration object to enumerate the instances of the given class. // status = WbemServices->CreateInstanceEnum(className, WBEM_FLAG_SHALLOW | WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator); if (FAILED(status)) { goto exit; } // // Set authentication information for the interface. // status = SetInterfaceSecurity(enumerator, UserId, Password, DomainName); if (FAILED(status)) { goto exit; } do { // // Get the instance object for each instance of the class. // status = enumerator->Next(WBEM_INFINITE, nbrObjsSought, &instanceObj, &nbrObjsReturned); if (status == WBEM_S_FALSE) { status = S_OK; break; } if (FAILED(status)) { if (status == WBEM_E_INVALID_CLASS) { printf("ERROR: Toaster driver may not be active on the system.\n"); } goto exit; } // // To obtain the object path of the object for which the method has to be // executed, query the "__PATH" property of the WMI instance object. // status = instanceObj->Get(_bstr_t(L"__PATH"), 0, &instProperty, 0, 0); if (FAILED(status)) { goto exit; } printf("\n"); printf("Instance Path .: %ws\n", (wchar_t*)instProperty.bstrVal); // // Get the current value of the DummyValue property. // status = instanceObj->Get(TOASTER_VAR1, 0, &instProperty, NULL, NULL); if (FAILED(status)) { goto exit; } printf(" Property ....: %ws\n", TOASTER_VAR1); printf(" Old Value ...: %d\n", instProperty.lVal); // // Set a new value for the DummyValue property. // instProperty.lVal++; status = instanceObj->Put(TOASTER_VAR1, 0, &instProperty, 0); if (FAILED(status)) { goto exit; } status = WbemServices->PutInstance(instanceObj, WBEM_FLAG_UPDATE_ONLY, NULL, NULL); if (FAILED(status)) { goto exit; } status = instanceObj->Get(_bstr_t(TOASTER_VAR1), 0, &instProperty, NULL, NULL); if (FAILED(status)) { goto exit; } printf(" New Value ...: %d\n", instProperty.lVal); instanceObj->Release(); instanceObj = NULL; } while (!FAILED(status)); exit: if (className != NULL) { SysFreeString(className); } if (classObj != NULL) { classObj->Release(); } if (enumerator != NULL) { enumerator->Release(); } if (instanceObj != NULL) { instanceObj->Release(); } return status; }
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; }
int wmi_get_cpu_comp_user_sys(float* pcpu_load_comp, float* pcpu_load_user, float* pcpu_load_sys) { assert(_initialized); assert(pcpu_load_comp); assert(pcpu_load_user); assert(pcpu_load_sys); float& cpu_load_comp = *pcpu_load_comp; float& cpu_load_user = *pcpu_load_user; float& cpu_load_sys = *pcpu_load_sys; IEnumWbemClassObject* enumerator = 0; IWbemClassObject* object = 0; cpu_load_comp = 0; cpu_load_user = 0; bool user_logged = false; long long current_process_id = _current_process_id; enumerator = request( bstr_t("SELECT Name, IDProcess, PercentProcessorTime FROM Win32_PerfFormattedData_PerfProc_Process WHERE PercentUserTime > 0") ); VARIANT var; VARIANT var_name; VARIANT user; ULONG uReturn; for(;;) { HRESULT result = enumerator->Next(WBEM_INFINITE, 1, &object, &uReturn); if(0 == uReturn) { break; } VariantInit(&var); // Get Process ID of object - Required for Get Owner Input result = object->Get(L"IDProcess", 0, &var, NULL, NULL ); long long process_id = var.iVal; // Get total cpu load VariantInit(&var); result = object->Get(L"PercentProcessorTime", 0, &var, NULL, NULL ); long long process_cpu_load = _wtoi(var.bstrVal); //std::wcout << "process_cpu_load: " << process_cpu_load << " var.bstrVal : " << var.bstrVal << " app name: " << var_name.bstrVal << std::endl; //std::cout << "app name: " << wtoa(var_name.bstrVal) << std::endl; //std::cout << "process_cpu_load: " << process_cpu_load << std::endl; if (process_id == 0) { // Process id 0 = System Idle Process continue; } else if (process_id == current_process_id) { //std::cout << "COMP test:" << process_cpu_load << std::endl; cpu_load_comp = (float)process_cpu_load; } else if(user_proc_set.find(process_id) != user_proc_set.end()) { //std::cout << "user fnd:" << process_id << '\n'; //Print(std::wcout, var_name); cpu_load_user += (float)process_cpu_load; } else if(system_proc_set.find(process_id) != system_proc_set.end()) { //std::cout << "sys Fnd:" << process_id << '\n'; //Print(std::wcout, var_name); cpu_load_sys += (float)process_cpu_load; } else { //std::cout << "TEST: " << process_id << '\n'; // Declare IWbemClassObject* pwcrGetOwnerIn = NULL; IWbemClassObject* pwcrGetOwnerOut = NULL; IWbemClassObject* pOutParams = NULL; result = services->ExecMethod(bstr_t("Win32_Process.Handle=") + bstr_t(process_id), bstr_t(L"GetOwner"), 0, NULL, pwcrGetOwnerIn, &pOutParams, NULL); VariantInit(&user); if (pOutParams) { result = pOutParams->Get(L"User", 0, &user, 0, 0); pOutParams->Release(); } //std::cout << "result: " << result << std::endl; if (SUCCEEDED(result) && user.vt == VT_BSTR) { const bstr_t& process_owner = user.bstrVal; if (process_owner.length() && process_owner == _username) { //std::cout << "user Insrt: " << process_id << " <_> " << process_cpu_load << '\n'; //Print(std::wcout, var_name); user_proc_set.insert(process_id); cpu_load_user += (float)process_cpu_load; } } else { // Get process name { result = object->Get(L"Name", 0, &var_name, NULL, NULL); //std::cout << "Name: " << wtoa(var_name.bstrVal) << std::endl; } if (bstr_t(var_name.bstrVal) != bstr_t("_Total")) { //std::cout << "OTHER test: " << process_cpu_load << std::endl; //std::cout << "system Insrt:" << process_id << " <_> " << process_cpu_load << '\n'; //Print(std::wcout, var_name); system_proc_set.insert(process_id); cpu_load_sys += (float)process_cpu_load; } } //pOutParams->Release(); } object->Release(); } // for(;;) VariantClear(&var); VariantClear(&var_name); VariantClear(&user); // Normalize value float total_cpu_load = cpu_load_comp + cpu_load_user + cpu_load_sys; if (total_cpu_load > 100) { cpu_load_comp = (cpu_load_comp / total_cpu_load) * 100; cpu_load_user = (cpu_load_user / total_cpu_load) * 100; cpu_load_sys = (cpu_load_sys / total_cpu_load) * 100; } //std::cout << "cpu_load_comp f: " << cpu_load_comp << std::endl; //std::cout << "cpu_load_user f: " << cpu_load_user << std::endl; //std::cout << "cpu_load_sys f: " << cpu_load_sys << std::endl; if (enumerator) enumerator->Release(); return 0; }
void CHardwareMonitor::RunWMIQuery(const char* qTable, const std::string &qType) { if ((m_pServicesOHM == NULL) || (m_pServicesSystem == NULL)) return; HRESULT hr; int dindex = 0; std::string query = "SELECT * FROM "; query.append(qTable); query.append(" WHERE SensorType = '"); query.append(qType); query.append("'"); IEnumWbemClassObject* pEnumerator = NULL; hr = m_pServicesOHM->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; hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); if (SUCCEEDED(hr)) { std::string itemName = _bstr_t(vtProp.bstrVal); stdreplace(itemName, "#", ""); VariantClear(&vtProp); hr = pclsObj->Get(L"Value", 0, &vtProp, 0, 0); if (SUCCEEDED(hr)) { float fItemValue = float(vtProp.fltVal); std::ostringstream itemValue; if ((qType == "Load") || (qType == "Temperature")) { itemValue.precision(3); } itemValue << fItemValue; VariantClear(&vtProp); //hr = pclsObj->Get(L"InstanceId", 0, &vtProp, 0, 0); hr = pclsObj->Get(L"Identifier", 0, &vtProp, 0, 0); // instance id seems to drift if (SUCCEEDED(hr)) { std::string itemId = _bstr_t(vtProp.bstrVal); if (itemId.find("/hdd") != std::string::npos) { itemName = itemId + " " + itemName; } //itemId = "WMI"+itemId; //_log.Log(LOG_NORM, "Hardware Monitor: %s, %s, %s",itemId.c_str(), itemName.c_str(),itemValue.str().c_str()); UpdateSystemSensor(qType, dindex, itemName, itemValue.str()); VariantClear(&vtProp); dindex++; } } } pclsObj->Release(); } pEnumerator->Release(); } }
int wmi_get_battery_info() { std::cout << "wmi_get_battery_info" << std::endl; //assert(_initialized); //assert(pcpu_load_comp); //assert(pcpu_load_user); //assert(pcpu_load_sys); //float& cpu_load_comp = *pcpu_load_comp; //float& cpu_load_user = *pcpu_load_user; //float& cpu_load_sys = *pcpu_load_sys; IEnumWbemClassObject* enumerator = 0; IWbemClassObject* object = 0; //cpu_load_comp = 0; //cpu_load_user = 0; bool user_logged = false; long long current_process_id = _current_process_id; enumerator = request( // uint16, uint32, uint16, uint32... bstr_t("SELECT" " Availability, BatteryRechargeTime, BatteryStatus," "Caption, DesignCapacity, DesignVoltage, FullChargeCapacity" " FROM Win32_Battery") ); ULONG uReturn; for(;;) { HRESULT result = enumerator->Next(WBEM_INFINITE, 1, &object, &uReturn); if(0 == uReturn) { break; } VARIANT var; VariantInit(&var); result = object->Get(L"Voltage", 0, &var, NULL, NULL ); if (SUCCEEDED(result)) { Print(std::wcout, var); //unsigned short v = var.uiVal; //std::cout << "Availability: " << v << std::endl; } VariantInit(&var); result = object->Get(L"DischargeRate", 0, &var, NULL, NULL ); if (SUCCEEDED(result)) { Print(std::wcout, var); //unsigned int v = var.uiVal; //std::cout << "BatteryRechargeTime: " << v << std::endl; } VariantInit(&var); result = object->Get(L"Caption", 0, &var, NULL, NULL ); if (SUCCEEDED(result)) { Print(std::wcout, var); //unsigned int v = var.uiVal; //std::cout << "BatteryRechargeTime: " << v << std::endl; } VariantInit(&var); result = object->Get(L"DesignCapacity", 0, &var, NULL, NULL ); if (SUCCEEDED(result)) { Print(std::wcout, var); //unsigned int v = var.uiVal; //std::cout << "DesignCapacity: " << v << std::endl; } VariantInit(&var); result = object->Get(L"DesignVoltage", 0, &var, NULL, NULL ); if (SUCCEEDED(result)) { Print(std::wcout, var); //unsigned long long v = var.ullVal; //std::cout << "DesignVoltage: " << v << std::endl; } VariantInit(&var); result = object->Get(L"FullChargeCapacity", 0, &var, NULL, NULL ); if (SUCCEEDED(result)) { Print(std::wcout, var); //unsigned int v = var.uiVal; //std::cout << "FullChargeCapacity: " << v << std::endl; } object->Release(); } // for(;;) if (enumerator) enumerator->Release(); return 0; }