|
|
//
// 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
|