Changeset b749b8d in nscp for modules/CheckWMI/WMIQuery.cpp


Ignore:
Timestamp:
11/04/07 17:35:28 (6 years ago)
Author:
Michael Medin <michael@…>
Branches:
master, 0.4.0, 0.4.1, 0.4.2, stable
Children:
22d2739
Parents:
12edcec
Message:

2007-11-04 MickeM

  • Rewritten WMI handling as well as checks so things should be more usefull now (cf. the wiki page for details)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • modules/CheckWMI/WMIQuery.cpp

    rdc65e35 rb749b8d  
    3939bool WMIQuery::initialize() 
    4040{ 
    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)); 
    4546    return false; 
    4647  } 
     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"); 
    4756  return true; 
    4857} 
     
    5463 
    5564 
    56 std::map<std::string,int> WMIQuery::execute(std::string query) 
     65WMIQuery::result_type WMIQuery::execute(std::string query) 
    5766{ 
    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 
    6078  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); 
    7383  } 
    7484  CComBSTR strQuery(query.c_str()); 
    7585  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); 
    9991  } 
    10092 
     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        } 
    101105 
    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(); 
    109142  } 
    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(); 
    141143  return ret; 
    142144} 
Note: See TracChangeset for help on using the changeset viewer.