// Copyright (c) Microsoft. All rights reserved. // // This is unpublished source code of Microsoft. // The copyright notice above does not evidence any // actual or intended publication of such source code. // OneLiner : Implementation of MWmiInstance // DevUnit : wlbstest // Author : Murtaza Hakim // include files #include "MWmiInstance.h" #include "MTrace.h" #include "MWmiError.h" #include "WTokens.h" #include using namespace std; // default constructor is purposely left undefined. No one should use it. // constructor // MWmiInstance::MWmiInstance( const _bstr_t& objectName, const _bstr_t& path, IWbemLocatorPtr pwl, IWbemServicesPtr pws ) : _objectName( objectName ), _path( path ), _pwl( pwl ), _pws( pws ) { TRACE(MTrace::INFO, L"mwmiinstance constructor\n" ); } // copy constructor // MWmiInstance::MWmiInstance( const MWmiInstance& obj) : _path( obj._path ), _pwl( obj._pwl ), _pws( obj._pws ), _objectName( obj._objectName ) { TRACE(MTrace::INFO, L"mwmiinstance copy constructor\n" ); } // assignment operator // MWmiInstance& MWmiInstance::operator=( const MWmiInstance& rhs ) { _path = rhs._path; _pwl = rhs._pwl; _pws = rhs._pws; _objectName = rhs._objectName; TRACE(MTrace::INFO, L"mwmiinstance assignment operator\n" ); return *this; } // destructor MWmiInstance::~MWmiInstance() { TRACE(MTrace::INFO, L"mwmiinstance destructor\n" ); } // runMethod MWmiInstance::MWmiInstance_Error MWmiInstance::runMethod( const _bstr_t& methodToRun, const vector& inputParameters, vector& outputParameters ) { HRESULT hr; _variant_t v_retVal; IWbemClassObjectPtr pwcoClass; IWbemClassObjectPtr pwcoOutput; IWbemClassObjectPtr pwcoInput; IWbemClassObjectPtr pwcoInputInstance; hr = _pws->GetObject( _objectName, 0, NULL, &pwcoClass, NULL ); if( FAILED(hr) ) { TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::GetObject failure\n"); throw _com_error( hr ); } // check if any input parameters specified. if( inputParameters.size() != 0 ) { hr = pwcoClass->GetMethod( methodToRun, 0, &pwcoInput, NULL ); if( FAILED( hr) ) { TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::GetMethod failure\n"); throw _com_error( hr ); } hr = pwcoInput->SpawnInstance( 0, &pwcoInputInstance ); if( FAILED( hr) ) { TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::SpawnInstance failure. Unable to spawn instance.\n" ); throw _com_error( hr ); } for( int i = 0; i < inputParameters.size(); ++i ) { hr = pwcoInputInstance->Put( inputParameters[i]->getName(), 0, &(inputParameters[i]->getValue() ), 0 ); if( FAILED( hr ) ) { TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::Put failure\n"); throw _com_error( hr ); } } } // execute method. hr = _pws->ExecMethod( _path, methodToRun, 0, NULL, pwcoInputInstance, &pwcoOutput, NULL); if( FAILED( hr) ) { TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::ExecMethod failure\n"); throw _com_error( hr ); } // get output parameters for( int i = 0; i < outputParameters.size(); ++i ) { hr = pwcoOutput->Get( outputParameters[i]->getName(), 0, &v_retVal, NULL, NULL ); if( FAILED( hr) ) { TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::Get failure\n"); throw _com_error( hr ); } outputParameters[i]->setValue( v_retVal ); v_retVal.Clear(); } return MWmiInstance_SUCCESS; } // getParameters // MWmiInstance::MWmiInstance_Error MWmiInstance::getParameters( vector& parametersToGet ) { HRESULT hr; IEnumWbemClassObjectPtr pewco; IWbemClassObjectPtr pwco; unsigned long count; _variant_t v_path; bool found; CIMTYPE vtype; _variant_t v_value; // get object corresponding to this path. hr = _pws->GetObject( _path, WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &pwco, NULL ); if( hr == 0x8004100c || hr == 0x8004100a ) { TRACE(MTrace::INFO, L"as this is not supported, trying different mechanism\n"); hr = _pws->CreateInstanceEnum( _objectName, WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pewco ); if ( FAILED(hr)) { TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::CreateInstanceEnum failure\n"); throw _com_error( hr ); } // there may be multiple instances. count = 1; while ( (hr = pewco->Next( INFINITE, 1, &pwco, &count ) ) == S_OK ) { hr = pwco->Get( _bstr_t(L"__RELPATH"), 0, &v_path, NULL, NULL ); if( FAILED(hr) ) { TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::CreateInstanceEnum failure\n"); throw _com_error( hr ); } if( _bstr_t( v_path ) == _path ) { // required instance found found = true; v_path.Clear(); break; } count = 1; v_path.Clear(); } if( found == false ) { TRACE( MTrace::SEVERE_ERROR, "unable to find instance with path specified\n"); throw _com_error( WBEM_E_NOT_FOUND ); } } else if ( FAILED(hr) ) { TRACE( MTrace::SEVERE_ERROR, L"IWbemServices::GetObject failure\n"); throw _com_error( hr ); } for( int i = 0; i < parametersToGet.size(); ++i ) { hr = pwco->Get( parametersToGet[i]->getName(), 0, &v_value, &vtype, NULL ); if( FAILED( hr ) ) { TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::Get failure\n"); throw _com_error(hr); } parametersToGet[i]->setValue( v_value ); v_value.Clear(); } return MWmiInstance_SUCCESS; } // setParameters // MWmiInstance::MWmiInstance_Error MWmiInstance::setParameters( const vector& parametersToSet ) { HRESULT hr; IWbemClassObjectPtr pwco = NULL; _variant_t v_value; // get object corresponding to this path. hr = _pws->GetObject( _path, WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &pwco, NULL ); if( FAILED( hr ) ) { TRACE( MTrace::SEVERE_ERROR, "IWbemServices::GetObject failure\n"); throw _com_error( hr ); } for( int i = 0; i < parametersToSet.size(); ++i ) { v_value = parametersToSet[i]->getValue(); hr = pwco->Put( parametersToSet[i]->getName(), 0, &v_value, NULL ); if( FAILED( hr ) ) { TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::Get failure\n"); throw _com_error( hr ); } v_value.Clear(); } hr = _pws->PutInstance( pwco, WBEM_FLAG_UPDATE_ONLY, NULL, NULL ); if( FAILED(hr) ) { TRACE( MTrace::SEVERE_ERROR, "IWbemServices::PutInstance failure\n"); throw _com_error( hr ); } return MWmiInstance_SUCCESS; }