WindowsXP-SP1/ds/adsi/router/oledsapi.h

421 lines
8.8 KiB
C

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