home *** CD-ROM | disk | FTP | other *** search
- ////////////////////////////////////////////////////////////////////////////////////////////
- // SshWbemHelpers.h //
- // //
- // The follwing classes are defined: //
- // //
- // CWbemServices - threadsafe wrapper class for IWbemServices //
- // CWbemClassObject - wrapper class for IWbemClassObject //
- // CWbemException - wrapper for IErrorInfo, assists with WBEM error reporting //
- // //
- // These classes provide a convenient way to use the three most common WBEM interfaces: //
- // IWbemLocator, IWbemServices, and IWbemClassObject. The also make it easy to //
- // the WBEM __ExtendedStatus error object and interpret the HRESULT. The use of these //
- // classes along with the smart pointers and the COM helper classes _bstr_t and //
- // _variant_t can greatly reduce the chances of memory leaks in your code. //
- // //
- // See T_SafeVector.h for help with safe arrays and arrays of embedded objects. //
- // //
- // Copyright (c)1997-99 Microsoft Corporation, All Rights Reserved //
- ////////////////////////////////////////////////////////////////////////////////////////////
-
-
- #if !defined(__SdkWbemHelpers_H)
- #pragma option push -b -a8 -pc -A- /*P_O_Push*/
- #define __SdkWbemHelpers_H
- #pragma once
-
- #pragma warning( disable : 4290) // C++ Exception Specification Ignored
-
- #include <wbemidl.h>
-
-
- class CWbemClassObject;
- class CWbemServices;
-
- //---------------------------------------------------------------------------------------
- //
- // Smart pointers for the WBEM interfaces. The _COM_SMARTPTR_TYPEDEF creates smart pointer types
- // named XXXPtr where XXX is the interface pointer, these types are actually classes derived from
- // the COM helper class _com_ptr_t. Use these types just as you would the interface pointer, only
- // AddRef and Release are called for you at the appropriate times.
- //
-
- _COM_SMARTPTR_TYPEDEF(IUnsecuredApartment, IID_IUnsecuredApartment); // IUnsecuredApartmentPtr
- _COM_SMARTPTR_TYPEDEF(IWbemObjectSink, IID_IWbemObjectSink); // IWbemObjectSinkPtr
- _COM_SMARTPTR_TYPEDEF(IWbemClassObject, IID_IWbemClassObject); // IWbemClassObjectPtr
- _COM_SMARTPTR_TYPEDEF(IWbemServices, IID_IWbemServices); // IWbemServicesPtr
- _COM_SMARTPTR_TYPEDEF(IWbemContext, IID_IWbemContext ); // IWbemContextPtr
- _COM_SMARTPTR_TYPEDEF(IWbemCallResult, IID_IWbemCallResult); // IWbemCallResultPtr
- _COM_SMARTPTR_TYPEDEF(IWbemQualifierSet, IID_IWbemQualifierSet); // IWbemQualifierSetPtr
- _COM_SMARTPTR_TYPEDEF(IWbemLocator, IID_IWbemLocator); // IWbemLocatorPtr
- _COM_SMARTPTR_TYPEDEF(IWbemObjectAccess, IID_IWbemObjectAccess); // IWbemObjectAccessPtr
- _COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, IID_IEnumWbemClassObject); // IEnumWbemClassObjectPtr
-
-
- //---------------------------------------------------------------------------------------
- // CWbemException
- //
- // This class assists with WBEM error handling and the WBEM __ExtendedStatus error object
- //
- // Create an instance of this class immediately after a WBEM call failure, and pass
- // in to the constructor the HRESULT from the failed COM call and a descriptive message.
- //
- // Call the GetWbemError() method to retrieve the __ExtendedStatus object.
- //
- // This object inherits from _com_error, see _com_error documentation for information on
- // how to access the encapsulated IErrorInfo interface.
- //
-
- class CWbemException : public _com_error
- {
- private:
- CWbemClassObject * m_pWbemError;
- HRESULT m_hr;
- _bstr_t m_sDescription;
-
- static IErrorInfo * GetErrorObject();
- static IErrorInfo * MakeErrorObject(_bstr_t);
- void GetWbemStatusObject();
-
- public:
- // use this constructor to capture the WBEM error object
- // pass in the HRESULT from the failed COM call and a descriptive message
- CWbemException(HRESULT hr,_bstr_t sMessage);
-
- // use this constructor to create a generic error, does not return WBEM error
- CWbemException(_bstr_t sMessage);
-
- // returns the WBEM __ExtendedStatus object if one exists
- CWbemClassObject GetWbemError();
-
- // returns the description passed to the constructor
- _bstr_t GetDescription() { return m_sDescription; }
-
- // returns the HRESULT passed to the constructor, WBEM_E_FAILED if none passed
- HRESULT GetErrorCode() { return m_hr; }
-
- // returns the string representation of the error code for the supplied HRESULT
- static _bstr_t GetWbemErrorText(HRESULT hr);
- };
-
-
-
-
-
- //-----------------------------------------------------------------------------------
- // CWbemClassObject
- //
- // This class encapsulates a WBEM object, it transparently handles AddRef and Release.
- // It also provides access to the objects methods.
- //
- // Assigning an instance of this object or passing it by value does not copy the
- // object, only the pointer. Use Clone to make a new object. Use one of the casting
- // operators to extract the underlying pointer.
- //
- // See IWbemClassObject for more information on the WBEM methods.
- //
-
- class CWbemClassObject
- {
- private:
- IWbemClassObjectPtr m_pWbemObject;
-
- // global object count for WBEM objects encapsulated by this class
- // helpful for debugging
- static DWORD s_dwObjectCount;
-
- public:
-
- // these constructors will addref the pointer
- CWbemClassObject(const CWbemClassObject& _in);
- CWbemClassObject(IWbemClassObject * const _in);
- CWbemClassObject(IWbemClassObjectPtr& _in);
- CWbemClassObject(IUnknown * _in);
- CWbemClassObject(IUnknownPtr& _in);
-
- CWbemClassObject();
- ~CWbemClassObject();
-
- void Attach(IWbemClassObject * pWbemObject)
- {
- m_pWbemObject.Attach(pWbemObject);
- }
-
- void Attach(IWbemClassObject * pWbemObject,bool bAddRef)
- {
- m_pWbemObject.Attach(pWbemObject,bAddRef);
- }
-
- // this operator allows you to use the object as a pointer to
- // call other IWbemClassObject methods without casting
- IWbemClassObject * operator->()
- {
- return m_pWbemObject;
- }
-
- unsigned long GetObjectSize();
-
- // Retrives the MOF description
- _bstr_t GetObjectText()
- {
- _bstr_t bRet;
-
- BSTR bstr;
-
- if( !FAILED(m_pWbemObject->GetObjectText(0,&bstr)) )
- {
- bRet = _bstr_t(bstr,false);
- }
-
- return bRet;
- }
-
- IWbemClassObject * Detach()
- {
- return m_pWbemObject.Detach();
- }
-
- // various casting operators
-
- operator IWbemClassObject*()
- {
- return m_pWbemObject;
- }
-
- operator IWbemClassObject**()
- {
- return &m_pWbemObject;
- }
-
- operator IWbemClassObjectPtr()
- {
- return m_pWbemObject;
- }
-
-
- operator IUnknown *()
- {
- return (IUnknown *)(IWbemClassObject *)m_pWbemObject;
- }
-
-
- // address of operator
- IWbemClassObject ** operator &()
- {
- return &m_pWbemObject;
- }
-
- // these operators allow you to check if the underlying pointer is NULL in an if statement
- // just like a regular pointer
- bool operator !()
- {
- return m_pWbemObject == NULL;
- }
-
- operator bool()
- {
- return m_pWbemObject != NULL;
- }
-
- bool IsNull() const
- {
- return m_pWbemObject == NULL;
- }
-
-
- // AddRef and Release
- ULONG AddRef()
- {
- return m_pWbemObject->AddRef();
- }
-
- ULONG Release()
- {
- return m_pWbemObject->Release();
- }
-
- // assignment operators
- IWbemClassObject* operator=(IWbemClassObject* _p)
- {
- m_pWbemObject = _p;
- return m_pWbemObject;
- }
-
- IWbemClassObjectPtr operator=(IWbemClassObjectPtr& _p)
- {
- m_pWbemObject = _p;
- return m_pWbemObject;
- }
-
-
- IWbemClassObject* operator=(IUnknown * _p)
- {
- m_pWbemObject = _p;
- return m_pWbemObject;
- }
-
- IWbemClassObjectPtr operator=(IUnknownPtr& _p)
- {
- m_pWbemObject = _p;
- return m_pWbemObject;
- }
-
-
- IWbemClassObject* operator=(const CWbemClassObject& _p)
- {
- m_pWbemObject = _p.m_pWbemObject;
- return m_pWbemObject;
- }
-
- // make a copy of the object
- HRESULT Clone(CWbemClassObject& _newObject)
- {
- return m_pWbemObject->Clone(_newObject);
- }
-
- // spawn a new blank instance of the object
- CWbemClassObject SpawnInstance()
- {
- CWbemClassObject coRet;
-
- m_pWbemObject->SpawnInstance(0,coRet);
-
- return coRet;
- }
-
- // get a method signatures for a class
- HRESULT GetMethod(const IN _bstr_t& _name, CWbemClassObject& coInSignature,
- CWbemClassObject& coOutSignature, long _lFlags = 0)
- {
- return m_pWbemObject->GetMethod(_name, _lFlags, coInSignature, coOutSignature);
- }
-
- // this operator is defined so that the object can be stored in ordered lists
- // or other structures
- bool operator<(const CWbemClassObject& _comp)
- {
- return m_pWbemObject < _comp.m_pWbemObject;
- }
-
- /***** Get and Put property access methods */
-
- //*** put overloads ***
- HRESULT Put(const _bstr_t& _Name,_variant_t _value,CIMTYPE vType = 0)
- {
- return m_pWbemObject->Put(_Name,0,&_value,vType);
- }
-
- HRESULT Put(const _bstr_t& _Name,const _bstr_t& _value,CIMTYPE vType = 0)
- {
- return m_pWbemObject->Put(_Name,0,&_variant_t(_value),vType);
- }
-
- HRESULT Put(const _bstr_t& _Name, const long _value, CIMTYPE vType = 0)
- {
- return m_pWbemObject->Put(_Name,0,&_variant_t(_value), vType);
- }
-
- HRESULT Put(const _bstr_t& _Name, const bool _value,CIMTYPE vType = 0)
- {
- return m_pWbemObject->Put(_Name,0,&_variant_t(_value),vType);
- }
-
- //*** get overloads ***
- HRESULT Get(const _bstr_t& _Name, _bstr_t& _value)
- {
- _variant_t v1;
- HRESULT hr = m_pWbemObject->Get (_Name, 0, &v1, NULL, NULL);
- _value = v1;
- return hr;
- }
-
- HRESULT Get(const _bstr_t& _Name, long& _value)
- {
- _variant_t v1;
- HRESULT hr = m_pWbemObject->Get (_Name, 0, &v1, NULL, NULL);
- _value = v1;
- return hr;
-
- }
-
- HRESULT Get(const _bstr_t& _Name, bool& _value)
- {
- _variant_t v1;
- HRESULT hr = m_pWbemObject->Get (_Name, 0, &v1, NULL, NULL);
- _value = v1;
- return hr;
- }
-
- HRESULT Get(const _bstr_t& _Name,_variant_t& _value)
- {
- _value.Clear();
- return m_pWbemObject->Get (_Name, 0, &_value, NULL, NULL);
- }
-
-
- _variant_t Get(const _bstr_t& _Name,CIMTYPE& vType,long& lFlavor)
- {
- _variant_t vRet;
-
- m_pWbemObject->Get (_Name, 0, &vRet, &vType, &lFlavor);
-
- return vRet;
- }
-
-
- _bstr_t GetString (const _bstr_t& _Name);
- _int64 GetI64 (const _bstr_t& _Name);
- long GetLong (const _bstr_t& _Name);
- bool GetBool (const _bstr_t& _Name);
- _bstr_t GetCIMTYPE (const _bstr_t& _Name);
-
- // retrieves a WBEM object embedded in a property
- CWbemClassObject GetEmbeddedObject(const _bstr_t& _Name);
-
-
- // use these for property enumeration
- HRESULT BeginEnumeration(long _lFlags = WBEM_FLAG_LOCAL_ONLY)
- {
- return m_pWbemObject->BeginEnumeration(_lFlags);
- }
-
-
- HRESULT Next(_bstr_t& _sName,_variant_t& _value)
- {
- HRESULT hr;
- BSTR bstr = NULL;
-
- hr = m_pWbemObject->Next(0,&bstr,&_value,NULL,NULL);
-
- if(hr == S_OK)
- {
- _sName = _bstr_t(bstr,false);
- }
-
- return hr;
- }
-
- HRESULT Next(_bstr_t& _sName,_variant_t& _value,CIMTYPE& _vartype)
- {
- HRESULT hr;
- BSTR bstr = NULL;
-
- _value.Clear();
- hr = m_pWbemObject->Next(0,&bstr,&_value,&_vartype,NULL);
-
- if(hr == S_OK)
- {
- _sName = _bstr_t(bstr,false);
- }
-
- return hr;
- }
-
- HRESULT Next(_bstr_t& _sName,_variant_t& _value,CIMTYPE& _vartype,long& _flavor)
- {
- HRESULT hr;
- BSTR bstr = NULL;
-
- _value.Clear();
- hr = m_pWbemObject->Next(0,&bstr,&_value,&_vartype,&_flavor);
-
- if(hr == S_OK)
- {
- _sName = _bstr_t(bstr,false);
- }
-
- return hr;
- }
-
- HRESULT EndEnumeration()
- {
- return m_pWbemObject->EndEnumeration();
- }
-
- };
-
-
- // these operators are needed for storage in some data structures
- __inline bool operator<(const CWbemClassObject& _X, const CWbemClassObject& _Y)
- {
- return _X < _Y;
- }
-
- __inline bool operator==(const CWbemClassObject& _X, const CWbemClassObject& _Y)
- {
- return _X == _Y;
- }
-
-
-
- //-----------------------------------------------------------------------------
- // CWbemServices
- //
- // Provides thread safe encapsulation of the IWbemServices interface and provides
- // access to it's methods. See the IWbemServices documentation for information
- // about the methods.
- //
- // This clas also encapsulates IWbemLocator::ConnectServer(). When using this call,
- // provide the address of a NULL IWbemServices pointer to act as a cache. This class
- // actually stores the interface pointer in an IStream. A real interface needs
- // to be kept somewhere or DCOM will garbage collect the object. When the instance
- // of this class is deleted, the cached pointer still needs to be released. Use a
- // smart pointer (IWbemServicesPtr) and keep it in the same scope as the
- // CWbemServices instance.
- //
-
- class CWbemServices
- {
- private:
- IWbemContextPtr m_pCtx;
- IStream * m_pServicesStream; // encapsulated IWbemServices pointer
- IUnknownPtr m_pUnkCache;
- CRITICAL_SECTION m_cs;
-
- bool GetInterfacePtr(IWbemServicesPtr & pServices,bool bThrowException = true);
- void CommonInit(IWbemServicesPtr& pServ);
-
- public:
- // constructors will AddRef the pointer
- CWbemServices(IWbemContext * _pContext = NULL);
- CWbemServices(const CWbemServices& _p);
- CWbemServices(const IWbemServicesPtr& _in);
- CWbemServices(const IUnknownPtr& _in);
- CWbemServices(IUnknown * _in);
- CWbemServices(IWbemServices *_in,IWbemContext * _pContext = NULL);
- ~CWbemServices();
-
- CWbemServices& operator=(IUnknown * _p);
- CWbemServices& operator=(IUnknownPtr& _p);
- CWbemServices& operator=(IWbemServices *_p);
- CWbemServices& operator=(const CWbemServices& _p);
-
- // when logging in, capture the IWbemServices pointer and keep it somewhere
- // this pointer is stored internaly in an IStream and DCOM will garbage collect the object if
- // there isn't at least one reference to it
-
- // Login with integrated security
- void ConnectServer(_bstr_t sNetworkResource, IWbemServices **_WbemServicesCache) throw(CWbemException);
-
- // Login as a specific user
- void ConnectServer
- (
- _bstr_t sNetworkResource,
- _bstr_t sUser,
- _bstr_t sPassword,
- IWbemServices **_WbemServicesCache,
- long lSecurityFlags = 0
- ) throw(CWbemException);
-
-
- // create an instance a of a class given the class name
- // encapsulates GetObject and SpawnInstance
- CWbemClassObject CreateInstance
- (
- _bstr_t _sClassName,
- IWbemCallResultPtr& _cr
- )
- {
- CWbemClassObject coClassDef = GetObject(_sClassName,_cr);
- CWbemClassObject coRet;
-
- if(!coClassDef.IsNull())
- {
- coRet = coClassDef.SpawnInstance();
- }
-
- return coRet;
- }
-
- CWbemClassObject CreateInstance(_bstr_t _sClassName)
- {
- IWbemCallResultPtr crUnused;
- return CreateInstance(_sClassName,crUnused);
- }
-
- HRESULT DeleteInstance
- (
- _bstr_t _sClass,
- IWbemCallResultPtr& _cr
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->DeleteInstance(_sClass, 0, m_pCtx, &_cr);
- return hr;
- }
-
- HRESULT DeleteInstance(_bstr_t _sClass)
- {
- IWbemCallResultPtr crUnused;
- return DeleteInstance(_sClass, crUnused);
- }
-
- CWbemClassObject GetObject
- (
- _bstr_t _sName,
- IWbemCallResultPtr& _cr,
- bool _bThrowOnError = false
- );
-
- CWbemClassObject GetObject(_bstr_t _sName,bool _bThrowOnError = false)
- {
- IWbemCallResultPtr crUnused;
- return GetObject(_sName,crUnused,_bThrowOnError);
- }
-
-
- HRESULT GetMethodSignatures(const _bstr_t& _sObjectName,const _bstr_t& _sMethodName,CWbemClassObject& _in,CWbemClassObject& _out)
- {
- HRESULT hr = E_FAIL;
-
- CWbemClassObject methodClass = GetObject(_sObjectName);
-
- if(methodClass)
- {
- hr = methodClass.GetMethod(_sMethodName,_in,_out);
- }
-
- return hr;
- }
-
-
- HRESULT PutInstance
- (
- CWbemClassObject& _object,
- IWbemCallResultPtr& _cr,
- long _lFlags = WBEM_FLAG_CREATE_OR_UPDATE
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->PutInstance(_object,_lFlags,m_pCtx,&_cr);
- return hr;
- }
-
- HRESULT PutInstance
- (
- CWbemClassObject& _object,
- long _lFlags = WBEM_FLAG_CREATE_OR_UPDATE
- )
- {
- IWbemCallResultPtr crUnused;
- return PutInstance(_object,crUnused,_lFlags);
- }
-
- bool IsNull()
- {
- IWbemServicesPtr pServices;
- bool bRet = GetInterfacePtr(pServices,false) == NULL;
-
- return bRet;
- }
-
- operator bool()
- {
- IWbemServicesPtr pServices;
- bool bRet = GetInterfacePtr(pServices,false) != NULL;
- return bRet;
- }
-
- operator !()
- {
- IWbemServicesPtr pServices;
- bool bRet = GetInterfacePtr(pServices,false) == NULL;
- return bRet;
- }
-
-
- HRESULT CreateInstanceEnum
- (
- _bstr_t Class,
- long lFlags,
- IEnumWbemClassObject **ppEnum
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->CreateInstanceEnum(Class, lFlags, m_pCtx, ppEnum);
- return hr;
- }
-
-
- HRESULT CreateInstanceEnumAsync
- (
- _bstr_t Class,
- IWbemObjectSink * ppSink,
- long lFlags = 0
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->CreateInstanceEnumAsync(Class, lFlags, m_pCtx, ppSink);
- return hr;
- }
-
-
- HRESULT CreateClassEnum
- (
- _bstr_t Class,
- long lFlags,
- IEnumWbemClassObject **ppEnum
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->CreateClassEnum(Class, lFlags, m_pCtx, ppEnum);
- return hr;
- }
-
- HRESULT ExecQuery
- (
- _bstr_t QueryLanguage,
- _bstr_t Query,
- long lFlags,
- IEnumWbemClassObject **ppEnum
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->ExecQuery(QueryLanguage, Query,lFlags, m_pCtx, ppEnum);
- return hr;
- }
-
- HRESULT ExecQuery
- (
- _bstr_t Query,
- long lFlags,
- IEnumWbemClassObject **ppEnum
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->ExecQuery(_bstr_t("WQL"), Query,lFlags, m_pCtx, ppEnum);
- return hr;
- }
-
- HRESULT ExecQuery
- (
- _bstr_t Query,
- IEnumWbemClassObject **ppEnum
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->ExecQuery(_bstr_t("WQL"), Query,0, m_pCtx, ppEnum);
- return hr;
- }
-
-
-
- HRESULT ExecQueryAsync
- (
- _bstr_t Query,
- IWbemObjectSink * pSink,
- long lFlags = 0
- )
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->ExecQueryAsync(_bstr_t("WQL"), Query,0, m_pCtx, pSink);
- return hr;
- }
-
-
- HRESULT ExecMethod
- (
- _bstr_t sPath,
- _bstr_t sMethod,
- CWbemClassObject& inParams,
- CWbemClassObject& outParams
- )
- {
- IWbemCallResultPtr crUnused;
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->ExecMethod(sPath, sMethod,0, m_pCtx, inParams,&outParams,&crUnused);
- return hr;
- }
-
- HRESULT CancelAsyncCall(IWbemObjectSink * pSink)
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
- HRESULT hr = pServices->CancelAsyncCall(pSink);
- return hr;
- }
-
- // context values are stored and used for every call until cleared
- HRESULT SetContextValue(_bstr_t sName,_variant_t value);
- HRESULT GetContextValue(_bstr_t sName,_variant_t& value);
- HRESULT DeleteContextValue(_bstr_t sName);
- HRESULT DeleteAllContextValues();
- HRESULT SetContext(IWbemContext * pWbemContext);
- HRESULT GetContext(IWbemContext ** ppWbemContext);
-
- HRESULT GetServices(IWbemServices ** ppServices)
- {
- IWbemServicesPtr pServices;
- GetInterfacePtr(pServices);
-
- *ppServices = pServices.Detach();
-
- return S_OK;
- }
-
- };
-
-
- #pragma option pop /*P_O_Pop*/
- #endif //__SdkWbemHelpers_H
-
-