Changeset b749b8d in nscp for modules/CheckWMI/WMIQuery.cpp
- Timestamp:
- 11/04/07 17:35:28 (6 years ago)
- Branches:
- master, 0.4.0, 0.4.1, 0.4.2, stable
- Children:
- 22d2739
- Parents:
- 12edcec
- File:
-
- 1 edited
-
modules/CheckWMI/WMIQuery.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
modules/CheckWMI/WMIQuery.cpp
rdc65e35 rb749b8d 39 39 bool WMIQuery::initialize() 40 40 { 41 if (CoInitialize(NULL) != S_OK) 42 return false; 43 bInitialized = true; 44 if(CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_PKT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,0,0) != S_OK) { 41 NSC_LOG_ERROR_STD("Attempting Inialized WMI component"); 42 43 HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED); 44 if (FAILED(hRes)) { 45 NSC_LOG_ERROR_STD("CoInitialize failed: " + error::format::from_system(hRes)); 45 46 return false; 46 47 } 48 bInitialized = true; 49 hRes = CoInitializeSecurity(NULL,-1,NULL,NULL,RPC_C_AUTHN_LEVEL_PKT,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE,NULL); 50 if (FAILED(hRes)) { 51 NSC_LOG_ERROR_STD("CoInitializeSecurity failed: " + error::format::from_system(hRes)); 52 return false; 53 } 54 55 NSC_LOG_ERROR_STD("Inialized WMI component"); 47 56 return true; 48 57 } … … 54 63 55 64 56 std::map<std::string,int>WMIQuery::execute(std::string query)65 WMIQuery::result_type WMIQuery::execute(std::string query) 57 66 { 58 std::map<std::string,int> ret; 59 IWbemLocator * pIWbemLocator = NULL; 67 if (!bInitialized) { 68 initialize(); 69 } 70 result_type ret; 71 72 CComPtr< IWbemLocator > locator; 73 HRESULT hr = CoCreateInstance( CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast< void** >( &locator ) ); 74 if (FAILED(hr)) { 75 throw WMIException("CoCreateInstance for CLSID_WbemAdministrativeLocator failed!", hr); 76 } 77 60 78 BSTR bstrNamespace = (L"root\\cimv2"); 61 //BSTR bstrNamespace = (L"root\\default"); 62 HRESULT hRes = CoCreateInstance(CLSID_WbemAdministrativeLocator,NULL,CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, 63 IID_IUnknown,(void**)&pIWbemLocator); 64 if (FAILED(hRes)) { 65 throw WMIException("CoCreateInstance for CLSID_WbemAdministrativeLocator failed!", hRes); 66 } 67 IWbemServices * pWbemServices = NULL; 68 hRes = pIWbemLocator->ConnectServer(bstrNamespace,NULL,NULL,NULL,0,NULL,NULL,&pWbemServices); 69 if (FAILED(hRes)) { 70 pIWbemLocator->Release(); 71 pIWbemLocator = NULL; 72 throw WMIException("ConnectServer failed!", hRes); 79 CComPtr< IWbemServices > service; 80 hr = locator->ConnectServer( bstrNamespace, NULL, NULL, NULL, WBEM_FLAG_CONNECT_USE_MAX_WAIT, NULL, NULL, &service ); 81 if (FAILED(hr)) { 82 throw WMIException("ConnectServer failed!", hr); 73 83 } 74 84 CComBSTR strQuery(query.c_str()); 75 85 BSTR strQL = (L"WQL"); 76 IEnumWbemClassObject * pEnumObject = NULL; 77 hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject); 78 if (FAILED(hRes)) { 79 pWbemServices->Release(); 80 pIWbemLocator->Release(); 81 pIWbemLocator = NULL; 82 throw WMIException("ExecQuery failed:" + query, hRes); 83 } 84 hRes = pEnumObject->Reset(); 85 if (FAILED(hRes)) { 86 pWbemServices->Release(); 87 pIWbemLocator->Release(); 88 pIWbemLocator = NULL; 89 throw WMIException("ExecQuery failed:" + query, hRes); 90 } 91 ULONG uCount = 1, uReturned; 92 IWbemClassObject * pClassObject = NULL; 93 hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned); 94 if (FAILED(hRes)) { 95 pWbemServices->Release(); 96 pIWbemLocator->Release(); 97 pIWbemLocator = NULL; 98 throw WMIException("ExecQuery failed!" + query, hRes); 86 87 CComPtr< IEnumWbemClassObject > enumerator; 88 hr = service->ExecQuery( strQL, strQuery, WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator ); 89 if (FAILED(hr)) { 90 throw WMIException("ExecQuery failed:" + query + " (reason is: " + ComError::getComError() + ")", hr); 99 91 } 100 92 93 CComPtr< IWbemClassObject > row = NULL; 94 ULONG retcnt; 95 int i=0; 96 while (hr = enumerator->Next( WBEM_INFINITE, 1L, &row, &retcnt ) == WBEM_S_NO_ERROR) { 97 if (SUCCEEDED(hr)) { 98 if (retcnt > 0) { 99 SAFEARRAY* pstrNames; 100 wmi_row returnRow; 101 hr = row->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_FLAG_NONSYSTEM_ONLY,NULL,&pstrNames); 102 if (FAILED(hr)) { 103 throw WMIException("GetNames failed:" + query, hr); 104 } 101 105 102 SAFEARRAY* pstrNames; 103 hRes = pClassObject->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_FLAG_NONSYSTEM_ONLY,NULL,&pstrNames); 104 if (FAILED(hRes)) { 105 pClassObject->Release(); 106 pWbemServices->Release(); 107 pIWbemLocator->Release(); 108 throw WMIException("GetNames failed!" + query, hRes); 106 long index = 0, begin, end; 107 CComSafeArray<BSTR> arr = pstrNames; 108 begin = arr.GetLowerBound(); 109 end = arr.GetUpperBound(); 110 for ( index = begin; index <= end; index++ ) { 111 USES_CONVERSION; 112 CComBSTR bColumn = arr.GetAt(index); 113 std::string column = OLE2T(bColumn); 114 CComVariant vValue; 115 hr = row->Get(bColumn, 0, &vValue, 0, 0); 116 if (FAILED(hr)) { 117 throw WMIException("Failed to get value for " + column + " in query: " + query, hr); 118 } 119 WMIResult value; 120 121 if (vValue.vt == VT_INT) { 122 value.setNumeric(column, vValue.intVal); 123 } else if (vValue.vt == VT_I4) { 124 value.setNumeric(column, vValue.lVal); 125 } else if (vValue.vt == VT_UINT) { 126 value.setNumeric(column, vValue.uintVal); 127 } else if (vValue.vt == VT_BSTR) { 128 value.setString(column, OLE2T(vValue.bstrVal)); 129 } else if (vValue.vt == VT_NULL) { 130 value.setString(column, "NULL"); 131 } else if (vValue.vt == VT_BOOL) { 132 value.setBoth(column, vValue.iVal, vValue.iVal?"TRUE":"FALSE"); 133 } else { 134 NSC_LOG_ERROR_STD(column + " is not supported (type-id: " + strEx::itos(vValue.vt) + ")"); 135 } 136 returnRow.addValue(column, value); 137 } 138 ret.push_back(returnRow); 139 } 140 } 141 row.Release(); 109 142 } 110 CComSafeArray<BSTR> arr = pstrNames;111 long index = 0, begin, end;112 begin = arr.GetLowerBound();113 end = arr.GetUpperBound();114 for ( index = begin; index <= end; index++ ) {115 BSTR bStr = arr.GetAt(index);116 CString str = bStr;117 std::string std_str = str;118 CComVariant vValue;119 hRes = pClassObject->Get(bStr, 0, &vValue, 0, 0);120 if (vValue.vt == VT_INT) {121 ret[std_str] = vValue.intVal;122 //std::cout << (LPCTSTR)str << " = (INT) " << vValue.intVal << std::endl;123 } else if (vValue.vt == VT_I4) {124 ret[std_str] = vValue.lVal;125 //std::cout << (LPCTSTR)str << " = (I4) " << vValue.lVal << std::endl;126 } else if (vValue.vt == VT_UINT) {127 ret[std_str] = vValue.uintVal;128 //std::cout << (LPCTSTR)str << " = (UINT) " << vValue.uintVal << std::endl;129 } else if (vValue.vt == VT_BSTR) {130 std::cout << (LPCTSTR)str << " = UNSUPPORTED (BSTR)" << std::endl;131 CString val = vValue;132 //ret[std_str] = std::string(val);133 } else {134 std::cout << (LPCTSTR)str << " = UNSUPPORTED" << vValue.vt << std::endl;135 }136 }137 pIWbemLocator->Release();138 pWbemServices->Release();139 pEnumObject->Release();140 pClassObject->Release();141 143 return ret; 142 144 }
Note: See TracChangeset
for help on using the changeset viewer.








