// // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // // *************************************************************************** // // Original Author: Rajesh Rao // // $Author: rajeshr $ // $Date: 9/16/98 4:43p $ // $Workfile:instprov.h $ // // $Modtime: 9/16/98 11:21a $ // $Revision: 1 $ // $Nokeywords: $ // // // Description: Contains the declaration for the DS Instance Provider class. // //*************************************************************************** ///////////////////////////////////////////////////////////////////////// #ifndef DS_INSTANCE_PROVIDER_H #define DS_INSTANCE_PROVIDER_H // Forward declaration for the initializer class class CDSInstanceProviderInitializer; class CLDAPInstanceProvider : public IWbemProviderInit, public IWbemServices { // The initialization class is a friend of this class friend CDSInstanceProviderInitializer; public: // Create the object CLDAPInstanceProvider () ; virtual ~CLDAPInstanceProvider () ; //////////////////////////////////////// //IUnknown members //////////////////////////////////////// STDMETHODIMP QueryInterface ( REFIID , LPVOID FAR * ) ; STDMETHODIMP_( ULONG ) AddRef () ; STDMETHODIMP_( ULONG ) Release () ; //////////////////////////////////////// //IWbemProviderInit members //////////////////////////////////////// virtual HRESULT STDMETHODCALLTYPE Initialize( LPWSTR wszUser, LONG lFlags, LPWSTR wszNamespace, LPWSTR wszLocale, IWbemServices __RPC_FAR *pNamespace, IWbemContext __RPC_FAR *pCtx, IWbemProviderInitSink __RPC_FAR *pInitSink) ; //////////////////////////////////////// //IWbemServices members //////////////////////////////////////// virtual HRESULT STDMETHODCALLTYPE OpenNamespace( /* [in] */ const BSTR strNamespace, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemServices __RPC_FAR *__RPC_FAR *ppWorkingNamespace, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppResult); virtual HRESULT STDMETHODCALLTYPE CancelAsyncCall( /* [in] */ IWbemObjectSink __RPC_FAR *pSink); virtual HRESULT STDMETHODCALLTYPE QueryObjectSink( /* [in] */ long lFlags, /* [out] */ IWbemObjectSink __RPC_FAR *__RPC_FAR *ppResponseHandler); virtual HRESULT STDMETHODCALLTYPE GetObject( /* [in] */ const BSTR strObjectPath, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemClassObject __RPC_FAR *__RPC_FAR *ppObject, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE GetObjectAsync( /* [in] */ const BSTR strObjectPath, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE PutClass( /* [in] */ IWbemClassObject __RPC_FAR *pObject, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE PutClassAsync( /* [in] */ IWbemClassObject __RPC_FAR *pObject, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE DeleteClass( /* [in] */ const BSTR strClass, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE DeleteClassAsync( /* [in] */ const BSTR strClass, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE CreateClassEnum( /* [in] */ const BSTR strSuperclass, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum); virtual HRESULT STDMETHODCALLTYPE CreateClassEnumAsync( /* [in] */ const BSTR strSuperclass, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE PutInstance( /* [in] */ IWbemClassObject __RPC_FAR *pInst, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE PutInstanceAsync( /* [in] */ IWbemClassObject __RPC_FAR *pInst, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE DeleteInstance( /* [in] */ const BSTR strObjectPath, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE DeleteInstanceAsync( /* [in] */ const BSTR strObjectPath, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE CreateInstanceEnum( /* [in] */ const BSTR strClass, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum); virtual HRESULT STDMETHODCALLTYPE CreateInstanceEnumAsync( /* [in] */ const BSTR strClass, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE ExecQuery( /* [in] */ const BSTR strQueryLanguage, /* [in] */ const BSTR strQuery, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum); virtual HRESULT STDMETHODCALLTYPE ExecQueryAsync( /* [in] */ const BSTR strQueryLanguage, /* [in] */ const BSTR strQuery, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE ExecNotificationQuery( /* [in] */ const BSTR strQueryLanguage, /* [in] */ const BSTR strQuery, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum); virtual HRESULT STDMETHODCALLTYPE ExecNotificationQueryAsync( /* [in] */ const BSTR strQueryLanguage, /* [in] */ const BSTR strQuery, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); virtual HRESULT STDMETHODCALLTYPE ExecMethod( /* [in] */ const BSTR strObjectPath, /* [in] */ const BSTR strMethodName, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemClassObject __RPC_FAR *pInParams, /* [unique][in][out] */ IWbemClassObject __RPC_FAR *__RPC_FAR *ppOutParams, /* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult); virtual HRESULT STDMETHODCALLTYPE ExecMethodAsync( /* [in] */ const BSTR strObjectPath, /* [in] */ const BSTR strMethodName, /* [in] */ long lFlags, /* [in] */ IWbemContext __RPC_FAR *pCtx, /* [in] */ IWbemClassObject __RPC_FAR *pInParams, /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler); protected: // The IWbemServices pointer stored from Initialize() IWbemServices *m_IWbemServices; // SHows whether the call to Initialize() was successful BOOLEAN m_bInitializedSuccessfully; // The IWbemClassObject pointer to the Uint8ArrayClass IWbemClassObject *m_pWbemUin8ArrayClass; // The IWbemClassObject pointer to the DNWithBinaryClass IWbemClassObject *m_pWbemDNWithBinaryClass; // The IWbemClassObject pointer to the DNWithStringClass IWbemClassObject *m_pWbemDNWithStringClass; // The IWbemClassObject interface to the associations class IWbemClassObject *m_pAssociationsClass; // The path to the top level container LPWSTR m_lpszTopLevelContainerPath; // Gets the IDIrectoryObject interface on an ADSI instance HRESULT MapPropertyValueToWBEM(BSTR strWbemName, IWbemClassObject *pWbemClass, IWbemClassObject *pWbemObject, PADS_ATTR_INFO pAttribute); //*************************************************************************** // // CLDAPInstanceProvider::IsContainedIn // // Purpose: Checks whether a containment is valid // // Parameters: // pszChildInstance : The WBEM Name of the child class // pszParentInstance : The WBEM Name of the parent class // // Return Value: The COM status of the request // //*************************************************************************** HRESULT IsContainedIn(LPCWSTR pszChildInstance, LPCWSTR pszParentInstance); //*************************************************************************** // // CLDAPInstanceProvider::CreateInstance // // Purpose: Checks whether a containment is valid // // Parameters: // strChildName : The WBEM Name of the child instance // strParentName : The WBEM Name of the parent instance // // Return Value: The COM status of the request. THe user should free the returned // IWbemClassObject when done. // //*************************************************************************** HRESULT CreateWBEMInstance(BSTR strChildName, BSTR strParentName, IWbemClassObject **ppInstance); //*************************************************************************** // // CLDAPInstanceProvider::ModifyExistingADSIInstance // // Purpose: Modify an existing ADSI Object using information from the WBEM object // // Parameters: // pWbemInstance : The WBEM instance being mapped // pszADSIPath : The path to the ADSI instance // pExistingObject : The CADSIInstance pointer on the existing instance // pszADSIClass : The ADSI class name of the new instance // // Return Value: The COM status of the request. // //*************************************************************************** HRESULT ModifyExistingADSIInstance(IWbemClassObject *pWbemInstance, LPCWSTR pszADSIPath, CADSIInstance *pExistingObject, LPCWSTR pszADSIClass, IWbemContext *pCtx); //*************************************************************************** // // CLDAPInstanceProvider::CreateNewADSIInstance // // Purpose: To create a new ADSI instance form a WBEM instance // // Parameters: // pWbemInstance : The WBEM instance being mapped // pszADSIPath : The path to the new ADSI instance // pszADSIClass : The ADSI class name of the new instance // // Return Value: The COM status of the request. // //*************************************************************************** HRESULT CreateNewADSIInstance(IWbemClassObject *pWbemInstance, LPCWSTR pszADSIPath, LPCWSTR pszADSIClass); //*************************************************************************** // // CLDAPInstanceProvider::MapPropertyValueToADSI // // Purpose: To map a WBEM property to ADSI // // strPropertyName : The WBEM name of the property // vPropertyValue : The variant representing the proeprty value // cType : The CIMTYPE of the property // lFlavour : The WBEM flavour of the proeprty // pAttributeEntry : A pointer to an ADS_ATTR_INFO structure that will be filled in. // //*************************************************************************** HRESULT MapPropertyValueToADSI(IWbemClassObject *pWbemInstance, BSTR strPropertyName, VARIANT vPropertyValue, CIMTYPE cType, LONG lFlavour, PADS_ATTR_INFO pAttributeEntry); //*************************************************************************** // // CLDAPInstanceProvider::DoChildContainmentQuery // // Purpose: Find the parent of a given child and create an association class // // Parameters: // pszChildPath : The ADSI path of the child instance // pResponseHandler : A sink on which the resulting objects are indicated // pListIndicatedSoFar : To avoid duplicate indications (WinMgmt will lot filter them), a // list of objects indicated so far is kept. Any objects in this list are // not indicated again // // Return Value: The COM status of the request. // //*************************************************************************** HRESULT DoChildContainmentQuery(LPCWSTR pszChildPath, IWbemObjectSink *pResponseHandler, CNamesList *pListIndicatedSoFar); //*************************************************************************** // // CLDAPInstanceProvider::DoParentContainmentQuery // // Purpose: Enumerate the children of a given parent and create association classes // // Parameters: // pszParentPath : The ADSI path of the parent instance // pResponseHandler : A sink on which the resulting objects are indicated // pListIndicatedSoFar : To avoid duplicate indications (WinMgmt will lot filter them), a // list of objects indicated so far is kept. Any objects in this list are // not indicated again // // Return Value: The COM status of the request. // //*************************************************************************** HRESULT DoParentContainmentQuery(LPCWSTR pszParentPath, IWbemObjectSink *pResponseHandler, CNamesList *pListIndicatedSoFar); // Maps an ADSI Instance to WBEM HRESULT MapADSIInstance(CADSIInstance *pADSInstance, IWbemClassObject *pWbemClass, IWbemClassObject *pWbemObject); private: // The COM Reference count long m_lReferenceCount ; // These are the search preferences often used ADS_SEARCHPREF_INFO m_pSearchInfo[2]; // A query for getting the DN associators of a class static LPCWSTR QUERY_FORMAT; static BSTR QUERY_LANGUAGE; static BSTR DN_PROPERTY; static BSTR ROOT_DN_PROPERTY; // Some literals static LPCWSTR DEFAULT_NAMING_CONTEXT_ATTR; static LPCWSTR OBJECT_CLASS_EQUALS; static BSTR CLASS_STR; static BSTR ADSI_PATH_STR; static BSTR UINT8ARRAY_STR; static BSTR DN_WITH_BINARY_CLASS_STR; static BSTR DN_WITH_STRING_CLASS_STR; static BSTR VALUE_PROPERTY_STR; static BSTR DN_STRING_PROPERTY_STR; static BSTR INSTANCE_ASSOCIATION_CLASS_STR; static BSTR CHILD_INSTANCE_PROPERTY_STR; static BSTR PARENT_INSTANCE_PROPERTY_STR; static BSTR RELPATH_STR; static BSTR ATTRIBUTE_SYNTAX_STR; static BSTR DEFAULT_OBJECT_CATEGORY_STR; static BSTR LDAP_DISPLAY_NAME_STR; static BSTR PUT_EXTENSIONS_STR; static BSTR PUT_EXT_PROPERTIES_STR; static BSTR CIMTYPE_STR; // Properties of LDAP://RootDSE static BSTR SUBSCHEMASUBENTRY_STR; static BSTR CURRENTTIME_STR; static BSTR SERVERNAME_STR; static BSTR NAMINGCONTEXTS_STR; static BSTR DEFAULTNAMINGCONTEXT_STR; static BSTR SCHEMANAMINGCONTEXT_STR; static BSTR CONFIGURATIONNAMINGCONTEXT_STR; static BSTR ROOTDOMAINNAMINGCONTEXT_STR; static BSTR SUPPORTEDCONTROLS_STR; static BSTR SUPPORTEDVERSION_STR; static BSTR DNSHOSTNAME_STR; static BSTR DSSERVICENAME_STR; static BSTR HIGHESTCOMMITEDUSN_STR; static BSTR LDAPSERVICENAME_STR; static BSTR SUPPORTEDCAPABILITIES_STR; static BSTR SUPPORTEDLDAPPOLICIES_STR; static BSTR SUPPORTEDSASLMECHANISMS_STR; // Process query for DS Associations HRESULT ProcessAssociationQuery( IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pResponseHandler, SQL1_Parser *pParser); // Process Query for DS Instances HRESULT ProcessInstanceQuery( BSTR strClass, BSTR strQuery, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pResponseHandler, SQL1_Parser *pParser); // COnverts a WQL query to an LDAP Filter. If possible HRESULT ConvertWQLToLDAPQuery(SQL_LEVEL_1_RPN_EXPRESSION *pExp, LPWSTR pszLDAPQuery, int dwLength); // Does a query on a specified Root DN HRESULT DoSingleQuery(BSTR strClass, IWbemClassObject *pWbemClass, LPCWSTR pszRootDN, LPCWSTR pszLDAPQuery, IWbemObjectSink *pResponseHandler); // Gets any static configuration data for enumerating/querying a given class HRESULT GetRootDN( LPCWSTR pszClass, LPWSTR **ppszRootDN, DWORD *pdwCount, IWbemContext *pCtx); HRESULT MapEmbeddedObjectToWBEM(PADSVALUE pAttribute, LPCWSTR pszQualifierName, IUnknown **ppEmbeddedObject); HRESULT MapUint8ArrayToWBEM(PADSVALUE pAttribute, IUnknown **ppEmbeddedObject); HRESULT MapDNWithBinaryToWBEM(PADSVALUE pAttribute, IUnknown **ppEmbeddedObject); HRESULT MapDNWithStringToWBEM(PADSVALUE pAttribute, IUnknown **ppEmbeddedObject); HRESULT MapByteArray(LPBYTE lpBinaryValue, DWORD dwLength, const BSTR strPropertyName, IWbemClassObject *pInstance); HRESULT ProcessRootDSEGetObject(BSTR strClassName, IWbemObjectSink *pResponseHandler, IWbemContext *pCtx); HRESULT MapRootDSE(IADs *pADSIRootDSE, IWbemClassObject *pWBEMRootDSE); //*************************************************************************** // // CLDAPInstanceProvider::SetStringValues // // Purpose: See Header File // //*************************************************************************** HRESULT SetStringValues(PADS_ATTR_INFO pAttributeEntry, ADSTYPE adType, VARIANT *pvPropertyValue); //*************************************************************************** // // CLDAPInstanceProvider::SetBooleanValues // // Purpose: See Header File // //*************************************************************************** HRESULT SetBooleanValues(PADS_ATTR_INFO pAttributeEntry, ADSTYPE adType, VARIANT *pvPropertyValue); //*************************************************************************** // // CLDAPInstanceProvider::SetIntegerValues // // Purpose: See Header File // //*************************************************************************** HRESULT SetIntegerValues(PADS_ATTR_INFO pAttributeEntry, ADSTYPE adType, VARIANT *pvPropertyValue); //*************************************************************************** // // CLDAPInstanceProvider::SetOctetStringValues // // Purpose: See Header File // //*************************************************************************** HRESULT SetOctetStringValues(PADS_ATTR_INFO pAttributeEntry, ADSTYPE adType, VARIANT *pvPropertyValue); HRESULT SetDNWithBinaryValues(PADS_ATTR_INFO pAttributeEntry, ADSTYPE adType, VARIANT *pvPropertyValue); HRESULT SetDNWithStringValues(PADS_ATTR_INFO pAttributeEntry, ADSTYPE adType, VARIANT *pvPropertyValue); //*************************************************************************** // // CLDAPInstanceProvider::SetStringValues // // Purpose: See Header File // //*************************************************************************** HRESULT SetTimeValues(PADS_ATTR_INFO pAttributeEntry, ADSTYPE adType, VARIANT *pvPropertyValue); //*************************************************************************** // // CLDAPInstanceProvider::SetStringValues // // Purpose: See Header File // //*************************************************************************** HRESULT SetLargeIntegerValues(PADS_ATTR_INFO pAttributeEntry, ADSTYPE adType, VARIANT *pvPropertyValue); //*************************************************************************** // // CLDAPInstanceProvider::SetObjectClassAttribute // // Purpose: See Header File // //*************************************************************************** void SetObjectClassAttribute(PADS_ATTR_INFO pAttributeEntry, LPCWSTR pszADSIClassName); }; #endif // DS_INSTANCE_PROVIDER_H