/******************************************************************* * * Copyright (c) Microsoft Corp. 1986-1996. All Rights Reserved. * * * DESCRIPTION: This header file defines the functions, structures, * and macros used to access the Microsoft Exchange * APIs for modifying entries in the Exchange 4.0 DIT. * These APIs permit a calling process to create, * modify, or delete DIT objects by specifying the * name of a CSV text file containing attributes * for objects to import into ( or to modify) * the DIT. See the Directory Access Functions * section of the Exchange Developer's Kit for * more detailed description of this interface. * * Calling programs must link with DAPI.LIB. * * Error and warning codes are defined in DAPIMSG.H * * *******************************************************************/ /** include files **/ #ifndef _WINDOWS_ #include #endif /** local definitions **/ #ifndef _DAPI_INCLUDED_ #define _DAPI_INCLUDED_ #ifdef __cplusplus extern "C" { #endif // Import / Export APIs check for the presence of this signature in // the dwDAPISignature field in the import parameter blocks. // This signature will be incremented each time one of the parameter // blocks is changed so that header synchronization problems can be // detected. #define DAPI_SIGNATURE 0x46414400 // Combinable flags used to control the API functions. // The following flags control filtering of DAPI events // The default action is DAPI_EVENT_ALL #define DAPI_EVENT_MASK 0x00000007 /* bit-field containing event-filtering requested if none of these bits are set, DAPI_EVENT_ALL is assumed */ #define DAPI_EVENT_MIN 0x00000001 /* No warning or error logging. Log start and stop messages */ #define DAPI_EVENT_SOME 0x00000002 /* Start, Stop, and Error messages will be logged. */ #define DAPI_EVENT_ALL 0x00000004 /* Start, Stop, Error, and Warning messages will be logged. */ // The following flags control schema read and use of the schema #define DAPI_FORCE_SCHEMA_LOAD 0x00000010 /* Unload previously loaded schema and read schema again. Default action is to re-use previously loaded schema if read from the same messaging domain */ #define DAPI_RAW_MODE 0x00000020 /* Import / Export in "Raw" mode. Import lines are taken literally. No attributes will be inherited, constructed, etc. Aliases for attribute and class names will not be recognized. */ #define DAPI_OVERRIDE_CONTAINER 0x00000040 /* Container specified in the parameter block overrides the contents of the container column. Default behaviour is for the value specified in the Obj-Container column to override that specified in the parameter block */ #define DAPI_IMPORT_NO_ERR_FILE 0x00000080 /* Do not create Error File -- BatchImport only */ #define DAPI_IMPORT_WRITE_THROUGH 0x00400000 /* Commit write operations immediately */ // Flags defined for "Batch" operations only -- ignored by DAPIRead, DAPIWrite #define DAPI_YES_TO_ALL 0x00000100 /* Force "yes" response on any user-prompt UI (i.e., continue w/o proxy addresses, etc.) */ #define DAPI_SUPPRESS_PROGRESS 0x00000200 /* Suppress progress thermometer on batch operations. Default is to display progress */ #define DAPI_SUPPRESS_COMPLETION 0x00000400 /* Suppress completion notification message box on batch operations */ #define DAPI_SUPPRESS_ARCHIVES 0x00000800 /* Suppress creation of "archive" copies of output files -- BatchImport and BatchExport only*/ // Flags defined for BatchExport #define DAPI_EXPORT_MAILBOX 0x00001000 /* Export Mailbox recipients */ #define DAPI_EXPORT_CUSTOM 0x00002000 /* Export remote address recipients */ #define DAPI_EXPORT_DIST_LIST 0x00004000 /* Export Distribution Lists */ #define DAPI_EXPORT_RECIPIENTS (DAPI_EXPORT_MAILBOX | DAPI_EXPORT_CUSTOM | DAPI_EXPORT_DIST_LIST) /* Export all recipient objects */ #define DAPI_EXPORT_ALL_CLASSES 0x00008000 /* If this flag is set, all objects meeting other restrictions (i.e., USN level, container scope, etc.) will be exported, regardless of class */ #define DAPI_EXPORT_HIDDEN 0x00010000 /* Include Hidden objects in export. Default is no export if Hide-From-Address-Book */ #define DAPI_EXPORT_SUBTREE 0x00020000 /* Traverse the Directory Information Tree hierarchy, exporting objects that meet the export restrictions */ #define DAPI_EXPORT_BASEPOINT_ONLY 0x00040000 /* Export only the requested attributes from the named BasePoint object. All other export restrictions are ignored (class flags, rgpszClasses, pszServerName). This flag implies DAPI_SUPPRESS_PROGRESS and DAPI_SUPPRESS_COMPLETION */ // Flags defined only for BatchImport #define DAPI_OVERRIDE_SYNCH_STATE 0x00080000 /* Override server's synchronization status, normally checked on BatchImport. NOTE: This flag should normally NOT be set. The normal behaviour is to prevent BatchImport operations from possible conflict with directory synchronization */ // Flags defined only for DAPIRead #define DAPI_READ_DEFINED_ATTRIBUTES 0x00100000 /* return all attributes that are set for the current object. This flag is ignored if pAttributes is specified. */ #define DAPI_READ_ALL_ATTRIBUTES 0x00200000 /* return all attributes that are defined for the class of the current object. This flag is ignored if pAttributes is specified. */ // The following flags control NT Security management #define DAPI_RESTRICT_ACCESS 0x01000000 /* Apply NT Security Descriptor to created objects */ #define DAPI_CREATE_NT_ACCOUNT 0x02000000 /* Create NT accounts (valid only in Create/Modify mode) */ #define DAPI_CREATE_RANDOM_PASSWORD 0x04000000 /* Generate random passwords for created NT accounts. Ignored if DAPI_CREATE_NT_ACCOUNT is not set */ #define DAPI_DELETE_NT_ACCOUNT 0x08000000 /* Delete ASSOC-NT-ACCOUNT when deleting mailbox */ // Flags defined only for DAPIWrite #define DAPI_MODIFY_REPLACE_PROPERTIES 0x00800000 /* Append values to multi-value attributes when modifying */ #define DAPI_WRITE_UPDATE 0x10000000 /* Modify if object exists, create if it doesn't. NOTE: This is the default mode */ #define DAPI_WRITE_CREATE 0x20000000 /* Create object -- fail if object exists */ #define DAPI_WRITE_MODIFY 0x30000000 /* Modify object -- fail if object does not exist */ #define DAPI_WRITE_DELETE 0x40000000 /* Delete object */ #define DAPI_WRITE_MODE_MASK 0x70000000 // Callback flags #define DAPI_CALLBACK_CHAIN 0x00000001 /* If set in dwFlags field of the ERROR_CALLBACK and the CALLBACKPROGRESS structures, the default handler will be invoked after calling out to the caller-supplied handler function, unless the user function returns FALSE, indicating cancel. NOTE: This flag is not defined for the EXPORT_CALLBACK structure. NOTE: This flag should not be set in the dwFlags field of the main parameter block */ // default delimiter values used when parsing the import file #define DAPI_DEFAULT_DELIMA ',' #define DAPI_DEFAULT_QUOTEA '"' #define DAPI_DEFAULT_MV_SEPA '%' #define DAPI_DEFAULT_DELIMW L',' #define DAPI_DEFAULT_QUOTEW L'"' #define DAPI_DEFAULT_MV_SEPW L'%' #define DAPI_CTRL_FILE_PTRA '=' #define DAPI_CTRL_FILE_PTRW L'=' #define DAPI_CTRL_META_CHARA '~' #define DAPI_CTRL_META_CHARW L'~' #define pszSubstServerA "~SERVER" #define pszSubstServerW L"~SERVER" #define cchSubstServer ((sizeof (pszSubstServerA) / sizeof(CHAR)) - 1) #define pszDeleteKeyA "~DEL" #define pszDeleteKeyW L"~DEL" #define cchDeleteKey ((sizeof (pszDeleteKeyA) / sizeof(CHAR)) - 1) #define DAPI_UNICODE_FILE ((UINT)-1) #ifdef UNICODE #define DAPI_DEFAULT_DELIM DAPI_DEFAULT_DELIMW #define DAPI_DEFAULT_QUOTE DAPI_DEFAULT_QUOTEW #define DAPI_DEFAULT_MV_SEP DAPI_DEFAULT_MV_SEPW #define DAPI_CTRL_FILE_PTR DAPI_CTRL_FILE_PTRW #define DAPI_CTRL_META_CHAR DAPI_CTRL_META_CHARW #define pszSubstServer pszSubstServerW #define pszDeleteKey pszDeleteKeyW #else #define DAPI_DEFAULT_DELIM DAPI_DEFAULT_DELIMA #define DAPI_DEFAULT_QUOTE DAPI_DEFAULT_QUOTEA #define DAPI_DEFAULT_MV_SEP DAPI_DEFAULT_MV_SEPA #define DAPI_CTRL_FILE_PTR DAPI_CTRL_FILE_PTRA #define DAPI_CTRL_META_CHAR DAPI_CTRL_META_CHARA #define pszSubstServer pszSubstServerA #define pszDeleteKey pszDeleteKeyA #endif /******************************************************************************* * Batch Operation Progress Callback Function Definitions * Pointers to functions of these types are provided by the caller via the * CALLBACKPROGRESS structure in the Batch function parameter block * ******************************************************************************** * * procedure : PDAPI_FInitProgress * * purpose : Initialize progress handler (possibly progress display dialog) * * parameters : lpvAppDefined value provided in the progress callback structure * nMac Maximum Anticipated Calls. If non-zero, this indicates * the number of progress events anticipated. * If zero, the number of items to process is unknown, * so the number of calls to UpdateProgress is indeterminate. * * returns : TRUE Indicates that all is well * FALSE Could not initialize progress handler, cancel session. * ******************************************************************************** * * procedure : PDAPI_FResetProgress * * purpose : Re-initialize progress handler (possibly reset progress bar) * * parameters : lpvAppDefined value provided in the progress callback structure * nMac Maximum Anticipated Calls. If non-zero, this indicates * the number of progress events anticipated. * If zero, the number of items to process is unknown, * so the number of calls to UpdateProgress is indeterminate. * * returns : TRUE Indicates that all is well * FALSE Could not re-initialize progress handler, cancel session. * ******************************************************************************** * * procedure : PDAPI_FEndProgress * * purpose : Terminate progress handler (possibly progress display dialog) * * parameters : lpvAppDefined value provided in the progress callback structure * * returns : TRUE Indicates that all is well * FALSE Could not terminate progress handler, cancel session. * ******************************************************************************** * * procedure : PDAPI_FUpdateProgress * * purpose : Completed processing item. Called to indicate time to increment * progress display. * * parameters : lpvAppDefined value provided in the progress callback structure * * returns : TRUE Indicates that all is well * FALSE Cancel session (i.e., cancel button pressed). * ******************************************************************************** * * procedure : PDAPI_FUpdateProgressText * * purpose : Replace progress text area with provided text string * * parameters : lpvAppDefined value provided in the progress callback structure * * returns : TRUE Indicates that all is well * FALSE Cancel session (i.e., cancel button pressed). * ********************************************************************************/ typedef BOOL (PASCAL * PDAPI_FInitProgress) (LPVOID lpvAppDefined, INT nMac); typedef BOOL (PASCAL * PDAPI_FUpdateProgress) (LPVOID lpvAppDefined); typedef BOOL (PASCAL * PDAPI_FEndProgress) (LPVOID lpvAppDefined); typedef BOOL (PASCAL * PDAPI_FResetProgress) (LPVOID lpvAppDefined, INT nMac); typedef BOOL (PASCAL * PDAPI_FUpdateProgressText) (LPVOID lpvAppDefined, LPTSTR pszText); typedef struct CallBackProgressEntryPoints { DWORD dwFlags; LPVOID lpvAppDefined; PDAPI_FInitProgress pfnInitProgress; PDAPI_FUpdateProgress pfnUpdateProgress; PDAPI_FEndProgress pfnEndProgress; PDAPI_FResetProgress pfnResetProgress; PDAPI_FUpdateProgressText pfnUpdateProgressText; } CALLBACKPROGRESS, *PCALLBACKPROGRESS; // Values specified in the ulEvalTag field of the // DAPI_ENTRY and EXPORT_CALLBACK structures // typedef enum _DAPI_EVAL { VALUE_ARRAY = 0, // Each attribute has an entry in the array // Text strings and object names exported as text // Numerical values exported as numbers // Binary data exported as binary string TEXT_VALUE_ARRAY, // Each attribute has an entry in the array // All values converted to text representation TEXT_LINE // first item in the rgEntryValues array // is a delimited text line } DAPI_EVAL, *PDAPI_EVAL; typedef enum _EXP_TYPE_TAG { EXPORT_HEADER = 0, // export item contains column headers EXPORT_ENTRY // export item contains attribute values } EXP_TYPE, * PEXP_TYPE; typedef enum enumDAPI_DATA_TYPE { DAPI_NO_VALUE = 0, DAPI_STRING8, DAPI_UNICODE, DAPI_BINARY, DAPI_INT, DAPI_BOOL, } DAPI_DATA_TYPE, * PDAPI_DATA_TYPE; #ifdef UNICODE #define DAPI_TEXT DAPI_UNICODE #else #define DAPI_TEXT DAPI_STRING8 #endif typedef union _DAPI_VALUE { LPSTR pszA; LPWSTR pszW; #ifdef UNICODE LPWSTR pszValue; #else LPSTR pszValue; #endif LPBYTE lpBinary; INT iValue; BOOL bool; } DAPI_VALUE, * PDAPI_VALUE; // The ATT_VALUE structure contains a text representation of an attribute value // A linked list of these structures is used for a multi-valued attribute typedef struct _ATT_VALUE { DAPI_DATA_TYPE DapiType; // How to evaluate DAPI_VALUE union DAPI_VALUE Value; UINT size; // size of the value -- // # chars if string type // else, # bytes struct _ATT_VALUE * pNextValue; } ATT_VALUE, * PATT_VALUE; typedef struct _DAPI_ENTRY { UINT unAttributes; // Number of attributes exported DAPI_EVAL ulEvalTag; // rgEntryValues is interpreted based on this value PATT_VALUE rgEntryValues; // if (ulEvalTag == TEXT_LINE) // There is a single value, w/ delimited line // else // unAttributes, each w/ 1 or more value in list } DAPI_ENTRY, * PDAPI_ENTRY; // Define type for address of application routine // for call-back on each exported entry. // Return value of FALSE indicates that export operation should be cancelled typedef BOOL (PASCAL DAPI_FNExportEntry) ( EXP_TYPE ExportDataType, // What type of data is being exported LPVOID lpvAppDefined, // Application-defined parameter, // passed in EXPORT_CALLBACK structure // on initialization PDAPI_ENTRY pExportEntry // pointer to exported entry data // NOTE: Data in this structure // will NOT remain valid after return // from this function ); typedef DAPI_FNExportEntry * PDAPI_FNExportEntry; typedef struct _EXPORT_CALLBACK { DWORD dwFlags; // Flags defined to control callback functionality // See flag definitions below DAPI_EVAL ulEvalTag; // Specifies data format on callback LPVOID lpvAppDefined; // Application-defined field, passed as parm to callback PDAPI_FNExportEntry pfnExportEntry; // Pointer to function called to process // each exported entry } EXPORT_CALLBACK, * PEXPORT_CALLBACK; /******************************************************************************* * procedure : pfnErrorCallback * * purpose : The following section defines structures for the error callback * mechanism of the Batch Import APIs * Events will be filtered based on the ControlfFlags set in the * API parameter block * ********************************************************************************/ // Define flags used for export callback // Define the maximum number of substitutions in a single event string #define DAPI_MAX_SUBST 8 typedef struct _DAPI_EVENTA { DWORD dwDAPIError; // Message ID for event log LPSTR rgpszSubst[DAPI_MAX_SUBST]; // Event message substitution array UINT unSubst; // number of substitution strings LPSTR pszAttribute; // Name of attribute specifically affected // Note: may be NULL on some errors LPSTR pszHoldLine; // point to buffer containing copy // of current import line HINSTANCE hinstDAPI; // Instance of DAPI DLL struct _DAPI_EVENTA * pNextEvent; // Pointer to next event } DAPI_EVENTA, *PDAPI_EVENTA; typedef struct _DAPI_EVENTW { DWORD dwDAPIError; // Message ID for event log LPWSTR rgpszSubst[DAPI_MAX_SUBST]; // Event message substitution array UINT unSubst; // number of substitution strings LPWSTR pszAttribute; // Name of attribute specifically affected // Note: may be NULL on some errors LPWSTR pszHoldLine; // point to buffer containing copy // of current import line HINSTANCE hinstDAPI; // Instance of DAPI DLL struct _DAPI_EVENTW * pNextEvent; // Pointer to next event } DAPI_EVENTW, *PDAPI_EVENTW; #ifdef UNICODE typedef DAPI_EVENTW DAPI_EVENT; typedef PDAPI_EVENTW PDAPI_EVENT; #else typedef DAPI_EVENTA DAPI_EVENT; typedef PDAPI_EVENTA PDAPI_EVENT; #endif // Define type for address of application routine // for call-back on each error encountered. // Return value of FALSE indicates that operation should be cancelled typedef BOOL (PASCAL DAPI_FNErrorCallback) ( LPVOID lpvAppDefined, // Application-defined parameter, // passed in EXPORT_CALLBACK structure // on initialization PDAPI_EVENT pDapiEvent // Event information structure // NOTE: Data in the event record // will NOT remain valid after return // from this function ); typedef DAPI_FNErrorCallback * PDAPI_FNErrorCallback; typedef struct tagERROR_CALLBACK { DWORD dwFlags; // Flags defined to control callback functionality // See flag definitions above LPVOID lpvAppDefined; // Application-defined field, passed back in callback PDAPI_FNErrorCallback pfnErrorCallback; // Address of function that should be // called on each error encountered // If not supplied (NULL), default // error handler is called, which // writes the error into the // NT Application event log } ERROR_CALLBACK, * PERROR_CALLBACK; /******************************************************************************* * * Batch Directory Import Interface definitions * ********************************************************************************/ /******************************************************************************* * procedure : DAPIUninitialize * * purpose : Notify DAPI that it is time to terminate background threads * and such in preparation for process shutdown * * parameters : dwFlags combinable bits which may be set to control function * * returns : nothing * * created : 11/01/95 * * changes : * ********************************************************************************/ extern void APIENTRY DAPIUninitialize ( DWORD dwFlags // Flags for call ); /******************************************************************************* * procedure : SchemaPreload * * purpose : Called to perform asyncronous schema load. This entry point * spawns a thread that initializes all the attribute and class * tables for normal import/export operation. * * parameters : pSchemaPreloadParms pointer to SchemaPreloadParameter block * * returns : nothing * * history : * ********************************************************************************/ extern void APIENTRY SchemaPreloadA ( DWORD dwFlags, // Flags used to control schema load. LPSTR pszDSA // name of DSA from which to read schema ); extern void APIENTRY SchemaPreloadW ( DWORD dwFlags, // Flags used to control schema load. LPWSTR pszDSA // name of DSA from which to read schema ); #ifdef UNICODE #define SchemaPreload SchemaPreloadW #else #define SchemaPreload SchemaPreloadA #endif typedef struct _BIMPORT_PARMSW { // NOTE: the order of the first three fields of this structure // should NOT be changed. DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control import action HWND hwndParent; // Windows handle to use when displaying message boxes LPWSTR pszImportFile; // Fully qualified pathname to Import Data file // On Batch Import, objects are imported into // the DIT from this file. UINT uCodePage; // Code page specification for import file. // The following values are interpreted: // DAPI_UNICODE_FILE Import file is Unicode // Will return error if file is ANSI // 0 Auto-detect file type // If ANSI, assume CP_ACP // other File contains text in the // specified code page // Will return error if file is Unicode // Will return error if code page is not // supported by the system LPWSTR pszDSAName; // Computer name of DSA to update // Default: local DSA (if operating) // if no local DSA, first DSA found // on network is used LPWSTR pszBasePoint; // DN of base-point in DIT for bulk operations // Default values: // if NULL, Messaging Site containing bound server // if empty string, enterprise containing bound server LPWSTR pszContainer; // RDN of default container under which // to perform bulk import operations // NOTE: This container is assumed to be // at the level below that indicated by // the pszBasePoint. If NULL, // bulk operations will be performed at // the level below BaseImportPoint. // Container names specified in the // import file will override this value. WCHAR chColSep; // Column Separator -- // DEFAULT_DELIM is used if this value is zero WCHAR chQuote; // String enclosing character -- // DEFAULT_QUOTE is used if this value is zero WCHAR chMVSep; // Multi-value Property Separator -- // DEFAULT_MV_SEP is used if this value is zero WCHAR creserved; // alignment CALLBACKPROGRESS ProgressCallBacks; // Progress call-back entry points ERROR_CALLBACK ErrorCallback; LPWSTR pszNTDomain; // Name of NT Domain in which to lookup / create NT accounts. // Defaults to current logon domain if NULL or empty LPWSTR pszCreateTemplate; // DN of the Default User (NULL if none) from which // to draw template values } BIMPORT_PARMSW, *PBIMPORT_PARMSW, *LPBIMPORT_PARMSW; typedef struct _BIMPORT_PARMSA { // NOTE: the order of the first three fields of this structure // should NOT be changed. DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control import action HWND hwndParent; // Windows handle to use when displaying message boxes LPSTR pszImportFile; // Fully qualified pathname to Import Data file // On Batch Import, objects are imported into // the DIT from this file. UINT uCodePage; // Code page specification for import file. // The following values are interpreted: // DAPI_UNICODE_FILE Import file is Unicode // Will return error if file is ANSI // 0 Auto-detect file type // If ANSI, assume CP_ACP // other File contains text in the // specified code page // Will return error if file is Unicode // Will return error if code page is not // supported by the system LPSTR pszDSAName; // Computer name of DSA to update // Default: local DSA (if operating) // if no local DSA, first DSA found // on network is used LPSTR pszBasePoint; // DN of base-point in DIT for bulk operations // Default values: // if NULL, Messaging Site containing bound server // if empty string, enterprise containing bound server LPSTR pszContainer; // RDN of default container under which // to perform bulk import operations // NOTE: This container is assumed to be // at the level below that indicated by // the pszBasePoint. If NULL, // bulk operations will be performed at // the level below BaseImportPoint. // Container names specified in the // import file will override this value. CHAR chColSep; // Column Separator -- // DEFAULT_DELIM is used if this value is zero CHAR chQuote; // String enclosing character -- // DEFAULT_QUOTE is used if this value is zero CHAR chMVSep; // Multi-value Property Separator -- // DEFAULT_MV_SEP is used if this value is zero CHAR creserved; // alignment CALLBACKPROGRESS ProgressCallBacks; // Progress call-back entry points ERROR_CALLBACK ErrorCallback; LPSTR pszNTDomain; // Name of NT Domain in which to lookup / create NT accounts. // Defaults to current logon domain if NULL or empty LPSTR pszCreateTemplate; // DN of the Default User (NULL if none) from which // to draw template values } BIMPORT_PARMSA, *PBIMPORT_PARMSA, *LPBIMPORT_PARMSA; #ifdef UNICODE typedef BIMPORT_PARMSW BIMPORT_PARMS; typedef PBIMPORT_PARMSW PBIMPORT_PARMS; typedef LPBIMPORT_PARMSW LPBIMPORT_PARMS; #else typedef BIMPORT_PARMSA BIMPORT_PARMS; typedef PBIMPORT_PARMSA PBIMPORT_PARMS; typedef LPBIMPORT_PARMSA LPBIMPORT_PARMS; #endif // The BatchImport function provides single-call BatchImport from the // specified import file. All import parameters are specified in the // BIMPORT_PARMS structure pointed to by lpBimportParms. // The return value indicates the number of errors logged in the // NT Application log. Please note that this does not indicate // success or failure of the Batch Import. // UI and Logging of errors and warnings into the Application log // are controlled through import parameters. extern DWORD APIENTRY BatchImportW (LPBIMPORT_PARMSW lpBimportParms); extern DWORD APIENTRY BatchImportA (LPBIMPORT_PARMSA lpBimportParms); #ifdef UNICODE #define BatchImport BatchImportW #else #define BatchImport BatchImportA #endif /******************************************************************************* * * Batch Directory Export Interface definitions * ********************************************************************************/ typedef struct _BEXPORT_PARMSW { DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control export action HWND hwndParent; // Windows handle to use when displaying message boxes LPWSTR pszExportFile; // Fully qualified pathname of file to export into // Ignored if ExportCallback is specified UINT uCodePage; // Code page specification for export file. // The following values are interpreted: // DAPI_UNICODE_FILE Export file is Unicode. // Will return error // if file exists and is ANSI // 0 Auto-detect file type // If file does not exist, // export file will contain CP_ACP text. // If file exists and is ANSI // export file will contain CP_ACP text. // If file exists and is Unicode, // export file will contain Unicode // other Export text to file in the // specified code page // Will return error // if file exists and is Unicode // Will return error if code page is not // supported by the system LPWSTR pszDSAName; // Computer name of DSA from which to export // Default: local DSA (if operating) // if no local DSA, first DSA found // on network is used LPWSTR pszBasePoint; // DN of base-point in DIT for bulk operations // Default values: // if NULL, Messaging Site containing bound server // if empty string, enterprise containing bound server LPWSTR pszContainer; // RDN of container from which to export objects // NOTE: This container is assumed to be // at the level below that indicated by // the pszBasePoint. If NULL, // the contents of all containers below // the BaseImportPoint will be exported. WCHAR chColSep; // Column Separator -- // DEFAULT_DELIM is used if this value is zero WCHAR chQuote; // String enclosing character -- // DEFAULT_QUOTE is used if this value is zero WCHAR chMVSep; // Multi-value Property Separator -- // DEFAULT_MV_SEP is used if this value is zero WCHAR cReserved; // alignment CALLBACKPROGRESS ProgressCallBacks; // Progress call-back entry points ERROR_CALLBACK ErrorCallback; EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to // receive callback on each exported item // NOTE: Callback functions are optional // The default export function (write to file) // will be called if these pointers are NULL PDAPI_ENTRY pAttributes; // DAPI_ENTRY filled with names of attributes to export // Optional if pszExportFile specified // Required if ExportCallback specified LPWSTR pszHomeServer; // Name of server for server-associated export LPWSTR * rgpszClasses; // array of pointers to zero-terminated object classes to export // The last entry must be NULL // NOTE: The Directory will be queried for objects // of the classes in the specified order. ULONG ulUSNBase; // Base USN to use for export restriction. // If non-zero, only items having USN-Changed >= ulUSNBase will be exported LPVOID pReserved; // Reserved -- Must be zero } BEXPORT_PARMSW, *PBEXPORT_PARMSW, *LPBEXPORT_PARMSW; typedef struct _BEXPORT_PARMSA { DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control export action HWND hwndParent; // Windows handle to use when displaying message boxes LPSTR pszExportFile; // Fully qualified pathname of file to export into // Ignored if ExportCallback is specified UINT uCodePage; // Code page specification for export file. // The following values are interpreted: // DAPI_UNICODE_FILE Export file is Unicode. // Will return error // if file exists and is ANSI // 0 Auto-detect file type // If file does not exist, // export file will contain CP_ACP text. // If file exists and is ANSI // export file will contain CP_ACP text. // If file exists and is Unicode, // export file will contain Unicode // other Export text to file in the // specified code page // Will return error // if file exists and is Unicode // Will return error if code page is not // supported by the system LPSTR pszDSAName; // Computer name of DSA from which to export // Default: local DSA (if operating) // if no local DSA, first DSA found // on network is used LPSTR pszBasePoint; // DN of base-point in DIT for bulk operations // Default values: // if NULL, Messaging Site containing bound server // if empty string, enterprise containing bound server LPSTR pszContainer; // RDN of container from which to export objects // NOTE: This container is assumed to be // at the level below that indicated by // the pszBasePoint. If NULL, // the contents of all containers below // the BaseImportPoint will be exported. CHAR chColSep; // Column Separator -- // DEFAULT_DELIM is used if this value is zero CHAR chQuote; // String enclosing character -- // DEFAULT_QUOTE is used if this value is zero CHAR chMVSep; // Multi-value Property Separator -- // DEFAULT_MV_SEP is used if this value is zero CHAR cReserved; // alignment CALLBACKPROGRESS ProgressCallBacks; // Progress call-back entry points ERROR_CALLBACK ErrorCallback; EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to // receive callback on each exported item // NOTE: Callback functions are optional // The default export function (write to file) // will be called if these pointers are NULL PDAPI_ENTRY pAttributes; // DAPI_ENTRY filled with names of attributes to export // Optional if pszExportFile specified // Required if ExportCallback specified LPSTR pszHomeServer; // Name of server for server-associated export LPSTR * rgpszClasses; // array of pointers to zero-terminated object classes to export // The last entry must be NULL // NOTE: The Directory will be queried for objects // of the classes in the specified order. ULONG ulUSNBase; // Base USN to use for export restriction. // If non-zero, only items having USN-Changed >= ulUSNBase will be exported LPVOID pReserved; // Reserved -- Must be zero } BEXPORT_PARMSA, *PBEXPORT_PARMSA, *LPBEXPORT_PARMSA; #ifdef UNICODE typedef BEXPORT_PARMSW BEXPORT_PARMS; typedef PBEXPORT_PARMSW PBEXPORT_PARMS; typedef LPBEXPORT_PARMSW LPBEXPORT_PARMS; #else typedef BEXPORT_PARMSA BEXPORT_PARMS; typedef PBEXPORT_PARMSA PBEXPORT_PARMS; typedef LPBEXPORT_PARMSA LPBEXPORT_PARMS; #endif // Batch Export entry points // The BatchExport function provides single-call BatchExport from the // specified import file. All import parameters are specified in the // BEXPORT_PARMS structure pointed to by lpBexportParms. // The return value indicates the number of errors logged in the // NT Application log. Please note that this does not indicate // success or failure of the Batch Export. // UI and Logging of errors and warnings into the Application log // are controlled through import parameters. extern DWORD APIENTRY BatchExportW (LPBEXPORT_PARMSW lpBexportParms); extern DWORD APIENTRY BatchExportA (LPBEXPORT_PARMSA lpBexportParms); #ifdef UNICODE #define BatchExport BatchExportW #else #define BatchExport BatchExportA #endif /******************************************************************************* * * Single-Object Interface definitions * ********************************************************************************/ typedef struct _DAPI_PARMSW { DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control import action // See Import Control flags defined above. LPWSTR pszDSAName; // Computer name of DSA to update // Default: local DSA (if operating) // if no local DSA, first DSA found // on network is used LPWSTR pszBasePoint; // DN of base-point in DIT for bulk operations // Default values: // if NULL, Messaging Site containing bound server // if empty string, enterprise containing bound server LPWSTR pszContainer; // RDN of default container under which // to perform bulk import operations // NOTE: This container is assumed to be // at the level below that indicated by // the pszBasePoint. If NULL, // bulk operations will be performed at // the level below BaseImportPoint. // Container names specified in the // import file will override this value. LPWSTR pszNTDomain; // Name of NT Domain in which to lookup accounts // and to create NT accounts. // Current logon domain is used if NULL or empty string. LPWSTR pszCreateTemplate;// DN of the template object used for default values PDAPI_ENTRY pAttributes; // DAPI_ENTRY filled with default attribute list } DAPI_PARMSW, *PDAPI_PARMSW, FAR *LPDAPI_PARMSW; typedef struct _DAPI_PARMSA { DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control import action // See Import Control flags defined above. LPSTR pszDSAName; // Computer name of DSA to update // Default: local DSA (if operating) // if no local DSA, first DSA found // on network is used LPSTR pszBasePoint; // DN of base-point in DIT for bulk operations // Default values: // if NULL, Messaging Site containing bound server // if empty string, enterprise containing bound server LPSTR pszContainer; // RDN of default container under which // to perform bulk import operations // NOTE: This container is assumed to be // at the level below that indicated by // the pszBasePoint. If NULL, // bulk operations will be performed at // the level below BaseImportPoint. // Container names specified in the // import file will override this value. LPSTR pszNTDomain; // Name of NT Domain in which to lookup accounts // and to create NT accounts. // Current logon domain is used if NULL or empty string. LPSTR pszCreateTemplate; // DN of the template object used for default values PDAPI_ENTRY pAttributes; // DAPI_ENTRY filled with default attribute list } DAPI_PARMSA, *PDAPI_PARMSA, FAR *LPDAPI_PARMSA; #ifdef UNICODE typedef DAPI_PARMSW DAPI_PARMS; typedef PDAPI_PARMSW PDAPI_PARMS; typedef LPDAPI_PARMSW LPDAPI_PARMS; #else typedef DAPI_PARMSA DAPI_PARMS; typedef PDAPI_PARMSA PDAPI_PARMS; typedef LPDAPI_PARMSA LPDAPI_PARMS; #endif typedef LPVOID DAPI_HANDLE; typedef LPVOID * PDAPI_HANDLE; typedef LPVOID FAR * LPDAPI_HANDLE; #define DAPI_INVALID_HANDLE ((DAPI_HANDLE) -1) // DAPIStart initializes a DAPI session. // for use by DAPIRead and DAPIWrite. The return value is 0 if no errors // are encountered. A pointer to a DAPI_EVENT structure is returned if an // error is encountered. // NOTE: The DAPI_HANDLE must be returned via a call to DAPIEnd. // If a non-NULL value is returned, its memory must be freed by // a call to DAPIFreeMemory extern PDAPI_EVENTW APIENTRY DAPIStartW (LPDAPI_HANDLE lphDAPISession, LPDAPI_PARMSW lpDAPIParms); extern PDAPI_EVENTA APIENTRY DAPIStartA (LPDAPI_HANDLE lphDAPISession, LPDAPI_PARMSA lpDAPIParms); #ifdef UNICODE #define DAPIStart DAPIStartW #else #define DAPIStart DAPIStartA #endif // DAPIEnd invalidates the DAPI_HANDLE obtained by the call to DAPIStart. // NOTE: There are no separate Unicode / Ansi entry points defined extern void APIENTRY DAPIEnd (LPDAPI_HANDLE lphDAPISession); // DAPIRead() Reads indicated attributes from the named Directory Object // Parameters: // Returned value: NULL indicates no difficulties encountered. // Else, pointer to structure containing description of // error(s) or warning(s) encountered. // Must be freed by call to DAPIFreeMemory. // hDAPISession DAPI Session handle obtained via InitDAPISession // dwFlags control operation // pszObjectName String containing name of object to read. // If specified as RDN, combined w/ session's // pszBasePoint and pszParentContainer. // If specified w/ prefix of "/cn=", the string // is concatenated to the session pszBasePoint. // If specified w/ prefix of "/o=", the string // is taken to be a fully-qualified DN. // pAttList Pointer to DAPI_ENTRY structure containing names of // attributes to read. The session default list is // overridden for the present call only. // ppValues Address of variable receiving pointer to DAPI_ENTRY // structure containing the values read from the DIT entry. // The pointer returned must be freed by call to // DAPIFreeMemory. // ppAttributes Address of variable receiving pointer to DAPI_ENTRY // structure containing the names of attributes read // from the DIT IFF DAPI_ALL_ATTRIBUTES or DAPI_LEGAL_ATTRIBUTES // were set in dwFlags. // The pointer returned must be freed by call to // DAPIFreeMemory. extern PDAPI_EVENTW APIENTRY DAPIReadW (DAPI_HANDLE hDAPISession, DWORD dwFlags, LPWSTR pszObjectName, PDAPI_ENTRY pAttList, PDAPI_ENTRY * ppValues, PDAPI_ENTRY * ppAttributes); extern PDAPI_EVENTA APIENTRY DAPIReadA (DAPI_HANDLE hDAPISession, DWORD dwFlags, LPSTR pszObjectName, PDAPI_ENTRY pAttList, PDAPI_ENTRY * ppValues, PDAPI_ENTRY * ppAttributes); #ifdef UNICODE #define DAPIRead DAPIReadW #else #define DAPIRead DAPIReadA #endif // DAPIWrite() // Perform the indicated write operation on the named object // Returned value: NULL indicates no difficulties encountered. // Else, pointer to structure containing description of // error(s) or warning(s) encountered. // Must be freed by call to DAPIFreeMemory. // Parameters: // hDAPISession DAPI Session handle obtained via InitDAPISession // dwFlags Operational control // pAttributes Pointer to DAPI_ENTRY structure containing names of // attributes to write. The session default list is // used if this parameter is NULL // pValues Pointer to DAPI_ENTRY structure containing the values // to set on the DIT entry. // lpulUSN Optional: Address of variable receiving USN of updated // DIT entry. May be specified as NULL to suppress this // return value. // lppszCreatedAccount Address receiving pointer to name of created NT account // lppszPassword Address receiving pointer to password generated if // NT Account is created. extern PDAPI_EVENTW APIENTRY DAPIWriteW (DAPI_HANDLE hDAPISession, DWORD dwFlags, PDAPI_ENTRY pAttributes, PDAPI_ENTRY pValues, PULONG lpulUSN, LPWSTR * lppszCreatedAccount, LPWSTR * lppszPassword); extern PDAPI_EVENTA APIENTRY DAPIWriteA (DAPI_HANDLE hDAPISession, DWORD dwFlags, PDAPI_ENTRY pAttributes, PDAPI_ENTRY pValues, PULONG lpulUSN, LPSTR * lppszCreatedAccount, LPSTR * lppszPassword); #ifdef UNICODE #define DAPIWrite DAPIWriteW #else #define DAPIWrite DAPIWriteA #endif /******************************************************************************* * procedure : DAPIAllocBuffer * * purpose : Allocate buffer, logically linking it to the pvAllocBase * The first buffer in logically linked set of allocations must be * freed by call to DAPIFreeMemory * * parameters : cbSize dword containing size of allocation request (in bytes) * pvAllocBase base for logical linking of allocated block * May be NULL * If non-NULL, must be a block previously allocated * by DAPIAllocBuffer or returned by DAPI function * * returns : ptr to allocated block * * history : * ********************************************************************************/ extern LPVOID APIENTRY DAPIAllocBuffer (DWORD cbSize, LPVOID pvAllocBase); /******************************************************************************* * procedure : DAPIFreeMemory * * purpose : Release memory allocated for structures returned by DAPI calls. * * parameters : lpVoid pointer to block to free * * returns : nothing * * history : * ********************************************************************************/ extern void APIENTRY DAPIFreeMemory (LPVOID lpVoid); /* * NetUserList interface definitions */ // When getting callbacks from NTExport / NWExport, these indices // can be used to interpret the value array returned in the callback // >>>> NOTE: These indices are NOT valid for Bexport callback! <<<< #define NET_CLASS 0 #define NET_COMMON_NAME 1 #define NET_DISPLAY_NAME 2 #define NET_HOME_SERVER 3 #define NET_COMMENT 4 /* NTExport only */ #define NTEXP_ENTRY_COUNT 5 /* number of parts in NT User export */ #define NWEXP_ENTRY_COUNT 4 /* number of parts in NetWare user export */ /******************************************************************************* * * NTIMPORT Interface definitions * ********************************************************************************/ typedef struct _NTEXPORT_PARMSW { DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control the user export HWND hwndParent; // Windows handle to use when displaying message boxes LPWSTR pszExportFile; // Name of file to create // Ignored if using callbacks CALLBACKPROGRESS ProgressCallBacks;// Progress call-back entry points ERROR_CALLBACK ErrorCallback; EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to // receive callback on each exported item // NOTE: Callback functions are optional // The default export function (write to file) // will be called if these pointers are NULL LPWSTR pszDCName; // Name of Domain Controller from which to get users // NOTE: Specification of Domain Controller overrides // the NTDomain LPWSTR pszNTDomain; // Name of Domain from which to read users // If neither pszNTDomain and pszDCName are specified, // users are extracted from the current login domain } NTEXPORT_PARMSW, *PNTEXPORT_PARMSW, FAR *LPNTEXPORT_PARMSW; typedef struct _NTEXPORT_PARMSA { DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control the user export HWND hwndParent; // Windows handle to use when displaying message boxes LPSTR pszExportFile; // Name of file to create // Ignored if using callbacks CALLBACKPROGRESS ProgressCallBacks;// Progress call-back entry points ERROR_CALLBACK ErrorCallback; EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to // receive callback on each exported item // NOTE: Callback functions are optional // The default export function (write to file) // will be called if these pointers are NULL LPSTR pszDCName; // NOTE: Specification of Domain Controller overrides // the NTDomain // Name of Domain from which to read users LPSTR pszNTDomain; // If neither pszNTDomain and pszDCName are specified, // users are extracted from the current login domain } NTEXPORT_PARMSA, *PNTEXPORT_PARMSA, FAR *LPNTEXPORT_PARMSA; #ifdef UNICODE typedef NTEXPORT_PARMSW NTEXPORT_PARMS; typedef PNTEXPORT_PARMSW PNTEXPORT_PARMS; typedef LPNTEXPORT_PARMSW LPNTEXPORT_PARMS; #else typedef NTEXPORT_PARMSA NTEXPORT_PARMS; typedef PNTEXPORT_PARMSA PNTEXPORT_PARMS; typedef LPNTEXPORT_PARMSA LPNTEXPORT_PARMS; #endif extern DWORD APIENTRY NTExportW (LPNTEXPORT_PARMSW pNTExportParms); extern DWORD APIENTRY NTExportA (LPNTEXPORT_PARMSA pNTExportParms); #ifdef UNICODE #define NTExport NTExportW #else #define NTExport NTExportA #endif /******************************************************************************* * * NWIMPORT Interface definitions * ********************************************************************************/ typedef struct _NWEXPORT_PARMSW { DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control the user export HWND hwndParent; // Windows handle to use when displaying message boxes LPWSTR pszExportFile; // Name of file to create // Ignored if using callbacks CALLBACKPROGRESS ProgressCallBacks;// Progress call-back entry points ERROR_CALLBACK ErrorCallback; EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to // receive callback on each exported item // NOTE: Callback functions are optional // The default export function (write to file) // will be called if these pointers are NULL LPWSTR pszFileServer; // Name of the file server to connect to LPWSTR pszUserName; // User Name -- Must have administrator priviliges LPWSTR pszPassword; // Password to connect to the server } NWEXPORT_PARMSW, *PNWEXPORT_PARMSW, *LPNWEXPORT_PARMSW; typedef struct _NWEXPORT_PARMSA { DWORD dwDAPISignature; DWORD dwFlags; // Bitmapped flags that control the user export HWND hwndParent; // Windows handle to use when displaying message boxes LPSTR pszExportFile; // Name of file to create // Ignored if using callbacks CALLBACKPROGRESS ProgressCallBacks;// Progress call-back entry points ERROR_CALLBACK ErrorCallback; EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to // receive callback on each exported item // NOTE: Callback functions are optional // The default export function (write to file) // will be called if these pointers are NULL LPSTR pszFileServer; // Name of the file server to connect to LPSTR pszUserName; // User Name -- Must have administrator priviliges LPSTR pszPassword; // Password to connect to the server } NWEXPORT_PARMSA, *PNWEXPORT_PARMSA, *LPNWEXPORT_PARMSA; #ifdef UNICODE typedef NWEXPORT_PARMSW NWEXPORT_PARMS; typedef PNWEXPORT_PARMSW PNWEXPORT_PARMS; typedef LPNWEXPORT_PARMSW LPNWEXPORT_PARMS; #else typedef NWEXPORT_PARMSA NWEXPORT_PARMS; typedef PNWEXPORT_PARMSA PNWEXPORT_PARMS; typedef LPNWEXPORT_PARMSA LPNWEXPORT_PARMS; #endif extern DWORD APIENTRY NWExportW (LPNWEXPORT_PARMSW pNWExportParms); extern DWORD APIENTRY NWExportA (LPNWEXPORT_PARMSA pNWExportParms); #ifdef UNICODE #define NWExport NWExportW #else #define NWExport NWExportA #endif // Definitions for the DAPIGetSiteInfo call typedef struct _NAME_INFOA { LPSTR pszName; // Simple object name LPSTR pszDNString; // DN of object LPSTR pszDisplayName; // Display name of object } NAME_INFOA, *PNAME_INFOA; typedef struct _NAME_INFOW { LPWSTR pszName; // Simple object name LPWSTR pszDNString; // DN of object LPWSTR pszDisplayName; // Display name of object } NAME_INFOW, *PNAME_INFOW; typedef struct _PSITE_INFOA { LPSTR pszCountry; // Country code NAME_INFOA objServer; // Name information for server NAME_INFOA objSite; // Name information for site containing server NAME_INFOA objEnterprise; // Name information for enterprise containing server } SITE_INFOA, *PSITE_INFOA; typedef struct _PSITE_INFOW { LPWSTR pszCountry; // Country code NAME_INFOW objServer; // Name information for server NAME_INFOW objSite; // Name information for site containing server NAME_INFOW objEnterprise; // Name information for enterprise containing server } SITE_INFOW, *PSITE_INFOW; #ifdef UNICODE typedef NAME_INFOW NAME_INFO; typedef PNAME_INFOW PNAME_INFO; typedef SITE_INFOW SITE_INFO; typedef PSITE_INFOW PSITE_INFO; #else typedef NAME_INFOA NAME_INFO; typedef PNAME_INFOA PNAME_INFO; typedef SITE_INFOA SITE_INFO; typedef PSITE_INFOA PSITE_INFO; #endif extern PDAPI_EVENTA APIENTRY DAPIGetSiteInfoA ( DWORD dwFlags, // Flags for request LPSTR pszDSA, // name of DSA from which to get information PSITE_INFOA * ppSiteInfo // Address receiving pointer to pSiteInfo structure // containing return data ); extern PDAPI_EVENTW APIENTRY DAPIGetSiteInfoW ( DWORD dwFlags, // Flags for request LPWSTR pszDSA, // name of DSA from which to get information PSITE_INFOW * ppSiteInfo // Address receiving pointer to pSiteInfo structure // containing return dataname of DSA from which to read schema ); #ifdef UNICODE #define DAPIGetSiteInfo DAPIGetSiteInfoW #else #define DAPIGetSiteInfo DAPIGetSiteInfoA #endif #ifdef __cplusplus } #endif #endif // _DAPI_INCLUDED