windows-nt/Source/XPSP1/NT/ds/adsi/router/oledscom.h
2020-09-26 16:20:57 +08:00

388 lines
9.4 KiB
C

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996
//
// File: oledscom.h
//
// Contents: Active Directory COM Interfaces
// - IDsOpen
// - IDsObject
// - IDsContainer
// - IDsEnum
// - IDsSchema
// - IDsClass
// - IDsAttribute
// - (IDsSecurity needs to be defined)
//
// Note: Objects are:
// DsObject: IDsOpen, IDsSecurity, IDsObject,
// and IDsContainer if object is a container (even if empty)
// DsSchema: IDsOpen, IDsSecurity, IDsSchema
// DsClass: IDsOpen, IDsSecurity, IDsClass
// DsAttribute: IDsOpen, IDsSecurity, IDsAttribute
// DsEnum: IDsOpen
//
// So, every object supports IDsEnum and all but DsEnum supports IDsSecurity
//
// Note2: I thought about having DsObject support IDsClass for easy class
// access, but I trashed that because of complexity.*
// Similarlry, I thought about IDsSchema support for DsClass and
// DsAttribute. Same problem here.*
// *SubNote: The object model would become a bit weird. However,
// adding a function to the main interface to get the
// Class/Schema object might be useful.
//
//----------------------------------------------------------------------------
#ifndef __ADS_COM__
#define __ADS_COM__
#include <oledsapi.h>
/* Definition of interface: IDsOpen */
/*
This interface should be used when you need to open some object or
schema path.
You can QI for it on any DS COM object
*/
#undef INTERFACE
#define INTERFACE IDsOpen
DECLARE_INTERFACE_(IDsOpen, IUnknown)
{
BEGIN_INTERFACE
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
#endif
/* IDsOpen */
STDMETHOD(OpenObject)(
THIS_
IN LPWSTR lpszObjectPath,
IN LPWSTR lpszUsername,
IN LPWSTR lpszPassword,
IN DWORD dwAccess,
IN DWORD dwFlags,
IN REFIID riid,
OUT void **ppADsObj
) PURE;
STDMETHOD(OpenSchemaDatabase)(
THIS_
IN LPWSTR lpszSchemaPath,
IN LPWSTR lpszUsername,
IN LPWSTR lpszPassword,
IN DWORD dwAccess,
IN DWORD dwFlags,
OUT IDsSchema **ppDsSchema
) PURE;
};
/* Definition of interface: IDsObject */
/*
This interface is only supported by actual DS object. It should not be
supported by schema entities.
NOTE: The names for the methods below should be shortened some for
ease of use.
*/
#undef INTERFACE
#define INTERFACE IDsObject
DECLARE_INTERFACE_(IDsObject, IUnknown)
{
BEGIN_INTERFACE
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
#endif
/* IDsObject*/
STDMETHOD(GetObjectInformation)(
THIS_
OUT PDS_OBJECT_INFO pObjInfo
) PURE;
STDMETHOD(GetObjectAttributes)(
THIS_
IN PDS_STRING_LIST pAttributeNames,
OUT PDS_ATTRIBUTE_ENTRY *ppAttributeEntries,
OUT PDWORD pdwNumAttributesReturned
) PURE;
STDMETHOD(SetObjectAttributes)(
THIS_
IN DWORD dwFlags,
IN PDS_ATTRIBUTE_ENTRY pAttributeEntries,
IN DWORD dwNumAttributes,
OUT PDWORD pdwNumAttributesModified
) PURE;
STDMETHOD(OpenSchemaDefinition)(
THIS_
OUT IDsSchema **ppDsSchema
) PURE;
};
/* Definition of interface: IDsContainer */
/*
This interface should be supported by any container object. Therefore,
all objects should support this interface except for objects whose class
definitions prohibit them from containing anything.
NOTE: Open, Create, and Delete accept any relative name, not just
objects immediately under the container (i.e. from object
"foo://bar", I can open "baz/foobar", which is really
"foo://bar/baz/foobar").
This funtionality allows me to open "@ADs!" and do all
sorts of operations without having to browse!
("All the power comes to me." -- a guy in some movie,
unfortunately, I don't know which guy or what movie.)
*/
#undef INTERFACE
#define INTERFACE IDsContainer
DECLARE_INTERFACE_(IDsContainer, IUnknown)
{
BEGIN_INTERFACE
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
#endif
/* IDsContainer*/
STDMETHOD(OpenEnum)(
THIS_
IN DWORD dwFlags,
IN PDS_STRING_LIST pFilters,
IN PDS_STRING_LIST pDesiredAttrs,
OUT IDsEnum **ppDsEnum
) PURE;
STDMETHOD(OpenObject)(
THIS_
IN LPWSTR lpszRelativeName,
IN IN LPWSTR lpszUsername,
IN LPWSTR lpszPassword,
IN DWORD dwAccess,
IN DWORD dwFlags,
IN REFIID riid,
OUT void **ppADsObj
) PURE;
STDMETHOD(Create)(
THIS_
IN LPWSTR lpszRelativeName,
IN LPWSTR lpszClass,
IN DWORD dwNumAttributes,
IN PDS_ATTRIBUTE_ENTRY pAttributeEntries
) PURE;
STDMETHOD(Delete)(
THIS_
IN LPWSTR lpszRDName,
IN LPWSTR lpszClassName
) PURE;
};
/* Definition of interface: IDsEnum */
/*
$$$$ The notes below are very important!!! $$$$
Note: *ppEnumInfo should be cast to PDS_OBJECT_INFO or LPWSTR depending
on whether the enum was on objects or class/attributes
(If this enum interface is used for other stuff, can use other
castings as appropriate.)
Note2: IDsEnum is only supported by enumeration objects that are created
when an enumeration takes place. These enumeration objects only
support IUnknown, IDsOpen, and IDsEnum. They cannot support any
other IDs* interfaces.
*/
#undef INTERFACE
#define INTERFACE IDsEnum
DECLARE_INTERFACE_(IDsEnum, IUnknown)
{
BEGIN_INTERFACE
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
#endif
/* IDsEnum */
STDMETHOD(Next)(
THIS_
IN DWORD dwRequested, // 0xFFFFFFFF for just counting
OUT PVOID *ppEnumInfo, // NULL for no info (just counting)
OUT LPDWORD lpdwReturned // This would return the count
) PURE;
};
/* Definition of interface: IDsSchema */
#undef INTERFACE
#define INTERFACE IDsSchema
DECLARE_INTERFACE_(IDsSchema, IUnknown)
{
BEGIN_INTERFACE
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
#endif
/* IDsSchema */
STDMETHOD(OpenClass)(
THIS_
IN LPWSTR lpszClass,
IN LPWSTR lpszUsername,
IN LPWSTR lpszPassword,
IN DWORD dwAccess,
IN DWORD dwFlags,
OUT IDsClass **ppDsClass
) PURE;
STDMETHOD(OpenAttribute)(
THIS_
IN LPWSTR lpszAttribute,
IN LPWSTR lpszUsername,
IN LPWSTR lpszPassword,
IN DWORD dwAccess,
IN DWORD dwFlags,
OUT IDsAttribute **ppDsAttribute
) PURE;
STDMETHOD(OpenClassEnum)(
THIS_
OUT IDsEnum **ppDsEnum
) PURE;
STDMETHOD(OpenAttributeEnum)(
THIS_
OUT IDsEnum **ppDsEnum
) PURE;
STDMETHOD(CreateClass)(
THIS_
IN PDS_CLASS_INFO pClassInfo
) PURE;
STDMETHOD(CreateAttribute)(
THIS_
IN PDS_ATTR_INFO pAttrInfo
) PURE;
STDMETHOD(DeleteClass)(
THIS_
IN LPWSTR lpszName,
IN DWORD dwFlags
) PURE;
STDMETHOD(DeleteAttribute)(
THIS_
IN LPWSTR lpszName,
IN DWORD dwFlags
) PURE;
};
/* Definition of interface: IDsClass */
#undef INTERFACE
#define INTERFACE IDsClass
DECLARE_INTERFACE_(IDsClass, IUnknown)
{
BEGIN_INTERFACE
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
#endif
/* IDsClass */
STDMETHOD(GetClassInfo)(
THIS_
OUT PDS_CLASS_INFO *ppClassInfo
);
STDMETHOD(ModifyClassInfo)(
THIS_
IN PDS_CLASS_INFO pClassInfo
) PURE;
};
/* Definition of interface: IDsAttribute */
#undef INTERFACE
#define INTERFACE IDsAttribute
DECLARE_INTERFACE_(IDsAttribute, IUnknown)
{
BEGIN_INTERFACE
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
#endif
/* IDsAttribute */
STDMETHOD(GetAttributeInfo)(
THIS_
OUT PDS_ATTR_INFO *ppAttrInfo
);
STDMETHOD(ModifyAttributeInfo)(
THIS_
IN PDS_ATTR_INFO pAttrInfo
) PURE;
};
#endif // __ADS_COM__