|
|
//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996
//
// File: oledsapi.h
//
// Contents: Active Directory C API header
//
//----------------------------------------------------------------------------
#ifndef __ADS_API__
#define __ADS_API__
//////////
//
// Defines
//
//////////
#define DS_NOTHING NULL // ???
#define DS_EVERYTHING 0xFFFFFFFF // ???
// missing a whole bunch...
//////////
//
// typedefs
//
//////////
// (syntax definitions need to be created in another file)
typedef DWORD OID; // To Be Determined (should not be DWORD)
typedef struct _ds_string_list { DWORD dwItems; LPWSTR Item[]; } DS_STRING_LIST, *PDS_STRING_LIST;
//
// Note: The struct below is returned when getting the last
// accessed/modified/etc times for some DS or Schema entity.
// The members of this structure are pointers in case the particular
// time information is not available or is not supported by the DS.
//
// Note2: A pointer to this struct is typically present in DS_*_INFO
// structures, in case no such info needs to be specified.
// A user should pass in NULL for PDS_ACCESS_TIMES if it is
// a member of some DS_*_INFO which is used as an IN parameter.
//
typedef struct _ds_access_times { PSYSTEMTIME pCreated; PSYSTEMTIME pLastAccess; PSYSTEMTIME pLastModified; } DS_ACCESS_TIMES, *PDS_ACCESS_TIMES;
typedef struct _ds_object_info { OID Oid; LPWSTR lpszPath; LPWSTR lpszParent; LPWSTR lpszName; LPWSTR lpszClass; LPWSTR lpszSchema; PDS_ATTRIBUTE_ENTRY pAttributes; // Usually NULL, but can be used on enum
PDS_ACCESS_TIMES pAccessTimes; } DS_OBJECT_INFO, *PDS_OBJECT_INFO;
typedef struct _ds_class_info { OID Oid; LPWSTR lpszName; PDS_STRING_LIST DerivedFrom; PDS_STRING_LIST CanContain; PDS_STRING_LIST NamingAttributes; // What's the deal with this?
PDS_STRING_LIST RequiredAttributes; PDS_STRING_LIST OptionalAttributes; BOOL fAbstract; PDS_ACCESS_TIMES pAccessTimes; } DS_CLASS_INFO, *PDS_CLASS_INFO;
typedef struct _ds_attr_info { OID Oid; LPWSTR lpszName; DWORD dwSyntaxId; BOOL fMultivalued; //
// Bug: Min/Max? What else?
//
PDS_ACCESS_TIMES pAccessTimes; } PDS_ATTR_INFO, *PDS_ATTR_INFO;
typedef struct _ds_attribute_value { DWORD cbData; LPBYTE lpData; } DS_ATTRIBUTE_VALUE, *PDS_ATTRIBUTE_VALUE;
//
// NOTE: The dwOperation field is used only when writing attributes.
// It describes how to write or if clearing the attribute is desired.
// If clearing is specified, dwSyntaxId, lpValue, and dwNumValues are
// ignored.
//
typedef struct _ds_attribute_entry { LPWSTR lpszName; DWORD dwSyntaxId; DWORD dwNumValues; DWORD dwOperation; // ADD, MODIFY, CLEAR ???
PDS_ATTRIBUTE_VALUE lpValue; // Array of values
PDS_ACCESS_TIMES pAccessTimes; } DS_ATTRIBUTE_ENTRY, *PDS_ATTRIBUTE_ENTRY;
//////////
//
// functions
//
//////////
//
// Memory functions
//
DWORD WINAPI DsBufferAlloc( OUT LPVOID *ppBuffer );
DWORD WINAPI DsBufferFree( IN LPVOID pBuffer );
//
// The function below could go out and get kerberos tickets or whatever.
//
// dwType is just a hint in case the user prefers that the underlying
// DS use a particular type of authentication...
//
DWORD WINAPI DsCredentialsOpen( IN LPWSTR lpszUsername, IN LPWSTR lpszPassword, IN DWORD dwType, // Like DS_CREDENTIALS_DEFAULT
// DS_CREDENTIALS_KRBV5, etc.???
IN DWORD dwFlags, // What is this???
OUT PHANDLE hCredentials );
DWORD WINAPI DsCredentialsClose( IN HANDLE hCredentials );
//
// Good old open
//
// Note: if hRoot is NULL, lpszPath is full object path
// otherwise, lpszPath is relative name from object w/hRoot handle
DWORD WINAPI DsObjectOpen( IN HANDLE hRoot, IN LPWSTR lpszPath, IN HANDLE hCredentials, // NULL for process credentials
IN DWORD dwAccess, IN DWORD dwFlags, OUT PHANDLE phDs );
//
// Note: Should we use single close (Object/Enum/Schema)???
//
DWORD WINAPI DsObjectClose( IN HANDLE hDs );
//
// We need some stuff to operate on handles to get back binding info
// (this stuff comes in only when you do an open or when you refresh)
//
DWORD WINAPI DsObjectInfo( IN HANDLE hDs, OUT PDS_OBJECT_INFO *ppObjectInfo );
//
// Read/Write Attributes
//
DWORD WINAPI DsObjectRead( IN HANDLE hDs, IN DWORD dwFlags, // ???
IN PDS_STRING_LIST pAttributeNames, OUT PDS_ATTRIBUTE_ENTRY *ppAttributeEntries, OUT LPDWORD lpdwNumAttributesReturned );
DWORD WINAPI DsObjectWrite( IN HANDLE hDs, IN DWORD dwNumAttributesToWrite, IN PDS_ATTRIBUTE_ENTRY pAttributeEntries, OUT LPDWORD lpdwNumAttributesWritten );
//
// Create/Delete Objects
//
DWORD WINAPI DsObjectCreate( IN HANDLE hDs, // Container
IN LPWSTR lpszRelativeName, IN LPWSTR lpszClass, IN DWORD dwNumAttributes, IN PDS_ATTRIBUTE_ENTRY pAttributeEntries );
DWORD WINAPI DsObjectDelete( IN HANDLE hDs, IN LPWSTR lpszRelativeName, IN LPWSTR lpszClass // Could be NULL if name unique??
);
//
// Enumeration
//
DWORD WINAPI DsObjectEnumOpen( IN HANDLE hDs, IN DWORD dwFlags, // What is this?
IN PDS_STRING_LIST pFilters, // Classes wanted
IN PDS_STRING_LIST pDesiredAttrs, // Attrs wanted or NULL just for info
OUT PHANDLE phEnum );
DWORD WINAPI DsObjectEnumNext( IN HANDLE hEnum, IN DWORD dwRequested, // 0xFFFFFFFF for just counting
OUT PDS_OBJECT_INFO *ppObjInfo, // NULL for no info (just counting)
OUT LPDWORD lpdwReturned // Actual number returned/counted
);
DWORD WINAPI DsObjectEnumClose( IN HANDLE hEnum );
//
// Schema stuff
//
//
// Note: The word "schema" below refers to the schema db and not to
// a class definition.
//
DWORD WINAPI DsSchemaOpen( IN HANDLE hSchema, // NULL if opening schema db,
// must be schema db handle otherwise
IN LPWSTR lpszPath, // One of: path to schema,
// class name,
// attribute name
IN HANDLE hCredentials, IN DWORD dwAccess, IN DWORD dwFlags, // DS_OPEN_SCHEMA = 0, DS_OPEN_CLASS, DS_OPEN_ATTR
OUT PHANDLE ph // handle to schema/class/attr depending on dwFlags
);
DWORD WINAPI DsSchemaClose( IN HANDLE hSchema );
//
// Can also create/delete schema databases (if DS allows it)???
//
DWORD WINAPI DsSchemaCreate( IN LPWSTR lpszPath, IN DWORD dwFlags //???
);
DWORD WINAPI DsSchemaDelete( IN LPWSTR lpszPath, IN DWORD dwFlags //???
);
//
// Schema Enumeration
//
//
// enum class/attribute names
//
DWORD WINAPI DsSchemaEnumOpen( IN HANDLE hSchema, IN DWORD dwFlags, // DS_SCHEMA_ENUM_CLASS xor DS_SCHEMA_ENUM_ATTR
OUT PHANDLE phEnum );
DWORD WINAPI DsSchemaEnumNext( IN HANDLE hEnum, IN DWORD dwRequested, // Pass in 0xFFFFFFFF for just counting
IN LPWSTR *ppObjInfo, // Pass in NULL for just counting
OUT LPDWORD lpdwReturned // This would return the count
);
DWORD WINAPI DsSchemaEnumClose( IN HANDLE hEnum );
//
// Class/Attribute Stuff
//
DWORD WINAPI DsSchemaClassCreate( IN HANDLE hSchema, IN PDS_CLASS_INFO pClassInfo // What do we do about naming attributes?
);
DWORD WINAPI DsSchemaAttrCreate( IN HANDLE hSchema, IN PDS_ATTR_INFO pAttrInfo );
DWORD WINAPI DsSchemaClassDelete( IN HANDLE hSchema, IN LPWSTR lpszPath, IN DWORD dwFlags //???
);
DWORD WINAPI DsSchemaAttrDelete( IN HANDLE hSchema, IN LPWSTR lpszPath, IN DWORD dwFlags //???
);
DWORD WINAPI DsSchemaClassInfo( IN HANDLE hClass, OUT PDS_CLASS_INFO *ppClassInfo );
DWORD WINAPI DsSchemaAttrInfo( IN HANDLE hAttr, OUT PDS_ATTR_INFO *ppAttrInfo );
DWORD WINAPI DsSchemaClassModify( IN HANDLE hSchema, IN PDS_CLASS_INFO pClassInfo // What do we do about naming attributes?
);
DWORD WINAPI DsSchemaAttrModify( IN HANDLE hSchema, IN PDS_ATTR_INFO pAttrInfo );
#endif // __ADS_API__
|