JwaNtDsApi.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:203k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { DC and Replication Management API interface Unit for Object Pascal           }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: ntdsapi.h, released June 2000. The original Pascal     }
  9. { code is: NtDsApi.pas, released December 2000. The initial developer of the   }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaNtDsApi;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "ntdsapi.h"'}
  47. {$HPPEMIT ''}
  48. {$HPPEMIT 'typedef PDS_REPSYNCALL_ERRINFOW *PPDS_REPSYNCALL_ERRINFOW'}
  49. {$HPPEMIT 'typedef PDS_REPSYNCALL_ERRINFOA *PPDS_REPSYNCALL_ERRINFOA'}
  50. {$HPPEMIT '#ifdef UNICODE'}
  51. {$HPPEMIT 'typedef PPDS_REPSYNCALL_ERRINFOW PPDS_REPSYNCALL_ERRINFO'}
  52. {$HPPEMIT '#else'}
  53. {$HPPEMIT 'typedef PPDS_REPSYNCALL_ERRINFOA PPDS_REPSYNCALL_ERRINFO'}
  54. {$HPPEMIT '#endif'}
  55. {$HPPEMIT ''}
  56. {$I WINDEFINES.INC}
  57. interface
  58. uses
  59.   JwaWinBase, JwaWinType, JwaWinNT, JwaWinNLS, JwaRpcDce, JwaSchedule;
  60. //////////////////////////////////////////////////////////////////////////
  61. //                                                                      //
  62. // Data definitions                                                     //
  63. //                                                                      //
  64. //////////////////////////////////////////////////////////////////////////
  65. // Following constants define the Active Directory Behavior
  66. // Version numbers.
  67. const
  68.   DS_BEHAVIOR_WIN2000                          = 0;
  69.   {$EXTERNALSYM DS_BEHAVIOR_WIN2000}
  70.   DS_BEHAVIOR_WIN_DOT_NET_WITH_MIXED_DOMAINS   = 1;
  71.   {$EXTERNALSYM DS_BEHAVIOR_WIN_DOT_NET_WITH_MIXED_DOMAINS}
  72.   DS_BEHAVIOR_WIN_DOT_NET                      = 2;
  73.   {$EXTERNALSYM DS_BEHAVIOR_WIN_DOT_NET}
  74.   // (MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT))
  75.   DS_DEFAULT_LOCALE = DWORD((DWORD(SORT_DEFAULT) shl 16) or ((SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH));
  76.   {$EXTERNALSYM DS_DEFAULT_LOCALE}
  77.   DS_DEFAULT_LOCALE_COMPARE_FLAGS = (NORM_IGNORECASE or NORM_IGNOREKANATYPE or
  78.     NORM_IGNORENONSPACE or NORM_IGNOREWIDTH or SORT_STRINGSORT);
  79.   {$EXTERNALSYM DS_DEFAULT_LOCALE_COMPARE_FLAGS}
  80. // When booted to DS mode, this event is signalled when the DS has completed
  81. // its initial sync attempts.  The period of time between system startup and
  82. // this event's state being set is indeterminate from the local service's
  83. // standpoint.  In the meantime the contents of the DS should be considered
  84. // incomplete / out-dated, and the machine will not be advertised as a domain
  85. // controller to off-machine clients.  Other local services that rely on
  86. // information published in the DS should avoid accessing (or at least
  87. // relying on) the contents of the DS until this event is set.
  88.   DS_SYNCED_EVENT_NAME   = 'NTDSInitialSyncsCompleted';
  89.   {$EXTERNALSYM DS_SYNCED_EVENT_NAME}
  90.   DS_SYNCED_EVENT_NAME_W = 'NTDSInitialSyncsCompleted';
  91.   {$EXTERNALSYM DS_SYNCED_EVENT_NAME_W}
  92. // Permissions bits used in security descriptors in the directory.
  93.   ACTRL_DS_OPEN           = $00000000;
  94.   {$EXTERNALSYM ACTRL_DS_OPEN}
  95.   ACTRL_DS_CREATE_CHILD   = $00000001;
  96.   {$EXTERNALSYM ACTRL_DS_CREATE_CHILD}
  97.   ACTRL_DS_DELETE_CHILD   = $00000002;
  98.   {$EXTERNALSYM ACTRL_DS_DELETE_CHILD}
  99.   ACTRL_DS_LIST           = $00000004;
  100.   {$EXTERNALSYM ACTRL_DS_LIST}
  101.   ACTRL_DS_SELF           = $00000008;
  102.   {$EXTERNALSYM ACTRL_DS_SELF}
  103.   ACTRL_DS_READ_PROP      = $00000010;
  104.   {$EXTERNALSYM ACTRL_DS_READ_PROP}
  105.   ACTRL_DS_WRITE_PROP     = $00000020;
  106.   {$EXTERNALSYM ACTRL_DS_WRITE_PROP}
  107.   ACTRL_DS_DELETE_TREE    = $00000040;
  108.   {$EXTERNALSYM ACTRL_DS_DELETE_TREE}
  109.   ACTRL_DS_LIST_OBJECT    = $00000080;
  110.   {$EXTERNALSYM ACTRL_DS_LIST_OBJECT}
  111.   ACTRL_DS_CONTROL_ACCESS = $00000100;
  112.   {$EXTERNALSYM ACTRL_DS_CONTROL_ACCESS}
  113. // generic read
  114.   DS_GENERIC_READ = STANDARD_RIGHTS_READ or ACTRL_DS_LIST or ACTRL_DS_READ_PROP or
  115.     ACTRL_DS_LIST_OBJECT;
  116.   {$EXTERNALSYM DS_GENERIC_READ}
  117. // generic execute
  118.   DS_GENERIC_EXECUTE = ((STANDARD_RIGHTS_EXECUTE) or (ACTRL_DS_LIST));
  119.   {$EXTERNALSYM DS_GENERIC_EXECUTE}
  120. // generic right
  121.   DS_GENERIC_WRITE = ((STANDARD_RIGHTS_WRITE) or (ACTRL_DS_SELF) or
  122.     (ACTRL_DS_WRITE_PROP));
  123.   {$EXTERNALSYM DS_GENERIC_WRITE}
  124. // generic all
  125.   DS_GENERIC_ALL = ((STANDARD_RIGHTS_REQUIRED) or (ACTRL_DS_CREATE_CHILD) or
  126.     (ACTRL_DS_DELETE_CHILD) or (ACTRL_DS_DELETE_TREE) or (ACTRL_DS_READ_PROP) or
  127.     (ACTRL_DS_WRITE_PROP) or (ACTRL_DS_LIST) or (ACTRL_DS_LIST_OBJECT) or
  128.     (ACTRL_DS_CONTROL_ACCESS) or (ACTRL_DS_SELF));
  129.   {$EXTERNALSYM DS_GENERIC_ALL}
  130. type
  131.   DS_NAME_FORMAT = (
  132.     // unknown name type
  133.     DS_UNKNOWN_NAME,
  134.     // eg: CN=User Name,OU=Users,DC=Example,DC=Microsoft,DC=Com
  135.     DS_FQDN_1779_NAME,
  136.     // eg: ExmapleUserName
  137.     // Domain-only version includes trailing '\'.
  138.     DS_NT4_ACCOUNT_NAME,
  139.     // Probably "User Name" but could be something else.  I.e. The
  140.     // display name is not necessarily the defining RDN.
  141.     DS_DISPLAY_NAME,
  142.     // obsolete - see #define later
  143.     // DS_DOMAIN_SIMPLE_NAME,
  144.     DS_STUB_4,
  145.     // obsolete - see #define later
  146.     // DS_ENTERPRISE_SIMPLE_NAME,
  147.     DS_STUB_5,
  148.     // String-ized GUID as returned by IIDFromString().
  149.     // eg: {4fa050f0-f561-11cf-bdd9-00aa003a77b6}
  150.     DS_UNIQUE_ID_NAME,
  151.     // eg: example.microsoft.com/software/user name
  152.     // Domain-only version includes trailing '/'.
  153.     DS_CANONICAL_NAME,
  154.     // eg: usern@example.microsoft.com
  155.     DS_USER_PRINCIPAL_NAME,
  156.     // Same as DS_CANONICAL_NAME except that rightmost '/' is
  157.     // replaced with 'n' - even in domain-only case.
  158.     // eg: example.microsoft.com/softwarenuser name
  159.     DS_CANONICAL_NAME_EX,
  160.     // eg: www/www.microsoft.com@example.com - generalized service principal
  161.     // names.
  162.     DS_SERVICE_PRINCIPAL_NAME,
  163.     // This is the string representation of a SID.  Invalid for formatDesired.
  164.     // See sddl.h for SID binary <--> text conversion routines.
  165.     // eg: S-1-5-21-397955417-626881126-188441444-501
  166.     DS_SID_OR_SID_HISTORY_NAME,
  167.     // Pseudo-name format so GetUserNameEx can return the DNS domain name to
  168.     // a caller.  This level is not supported by the DS APIs.
  169.     DS_DNS_DOMAIN_NAME);
  170.   {$EXTERNALSYM DS_NAME_FORMAT}
  171.   TDsNameFormat = DS_NAME_FORMAT;
  172. // Map old name formats to closest new format so that old code builds
  173. // against new headers w/o errors and still gets (almost) correct result.
  174. const
  175.   DS_DOMAIN_SIMPLE_NAME     = DS_USER_PRINCIPAL_NAME;
  176.   {$EXTERNALSYM DS_DOMAIN_SIMPLE_NAME}
  177.   DS_ENTERPRISE_SIMPLE_NAME = DS_USER_PRINCIPAL_NAME;
  178.   {$EXTERNALSYM DS_ENTERPRISE_SIMPLE_NAME}
  179. type
  180.   DS_NAME_FLAGS = DWORD;
  181.   {$EXTERNALSYM DS_NAME_FLAGS}
  182.   TDsNameFlags = DS_NAME_FLAGS;
  183. const
  184.     DS_NAME_NO_FLAGS = $0;
  185.     {$EXTERNALSYM DS_NAME_NO_FLAGS}
  186.     // Perform a syntactical mapping at the client (if possible) without
  187.     // going out on the wire.  Returns DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING
  188.     // if a purely syntactical mapping is not possible.
  189.     DS_NAME_FLAG_SYNTACTICAL_ONLY = $1;
  190.     {$EXTERNALSYM DS_NAME_FLAG_SYNTACTICAL_ONLY}
  191.     // Force a trip to the DC for evaluation, even if this could be
  192.     // locally cracked syntactically.
  193.     DS_NAME_FLAG_EVAL_AT_DC = $2;
  194.     {$EXTERNALSYM DS_NAME_FLAG_EVAL_AT_DC}
  195.     // The call fails if the DC is not a GC
  196.     DS_NAME_FLAG_GCVERIFY = $4;
  197.     {$EXTERNALSYM DS_NAME_FLAG_GCVERIFY}
  198.     // Enable cross forest trust referral
  199.     DS_NAME_FLAG_TRUST_REFERRAL = $8;
  200.     {$EXTERNALSYM DS_NAME_FLAG_TRUST_REFERRAL}
  201. type
  202.   DS_NAME_ERROR = (
  203.     DS_NAME_NO_ERROR,
  204.     // Generic processing error.
  205.     DS_NAME_ERROR_RESOLVING,
  206.     // Couldn't find the name at all - or perhaps caller doesn't have
  207.     // rights to see it.
  208.     DS_NAME_ERROR_NOT_FOUND,
  209.     // Input name mapped to more than one output name.
  210.     DS_NAME_ERROR_NOT_UNIQUE,
  211.     // Input name found, but not the associated output format.
  212.     // Can happen if object doesn't have all the required attributes.
  213.     DS_NAME_ERROR_NO_MAPPING,
  214.     // Unable to resolve entire name, but was able to determine which
  215.     // domain object resides in.  Thus DS_NAME_RESULT_ITEM?.pDomain
  216.     // is valid on return.
  217.     DS_NAME_ERROR_DOMAIN_ONLY,
  218.     // Unable to perform a purely syntactical mapping at the client
  219.     // without going out on the wire.
  220.     DS_NAME_ERROR_NO_SYNTACTICAL_MAPPING,
  221.     // The name is from an external trusted forest.
  222.     DS_NAME_ERROR_TRUST_REFERRAL);
  223.   {$EXTERNALSYM DS_NAME_ERROR}
  224.   TDsNameError = DS_NAME_ERROR;
  225. const
  226.   DS_NAME_LEGAL_FLAGS = (DS_NAME_FLAG_SYNTACTICAL_ONLY);
  227.   {$EXTERNALSYM DS_NAME_LEGAL_FLAGS}
  228. type
  229.   DS_SPN_NAME_TYPE = (
  230.     // "paulle-nec.ntwksta.ms.com"
  231.     DS_SPN_DNS_HOST,
  232.     // "cn=paulle-nec,ou=computers,dc=ntwksta,dc=ms,dc=com"
  233.     DS_SPN_DN_HOST,
  234.     // "paulle-nec"
  235.     DS_SPN_NB_HOST,
  236.     // "ntdev.ms.com"
  237.     DS_SPN_DOMAIN,
  238.     // "ntdev"
  239.     DS_SPN_NB_DOMAIN,
  240.     // "cn=anRpcService,cn=RPC Services,cn=system,dc=ms,dc=com"
  241.     // "cn=aWsService,cn=Winsock Services,cn=system,dc=ms,dc=com"
  242.     // "cn=aService,dc=itg,dc=ms,dc=com"
  243.     // "www.ms.com", "ftp.ms.com", "ldap.ms.com"
  244.     // "products.ms.com"
  245.     DS_SPN_SERVICE);
  246.   {$EXTERNALSYM DS_SPN_NAME_TYPE}
  247.   TDsSpnNameType = DS_SPN_NAME_TYPE;
  248.   DS_SPN_WRITE_OP = (
  249.         DS_SPN_ADD_SPN_OP,          // add SPNs
  250.         DS_SPN_REPLACE_SPN_OP,      // set all SPNs
  251.         DS_SPN_DELETE_SPN_OP);      // Delete SPNs
  252.   {$EXTERNALSYM DS_SPN_WRITE_OP}
  253.   TDsSpnWriteOp = DS_SPN_WRITE_OP;
  254.   PDS_NAME_RESULT_ITEMA = ^DS_NAME_RESULT_ITEMA;
  255.   {$EXTERNALSYM PDS_NAME_RESULT_ITEMA}
  256.   DS_NAME_RESULT_ITEMA = record
  257.     status: DWORD;  // DS_NAME_ERROR
  258.     pDomain: LPSTR; // DNS domain
  259.     pName: LPSTR;   // name in requested format
  260.   end;
  261.   {$EXTERNALSYM DS_NAME_RESULT_ITEMA}
  262.   TDsNameResultItemA = DS_NAME_RESULT_ITEMA;
  263.   PDsNameResultItemA = PDS_NAME_RESULT_ITEMA;
  264.   PDS_NAME_RESULTA = ^DS_NAME_RESULTA;
  265.   {$EXTERNALSYM PDS_NAME_RESULTA}
  266.   DS_NAME_RESULTA = record
  267.     cItems: DWORD;                 // item count
  268.     rItems: PDS_NAME_RESULT_ITEMA; // item array
  269.   end;
  270.   {$EXTERNALSYM DS_NAME_RESULTA}
  271.   TDsNameResultA = DS_NAME_RESULTA;
  272.   PDsNameResultA = PDS_NAME_RESULTA;
  273.   PDS_NAME_RESULT_ITEMW = ^DS_NAME_RESULT_ITEMW;
  274.   {$EXTERNALSYM PDS_NAME_RESULT_ITEMW}
  275.   DS_NAME_RESULT_ITEMW = record
  276.     status: DWORD;   // DS_NAME_ERROR
  277.     pDomain: LPWSTR; // DNS domain
  278.     pName: LPWSTR;   // name in requested format
  279.   end;
  280.   {$EXTERNALSYM DS_NAME_RESULT_ITEMW}
  281.   TDsNameResultItemW = DS_NAME_RESULT_ITEMW;
  282.   PDsNameResultItemW = PDS_NAME_RESULT_ITEMW;
  283.   PDS_NAME_RESULTW = ^DS_NAME_RESULTW;
  284.   {$EXTERNALSYM PDS_NAME_RESULTW}
  285.   DS_NAME_RESULTW = record
  286.     cItems: DWORD;                 // item count
  287.     rItems: PDS_NAME_RESULT_ITEMW; // item array
  288.   end;
  289.   {$EXTERNALSYM DS_NAME_RESULTW}
  290.   TDsNameResultW = DS_NAME_RESULTW;
  291.   PDsNameResultW = PDS_NAME_RESULTW;
  292. {$IFDEF UNICODE}
  293.   DS_NAME_RESULT = DS_NAME_RESULTW;
  294.   {$EXTERNALSYM DS_NAME_RESULT}
  295.   PDS_NAME_RESULT = PDS_NAME_RESULTW;
  296.   {$EXTERNALSYM PDS_NAME_RESULT}
  297.   DS_NAME_RESULT_ITEM = DS_NAME_RESULT_ITEMW;
  298.   {$EXTERNALSYM DS_NAME_RESULT_ITEM}
  299.   PDS_NAME_RESULT_ITEM = PDS_NAME_RESULT_ITEMW;
  300.   {$EXTERNALSYM PDS_NAME_RESULT_ITEM}
  301.   TDsNameResult = TDsNameResultW;
  302.   PDsNameResult = PDsNameResultW;
  303.   TDsNameResultItem = TDsNameResultItemW;
  304.   PDsNameResultItem = PDsNameResultItemW;
  305. {$ELSE}
  306.   DS_NAME_RESULT = DS_NAME_RESULTA;
  307.   {$EXTERNALSYM DS_NAME_RESULT}
  308.   PDS_NAME_RESULT = PDS_NAME_RESULTA;
  309.   {$EXTERNALSYM PDS_NAME_RESULT}
  310.   DS_NAME_RESULT_ITEM = DS_NAME_RESULT_ITEMA;
  311.   {$EXTERNALSYM DS_NAME_RESULT_ITEM}
  312.   PDS_NAME_RESULT_ITEM = PDS_NAME_RESULT_ITEMA;
  313.   {$EXTERNALSYM PDS_NAME_RESULT_ITEM}
  314.   TDsNameResult = TDsNameResultA;
  315.   PDsNameResult = PDsNameResultA;
  316.   TDsNameResultItem = TDsNameResultItemA;
  317.   PDsNameResultItem = PDsNameResultItemA;
  318. {$ENDIF}
  319. // Public replication option flags
  320. // ********************
  321. // DsBindWithSpnEx flags
  322. // ********************
  323. // Allow the Bind to use delegate service level, so that you can
  324. // do ntdsapi operations that require delegation, such as
  325. // DsAddSidHistory, and DsReplicaSyncAll().  Most operations do
  326. // not require DELEGATE so this flag should only be specified 
  327. // if you need it, because if you bind to a rogue server with
  328. // the DELEGATE flag, you'll allow the rogue server to use your
  329. // credentials to connect back to a non-rogue server and perform
  330. // operations other than you intended.
  331. const
  332.   NTDSAPI_BIND_ALLOW_DELEGATION = ($00000001);
  333.   {$EXTERNALSYM NTDSAPI_BIND_ALLOW_DELEGATION}
  334. // ********************
  335. // Replica Sync flags
  336. // These flag values are used both as input to DsReplicaSync and
  337. // as output from DsReplicaGetInfo, PENDING_OPS, DS_REPL_OPW.ulOptions
  338. // ********************
  339. // Perform this operation asynchronously.
  340. // Required when using DS_REPSYNC_ALL_SOURCES
  341. const
  342.   DS_REPSYNC_ASYNCHRONOUS_OPERATION = $00000001;
  343.   {$EXTERNALSYM DS_REPSYNC_ASYNCHRONOUS_OPERATION}
  344. // Writeable replica.  Otherwise, read-only.
  345.   DS_REPSYNC_WRITEABLE = $00000002;
  346.   {$EXTERNALSYM DS_REPSYNC_WRITEABLE}
  347. // This is a periodic sync request as scheduled by the admin.
  348.   DS_REPSYNC_PERIODIC = $00000004;
  349.   {$EXTERNALSYM DS_REPSYNC_PERIODIC}
  350. // Use inter-site messaging
  351.   DS_REPSYNC_INTERSITE_MESSAGING = $00000008;
  352.   {$EXTERNALSYM DS_REPSYNC_INTERSITE_MESSAGING}
  353. // Sync from all sources.
  354.   DS_REPSYNC_ALL_SOURCES = $00000010;
  355.   {$EXTERNALSYM DS_REPSYNC_ALL_SOURCES}
  356. // Sync starting from scratch (i.e., at the first USN).
  357.   DS_REPSYNC_FULL = $00000020;
  358.   {$EXTERNALSYM DS_REPSYNC_FULL}
  359. // This is a notification of an update that was marked urgent.
  360.   DS_REPSYNC_URGENT = $00000040;
  361.   {$EXTERNALSYM DS_REPSYNC_URGENT}
  362. // Don't discard this synchronization request, even if a similar
  363. // sync is pending.
  364.   DS_REPSYNC_NO_DISCARD = $00000080;
  365.   {$EXTERNALSYM DS_REPSYNC_NO_DISCARD}
  366. // Sync even if link is currently disabled.
  367.   DS_REPSYNC_FORCE = $00000100;
  368.   {$EXTERNALSYM DS_REPSYNC_FORCE}
  369. // Causes the source DSA to check if a reps-to is present for the local DSA
  370. // (aka the destination). If not, one is added.  This ensures that
  371. // source sends change notifications.
  372.   DS_REPSYNC_ADD_REFERENCE = $00000200;
  373.   {$EXTERNALSYM DS_REPSYNC_ADD_REFERENCE}
  374. // A sync from this source has never completed (e.g., a new source).
  375.   DS_REPSYNC_NEVER_COMPLETED = $00000400;
  376.   {$EXTERNALSYM DS_REPSYNC_NEVER_COMPLETED}
  377. // When this sync is complete, requests a sync in the opposite direction.
  378.   DS_REPSYNC_TWO_WAY = $00000800;
  379.   {$EXTERNALSYM DS_REPSYNC_TWO_WAY}
  380. // Do not request change notifications from this source.
  381.   DS_REPSYNC_NEVER_NOTIFY          = $00001000;
  382.   {$EXTERNALSYM DS_REPSYNC_NEVER_NOTIFY}
  383. // Sync the NC from this source when the DSA is started.
  384.   DS_REPSYNC_INITIAL                = $00002000;
  385.   {$EXTERNALSYM DS_REPSYNC_INITIAL}
  386. // Use compression when replicating.  Saves message size (e.g., network
  387. // bandwidth) at the expense of extra CPU overhead at both the source and
  388. // destination servers.
  389.   DS_REPSYNC_USE_COMPRESSION        = $00004000;
  390.   {$EXTERNALSYM DS_REPSYNC_USE_COMPRESSION}
  391. // Sync was abandoned for lack of updates
  392.   DS_REPSYNC_ABANDONED              = $00008000;
  393.   {$EXTERNALSYM DS_REPSYNC_ABANDONED}
  394. // Initial sync in progress
  395.   DS_REPSYNC_INITIAL_IN_PROGRESS    = $00010000;
  396.   {$EXTERNALSYM DS_REPSYNC_INITIAL_IN_PROGRESS}
  397. // Partial Attribute Set sync in progress
  398.   DS_REPSYNC_PARTIAL_ATTRIBUTE_SET  = $00020000;
  399.   {$EXTERNALSYM DS_REPSYNC_PARTIAL_ATTRIBUTE_SET}
  400. // Sync is being retried
  401.   DS_REPSYNC_REQUEUE                = $00040000;
  402.   {$EXTERNALSYM DS_REPSYNC_REQUEUE}
  403. // Sync is a notification request from a source
  404.   DS_REPSYNC_NOTIFICATION           = $00080000;
  405.   {$EXTERNALSYM DS_REPSYNC_NOTIFICATION}
  406. // Sync is a special form which requests to establish contact
  407. // now and do the rest of the sync later
  408.   DS_REPSYNC_ASYNCHRONOUS_REPLICA   = $00100000;
  409.   {$EXTERNALSYM DS_REPSYNC_ASYNCHRONOUS_REPLICA}
  410. // Request critical objects only
  411.   DS_REPSYNC_CRITICAL               = $00200000;
  412.   {$EXTERNALSYM DS_REPSYNC_CRITICAL}
  413. // A full synchronization is in progress
  414.   DS_REPSYNC_FULL_IN_PROGRESS       = $00400000;
  415.   {$EXTERNALSYM DS_REPSYNC_FULL_IN_PROGRESS}
  416. // Synchronization request was previously preempted
  417.   DS_REPSYNC_PREEMPTED              = $00800000;
  418.   {$EXTERNALSYM DS_REPSYNC_PREEMPTED}
  419. // ********************
  420. // Replica Add flags
  421. // ********************
  422. // Perform this operation asynchronously.
  423.   DS_REPADD_ASYNCHRONOUS_OPERATION = $00000001;
  424.   {$EXTERNALSYM DS_REPADD_ASYNCHRONOUS_OPERATION}
  425. // Create a writeable replica.  Otherwise, read-only.
  426.   DS_REPADD_WRITEABLE = $00000002;
  427.   {$EXTERNALSYM DS_REPADD_WRITEABLE}
  428. // Sync the NC from this source when the DSA is started.
  429.   DS_REPADD_INITIAL = $00000004;
  430.   {$EXTERNALSYM DS_REPADD_INITIAL}
  431. // Sync the NC from this source periodically, as defined by the
  432. // schedule passed in the preptimesSync argument.
  433.   DS_REPADD_PERIODIC = $00000008;
  434.   {$EXTERNALSYM DS_REPADD_PERIODIC}
  435. // Sync from the source DSA via an Intersite Messaging Service (ISM) transport
  436. // (e.g., SMTP) rather than native DS RPC.
  437.   DS_REPADD_INTERSITE_MESSAGING = $00000010;
  438.   {$EXTERNALSYM DS_REPADD_INTERSITE_MESSAGING}
  439. // Don't replicate the NC now -- just save enough state such that we
  440. // know to replicate it later.
  441.   DS_REPADD_ASYNCHRONOUS_REPLICA = $00000020;
  442.   {$EXTERNALSYM DS_REPADD_ASYNCHRONOUS_REPLICA}
  443. // Disable notification-based synchronization for the NC from this source.
  444. // This is expected to be a temporary state; the similar flag
  445. // DS_REPADD_NEVER_NOTIFY should be used if the disable is to be more permanent.
  446.   DS_REPADD_DISABLE_NOTIFICATION = $00000040;
  447.   {$EXTERNALSYM DS_REPADD_DISABLE_NOTIFICATION}
  448. // Disable periodic synchronization for the NC from this source
  449.   DS_REPADD_DISABLE_PERIODIC = $00000080;
  450.   {$EXTERNALSYM DS_REPADD_DISABLE_PERIODIC}
  451. // Use compression when replicating.  Saves message size (e.g., network
  452. // bandwidth) at the expense of extra CPU overhead at both the source and
  453. // destination servers.
  454.   DS_REPADD_USE_COMPRESSION = $00000100;
  455.   {$EXTERNALSYM DS_REPADD_USE_COMPRESSION}
  456. // Do not request change notifications from this source.  When this flag is
  457. // set, the source will not notify the destination when changes occur.
  458. // Recommended for all intersite replication, which may occur over WAN links.
  459. // This is expected to be a more or less permanent state; the similar flag
  460. // DS_REPADD_DISABLE_NOTIFICATION should be used if notifications are to be
  461. // disabled only temporarily.
  462.   DS_REPADD_NEVER_NOTIFY = $00000200;
  463.   {$EXTERNALSYM DS_REPADD_NEVER_NOTIFY}
  464. // When this sync is complete, requests a sync in the opposite direction.
  465.   DS_REPADD_TWO_WAY                  = $00000400;
  466.   {$EXTERNALSYM DS_REPADD_TWO_WAY}
  467. // Request critical objects only
  468. // Critical only is only allowed while installing
  469. // A critical only sync does not bring all objects in the partition. It
  470. // replicates just the ones necessary for minimal directory operation.
  471. // A normal, non-critical sync must be performed before the partition
  472. // can be considered fully synchronized.
  473.   DS_REPADD_CRITICAL                 = $00000800;
  474.   {$EXTERNALSYM DS_REPADD_CRITICAL}
  475. // ********************
  476. // Replica Delete flags
  477. // ********************
  478. // Perform this operation asynchronously.
  479.   DS_REPDEL_ASYNCHRONOUS_OPERATION = $00000001;
  480.   {$EXTERNALSYM DS_REPDEL_ASYNCHRONOUS_OPERATION}
  481. // The replica being deleted is writeable.
  482.   DS_REPDEL_WRITEABLE = $00000002;
  483.   {$EXTERNALSYM DS_REPDEL_WRITEABLE}
  484. // Replica is a mail-based replica
  485.   DS_REPDEL_INTERSITE_MESSAGING = $00000004;
  486.   {$EXTERNALSYM DS_REPDEL_INTERSITE_MESSAGING}
  487. // Ignore any error generated by contacting the source to tell it to scratch
  488. // this server from its Reps-To for this NC.
  489.   DS_REPDEL_IGNORE_ERRORS = $00000008;
  490.   {$EXTERNALSYM DS_REPDEL_IGNORE_ERRORS}
  491. // Do not contact the source telling it to scratch this server from its
  492. // Rep-To for this NC.  Otherwise, if the link is RPC-based, the source will
  493. // be contacted.
  494.   DS_REPDEL_LOCAL_ONLY = $00000010;
  495.   {$EXTERNALSYM DS_REPDEL_LOCAL_ONLY}
  496. // Delete all the objects in the NC
  497. // "No source" is incompatible with (and rejected for) writeable NCs.  This is
  498. // valid only for read-only NCs, and then only if the NC has no source.  This
  499. // can occur when the NC has been partially deleted (in which case the KCC
  500. // periodically calls the delete API with the "no source" flag set).
  501.   DS_REPDEL_NO_SOURCE = $00000020;
  502.   {$EXTERNALSYM DS_REPDEL_NO_SOURCE}
  503. // Allow deletion of read-only replica even if it sources
  504. // other read-only replicas.
  505.   DS_REPDEL_REF_OK = $00000040;
  506.   {$EXTERNALSYM DS_REPDEL_REF_OK}
  507. // ********************
  508. // Replica Modify flags
  509. // ********************
  510. // Perform this operation asynchronously.
  511.   DS_REPMOD_ASYNCHRONOUS_OPERATION = $00000001;
  512.   {$EXTERNALSYM DS_REPMOD_ASYNCHRONOUS_OPERATION}
  513. // The replica is writeable.
  514.   DS_REPMOD_WRITEABLE = $00000002;
  515.   {$EXTERNALSYM DS_REPMOD_WRITEABLE}
  516. // ********************
  517. // Replica Modify fields
  518. // ********************
  519.   DS_REPMOD_UPDATE_FLAGS     = $00000001;
  520.   {$EXTERNALSYM DS_REPMOD_UPDATE_FLAGS}
  521.   DS_REPMOD_UPDATE_ADDRESS   = $00000002;
  522.   {$EXTERNALSYM DS_REPMOD_UPDATE_ADDRESS}
  523.   DS_REPMOD_UPDATE_SCHEDULE  = $00000004;
  524.   {$EXTERNALSYM DS_REPMOD_UPDATE_SCHEDULE}
  525.   DS_REPMOD_UPDATE_RESULT    = $00000008;
  526.   {$EXTERNALSYM DS_REPMOD_UPDATE_RESULT}
  527.   DS_REPMOD_UPDATE_TRANSPORT = $00000010;
  528.   {$EXTERNALSYM DS_REPMOD_UPDATE_TRANSPORT}
  529. // ********************
  530. // Update Refs fields
  531. // ********************
  532. // Perform this operation asynchronously.
  533.   DS_REPUPD_ASYNCHRONOUS_OPERATION = $00000001;
  534.   {$EXTERNALSYM DS_REPUPD_ASYNCHRONOUS_OPERATION}
  535. // The replica being deleted is writeable.
  536.   DS_REPUPD_WRITEABLE = $00000002;
  537.   {$EXTERNALSYM DS_REPUPD_WRITEABLE}
  538. // Add a reference
  539.   DS_REPUPD_ADD_REFERENCE = $00000004;
  540.   {$EXTERNALSYM DS_REPUPD_ADD_REFERENCE}
  541. // Remove a reference
  542.   DS_REPUPD_DELETE_REFERENCE = $00000008;
  543.   {$EXTERNALSYM DS_REPUPD_DELETE_REFERENCE}
  544. // ********************
  545. //  NC Related Flags
  546. // ********************
  547. //
  548. // Instance Type bits, specifies flags for NC head creation.
  549. //
  550.   DS_INSTANCETYPE_IS_NC_HEAD       = $00000001; // This if what to specify on an object to indicate it's an NC Head.
  551.   {$EXTERNALSYM DS_INSTANCETYPE_IS_NC_HEAD}
  552.   DS_INSTANCETYPE_NC_IS_WRITEABLE  = $00000004; // This is to indicate that the NC Head is writeable.
  553.   {$EXTERNALSYM DS_INSTANCETYPE_NC_IS_WRITEABLE}
  554.   DS_INSTANCETYPE_NC_COMING        = $00000010; // This is to indicate that this NC is still replicating in objects to this DC, and may not be a complete NC.
  555.   {$EXTERNALSYM DS_INSTANCETYPE_NC_COMING}
  556.   DS_INSTANCETYPE_NC_GOING         = $00000020; // This is to indicate that this NC is in the process of being removed from this DC, and may not be a complete NC.
  557.   {$EXTERNALSYM DS_INSTANCETYPE_NC_GOING}
  558. // ********************
  559. //  xxx_OPT_xxx Flags
  560. // ********************
  561. // These macros define bit flags which can be set in the "options" attribute
  562. // of objects of the specified object class.
  563. // Bit flags valid for options attribute on NTDS-DSA objects.
  564. //
  565.   NTDSDSA_OPT_IS_GC                    = (1 shl 0); // DSA is a global catalog
  566.   {$EXTERNALSYM NTDSDSA_OPT_IS_GC}
  567.   NTDSDSA_OPT_DISABLE_INBOUND_REPL     = (1 shl 1); // disable inbound replication
  568.   {$EXTERNALSYM NTDSDSA_OPT_DISABLE_INBOUND_REPL}
  569.   NTDSDSA_OPT_DISABLE_OUTBOUND_REPL    = (1 shl 2); // disable outbound replication
  570.   {$EXTERNALSYM NTDSDSA_OPT_DISABLE_OUTBOUND_REPL}
  571.   NTDSDSA_OPT_DISABLE_NTDSCONN_XLATE   = (1 shl 3); // disable logical conn xlation
  572.   {$EXTERNALSYM NTDSDSA_OPT_DISABLE_NTDSCONN_XLATE}
  573. // Bit flags for options attribute on NTDS-Connection objects.
  574. //
  575. // The reasons that two bits are required to control notification are as follows.
  576. // We must support existing connections with the old behavior and the UI does not
  577. // create manual connections with the new bit set.
  578. // The default for existing and manually created connections with bits 2 and 3
  579. // clear must be the standard prior behavior: notification for intra-site and
  580. // no notification for inter-site.
  581. // We need a way to distinguish a old connection which desires the default
  582. // notification rules, and a new connection for which we desire to explicitly
  583. // control the notification state as passed down from a site link.  Thus we
  584. // have a new bit to say we are overriding the default, and a new bit to indicate
  585. // what the overridden default shall be.
  586. //
  587.   NTDSCONN_OPT_IS_GENERATED = (1 shl 0);  // object generated by DS, not admin
  588.   {$EXTERNALSYM NTDSCONN_OPT_IS_GENERATED}
  589.   NTDSCONN_OPT_TWOWAY_SYNC  = (1 shl 1);  // force sync in opposite direction at end of sync
  590.   {$EXTERNALSYM NTDSCONN_OPT_TWOWAY_SYNC}
  591.   NTDSCONN_OPT_OVERRIDE_NOTIFY_DEFAULT = (1 shl 2);  // Do not use defaults to determine notification
  592.   {$EXTERNALSYM NTDSCONN_OPT_OVERRIDE_NOTIFY_DEFAULT}
  593.   NTDSCONN_OPT_USE_NOTIFY   = (1 shl 3); // Does source notify destination
  594.   {$EXTERNALSYM NTDSCONN_OPT_USE_NOTIFY}
  595. // For intra-site connections, this bit has no meaning.
  596. // For inter-site connections, this bit means:
  597. //  0 - Compression of replication data enabled
  598. //  1 - Compression of replication data disabled
  599.   NTDSCONN_OPT_DISABLE_INTERSITE_COMPRESSION   = (1 shl 4);
  600.   {$EXTERNALSYM NTDSCONN_OPT_DISABLE_INTERSITE_COMPRESSION}
  601. // For connections whose IS_GENERATED bit is 0, this bit has no effect.
  602. // For KCC-generated connections, this bit indicates that the schedule attribute
  603. // is owned by the user and should not be touched by the KCC.
  604.   NTDSCONN_OPT_USER_OWNED_SCHEDULE = (1 shl 5);
  605.   {$EXTERNALSYM NTDSCONN_OPT_USER_OWNED_SCHEDULE}
  606. //
  607. // The high 4 bits of the options attribute are used by NTFRS to assign priority
  608. // for inbound connections. Bit 31 is used to force FRS to ignore schedule during
  609. // the initial sync. Bits 30 - 28 are used to specify a priority between 0-7.
  610. //
  611.   FRSCONN_PRIORITY_MASK      = $70000000;
  612.   {$EXTERNALSYM FRSCONN_PRIORITY_MASK}
  613.   FRSCONN_MAX_PRIORITY      = $8;
  614.   {$EXTERNALSYM FRSCONN_MAX_PRIORITY}
  615.   DSCONN_OPT_IGNORE_SCHEDULE_MASK = DWORD($80000000);
  616.   {$EXTERNALSYM DSCONN_OPT_IGNORE_SCHEDULE_MASK}
  617. function NTDSCONN_IGNORE_SCHEDULE(_options_: DWORD): DWORD;
  618. {$EXTERNALSYM NTDSCONN_IGNORE_SCHEDULE}
  619. function FRSCONN_GET_PRIORITY(_options_: DWORD): DWORD;
  620. {$EXTERNALSYM FRSCONN_GET_PRIORITY}
  621. // Bit flags for options attribute on NTDS-Site-Settings objects.
  622. //
  623. const
  624.   NTDSSETTINGS_OPT_IS_AUTO_TOPOLOGY_DISABLED     = (1 shl 0); // automatic topology gen disabled
  625.   {$EXTERNALSYM NTDSSETTINGS_OPT_IS_AUTO_TOPOLOGY_DISABLED}
  626.   NTDSSETTINGS_OPT_IS_TOPL_CLEANUP_DISABLED      = (1 shl 1); // automatic topology cleanup disabled
  627.   {$EXTERNALSYM NTDSSETTINGS_OPT_IS_TOPL_CLEANUP_DISABLED}
  628.   NTDSSETTINGS_OPT_IS_TOPL_MIN_HOPS_DISABLED     = (1 shl 2); // automatic minimum hops topology disabled
  629.   {$EXTERNALSYM NTDSSETTINGS_OPT_IS_TOPL_MIN_HOPS_DISABLED}
  630.   NTDSSETTINGS_OPT_IS_TOPL_DETECT_STALE_DISABLED = (1 shl 3); // automatic stale server detection disabled
  631.   {$EXTERNALSYM NTDSSETTINGS_OPT_IS_TOPL_DETECT_STALE_DISABLED}
  632.   NTDSSETTINGS_OPT_IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED = (1 shl 4); // automatic inter-site topology gen disabled
  633.   {$EXTERNALSYM NTDSSETTINGS_OPT_IS_INTER_SITE_AUTO_TOPOLOGY_DISABLED}
  634.   NTDSSETTINGS_OPT_IS_GROUP_CACHING_ENABLED      = (1 shl 5); // group memberships for users enabled
  635.   {$EXTERNALSYM NTDSSETTINGS_OPT_IS_GROUP_CACHING_ENABLED}
  636.   NTDSSETTINGS_OPT_FORCE_KCC_WHISTLER_BEHAVIOR   = (1 shl 6); // force KCC to operate in Whistler behavior mode
  637.   {$EXTERNALSYM NTDSSETTINGS_OPT_FORCE_KCC_WHISTLER_BEHAVIOR}
  638.   NTDSSETTINGS_OPT_FORCE_KCC_W2K_ELECTION        = (1 shl 7); // force KCC to use the Windows 2000 ISTG election algorithm
  639.   {$EXTERNALSYM NTDSSETTINGS_OPT_FORCE_KCC_W2K_ELECTION}
  640.   NTDSSETTINGS_OPT_IS_RAND_BH_SELECTION_DISABLED = (1 shl 8); // prevent the KCC from randomly picking a bridgehead when creating a connection
  641.   {$EXTERNALSYM NTDSSETTINGS_OPT_IS_RAND_BH_SELECTION_DISABLED}
  642.   NTDSSETTINGS_OPT_IS_SCHEDULE_HASHING_ENABLED   = (1 shl 9); // allow the KCC to use hashing when creating a replication schedule
  643.   {$EXTERNALSYM NTDSSETTINGS_OPT_IS_SCHEDULE_HASHING_ENABLED}
  644. // Bit flags for options attribute on Inter-Site-Transport objects
  645. //
  646. // Note, the sense of the flag should be such that the default state or
  647. // behavior corresponds to the flag NOT being present. Put another way, the
  648. // flag should state the OPPOSITE of the default
  649. //
  650. // default: schedules are significant
  651.   NTDSTRANSPORT_OPT_IGNORE_SCHEDULES = (1 shl 0); // Schedules disabled
  652.   {$EXTERNALSYM NTDSTRANSPORT_OPT_IGNORE_SCHEDULES}
  653. // default: links transitive (bridges not required)
  654.   NTDSTRANSPORT_OPT_BRIDGES_REQUIRED = (1 shl 1); // siteLink bridges are required
  655.   {$EXTERNALSYM NTDSTRANSPORT_OPT_BRIDGES_REQUIRED}
  656. // Bit flags for options attribute on site-Connection objects
  657. //
  658. // These are not realized in the DS, but are built up in the KCC
  659.   NTDSSITECONN_OPT_USE_NOTIFY  = (1 shl 0); // Use notification on this link
  660.   {$EXTERNALSYM NTDSSITECONN_OPT_USE_NOTIFY}
  661.   NTDSSITECONN_OPT_TWOWAY_SYNC = (1 shl 1);  // force sync in opposite direction at end of sync
  662.   {$EXTERNALSYM NTDSSITECONN_OPT_TWOWAY_SYNC}
  663. // This bit means:
  664. //  0 - Compression of replication data across this site connection enabled
  665. //  1 - Compression of replication data across this site connection disabled
  666.   NTDSSITECONN_OPT_DISABLE_COMPRESSION = (1 shl 2);
  667.   {$EXTERNALSYM NTDSSITECONN_OPT_DISABLE_COMPRESSION}
  668. // Bit flags for options attribute on site-Link objects
  669. // Note that these options are AND-ed along a site-link path
  670. //
  671.   NTDSSITELINK_OPT_USE_NOTIFY  = (1 shl 0); // Use notification on this link
  672.   {$EXTERNALSYM NTDSSITELINK_OPT_USE_NOTIFY}
  673.   NTDSSITELINK_OPT_TWOWAY_SYNC = (1 shl 1);  // force sync in opposite direction at end of sync
  674.   {$EXTERNALSYM NTDSSITELINK_OPT_TWOWAY_SYNC}
  675. // This bit means:
  676. //  0 - Compression of replication data across this site link enabled
  677. //  1 - Compression of replication data across this site link disabled
  678.   NTDSSITELINK_OPT_DISABLE_COMPRESSION = (1 shl 2);
  679.   {$EXTERNALSYM NTDSSITELINK_OPT_DISABLE_COMPRESSION}
  680. // ***********************
  681. // Well Known Object Guids
  682. // ***********************
  683.   GUID_USERS_CONTAINER_A              = 'a9d1ca15768811d1aded00c04fd8d5cd';
  684.   {$EXTERNALSYM GUID_USERS_CONTAINER_A}
  685.   GUID_COMPUTRS_CONTAINER_A           = 'aa312825768811d1aded00c04fd8d5cd';
  686.   {$EXTERNALSYM GUID_COMPUTRS_CONTAINER_A}
  687.   GUID_SYSTEMS_CONTAINER_A            = 'ab1d30f3768811d1aded00c04fd8d5cd';
  688.   {$EXTERNALSYM GUID_SYSTEMS_CONTAINER_A}
  689.   GUID_DOMAIN_CONTROLLERS_CONTAINER_A = 'a361b2ffffd211d1aa4b00c04fd7d83a';
  690.   {$EXTERNALSYM GUID_DOMAIN_CONTROLLERS_CONTAINER_A}
  691.   GUID_INFRASTRUCTURE_CONTAINER_A     = '2fbac1870ade11d297c400c04fd8d5cd';
  692.   {$EXTERNALSYM GUID_INFRASTRUCTURE_CONTAINER_A}
  693.   GUID_DELETED_OBJECTS_CONTAINER_A    = '18e2ea80684f11d2b9aa00c04f79f805';
  694.   {$EXTERNALSYM GUID_DELETED_OBJECTS_CONTAINER_A}
  695.   GUID_LOSTANDFOUND_CONTAINER_A       = 'ab8153b7768811d1aded00c04fd8d5cd';
  696.   {$EXTERNALSYM GUID_LOSTANDFOUND_CONTAINER_A}
  697.   GUID_FOREIGNSECURITYPRINCIPALS_CONTAINER_A = '22b70c67d56e4efb91e9300fca3dc1aa';
  698.   {$EXTERNALSYM GUID_FOREIGNSECURITYPRINCIPALS_CONTAINER_A}
  699.   GUID_PROGRAM_DATA_CONTAINER_A       = '09460c08ae1e4a4ea0f64aee7daa1e5a';
  700.   {$EXTERNALSYM GUID_PROGRAM_DATA_CONTAINER_A}
  701.   GUID_MICROSOFT_PROGRAM_DATA_CONTAINER_A = 'f4be92a4c777485e878e9421d53087db';
  702.   {$EXTERNALSYM GUID_MICROSOFT_PROGRAM_DATA_CONTAINER_A}
  703.   GUID_USERS_CONTAINER_W              = WideString('a9d1ca15768811d1aded00c04fd8d5cd');
  704.   {$EXTERNALSYM GUID_USERS_CONTAINER_W}
  705.   GUID_COMPUTRS_CONTAINER_W           = WideString('aa312825768811d1aded00c04fd8d5cd');
  706.   {$EXTERNALSYM GUID_COMPUTRS_CONTAINER_W}
  707.   GUID_SYSTEMS_CONTAINER_W            = WideString('ab1d30f3768811d1aded00c04fd8d5cd');
  708.   {$EXTERNALSYM GUID_SYSTEMS_CONTAINER_W}
  709.   GUID_DOMAIN_CONTROLLERS_CONTAINER_W = WideString('a361b2ffffd211d1aa4b00c04fd7d83a');
  710.   {$EXTERNALSYM GUID_DOMAIN_CONTROLLERS_CONTAINER_W}
  711.   GUID_INFRASTRUCTURE_CONTAINER_W     = WideString('2fbac1870ade11d297c400c04fd8d5cd');
  712.   {$EXTERNALSYM GUID_INFRASTRUCTURE_CONTAINER_W}
  713.   GUID_DELETED_OBJECTS_CONTAINER_W    = WideString('18e2ea80684f11d2b9aa00c04f79f805');
  714.   {$EXTERNALSYM GUID_DELETED_OBJECTS_CONTAINER_W}
  715.   GUID_LOSTANDFOUND_CONTAINER_W       = WideString('ab8153b7768811d1aded00c04fd8d5cd');
  716.   {$EXTERNALSYM GUID_LOSTANDFOUND_CONTAINER_W}
  717.   GUID_FOREIGNSECURITYPRINCIPALS_CONTAINER_W = WideString('22b70c67d56e4efb91e9300fca3dc1aa');
  718.   {$EXTERNALSYM GUID_FOREIGNSECURITYPRINCIPALS_CONTAINER_W}
  719.   GUID_PROGRAM_DATA_CONTAINER_W       = WideString('09460c08ae1e4a4ea0f64aee7daa1e5a');
  720.   {$EXTERNALSYM GUID_PROGRAM_DATA_CONTAINER_W}
  721.   GUID_MICROSOFT_PROGRAM_DATA_CONTAINER_W = WideString('f4be92a4c777485e878e9421d53087db');
  722.   {$EXTERNALSYM GUID_MICROSOFT_PROGRAM_DATA_CONTAINER_W}
  723.   GUID_USERS_CONTAINER_BYTE              = 'xa9xd1xcax15x76x88x11xd1xadxedx00xc0x4fxd8xd5xcd';
  724.   {$EXTERNALSYM GUID_USERS_CONTAINER_BYTE}
  725.   GUID_COMPUTRS_CONTAINER_BYTE           = 'xaax31x28x25x76x88x11xd1xadxedx00xc0x4fxd8xd5xcd';
  726.   {$EXTERNALSYM GUID_COMPUTRS_CONTAINER_BYTE}
  727.   GUID_SYSTEMS_CONTAINER_BYTE            = 'xabx1dx30xf3x76x88x11xd1xadxedx00xc0x4fxd8xd5xcd';
  728.   {$EXTERNALSYM GUID_SYSTEMS_CONTAINER_BYTE}
  729.   GUID_DOMAIN_CONTROLLERS_CONTAINER_BYTE = 'xa3x61xb2xffxffxd2x11xd1xaax4bx00xc0x4fxd7xd8x3a';
  730.   {$EXTERNALSYM GUID_DOMAIN_CONTROLLERS_CONTAINER_BYTE}
  731.   GUID_INFRASTRUCTURE_CONTAINER_BYTE     = 'x2fxbaxc1x87x0axdex11xd2x97xc4x00xc0x4fxd8xd5xcd';
  732.   {$EXTERNALSYM GUID_INFRASTRUCTURE_CONTAINER_BYTE}
  733.   GUID_DELETED_OBJECTS_CONTAINER_BYTE    = 'x18xe2xeax80x68x4fx11xd2xb9xaax00xc0x4fx79xf8x05';
  734.   {$EXTERNALSYM GUID_DELETED_OBJECTS_CONTAINER_BYTE}
  735.   GUID_LOSTANDFOUND_CONTAINER_BYTE       = 'xabx81x53xb7x76x88x11xd1xadxedx00xc0x4fxd8xd5xcd';
  736.   {$EXTERNALSYM GUID_LOSTANDFOUND_CONTAINER_BYTE}
  737.   GUID_FOREIGNSECURITYPRINCIPALS_CONTAINER_BYTE = 'x22xb7x0cx67xd5x6ex4exfbx91xe9x30x0fxcax3dxc1xaa';
  738.   {$EXTERNALSYM GUID_FOREIGNSECURITYPRINCIPALS_CONTAINER_BYTE}
  739.   GUID_PROGRAM_DATA_CONTAINER_BYTE       = 'x09x46x0cx08xaex1ex4ax4exa0xf6x4axeex7dxaax1ex5a';
  740.   {$EXTERNALSYM GUID_PROGRAM_DATA_CONTAINER_BYTE}
  741.   GUID_MICROSOFT_PROGRAM_DATA_CONTAINER_BYTE = 'xf4xbex92xa4xc7x77x48x5ex87x8ex94x21xd5x30x87xdb';
  742.   {$EXTERNALSYM GUID_MICROSOFT_PROGRAM_DATA_CONTAINER_BYTE}
  743. type
  744.   _DS_MANGLE_FOR = (
  745.     DS_MANGLE_UNKNOWN,
  746.     DS_MANGLE_OBJECT_RDN_FOR_DELETION,
  747.     DS_MANGLE_OBJECT_RDN_FOR_NAME_CONFLICT);
  748.   {$EXTERNALSYM _DS_MANGLE_FOR}
  749.   DS_MANGLE_FOR = _DS_MANGLE_FOR;
  750.   {$EXTERNALSYM DS_MANGLE_FOR}
  751.   TDsMangleFor = DS_MANGLE_FOR;
  752.   PDsMangleFor = ^DS_MANGLE_FOR;
  753. //////////////////////////////////////////////////////////////////////////
  754. //                                                                      //
  755. // Prototypes                                                           //
  756. //                                                                      //
  757. //////////////////////////////////////////////////////////////////////////
  758. // DSBind takes two optional input parameters which identify whether the
  759. // caller found a domain controller themselves via DsGetDcName or whether
  760. // a domain controller should be found using default parameters.
  761. // Behavior of the possible combinations are outlined below.
  762. //
  763. // DomainControllerName(value), DnsDomainName(NULL)
  764. //
  765. //      The value for DomainControllerName is assumed to have been
  766. //      obtained via DsGetDcName (i.e. Field with the same name in a
  767. //      DOMAIN_CONTROLLER_INFO struct on return from DsGetDcName call.)
  768. //      The client is bound to the domain controller at this name.
  769. //      
  770. //      Mutual authentication will be performed using an SPN of
  771. //      LDAP/DomainControllerName provided DomainControllerName
  772. //      is not a NETBIOS name or IP address - i.e. it must be a 
  773. //      DNS host name.
  774. //
  775. // DomainControllerName(value), DnsDomainName(value)
  776. //
  777. //      DsBind will connect to the server identified by DomainControllerName.
  778. //
  779. //      Mutual authentication will be performed using an SPN of
  780. //      LDAP/DomainControllerName/DnsDomainName provided neither value
  781. //      is a NETBIOS names or IP address - i.e. they must be
  782. //      valid DNS names.
  783. //
  784. // DomainControllerName(NULL), DnsDomainName(NULL)
  785. //
  786. //      DsBind will attempt to find to a global catalog and fail if one
  787. //      can not be found.  
  788. //
  789. //      Mutual authentication will be performed using an SPN of
  790. //      GC/DnsHostName/ForestName where DnsHostName and ForestName
  791. //      represent the DomainControllerName and DnsForestName fields
  792. //      respectively of the DOMAIN_CONTROLLER_INFO returned by the
  793. //      DsGetDcName call used to find a global catalog.
  794. //
  795. // DomainControllerName(NULL), DnsDomainName(value)
  796. //
  797. //      DsBind will attempt to find a domain controller for the domain
  798. //      identified by DnsDomainName and fail if one can not be found.
  799. //
  800. //      Mutual authentication will be performed using an SPN of
  801. //      LDAP/DnsHostName/DnsDomainName where DnsDomainName is that
  802. //      provided by the caller and DnsHostName is that returned by
  803. //      DsGetDcName for the domain specified - provided DnsDomainName
  804. //      is a valid DNS domain name - i.e. not a NETBIOS domain name.
  805. function DsBindA(DomainControllerName: LPCSTR; DnsDomainName: LPCSTR;
  806.   var phDS: HANDLE): DWORD; stdcall;
  807. {$EXTERNALSYM DsBindA}
  808. function DsBindW(DomainControllerName: LPCWSTR; DnsDomainName: LPCWSTR;
  809.   var phDS: HANDLE): DWORD; stdcall;
  810. {$EXTERNALSYM DsBindW}
  811. {$IFDEF UNICODE}
  812. function DsBind(DomainControllerName: LPCSTR; DnsDomainName: LPCSTR;
  813.   var phDS: HANDLE): DWORD; stdcall;
  814. {$EXTERNALSYM DsBind}
  815. {$ELSE}
  816. function DsBind(DomainControllerName: LPCWSTR; DnsDomainName: LPCWSTR;
  817.   var phDS: HANDLE): DWORD; stdcall;
  818. {$EXTERNALSYM DsBind}
  819. {$ENDIF}
  820. function DsBindWithCredA(DomainControllerName: LPCSTR; DnsDomainName: LPCSTR;
  821.   AuthIdentity: RPC_AUTH_IDENTITY_HANDLE; var phDS: HANDLE): DWORD; stdcall;
  822. {$EXTERNALSYM DsBindWithCredA}
  823. function DsBindWithCredW(DomainControllerName: LPCWSTR; DnsDomainName: LPCWSTR;
  824.   AuthIdentity: RPC_AUTH_IDENTITY_HANDLE; var phDS: HANDLE): DWORD; stdcall;
  825. {$EXTERNALSYM DsBindWithCredW}
  826. {$IFDEF UNICODE}
  827. function DsBindWithCred(DomainControllerName: LPCWSTR; DnsDomainName: LPCWSTR;
  828.   AuthIdentity: RPC_AUTH_IDENTITY_HANDLE; var phDS: HANDLE): DWORD; stdcall;
  829. {$EXTERNALSYM DsBindWithCred}
  830. {$ELSE}
  831. function DsBindWithCred(DomainControllerName: LPCSTR; DnsDomainName: LPCSTR;
  832.   AuthIdentity: RPC_AUTH_IDENTITY_HANDLE; var phDS: HANDLE): DWORD; stdcall;
  833. {$EXTERNALSYM DsBindWithCred}
  834. {$ENDIF}
  835. //
  836. // DsBindWithSpn{A|W} allows the caller to specify the service principal
  837. // name (SPN) which will be used for mutual authentication against
  838. // the destination server.  Do not provide an SPN if you are expecting
  839. // DsBind to find a server for you as SPNs are machine specific and its
  840. // unlikely the SPN you provide matches the server DsBind finds for you.
  841. // Providing a NULL ServicePrincipalName argument results in behavior
  842. // identical to DsBindWithCred{A|W}.
  843. //
  844. function DsBindWithSpnA(DomainControllerName: LPCSTR; DnsDomainName: LPCSTR;
  845.   AuthIdentity: RPC_AUTH_IDENTITY_HANDLE; ServicePrincipalName: LPCSTR;
  846.   var phDS: HANDLE): DWORD; stdcall;
  847. {$EXTERNALSYM DsBindWithSpnA}
  848. function DsBindWithSpnW(DomainControllerName: LPCWSTR; DnsDomainName: LPCWSTR;
  849.   AuthIdentity: RPC_AUTH_IDENTITY_HANDLE; ServicePrincipalName: LPCWSTR;
  850.   var phDS: HANDLE): DWORD; stdcall;
  851. {$EXTERNALSYM DsBindWithSpnW}
  852. {$IFDEF UNICODE}
  853. function DsBindWithSpn(DomainControllerName: LPCWSTR; DnsDomainName: LPCWSTR;
  854.   AuthIdentity: RPC_AUTH_IDENTITY_HANDLE; ServicePrincipalName: LPCWSTR;
  855.   var phDS: HANDLE): DWORD; stdcall;
  856. {$EXTERNALSYM DsBindWithSpn}
  857. {$ELSE}
  858. function DsBindWithSpn(DomainControllerName: LPCSTR; DnsDomainName: LPCSTR;
  859.   AuthIdentity: RPC_AUTH_IDENTITY_HANDLE; ServicePrincipalName: LPCSTR;
  860.   var phDS: HANDLE): DWORD; stdcall;
  861. {$EXTERNALSYM DsBindWithSpn}
  862. {$ENDIF}
  863. //
  864. // DsBindWithSpnEx{A|W} allows you all the options of the previous
  865. // DsBindWithSpn(), plus the added benefit of specifying some optional
  866. // Binding flags.  Currently if you pass NTDSAPI_BIND_ALLOW_DELEGATION,
  867. // you will get the exact old behaviour.  If you can avoid it, you
  868. // should not specify this flag, see flag above for details.
  869. //
  870. function DsBindWithSpnExW(DomainControllerName, DnsDomainName: LPCWSTR; AuthIdentity: RPC_AUTH_IDENTITY_HANDLE;
  871.   ServicePrincipalName: LPCWSTR; BindFlags: DWORD; phDS: LPHANDLE): DWORD; stdcall;
  872. {$EXTERNALSYM DsBindWithSpnExW}
  873. function DsBindWithSpnExA(DomainControllerName, DnsDomainName: LPCSTR; AuthIdentity: RPC_AUTH_IDENTITY_HANDLE;
  874.   ServicePrincipalName: LPCSTR; BindFlags: DWORD; phDS: LPHANDLE): DWORD; stdcall;
  875. {$EXTERNALSYM DsBindWithSpnExA}
  876. {$IFDEF UNICODE}
  877. function DsBindWithSpnEx(DomainControllerName, DnsDomainName: LPCWSTR; AuthIdentity: RPC_AUTH_IDENTITY_HANDLE;
  878.   ServicePrincipalName: LPCWSTR; BindFlags: DWORD; phDS: LPHANDLE): DWORD; stdcall;
  879. {$EXTERNALSYM DsBindWithSpnEx}
  880. {$ELSE}
  881. function DsBindWithSpnEx(DomainControllerName, DnsDomainName: LPCSTR; AuthIdentity: RPC_AUTH_IDENTITY_HANDLE;
  882.   ServicePrincipalName: LPCSTR; BindFlags: DWORD; phDS: LPHANDLE): DWORD; stdcall;
  883. {$EXTERNALSYM DsBindWithSpnEx}
  884. {$ENDIF}
  885. //
  886. // DsBindToISTG{A|W} allows the caller to bind to the server which
  887. // holds the Inter-Site Topology Generator role in the specified site.
  888. // The site name should be the RDN of a site.  If no site is specified,
  889. // the function will try to bind to the ISTG in a nearby site.
  890. //
  891. function DsBindToISTGW(SiteName: LPCWSTR; phDS: LPHANDLE): DWORD; stdcall;
  892. {$EXTERNALSYM DsBindToISTGW}
  893. function DsBindToISTGA(SiteName: LPCSTR; phDS: LPHANDLE): DWORD; stdcall;
  894. {$EXTERNALSYM DsBindToISTGA}
  895. {$IFDEF UNICODE}
  896. function DsBindToISTG(SiteName: LPCWSTR; phDS: LPHANDLE): DWORD; stdcall;
  897. {$EXTERNALSYM DsBindToISTG}
  898. {$ELSE}
  899. function DsBindToISTG(SiteName: LPCSTR; phDS: LPHANDLE): DWORD; stdcall;
  900. {$EXTERNALSYM DsBindToISTG}
  901. {$ENDIF}
  902. //
  903. // DsBindingSetTimeout allows the caller to specify a timeout value
  904. // which will be honored by all RPC calls using the specified binding
  905. // handle. RPC calls which take longer the timeout value are canceled.
  906. //
  907. function DsBindingSetTimeout(hDS: HANDLE; cTimeoutSecs: ULONG): DWORD; stdcall;
  908. {$EXTERNALSYM DsBindingSetTimeout}
  909. //
  910. // DsUnBind
  911. //
  912. function DsUnBindA(var phDS: HANDLE): DWORD; stdcall;
  913. {$EXTERNALSYM DsUnBindA}
  914. function DsUnBindW(var phDS: HANDLE): DWORD; stdcall;
  915. {$EXTERNALSYM DsUnBindW}
  916. {$IFDEF UNICODE}
  917. function DsUnBind(var phDS: HANDLE): DWORD; stdcall;
  918. {$EXTERNALSYM DsUnBind}
  919. {$ELSE}
  920. function DsUnBind(var phDS: HANDLE): DWORD; stdcall;
  921. {$EXTERNALSYM DsUnBind}
  922. {$ENDIF}
  923. //
  924. // DsMakePasswordCredentials
  925. //
  926. // This function constructs a credential structure which is suitable for input
  927. // to the DsBindWithCredentials function, or the ldap_open function (winldap.h)
  928. // The credential must be freed using DsFreeCredential.
  929. //
  930. // None of the input parameters may be present indicating a null, default
  931. // credential.  Otherwise the username must be present.  If the domain or
  932. // password are null, they default to empty strings.  The domain name may be
  933. // null when the username is fully qualified, for example UPN format.
  934. //
  935. function DsMakePasswordCredentialsA(User: LPCSTR; Domain: LPCSTR;
  936.   Password: LPCSTR; var pAuthIdentity: RPC_AUTH_IDENTITY_HANDLE): DWORD; stdcall;
  937. {$EXTERNALSYM DsMakePasswordCredentialsA}
  938. function DsMakePasswordCredentialsW(User: LPCWSTR; Domain: LPCWSTR;
  939.   Password: LPCWSTR; var pAuthIdentity: RPC_AUTH_IDENTITY_HANDLE): DWORD; stdcall;
  940. {$EXTERNALSYM DsMakePasswordCredentialsW}
  941. {$IFDEF UNICODE}
  942. function DsMakePasswordCredentials(User: LPCWSTR; Domain: LPCWSTR;
  943.   Password: LPCWSTR; var pAuthIdentity: RPC_AUTH_IDENTITY_HANDLE): DWORD; stdcall;
  944. {$EXTERNALSYM DsMakePasswordCredentials}
  945. {$ELSE}
  946. function DsMakePasswordCredentials(User: LPCSTR; Domain: LPCSTR;
  947.   Password: LPCSTR; var pAuthIdentity: RPC_AUTH_IDENTITY_HANDLE): DWORD; stdcall;
  948. {$EXTERNALSYM DsMakePasswordCredentials}
  949. {$ENDIF}
  950. procedure DsFreePasswordCredentials(AuthIdentity: RPC_AUTH_IDENTITY_HANDLE); stdcall;
  951. {$EXTERNALSYM DsFreePasswordCredentials}
  952. procedure DsFreePasswordCredentialsA(AuthIdentity: RPC_AUTH_IDENTITY_HANDLE); stdcall;
  953. {$EXTERNALSYM DsFreePasswordCredentialsA}
  954. procedure DsFreePasswordCredentialsW(AuthIdentity: RPC_AUTH_IDENTITY_HANDLE); stdcall;
  955. {$EXTERNALSYM DsFreePasswordCredentialsW}
  956. //
  957. // DsCrackNames
  958. //
  959. function DsCrackNamesA(hDS: HANDLE; flags: DS_NAME_FLAGS;
  960.   formatOffered: DS_NAME_FORMAT; formatDesired: DS_NAME_FORMAT; cNames: DWORD;
  961.   rpNames: LPCSTR; var ppResult: PDS_NAME_RESULTA): DWORD; stdcall;
  962. {$EXTERNALSYM DsCrackNamesA}
  963. function DsCrackNamesW(hDS: HANDLE; flags: DS_NAME_FLAGS;
  964.   formatOffered: DS_NAME_FORMAT; formatDesired: DS_NAME_FORMAT; cNames: DWORD;
  965.   rpNames: LPCWSTR; var ppResult: PDS_NAME_RESULTW): DWORD; stdcall;
  966. {$EXTERNALSYM DsCrackNamesW}
  967. {$IFDEF UNICODE}
  968. function DsCrackNames(hDS: HANDLE; flags: DS_NAME_FLAGS;
  969.   formatOffered: DS_NAME_FORMAT; formatDesired: DS_NAME_FORMAT; cNames: DWORD;
  970.   rpNames: LPCWSTR; var ppResult: PDS_NAME_RESULTW): DWORD; stdcall;
  971. {$EXTERNALSYM DsCrackNames}
  972. {$ELSE}
  973. function DsCrackNames(hDS: HANDLE; flags: DS_NAME_FLAGS;
  974.   formatOffered: DS_NAME_FORMAT; formatDesired: DS_NAME_FORMAT; cNames: DWORD;
  975.   rpNames: LPCSTR; var ppResult: PDS_NAME_RESULTA): DWORD; stdcall;
  976. {$EXTERNALSYM DsCrackNames}
  977. {$ENDIF}
  978. //
  979. // DsFreeNameResult
  980. //
  981. procedure DsFreeNameResultA(pResult: PDS_NAME_RESULTA); stdcall;
  982. {$EXTERNALSYM DsFreeNameResultA}
  983. procedure DsFreeNameResultW(pResult: PDS_NAME_RESULTW); stdcall;
  984. {$EXTERNALSYM DsFreeNameResultW}
  985. {$IFDEF UNICODE}
  986. procedure DsFreeNameResult(pResult: PDS_NAME_RESULTW); stdcall;
  987. {$EXTERNALSYM DsFreeNameResult}
  988. {$ELSE}
  989. procedure DsFreeNameResult(pResult: PDS_NAME_RESULTA); stdcall;
  990. {$EXTERNALSYM DsFreeNameResult}
  991. {$ENDIF}
  992. // ==========================================================
  993. // DSMakeSpn -- client call to create SPN for a service to which it wants to
  994. // authenticate.
  995. // This name is then passed to "pszTargetName" of InitializeSecurityContext().
  996. //
  997. // Notes:
  998. // If the service name is a DNS host name, or canonical DNS service name
  999. // e.g. "www.ms.com", i.e., caller resolved with gethostbyname, then instance
  1000. // name should be NULL.
  1001. // Realm is host name minus first component, unless it is in the exception list
  1002. //
  1003. // If the service name is NetBIOS machine name, then instance name should be
  1004. // NULL
  1005. // Form must be <domain><machine>
  1006. // Realm will be <domain>
  1007. //
  1008. // If the service name is that of a replicated service, where each replica has
  1009. // its own account (e.g., with SRV records) then the caller must supply the
  1010. // instance name then realm name is same as ServiceName
  1011. //
  1012. // If the service name is a DN, then must also supply instance name
  1013. // (DN could be name of service object (incl RPC or Winsock), name of machine
  1014. // account, name of domain object)
  1015. // then realm name is domain part of the DN
  1016. //
  1017. // If the service name is NetBIOS domain name, then must also supply instance
  1018. // name; realm name is domain name
  1019. //
  1020. // If the service is named by an IP address -- then use referring service name
  1021. // as service name
  1022. //
  1023. //  ServiceClass - e.g. "http", "ftp", "ldap", GUID
  1024. //  ServiceName - DNS or DN; assumes we can compute domain from service name
  1025. //  InstanceName OPTIONAL- DNS name of host for instance of service
  1026. //  InstancePort - port number for instance (0 if default)
  1027. //  Referrer OPTIONAL- DNS name of host that gave this referral
  1028. //  pcSpnLength - in -- max length IN CHARACTERS of principal name;
  1029. //                out -- actual
  1030. //                Length includes terminator
  1031. //  pszSPN - server principal name
  1032. //
  1033. // If buffer is not large enough, ERROR_BUFFER_OVERFLOW is returned and the
  1034. // needed length is returned in pcSpnLength.
  1035. //
  1036. //
  1037. function DsMakeSpnA(ServiceClass: LPCSTR; ServiceName: LPCSTR;
  1038.   InstanceName: LPCSTR; InstancePort: USHORT; Referrer: LPCSTR;
  1039.   var pcSpnLength: DWORD; pszSpn: LPSTR): DWORD; stdcall;
  1040. {$EXTERNALSYM DsMakeSpnA}
  1041. function DsMakeSpnW(ServiceClass: LPCWSTR; ServiceName: LPCWSTR;
  1042.   InstanceName: LPCWSTR; InstancePort: USHORT; Referrer: LPCWSTR;
  1043.   var pcSpnLength: DWORD; pszSpn: LPWSTR): DWORD; stdcall;
  1044. {$EXTERNALSYM DsMakeSpnW}
  1045. {$IFDEF UNICODE}
  1046. function DsMakeSpn(ServiceClass: LPCWSTR; ServiceName: LPCWSTR;
  1047.   InstanceName: LPCWSTR; InstancePort: USHORT; Referrer: LPCWSTR;
  1048.   var pcSpnLength: DWORD; pszSpn: LPWSTR): DWORD; stdcall;
  1049. {$EXTERNALSYM DsMakeSpn}
  1050. {$ELSE}
  1051. function DsMakeSpn(ServiceClass: LPCSTR; ServiceName: LPCSTR;
  1052.   InstanceName: LPCSTR; InstancePort: USHORT; Referrer: LPCSTR;
  1053.   var pcSpnLength: DWORD; pszSpn: LPSTR): DWORD; stdcall;
  1054. {$EXTERNALSYM DsMakeSpn}
  1055. {$ENDIF}
  1056. // ==========================================================
  1057. // DsGetSPN -- server's call to gets SPNs for a service name by which it is
  1058. // known to clients. N.B.: there may be more than one name by which clients
  1059. // know it the SPNs are then passed to DsAddAccountSpn to register them in
  1060. // the DS
  1061. //
  1062. //      IN SpnNameType eType,
  1063. //      IN LPCTSTR ServiceClass,
  1064. // kind of service -- "http", "ldap", "ftp", etc.
  1065. //      IN LPCTSTR ServiceName OPTIONAL,
  1066. // name of service -- DN or DNS; not needed for host-based
  1067. //      IN USHORT InstancePort,
  1068. // port number (0 => default) for instances
  1069. //      IN USHORT cInstanceNames,
  1070. // count of extra instance names and ports (0=>use gethostbyname)
  1071. //      IN LPCTSTR InstanceNames[] OPTIONAL,
  1072. // extra instance names (not used for host names)
  1073. //      IN USHORT InstancePorts[] OPTIONAL,
  1074. // extra instance ports (0 => default)
  1075. //      IN OUT PULONG pcSpn,    // count of SPNs
  1076. //      IN OUT LPTSTR * prpszSPN[]
  1077. // a bunch of SPNs for this service; free with DsFreeSpnArray
  1078. function DsGetSpnA(ServiceType: DS_SPN_NAME_TYPE; ServiceClass: LPCSTR;
  1079.   ServiceName: LPCSTR; InstancePort: USHORT; cInstanceNames: USHORT;
  1080.   pInstanceNames: LPCSTR; pInstancePorts: PUSHORT; var pcSpn: DWORD;
  1081.   var prpszSpn: LPSTR): DWORD; stdcall;
  1082. {$EXTERNALSYM DsGetSpnA}
  1083. function DsGetSpnW(ServiceType: DS_SPN_NAME_TYPE; ServiceClass: LPCWSTR;
  1084.   ServiceName: LPCWSTR; InstancePort: USHORT; cInstanceNames: USHORT;
  1085.   pInstanceNames: LPCWSTR; pInstancePorts: PUSHORT; var pcSpn: DWORD;
  1086.   var prpszSpn: LPWSTR): DWORD; stdcall;
  1087. {$EXTERNALSYM DsGetSpnW}
  1088. {$IFDEF UNICODE}
  1089. function DsGetSpn(ServiceType: DS_SPN_NAME_TYPE; ServiceClass: LPCWSTR;
  1090.   ServiceName: LPCWSTR; InstancePort: USHORT; cInstanceNames: USHORT;
  1091.   pInstanceNames: LPCWSTR; pInstancePorts: PUSHORT; var pcSpn: DWORD;
  1092.   var prpszSpn: LPWSTR): DWORD; stdcall;
  1093. {$EXTERNALSYM DsGetSpn}
  1094. {$ELSE}
  1095. function DsGetSpn(ServiceType: DS_SPN_NAME_TYPE; ServiceClass: LPCSTR;
  1096.   ServiceName: LPCSTR; InstancePort: USHORT; cInstanceNames: USHORT;
  1097.   pInstanceNames: LPCSTR; pInstancePorts: PUSHORT; var pcSpn: DWORD;
  1098.   var prpszSpn: LPSTR): DWORD; stdcall;
  1099. {$EXTERNALSYM DsGetSpn}
  1100. {$ENDIF}
  1101. // ==========================================================
  1102. // DsFreeSpnArray() -- Free array returned by DsGetSpn{A,W}
  1103. procedure DsFreeSpnArrayA(cSpn: DWORD; rpszSpn: LPSTR); stdcall;
  1104. {$EXTERNALSYM DsFreeSpnArrayA}
  1105. procedure DsFreeSpnArrayW(cSpn: DWORD; rpszSpn: LPWSTR); stdcall;
  1106. {$EXTERNALSYM DsFreeSpnArrayW}
  1107. {$IFDEF UNICODE}
  1108. procedure DsFreeSpnArray(cSpn: DWORD; rpszSpn: LPWSTR); stdcall;
  1109. {$EXTERNALSYM DsFreeSpnArray}
  1110. {$ELSE}
  1111. procedure DsFreeSpnArray(cSpn: DWORD; rpszSpn: LPSTR); stdcall;
  1112. {$EXTERNALSYM DsFreeSpnArray}
  1113. {$ENDIF}
  1114. // ==========================================================
  1115. // DsCrackSpn() -- parse an SPN into the ServiceClass,
  1116. // ServiceName, and InstanceName (and InstancePort) pieces.
  1117. // An SPN is passed in, along with a pointer to the maximum length
  1118. // for each piece and a pointer to a buffer where each piece should go.
  1119. // On exit, the maximum lengths are updated to the actual length for each piece
  1120. // and the buffer contain the appropriate piece. The InstancePort is 0 if not
  1121. // present.
  1122. //
  1123. // DWORD DsCrackSpn(
  1124. //      IN LPTSTR pszSPN,               // the SPN to parse
  1125. //      IN OUT PUSHORT pcServiceClass,  // input -- max length of ServiceClass;
  1126. //                                         output -- actual length
  1127. //      OUT LPCTSTR ServiceClass,       // the ServiceClass part of the SPN
  1128. //      IN OUT PUSHORT pcServiceName,   // input -- max length of ServiceName;
  1129. //                                         output -- actual length
  1130. //      OUT LPCTSTR ServiceName,        // the ServiceName part of the SPN
  1131. //      IN OUT PUSHORT pcInstance,      // input -- max length of ServiceClass;
  1132. //                                         output -- actual length
  1133. //      OUT LPCTSTR InstanceName,  // the InstanceName part of the SPN
  1134. //      OUT PUSHORT InstancePort          // instance port
  1135. //
  1136. // Note: lengths are in characters; all string lengths include terminators
  1137. // All arguments except pszSpn are optional.
  1138. //
  1139. function DsCrackSpnA(pszSpn: LPCSTR; pcServiceClass: LPDWORD; ServiceClass: LPSTR;
  1140.   pcServiceName: LPDWORD; ServiceName: LPSTR; pcInstanceName: LPDWORD;
  1141.   InstanceName: LPSTR; pInstancePort: PUSHORT): DWORD; stdcall;
  1142. {$EXTERNALSYM DsCrackSpnA}
  1143. function DsCrackSpnW(pszSpn: LPCWSTR; pcServiceClass: LPDWORD; ServiceClass: LPWSTR;
  1144.   pcServiceName: LPDWORD; ServiceName: LPWSTR; pcInstanceName: LPDWORD;
  1145.   InstanceName: LPWSTR; pInstancePort: PUSHORT): DWORD; stdcall;
  1146. {$EXTERNALSYM DsCrackSpnW}
  1147. {$IFDEF UNICODE}
  1148. function DsCrackSpn(pszSpn: LPCWSTR; pcServiceClass: LPDWORD; ServiceClass: LPWSTR;
  1149.   pcServiceName: LPDWORD; ServiceName: LPWSTR; pcInstanceName: LPDWORD;
  1150.   InstanceName: LPWSTR; pInstancePort: PUSHORT): DWORD; stdcall;
  1151. {$EXTERNALSYM DsCrackSpn}
  1152. {$ELSE}
  1153. function DsCrackSpn(pszSpn: LPCSTR; pcServiceClass: LPDWORD; ServiceClass: LPSTR;
  1154.   pcServiceName: LPDWORD; ServiceName: LPSTR; pcInstanceName: LPDWORD;
  1155.   InstanceName: LPSTR; pInstancePort: PUSHORT): DWORD; stdcall;
  1156. {$EXTERNALSYM DsCrackSpn}
  1157. {$ENDIF}
  1158. // ==========================================================
  1159. // DsWriteAccountSpn -- set or add SPNs for an account object
  1160. // Usually done by service itself, or perhaps by an admin.
  1161. //
  1162. // This call is RPC'd to the DC where the account object is stored, so it can
  1163. // securely enforce policy on what SPNs are allowed on the account. Direct LDAP
  1164. // writes to the SPN property are not allowed -- all writes must come through
  1165. // this RPC call. (Reads via // LDAP are OK.)
  1166. //
  1167. // The account object can be a machine accout, or a service (user) account.
  1168. //
  1169. // If called by the service to register itself, it can most easily get
  1170. // the names by calling DsGetSpn with each of the names that
  1171. // clients can use to find the service.
  1172. //
  1173. // IN SpnWriteOp eOp,                   // set, add
  1174. // IN LPCTSTR   pszAccount,             // DN of account to which to add SPN
  1175. // IN int       cSPN,                   // count of SPNs to add to account
  1176. // IN LPCTSTR   rpszSPN[]               // SPNs to add to altSecID property
  1177. function DsWriteAccountSpnA(hDS: HANDLE; Operation: DS_SPN_WRITE_OP;
  1178.   pszAccount: LPCSTR; cSpn: DWORD; rpszSpn: LPCSTR): DWORD; stdcall;
  1179. {$EXTERNALSYM DsWriteAccountSpnA}
  1180. function DsWriteAccountSpnW(hDS: HANDLE; Operation: DS_SPN_WRITE_OP;
  1181.   pszAccount: LPCWSTR; cSpn: DWORD; rpszSpn: LPCWSTR): DWORD; stdcall;
  1182. {$EXTERNALSYM DsWriteAccountSpnW}
  1183. {$IFDEF UNICODE}
  1184. function DsWriteAccountSpn(hDS: HANDLE; Operation: DS_SPN_WRITE_OP;
  1185.   pszAccount: LPCWSTR; cSpn: DWORD; rpszSpn: LPCWSTR): DWORD; stdcall;
  1186. {$EXTERNALSYM DsWriteAccountSpn}
  1187. {$ELSE}
  1188. function DsWriteAccountSpn(hDS: HANDLE; Operation: DS_SPN_WRITE_OP;
  1189.   pszAccount: LPCSTR; cSpn: DWORD; rpszSpn: LPCSTR): DWORD; stdcall;
  1190. {$EXTERNALSYM DsWriteAccountSpn}
  1191. {$ENDIF}
  1192. {++
  1193. Routine Description:
  1194. Constructs a Service Principal Name suitable to identify the desired server.
  1195. The service class and part of a dns hostname must be supplied.
  1196. This routine is a simplified wrapper to DsMakeSpn.
  1197. The ServiceName is made canonical by resolving through DNS.
  1198. Guid-based dns names are not supported.
  1199. The simplified SPN constructed looks like this:
  1200. ServiceClass / ServiceName / ServiceName
  1201. The instance name portion (2nd position) is always defaulted.  The port and
  1202. referrer fields are not used.
  1203. Arguments:
  1204.     ServiceClass - Class of service, defined by the service, can be any
  1205.         string unique to the service
  1206.     ServiceName - dns hostname, fully qualified or not
  1207.        Stringized IP address is also resolved if necessary
  1208.     pcSpnLength - IN, maximum length of buffer, in chars
  1209.                   OUT, space utilized, in chars, including terminator
  1210.     pszSpn - Buffer, atleast of length *pcSpnLength
  1211. Return Value:
  1212.     WINAPI - Win32 error code
  1213. --}
  1214. function DsClientMakeSpnForTargetServerA(ServiceClass: LPCSTR; ServiceName: LPCSTR;
  1215.   var pcSpnLength: DWORD; pszSpn: LPSTR): DWORD; stdcall;
  1216. {$EXTERNALSYM DsClientMakeSpnForTargetServerA}
  1217. function DsClientMakeSpnForTargetServerW(ServiceClass: LPCWSTR; ServiceName: LPCWSTR;
  1218.   var pcSpnLength: DWORD; pszSpn: LPWSTR): DWORD; stdcall;
  1219. {$EXTERNALSYM DsClientMakeSpnForTargetServerW}
  1220. {$IFDEF UNICODE}
  1221. function DsClientMakeSpnForTargetServer(ServiceClass: LPCWSTR; ServiceName: LPCWSTR;
  1222.   var pcSpnLength: DWORD; pszSpn: LPWSTR): DWORD; stdcall;
  1223. {$EXTERNALSYM DsClientMakeSpnForTargetServer}
  1224. {$ELSE}
  1225. function DsClientMakeSpnForTargetServer(ServiceClass: LPCSTR; ServiceName: LPCSTR;
  1226.   var pcSpnLength: DWORD; pszSpn: LPSTR): DWORD; stdcall;
  1227. {$EXTERNALSYM DsClientMakeSpnForTargetServer}
  1228. {$ENDIF}
  1229. {++
  1230. outine Description:
  1231. Register Service Principal Names for a server application.
  1232. This routine does the following:
  1233. 1. Enumerates a list of server SPNs using DsGetSpn and the provided class
  1234. 2. Determines the domain of the current user context
  1235. 3. Determines the DN of the current user context if not supplied
  1236. 4. Locates a domain controller
  1237. 5. Binds to the domain controller
  1238. 6. Uses DsWriteAccountSpn to write the SPNs on the named object DN
  1239. 7. Unbinds
  1240. Construct server SPNs for this service, and write them to the right object.
  1241. If the userObjectDn is specified, the SPN is written to that object.
  1242. Otherwise the Dn is defaulted, to the user object, then computer.
  1243. Now, bind to the DS, and register the name on the object for the
  1244. user this service is running as.  So, if we're running as local
  1245. system, we'll register it on the computer object itself.  If we're
  1246. running as a domain user, we'll add the SPN to the user's object.
  1247. Arguments:
  1248.     Operation - What should be done with the values: add, replace or delete
  1249.     ServiceClass - Unique string identifying service
  1250.     UserObjectDN - Optional, dn of object to write SPN to
  1251. Return Value:
  1252.     WINAPI - Win32 error code
  1253. --}
  1254. function DsServerRegisterSpnA(Operation: DS_SPN_WRITE_OP; ServiceClass: LPCSTR;
  1255.   UserObjectDN: LPCSTR): DWORD; stdcall;
  1256. {$EXTERNALSYM DsServerRegisterSpnA}
  1257. function DsServerRegisterSpnW(Operation: DS_SPN_WRITE_OP; ServiceClass: LPCWSTR;
  1258.   UserObjectDN: LPCWSTR): DWORD; stdcall;
  1259. {$EXTERNALSYM DsServerRegisterSpnW}
  1260. {$IFDEF UNICODE}
  1261. function DsServerRegisterSpn(Operation: DS_SPN_WRITE_OP; ServiceClass: LPCWSTR;
  1262.   UserObjectDN: LPCWSTR): DWORD; stdcall;
  1263. {$EXTERNALSYM DsServerRegisterSpn}
  1264. {$ELSE}
  1265. function DsServerRegisterSpn(Operation: DS_SPN_WRITE_OP; ServiceClass: LPCSTR;
  1266.   UserObjectDN: LPCSTR): DWORD; stdcall;
  1267. {$EXTERNALSYM DsServerRegisterSpn}
  1268. {$ENDIF}
  1269. // DsReplicaSync.  The server that this call is executing on is called the
  1270. // destination.  The destination's naming context will be brought up to date
  1271. // with respect to a source system.  The source system is identified by the
  1272. // uuid.  The uuid is that of the source system's "NTDS Settings" object.
  1273. // The destination system must already be configured such that the source
  1274. // system is one of the systems from which it recieves replication data
  1275. // ("replication from"). This is usually done automatically by the KCC.
  1276. //
  1277. //  PARAMETERS:
  1278. //      pNC (DSNAME *)
  1279. //          Name of the NC to synchronize.
  1280. //      puuidSourceDRA (SZ)
  1281. //          objectGuid of DSA with which to synchronize the replica.
  1282. //      ulOptions (ULONG)
  1283. //          Bitwise OR of zero or more flags
  1284. //   RETURNS: WIN32 STATUS
  1285. function DsReplicaSyncA(hDS: HANDLE; NameContext: LPCSTR; pUuidDsaSrc: LPUUID;
  1286.   Options: ULONG): DWORD; stdcall;
  1287. {$EXTERNALSYM DsReplicaSyncA}
  1288. function DsReplicaSyncW(hDS: HANDLE; NameContext: LPCWSTR; pUuidDsaSrc: LPUUID;
  1289.   Options: ULONG): DWORD; stdcall;
  1290. {$EXTERNALSYM DsReplicaSyncW}
  1291. {$IFDEF UNICODE}
  1292. function DsReplicaSync(hDS: HANDLE; NameContext: LPCWSTR; pUuidDsaSrc: LPUUID;
  1293.   Options: ULONG): DWORD; stdcall;
  1294. {$EXTERNALSYM DsReplicaSync}
  1295. {$ELSE}
  1296. function DsReplicaSync(hDS: HANDLE; NameContext: LPCSTR; pUuidDsaSrc: LPUUID;
  1297.   Options: ULONG): DWORD; stdcall;
  1298. {$EXTERNALSYM DsReplicaSync}
  1299. {$ENDIF}
  1300. // DsReplicaAdd
  1301. //
  1302. {
  1303. Description:
  1304.    This call is executed on the destination.  It causes the destination to
  1305.    add a "replication from" reference to the indicated source system.
  1306. The source server is identified by string name, not uuid as with Sync.
  1307. The DsaSrcAddress parameter is the transport specific address of the source
  1308. DSA, usually its guid-based dns name.  The guid in the guid-based dns name is
  1309. the object-guid of that server's ntds-dsa (settings) object.
  1310. Arguments:
  1311.     pNC (IN) - NC for which to add the replica.
  1312.     pSourceDsaDN (IN) - DN of the source DSA's ntdsDsa object.  Required if
  1313.         ulOptions includes DS_REPADD_ASYNCHRONOUS_REPLICA; ignored otherwise.
  1314.     pTransportDN (IN) - DN of the interSiteTransport object representing the
  1315.         transport by which to communicate with the source server.  Required if
  1316.         ulOptions includes INTERSITE_MESSAGING; ignored otherwise.
  1317.     pszSourceDsaAddress (IN) - Transport-specific address of the source DSA.
  1318.     pSchedule (IN) - Schedule by which to replicate the NC from this
  1319.         source in the future.
  1320.     ulOptions (IN) - flags
  1321.     RETURNS: WIN32 STATUS
  1322. }
  1323. function DsReplicaAddA(hDS: HANDLE; NameContext: LPCSTR; SourceDsaDn: LPCSTR;
  1324.   TransportDn: LPCSTR; SourceDsaAddress: LPCSTR; pSchedule: PSCHEDULE;
  1325.   Options: DWORD): DWORD; stdcall;
  1326. {$EXTERNALSYM DsReplicaAddA}
  1327. function DsReplicaAddW(hDS: HANDLE; NameContext: LPCWSTR; SourceDsaDn: LPCWSTR;
  1328.   TransportDn: LPCWSTR; SourceDsaAddress: LPCWSTR; pSchedule: PSCHEDULE;
  1329.   Options: DWORD): DWORD; stdcall;
  1330. {$EXTERNALSYM DsReplicaAddW}
  1331. {$IFDEF UNICODE}
  1332. function DsReplicaAdd(hDS: HANDLE; NameContext: LPCWSTR; SourceDsaDn: LPCWSTR;
  1333.   TransportDn: LPCWSTR; SourceDsaAddress: LPCWSTR; pSchedule: PSCHEDULE;
  1334.   Options: DWORD): DWORD; stdcall;
  1335. {$EXTERNALSYM DsReplicaAdd}
  1336. {$ELSE}
  1337. function DsReplicaAdd(hDS: HANDLE; NameContext: LPCSTR; SourceDsaDn: LPCSTR;
  1338.   TransportDn: LPCSTR; SourceDsaAddress: LPCSTR; pSchedule: PSCHEDULE;
  1339.   Options: DWORD): DWORD; stdcall;
  1340. {$EXTERNALSYM DsReplicaAdd}
  1341. {$ENDIF}
  1342. // DsReplicaDel
  1343. //
  1344. // The server that this call is executing on is the destination.  The call
  1345. // causes the destination to remove a "replication from" reference to the
  1346. // indicated source server.
  1347. // The source server is identified by string name, not uuid as with Sync.
  1348. // The DsaSrc parameter is the transport specific address of the source DSA,
  1349. // usually its guid-based dns name.  The guid in the guid-based dns name is
  1350. // the object-guid of that server's ntds-dsa (settings) object.
  1351. // If you remove an NC from a given destination and specify the "no source"
  1352. // flag, then the entire replica will be removed from the DC.
  1353. //
  1354. //  PARAMETERS:
  1355. //      pNC (DSNAME *)
  1356. //          Name of the NC for which to delete a source.
  1357. //      pszSourceDRA (SZ)
  1358. //          DSA for which to delete the source.
  1359. //      ulOptions (ULONG)
  1360. //          Bitwise OR of zero or more flags
  1361. //
  1362. //
  1363. //   RETURNS: WIN32 STATUS
  1364. function DsReplicaDelA(hDS: HANDLE; NameContext: LPCSTR; DsaSrc: LPCSTR;
  1365.   Options: ULONG): DWORD; stdcall;
  1366. {$EXTERNALSYM DsReplicaDelA}
  1367. function DsReplicaDelW(hDS: HANDLE; NameContext: LPCWSTR; DsaSrc: LPCWSTR;
  1368.   Options: ULONG): DWORD; stdcall;
  1369. {$EXTERNALSYM DsReplicaDelW}
  1370. {$IFDEF UNICODE}
  1371. function DsReplicaDel(hDS: HANDLE; NameContext: LPCWSTR; DsaSrc: LPCWSTR;
  1372.   Options: ULONG): DWORD; stdcall;
  1373. {$EXTERNALSYM DsReplicaDel}
  1374. {$ELSE}
  1375. function DsReplicaDel(hDS: HANDLE; NameContext: LPCSTR; DsaSrc: LPCSTR;
  1376.   Options: ULONG): DWORD; stdcall;
  1377. {$EXTERNALSYM DsReplicaDel}
  1378. {$ENDIF}
  1379. // DsReplicaModify
  1380. //
  1381. //
  1382. //  Modify a source for a given naming context
  1383. //
  1384. //  The value must already exist.
  1385. //
  1386. //  Either the UUID or the address may be used to identify the current value.
  1387. //  If a UUID is specified, the UUID will be used for comparison.  Otherwise,
  1388. //  the address will be used for comparison.
  1389. //
  1390. //  PARAMETERS:
  1391. //      pNC (DSNAME *)
  1392. //          Name of the NC for which the Reps-From should be modified.
  1393. //      puuidSourceDRA (UUID *)
  1394. //          Guid of the DSA object for the source server. May be NULL if:
  1395. //            . ulModifyFields does not include DS_REPMOD_UPDATE_ADDRESS and
  1396. //            . pmtxSourceDRA is non-NULL.
  1397. //      puuidTransportObj (UUID *)
  1398. //          objectGuid of the transport by which replication is to be performed
  1399. //          Ignored if ulModifyFields does not include
  1400. //          DS_REPMOD_UPDATE_TRANSPORT.
  1401. //      pszSourceDRA (SZ)
  1402. //          DSA for which the reference should be added or deleted.  Ignored if
  1403. //          puuidSourceDRA is non-NULL and ulModifyFields does not include
  1404. //          DS_REPMOD_UPDATE_ADDRESS.
  1405. //      prtSchedule (REPLTIMES *)
  1406. //          Periodic replication schedule for this replica.  Ignored if
  1407. //          ulModifyFields does not include DS_REPMOD_UPDATE_SCHEDULE.
  1408. //      ulReplicaFlags (ULONG)
  1409. //          Flags to set for this replica.  Ignored if ulModifyFields does not
  1410. //          include DS_REPMOD_UPDATE_FLAGS.
  1411. //      ulModifyFields (ULONG)
  1412. //          Fields to update.  One or more of the following bit flags:
  1413. //              UPDATE_ADDRESS
  1414. //                  Update the MTX_ADDR associated with the referenced server.
  1415. //              UPDATE_SCHEDULE
  1416. //                  Update the periodic replication schedule associated with
  1417. //                  the replica.
  1418. //              UPDATE_FLAGS
  1419. //                  Update the flags associated with the replica.
  1420. //              UPDATE_TRANSPORT
  1421. //                  Update the transport associated with the replica.
  1422. //      ulOptions (ULONG)
  1423. //          Bitwise OR of zero or more of the following:
  1424. //              DS_REPMOD_ASYNCHRONOUS_OPERATION
  1425. //                  Perform this operation asynchronously.
  1426. //   RETURNS: WIN32 STATUS
  1427. function DsReplicaModifyA(hDS: HANDLE; NameContext: LPCSTR; pUuidSourceDsa: LPUUID;
  1428.   TransportDn: LPCSTR; SourceDsaAddress: LPCSTR; pSchedule: PSCHEDULE;
  1429.   ReplicaFlags: DWORD; ModifyFields: DWORD; Options: DWORD): DWORD; stdcall;
  1430. {$EXTERNALSYM DsReplicaModifyA}
  1431. function DsReplicaModifyW(hDS: HANDLE; NameContext: LPCWSTR; pUuidSourceDsa: LPUUID;
  1432.   TransportDn: LPCWSTR; SourceDsaAddress: LPCWSTR; pSchedule: PSCHEDULE;
  1433.   ReplicaFlags: DWORD; ModifyFields: DWORD; Options: DWORD): DWORD; stdcall;
  1434. {$EXTERNALSYM DsReplicaModifyW}
  1435. {$IFDEF UNICODE}
  1436. function DsReplicaModify(hDS: HANDLE; NameContext: LPCWSTR; pUuidSourceDsa: LPUUID;
  1437.   TransportDn: LPCWSTR; SourceDsaAddress: LPCWSTR; pSchedule: PSCHEDULE;
  1438.   ReplicaFlags: DWORD; ModifyFields: DWORD; Options: DWORD): DWORD; stdcall;
  1439. {$EXTERNALSYM DsReplicaModify}
  1440. {$ELSE}
  1441. function DsReplicaModify(hDS: HANDLE; NameContext: LPCSTR; pUuidSourceDsa: LPUUID;
  1442.   TransportDn: LPCSTR; SourceDsaAddress: LPCSTR; pSchedule: PSCHEDULE;
  1443.   ReplicaFlags: DWORD; ModifyFields: DWORD; Options: DWORD): DWORD; stdcall;
  1444. {$EXTERNALSYM DsReplicaModify}
  1445. {$ENDIF}
  1446. // DsReplicaUpdateRefs
  1447. //
  1448. // In this case, the RPC is being executed on the "source" of destination-sourc
  1449. // replication relationship.  This function tells the source that it no longer
  1450. // supplies replication information to the indicated destination system.
  1451. // Add or remove a target server from the Reps-To property on the given NC.
  1452. // Add/remove a reference given the DSNAME of the corresponding NTDS-DSA
  1453. // object.
  1454. //
  1455. //  PARAMETERS:
  1456. //      pNC (DSNAME *)
  1457. //          Name of the NC for which the Reps-To should be modified.
  1458. //      DsaDest (SZ)
  1459. //          Network address of DSA for which the reference should be added
  1460. //          or deleted.
  1461. //      pUuidDsaDest (UUID *)
  1462. //          objectGuid of the DSA object for which the reference should be 
  1463. //          added or deleted.
  1464. //      ulOptions (ULONG)
  1465. //          Bitwise OR of zero or more of the following:
  1466. //              DS_REPUPD_ASYNC_OP
  1467. //                  Perform this operation asynchronously.
  1468. //              DS_REPUPD_ADD_REFERENCE
  1469. //                  Add the given server to the Reps-To property.
  1470. //              DS_REPUPD_DEL_REFERENCE
  1471. //                  Remove the given server from the Reps-To property.
  1472. //          Note that ADD_REF and DEL_REF may be paired to perform
  1473. //          "add or update".
  1474. //
  1475. //   RETURNS: WIN32 STATUS
  1476. function DsReplicaUpdateRefsA(hDS: HANDLE; NameContext: LPCSTR; DsaDest: LPCSTR;
  1477.   pUuidDsaDest: LPUUID; Options: ULONG): DWORD; stdcall;
  1478. {$EXTERNALSYM DsReplicaUpdateRefsA}
  1479. function DsReplicaUpdateRefsW(hDS: HANDLE; NameContext: LPCWSTR; DsaDest: LPCWSTR;
  1480.   pUuidDsaDest: LPUUID; Options: ULONG): DWORD; stdcall;
  1481. {$EXTERNALSYM DsReplicaUpdateRefsW}
  1482. {$IFDEF UNICODE}
  1483. function DsReplicaUpdateRefs(hDS: HANDLE; NameContext: LPCWSTR; DsaDest: LPCWSTR;
  1484.   pUuidDsaDest: LPUUID; Options: ULONG): DWORD; stdcall;
  1485. {$EXTERNALSYM DsReplicaUpdateRefs}
  1486. {$ELSE}
  1487. function DsReplicaUpdateRefs(hDS: HANDLE; NameContext: LPCSTR; DsaDest: LPCSTR;
  1488.   pUuidDsaDest: LPUUID; Options: ULONG): DWORD; stdcall;
  1489. {$EXTERNALSYM DsReplicaUpdateRefs}
  1490. {$ENDIF}
  1491. // Friends of DsReplicaSyncAll
  1492. type
  1493.   DS_REPSYNCALL_ERROR = (
  1494.     DS_REPSYNCALL_WIN32_ERROR_CONTACTING_SERVER,
  1495.     DS_REPSYNCALL_WIN32_ERROR_REPLICATING,
  1496.     DS_REPSYNCALL_SERVER_UNREACHABLE);
  1497.   {$EXTERNALSYM DS_REPSYNCALL_ERROR}
  1498.   TDsReSynCallError = DS_REPSYNCALL_ERROR;
  1499.   DS_REPSYNCALL_EVENT = (
  1500.     DS_REPSYNCALL_EVENT_ERROR,
  1501.     DS_REPSYNCALL_EVENT_SYNC_STARTED,
  1502.     DS_REPSYNCALL_EVENT_SYNC_COMPLETED,
  1503.     DS_REPSYNCALL_EVENT_FINISHED);
  1504.   {$EXTERNALSYM DS_REPSYNCALL_EVENT}
  1505.   TDsReSynCallEvent = DS_REPSYNCALL_EVENT;
  1506. // Friends of DsReplicaSyncAll
  1507.   PDS_REPSYNCALL_SYNCA = ^DS_REPSYNCALL_SYNCA;
  1508.   {$EXTERNALSYM PDS_REPSYNCALL_SYNCA}
  1509.   DS_REPSYNCALL_SYNCA = record
  1510.     pszSrcId: LPSTR;
  1511.     pszDstId: LPSTR;
  1512.     pszNC: LPSTR;
  1513.     pguidSrc: LPGUID;
  1514.     pguidDst: LPGUID;
  1515.   end;
  1516.   {$EXTERNALSYM DS_REPSYNCALL_SYNCA}
  1517.   TDsRepsyncallSyncA = DS_REPSYNCALL_SYNCA;
  1518.   PDsRepsyncallSyncA = PDS_REPSYNCALL_SYNCA;
  1519.   PDS_REPSYNCALL_SYNCW = ^DS_REPSYNCALL_SYNCW;
  1520.   {$EXTERNALSYM PDS_REPSYNCALL_SYNCW}
  1521.   DS_REPSYNCALL_SYNCW = record
  1522.     pszSrcId: LPWSTR;
  1523.     pszDstId: LPWSTR;
  1524.     pszNC: LPWSTR;
  1525.     pguidSrc: LPGUID;
  1526.     pguidDst: LPGUID;
  1527.   end;
  1528.   {$EXTERNALSYM DS_REPSYNCALL_SYNCW}
  1529.   TDsRepsyncallSyncW = DS_REPSYNCALL_SYNCW;
  1530.   PDsRepsyncallSyncW = PDS_REPSYNCALL_SYNCW;
  1531.   PDS_REPSYNCALL_ERRINFOA = ^DS_REPSYNCALL_ERRINFOA;
  1532.   {$EXTERNALSYM PDS_REPSYNCALL_ERRINFOA}
  1533.   DS_REPSYNCALL_ERRINFOA = record
  1534.     pszSvrId: LPSTR;
  1535.     error: DS_REPSYNCALL_ERROR;
  1536.     dwWin32Err: DWORD;
  1537.     pszSrcId: LPSTR;
  1538.   end;
  1539.   {$EXTERNALSYM DS_REPSYNCALL_ERRINFOA}
  1540.   PPDS_REPSYNCALL_ERRINFOA = ^PDS_REPSYNCALL_ERRINFOA;
  1541.   {$NODEFINE PPDS_REPSYNCALL_ERRINFOA}
  1542.   TDsRepSynCallErrInfoA = DS_REPSYNCALL_ERRINFOA;
  1543.   PDsRepSynCallErrInfoA = PDS_REPSYNCALL_ERRINFOA;
  1544.   PDS_REPSYNCALL_ERRINFOW = ^DS_REPSYNCALL_ERRINFOW;
  1545.   {$EXTERNALSYM PDS_REPSYNCALL_ERRINFOW}
  1546.   DS_REPSYNCALL_ERRINFOW = record
  1547.     pszSvrId: LPWSTR;
  1548.     error: DS_REPSYNCALL_ERROR;
  1549.     dwWin32Err: DWORD;
  1550.     pszSrcId: LPWSTR;
  1551.   end;
  1552.   {$EXTERNALSYM DS_REPSYNCALL_ERRINFOW}
  1553.   PPDS_REPSYNCALL_ERRINFOW = ^PDS_REPSYNCALL_ERRINFOW;
  1554.   {$NODEFINE PPDS_REPSYNCALL_ERRINFOW}
  1555.   TDsRepSynCallErrInfoW = DS_REPSYNCALL_ERRINFOW;
  1556.   PDsRepSynCallErrInfoW = PDS_REPSYNCALL_ERRINFOW;
  1557.   PDS_REPSYNCALL_UPDATEA = ^DS_REPSYNCALL_UPDATEA;
  1558.   {$EXTERNALSYM PDS_REPSYNCALL_UPDATEA}
  1559.   DS_REPSYNCALL_UPDATEA = record
  1560.     event: DS_REPSYNCALL_EVENT;
  1561.     pErrInfo: PDS_REPSYNCALL_ERRINFOA;
  1562.     pSync: PDS_REPSYNCALL_SYNCA;
  1563.   end;
  1564.   {$EXTERNALSYM DS_REPSYNCALL_UPDATEA}
  1565.   TDsRepSynCallUpdateA = DS_REPSYNCALL_UPDATEA;
  1566.   PDsRepSynCallUpdateA = PDS_REPSYNCALL_UPDATEA;
  1567.   PDS_REPSYNCALL_UPDATEW = ^DS_REPSYNCALL_UPDATEW;
  1568.   {$EXTERNALSYM PDS_REPSYNCALL_UPDATEW}
  1569.   DS_REPSYNCALL_UPDATEW = record
  1570.     event: DS_REPSYNCALL_EVENT;
  1571.     pErrInfo: PDS_REPSYNCALL_ERRINFOW;
  1572.     pSync: PDS_REPSYNCALL_SYNCW;
  1573.   end;
  1574.   {$EXTERNALSYM DS_REPSYNCALL_UPDATEW}
  1575.   TDsRepSynCallUpdateW = DS_REPSYNCALL_UPDATEW;
  1576.   PDsRepSynCallUpdateW = PDS_REPSYNCALL_UPDATEW;
  1577. {$IFDEF UNICODE}
  1578.   DS_REPSYNCALL_SYNC = DS_REPSYNCALL_SYNCW;
  1579.   {$EXTERNALSYM DS_REPSYNCALL_SYNC}
  1580.   DS_REPSYNCALL_ERRINFO = DS_REPSYNCALL_ERRINFOW;
  1581.   {$EXTERNALSYM DS_REPSYNCALL_ERRINFO}
  1582.   PPDS_REPSYNCALL_ERRINFO = PPDS_REPSYNCALL_ERRINFOW;
  1583.   {$NODEFINE PPDS_REPSYNCALL_ERRINFO}
  1584.   DS_REPSYNCALL_UPDATE = DS_REPSYNCALL_UPDATEW;
  1585.   {$EXTERNALSYM DS_REPSYNCALL_UPDATE}
  1586.   PDS_REPSYNCALL_SYNC = PDS_REPSYNCALL_SYNCW;
  1587.   {$EXTERNALSYM PDS_REPSYNCALL_SYNC}
  1588.   PDS_REPSYNCALL_ERRINFO = PDS_REPSYNCALL_ERRINFOW;
  1589.   {$EXTERNALSYM PDS_REPSYNCALL_ERRINFO}
  1590.   PDS_REPSYNCALL_UPDATE = PDS_REPSYNCALL_UPDATEW;
  1591.   {$EXTERNALSYM PDS_REPSYNCALL_UPDATE}
  1592.   TDsRepSynCallSync = TDsRepSynCallSyncW;
  1593.   PDsRepSynCallSync = PDsRepSynCallSyncW;
  1594.   TDsRepSynCallErrInfo = TDsRepSynCallErrInfoW;
  1595.   PDsRepSynCallErrInfo = PDsRepSynCallErrInfoW;
  1596.   TDsRepSynCallUpdate = TDsRepSynCallUpdateW;
  1597.   PDsRepSynCallUpdate = PDsRepSynCallUpdateW;
  1598. {$ELSE}
  1599.   DS_REPSYNCALL_SYNC = DS_REPSYNCALL_SYNCA;
  1600.   {$EXTERNALSYM DS_REPSYNCALL_SYNC}
  1601.   DS_REPSYNCALL_ERRINFO = DS_REPSYNCALL_ERRINFOA;
  1602.   {$EXTERNALSYM DS_REPSYNCALL_ERRINFO}
  1603.   PPDS_REPSYNCALL_ERRINFO = PPDS_REPSYNCALL_ERRINFOA;
  1604.   {$NODEFINE PPDS_REPSYNCALL_ERRINFO}
  1605.   DS_REPSYNCALL_UPDATE = DS_REPSYNCALL_UPDATEA;
  1606.   {$EXTERNALSYM DS_REPSYNCALL_UPDATE}
  1607.   PDS_REPSYNCALL_SYNC = PDS_REPSYNCALL_SYNCA;
  1608.   {$EXTERNALSYM PDS_REPSYNCALL_SYNC}
  1609.   PDS_REPSYNCALL_ERRINFO = PDS_REPSYNCALL_ERRINFOA;
  1610.   {$EXTERNALSYM PDS_REPSYNCALL_ERRINFO}
  1611.   PDS_REPSYNCALL_UPDATE = PDS_REPSYNCALL_UPDATEA;
  1612.   {$EXTERNALSYM PDS_REPSYNCALL_UPDATE}
  1613.   TDsRepSynCallSync = TDsRepSynCallSyncA;
  1614.   PDsRepSynCallSync = PDsRepSynCallSyncA;
  1615.   TDsRepSynCallErrInfo = TDsRepSynCallErrInfoA;
  1616.   PDsRepSynCallErrInfo = PDsRepSynCallErrInfoA;
  1617.   TDsRepSynCallUpdate = TDsRepSynCallUpdateA;
  1618.   PDsRepSynCallUpdate = PDsRepSynCallUpdateA;
  1619. {$ENDIF}
  1620. // **********************
  1621. // Replica SyncAll flags
  1622. // **********************
  1623. const
  1624. // This option has no effect.
  1625.   DS_REPSYNCALL_NO_OPTIONS = $00000000;
  1626.   {$EXTERNALSYM DS_REPSYNCALL_NO_OPTIONS}
  1627. // Ordinarily, if a server cannot be contacted, DsReplicaSyncAll tries to
  1628. // route around it and replicate from as many servers as possible.  Enabling
  1629. // this option will cause DsReplicaSyncAll to generate a fatal error if any
  1630. // server cannot be contacted, or if any server is unreachable (due to a
  1631. // disconnected or broken topology.)
  1632.   DS_REPSYNCALL_ABORT_IF_SERVER_UNAVAILABLE = $00000001;
  1633.   {$EXTERNALSYM DS_REPSYNCALL_ABORT_IF_SERVER_UNAVAILABLE}
  1634. // This option disables transitive replication; syncs will only be performed
  1635. // with adjacent servers and no DsBind calls will be made.
  1636.   DS_REPSYNCALL_SYNC_ADJACENT_SERVERS_ONLY = $00000002;
  1637.   {$EXTERNALSYM DS_REPSYNCALL_SYNC_ADJACENT_SERVERS_ONLY}
  1638. // Ordinarily, when DsReplicaSyncAll encounters a non-fatal error, it returns
  1639. // the GUID DNS of the relevant server(s).  Enabling this option causes
  1640. // DsReplicaSyncAll to return the servers' DNs instead.
  1641.   DS_REPSYNCALL_ID_SERVERS_BY_DN = $00000004;
  1642.   {$EXTERNALSYM DS_REPSYNCALL_ID_SERVERS_BY_DN}
  1643. // This option disables all syncing.  The topology will still be analyzed and
  1644. // unavailable / unreachable servers will still be identified.
  1645.   DS_REPSYNCALL_DO_NOT_SYNC = $00000008;
  1646.   {$EXTERNALSYM DS_REPSYNCALL_DO_NOT_SYNC}
  1647. // Ordinarily, DsReplicaSyncAll attempts to bind to all servers before
  1648. // generating the topology.  If a server cannot be contacted, DsReplicaSyncAll
  1649. // excludes that server from the topology and tries to route around it.  If
  1650. // this option is enabled, checking will be bypassed and DsReplicaSyncAll will
  1651. // assume all servers are responding.  This will speed operation of
  1652. // DsReplicaSyncAll, but if some servers are not responding, some transitive
  1653. // replications may be blocked.
  1654.   DS_REPSYNCALL_SKIP_INITIAL_CHECK = $00000010;
  1655.   {$EXTERNALSYM DS_REPSYNCALL_SKIP_INITIAL_CHECK}
  1656. // Push mode. Push changes from the home server out to all partners using
  1657. // transitive replication.  This reverses the direction of replication, and
  1658. // the order of execution of the replication sets from the usual "pulling"
  1659. // mode of execution.
  1660.   DS_REPSYNCALL_PUSH_CHANGES_OUTWARD = $00000020;
  1661.   {$EXTERNALSYM DS_REPSYNCALL_PUSH_CHANGES_OUTWARD}
  1662. // Cross site boundaries.  By default, the only servers that are considered are
  1663. // those in the same site as the home system.  With this option, all servers in
  1664. // the enterprise, across all sites, are eligible.  They must be connected by
  1665. // a synchronous (RPC) transport, however.
  1666.   DS_REPSYNCALL_CROSS_SITE_BOUNDARIES = $00000040;
  1667.   {$EXTERNALSYM DS_REPSYNCALL_CROSS_SITE_BOUNDARIES}
  1668. // DsReplicaSyncAll.  Syncs the destination server with all other servers
  1669. // in the site.
  1670. //
  1671. //  PARAMETERS:
  1672. // hDS (IN) - A DS connection bound to the destination server.
  1673. // pszNameContext (IN) - The naming context to synchronize
  1674. // ulFlags (IN) - Bitwise OR of zero or more flags
  1675. // pFnCallBack (IN, OPTIONAL) - Callback function for message-passing.
  1676. // pCallbackData (IN, OPTIONAL) - A pointer that will be passed to the
  1677. // first argument of the callback function.
  1678. // pErrors (OUT, OPTIONAL) - Pointer to a (PDS_REPSYNCALL_ERRINFO *)
  1679. // object that will hold an array of error structures.
  1680. type
  1681.   TSynchUpdateProcA = function (pData: LPVOID; pUpdate: PDS_REPSYNCALL_UPDATEA): BOOL; stdcall;
  1682.   TSynchUpdateProcW = function (pData: LPVOID; pUpdate: PDS_REPSYNCALL_UPDATEW): BOOL; stdcall;
  1683. function DsReplicaSyncAllA(hDS: HANDLE; pszNameContext: LPCSTR; ulFlags: ULONG;
  1684.   pfnCallBack: TSynchUpdateProcA; pCallbackData: LPVOID;
  1685.   pErrors: PPDS_REPSYNCALL_ERRINFOA): DWORD; stdcall;
  1686. {$EXTERNALSYM DsReplicaSyncAllA}
  1687. function DsReplicaSyncAllW(hDS: HANDLE; pszNameContext: LPCWSTR; ulFlags: ULONG;
  1688.   pfnCallBackW: TSynchUpdateProcW; pCallbackData: LPVOID;
  1689.   pErrors: PPDS_REPSYNCALL_ERRINFOW): DWORD; stdcall;
  1690. {$EXTERNALSYM DsReplicaSyncAllW}
  1691. {$IFDEF UNICODE}
  1692. function DsReplicaSyncAll(hDS: HANDLE; pszNameContext: LPCWSTR; ulFlags: ULONG;
  1693.   pfnCallBackW: TSynchUpdateProcW; pCallbackData: LPVOID;
  1694.   pErrors: PPDS_REPSYNCALL_ERRINFOW): DWORD; stdcall;
  1695. {$EXTERNALSYM DsReplicaSyncAll}
  1696. {$ELSE}
  1697. function DsReplicaSyncAll(hDS: HANDLE; pszNameContext: LPCSTR; ulFlags: ULONG;
  1698.   pfnCallBack: TSynchUpdateProcA; pCallbackData: LPVOID;
  1699.   pErrors: PPDS_REPSYNCALL_ERRINFOA): DWORD; stdcall;
  1700. {$EXTERNALSYM DsReplicaSyncAll}
  1701. {$ENDIF}
  1702. function DsRemoveDsServerA(hDs: HANDLE; ServerDN: LPSTR; DomainDN: LPSTR;
  1703.   fLastDcInDomain: PBOOL; fCommit: BOOL): DWORD; stdcall;
  1704. {$EXTERNALSYM DsRemoveDsServerA}
  1705. function DsRemoveDsServerW(hDs: HANDLE; ServerDN: LPWSTR; DomainDN: LPWSTR;
  1706.   fLastDcInDomain: PBOOL; fCommit: BOOL): DWORD; stdcall;
  1707. {$EXTERNALSYM DsRemoveDsServerW}
  1708. {$IFDEF UNICODE}
  1709. function DsRemoveDsServer(hDs: HANDLE; ServerDN: LPWSTR; DomainDN: LPWSTR;
  1710.   fLastDcInDomain: PBOOL; fCommit: BOOL): DWORD; stdcall;
  1711. {$EXTERNALSYM DsRemoveDsServer}
  1712. {$ELSE}
  1713. function DsRemoveDsServer(hDs: HANDLE; ServerDN: LPSTR; DomainDN: LPSTR;
  1714.   fLastDcInDomain: PBOOL; fCommit: BOOL): DWORD; stdcall;
  1715. {$EXTERNALSYM DsRemoveDsServer}
  1716. {$ENDIF}
  1717. function DsRemoveDsDomainA(hDs: HANDLE; DomainDN: LPSTR): DWORD; stdcall;
  1718. {$EXTERNALSYM DsRemoveDsDomainA}
  1719. function DsRemoveDsDomainW(hDs: HANDLE; DomainDN: LPWSTR): DWORD; stdcall;
  1720. {$EXTERNALSYM DsRemoveDsDomainW}
  1721. {$IFDEF UNICODE}
  1722. function DsRemoveDsDomain(hDs: HANDLE; DomainDN: LPWSTR): DWORD; stdcall;
  1723. {$EXTERNALSYM DsRemoveDsDomain}
  1724. {$ELSE}
  1725. function DsRemoveDsDomain(hDs: HANDLE; DomainDN: LPSTR): DWORD; stdcall;
  1726. {$EXTERNALSYM DsRemoveDsDomain}
  1727. {$ENDIF}
  1728. function DsListSitesA(hDs: HANDLE; var ppSites: PDS_NAME_RESULTA): DWORD; stdcall;
  1729. {$EXTERNALSYM DsListSitesA}
  1730. function DsListSitesW(hDs: HANDLE; var ppSites: PDS_NAME_RESULTW): DWORD; stdcall;
  1731. {$EXTERNALSYM DsListSitesW}
  1732. {$IFDEF UNICODE}
  1733. function DsListSites(hDs: HANDLE; var ppSites: PDS_NAME_RESULTW): DWORD; stdcall;
  1734. {$EXTERNALSYM DsListSites}
  1735. {$ELSE}
  1736. function DsListSites(hDs: HANDLE; var ppSites: PDS_NAME_RESULTA): DWORD; stdcall;
  1737. {$EXTERNALSYM DsListSites}
  1738. {$ENDIF}
  1739. function DsListServersInSiteA(hDs: HANDLE; site: LPCSTR;
  1740.   var ppServers: PDS_NAME_RESULTA): DWORD; stdcall;
  1741. {$EXTERNALSYM DsListServersInSiteA}
  1742. function DsListServersInSiteW(hDs: HANDLE; site: LPCWSTR;
  1743.   var ppServers: PDS_NAME_RESULTW): DWORD; stdcall;
  1744. {$EXTERNALSYM DsListServersInSiteW}
  1745. {$IFDEF UNICODE}
  1746. function DsListServersInSite(hDs: HANDLE; site: LPCWSTR;
  1747.   var ppServers: PDS_NAME_RESULTW): DWORD; stdcall;
  1748. {$EXTERNALSYM DsListServersInSite}
  1749. {$ELSE}
  1750. function DsListServersInSite(hDs: HANDLE; site: LPCSTR;
  1751.   var ppServers: PDS_NAME_RESULTA): DWORD; stdcall;
  1752. {$EXTERNALSYM DsListServersInSite}
  1753. {$ENDIF}
  1754. function DsListDomainsInSiteA(hDs: HANDLE; site: LPCSTR;
  1755.   var ppDomains: PDS_NAME_RESULTA): DWORD; stdcall;
  1756. {$EXTERNALSYM DsListDomainsInSiteA}
  1757. function DsListDomainsInSiteW(hDs: HANDLE; site: LPCWSTR;
  1758.   var ppDomains: PDS_NAME_RESULTW): DWORD; stdcall;
  1759. {$EXTERNALSYM DsListDomainsInSiteW}
  1760. {$IFDEF UNICODE}
  1761. function DsListDomainsInSite(hDs: HANDLE; site: LPCWSTR;
  1762.   var ppDomains: PDS_NAME_RESULTW): DWORD; stdcall;
  1763. {$EXTERNALSYM DsListDomainsInSite}
  1764. {$ELSE}
  1765. function DsListDomainsInSite(hDs: HANDLE; site: LPCSTR;
  1766.   var ppDomains: PDS_NAME_RESULTA): DWORD; stdcall;
  1767. {$EXTERNALSYM DsListDomainsInSite}
  1768. {$ENDIF}
  1769. function DsListServersForDomainInSiteA(hDs: HANDLE; domain: LPCSTR; site: LPCSTR;
  1770.   var ppServers: PDS_NAME_RESULTA): DWORD; stdcall;
  1771. {$EXTERNALSYM DsListServersForDomainInSiteA}
  1772. function DsListServersForDomainInSiteW(hDs: HANDLE; domain: LPCWSTR; site: LPCWSTR;
  1773.   var ppServers: PDS_NAME_RESULTW): DWORD; stdcall;
  1774. {$EXTERNALSYM DsListServersForDomainInSiteW}
  1775. {$IFDEF UNICODE}
  1776. function DsListServersForDomainInSite(hDs: HANDLE; domain: LPCWSTR; site: LPCWSTR;
  1777.   var ppServers: PDS_NAME_RESULTW): DWORD; stdcall;
  1778. {$EXTERNALSYM DsListServersForDomainInSite}
  1779. {$ELSE}
  1780. function DsListServersForDomainInSite(hDs: HANDLE; domain: LPCSTR; site: LPCSTR;
  1781.   var ppServers: PDS_NAME_RESULTA): DWORD; stdcall;
  1782. {$EXTERNALSYM DsListServersForDomainInSite}
  1783. {$ENDIF}
  1784. // Define indices for DsListInfoForServer return data.  Check status
  1785. // for each field as a given value may not be present.
  1786. const
  1787.   DS_LIST_DSA_OBJECT_FOR_SERVER     = 0;
  1788.   {$EXTERNALSYM DS_LIST_DSA_OBJECT_FOR_SERVER}
  1789.   DS_LIST_DNS_HOST_NAME_FOR_SERVER  = 1;
  1790.   {$EXTERNALSYM DS_LIST_DNS_HOST_NAME_FOR_SERVER}
  1791.   DS_LIST_ACCOUNT_OBJECT_FOR_SERVER = 2;
  1792.   {$EXTERNALSYM DS_LIST_ACCOUNT_OBJECT_FOR_SERVER}
  1793. function DsListInfoForServerA(hDs: HANDLE; server: LPCSTR;
  1794.   var ppInfo: PDS_NAME_RESULTA): DWORD; stdcall;
  1795. {$EXTERNALSYM DsListInfoForServerA}
  1796. function DsListInfoForServerW(hDs: HANDLE; server: LPCWSTR;
  1797.   var ppInfo: PDS_NAME_RESULTW): DWORD; stdcall;
  1798. {$EXTERNALSYM DsListInfoForServerW}
  1799. {$IFDEF UNICODE}
  1800. function DsListInfoForServer(hDs: HANDLE; server: LPCWSTR;
  1801.   var ppInfo: PDS_NAME_RESULTW): DWORD; stdcall;
  1802. {$EXTERNALSYM DsListInfoForServer}
  1803. {$ELSE}
  1804. function DsListInfoForServer(hDs: HANDLE; server: LPCSTR;
  1805.   var ppInfo: PDS_NAME_RESULTA): DWORD; stdcall;
  1806. {$EXTERNALSYM DsListInfoForServer}
  1807. {$ENDIF}
  1808. // Define indices for DsListRoles return data.  Check status for
  1809. // each field as a given value may not be present.
  1810. const
  1811.   DS_ROLE_SCHEMA_OWNER         = 0;
  1812.   {$EXTERNALSYM DS_ROLE_SCHEMA_OWNER}
  1813.   DS_ROLE_DOMAIN_OWNER         = 1;
  1814.   {$EXTERNALSYM DS_ROLE_DOMAIN_OWNER}
  1815.   DS_ROLE_PDC_OWNER            = 2;
  1816.   {$EXTERNALSYM DS_ROLE_PDC_OWNER}
  1817.   DS_ROLE_RID_OWNER            = 3;
  1818.   {$EXTERNALSYM DS_ROLE_RID_OWNER}
  1819.   DS_ROLE_INFRASTRUCTURE_OWNER = 4;
  1820.   {$EXTERNALSYM DS_ROLE_INFRASTRUCTURE_OWNER}
  1821. function DsListRolesA(hDs: HANDLE; var ppRoles: PDS_NAME_RESULTA): DWORD; stdcall;
  1822. {$EXTERNALSYM DsListRolesA}
  1823. function DsListRolesW(hDs: HANDLE; var ppRoles: PDS_NAME_RESULTW): DWORD; stdcall;
  1824. {$EXTERNALSYM DsListRolesW}
  1825. {$IFDEF UNICODE}
  1826. function DsListRoles(hDs: HANDLE; var ppRoles: PDS_NAME_RESULTW): DWORD; stdcall;
  1827. {$EXTERNALSYM DsListRoles}
  1828. {$ELSE}
  1829. function DsListRoles(hDs: HANDLE; var ppRoles: PDS_NAME_RESULTA): DWORD; stdcall;
  1830. {$EXTERNALSYM DsListRoles}
  1831. {$ENDIF}
  1832. //
  1833. // DsQuerySitesByCost{A|W} allows the caller to determine the
  1834. // communication cost between the From Site and each of the sites
  1835. // in the list of To Sites. The costs are returned in the rgSiteInfo
  1836. // structure which must be freed with DsQuerySitesFree.
  1837. //
  1838. // The Site Names should all be passed as RDNs. For example, if the
  1839. // site's DN is "CN=Foo,CN=Sites,CN=Configuration,...", the RDN is
  1840. // simply "Foo".
  1841. //
  1842. type
  1843.   DS_SITE_COST_INFO = record
  1844.     errorCode: DWORD;
  1845.     cost: DWORD;
  1846.   end;
  1847.   {$EXTERNALSYM DS_SITE_COST_INFO}
  1848.   PDS_SITE_COST_INFO = ^DS_SITE_COST_INFO;
  1849.   {$EXTERNALSYM PDS_SITE_COST_INFO}
  1850.   TDsSiteCostInfo = DS_SITE_COST_INFO;
  1851.   PDsSiteCostInfo = PDS_SITE_COST_INFO;
  1852. function DsQuerySitesByCostW(hDS: HANDLE; pwszFromSite: LPWSTR; out rgwszToSites: LPWSTR; cToSites, dwFlags: DWORD;
  1853.   out prgSiteInfo: PDS_SITE_COST_INFO): DWORD; stdcall;
  1854. {$EXTERNALSYM DsQuerySitesByCostW}
  1855. function DsQuerySitesByCostA(hDS: HANDLE; pwszFromSite: LPSTR; out rgwszToSites: LPSTR; cToSites, dwFlags: DWORD;
  1856.   out prgSiteInfo: PDS_SITE_COST_INFO): DWORD; stdcall;
  1857. {$EXTERNALSYM DsQuerySitesByCostA}
  1858. {$IFDEF UNICODE}
  1859. function DsQuerySitesByCost(hDS: HANDLE; pwszFromSite: LPWSTR; out rgwszToSites: LPWSTR; cToSites, dwFlags: DWORD;
  1860.   out prgSiteInfo: PDS_SITE_COST_INFO): DWORD; stdcall;
  1861. {$EXTERNALSYM DsQuerySitesByCost}
  1862. {$ELSE}
  1863. function DsQuerySitesByCost(hDS: HANDLE; pwszFromSite: LPSTR; out rgwszToSites: LPSTR; cToSites, dwFlags: DWORD;
  1864.   out prgSiteInfo: PDS_SITE_COST_INFO): DWORD; stdcall;
  1865. {$EXTERNALSYM DsQuerySitesByCost}
  1866. {$ENDIF}
  1867. //
  1868. // DsQuerySitesByCost will free the site info array returned
  1869. // from DsQuerySitesByCost{A|W}.
  1870. //
  1871. procedure DsQuerySitesFree(rgSiteInfo: PDS_SITE_COST_INFO); stdcall;
  1872. {$EXTERNALSYM DsQuerySitesFree}
  1873. // Definitions required for DsMapSchemaGuid routines.
  1874. const
  1875.   DS_SCHEMA_GUID_NOT_FOUND     = 0;
  1876.   {$EXTERNALSYM DS_SCHEMA_GUID_NOT_FOUND}
  1877.   DS_SCHEMA_GUID_ATTR          = 1;
  1878.   {$EXTERNALSYM DS_SCHEMA_GUID_ATTR}
  1879.   DS_SCHEMA_GUID_ATTR_SET      = 2;
  1880.   {$EXTERNALSYM DS_SCHEMA_GUID_ATTR_SET}
  1881.   DS_SCHEMA_GUID_CLASS         = 3;
  1882.   {$EXTERNALSYM DS_SCHEMA_GUID_CLASS}
  1883.   DS_SCHEMA_GUID_CONTROL_RIGHT = 4;
  1884.   {$EXTERNALSYM DS_SCHEMA_GUID_CONTROL_RIGHT}
  1885. type
  1886.   PDS_SCHEMA_GUID_MAPA = ^DS_SCHEMA_GUID_MAPA;
  1887.   {$EXTERNALSYM PDS_SCHEMA_GUID_MAPA}
  1888.   DS_SCHEMA_GUID_MAPA = record
  1889.     guid: GUID;      // mapped GUID
  1890.     guidType: DWORD; // DS_SCHEMA_GUID_* value
  1891.     pName: LPSTR;    // might be NULL
  1892.   end;
  1893.   {$EXTERNALSYM DS_SCHEMA_GUID_MAPA}
  1894.   TDsSchemaGuidMapA = DS_SCHEMA_GUID_MAPA;
  1895.   PDsSchemaGuidMapA = PDS_SCHEMA_GUID_MAPA;
  1896.   PDS_SCHEMA_GUID_MAPW = ^DS_SCHEMA_GUID_MAPW;
  1897.   {$EXTERNALSYM PDS_SCHEMA_GUID_MAPW}
  1898.   DS_SCHEMA_GUID_MAPW = record
  1899.     guid: GUID;      // mapped GUID
  1900.     guidType: DWORD; // DS_SCHEMA_GUID_* value
  1901.     pName: LPWSTR;   // might be NULL
  1902.   end;
  1903.   {$EXTERNALSYM DS_SCHEMA_GUID_MAPW}
  1904.   TDsSchemaGuidMapW = DS_SCHEMA_GUID_MAPW;
  1905.   PDsSchemaGuidMapW = PDS_SCHEMA_GUID_MAPW;
  1906. function DsMapSchemaGuidsA(hDs: HANDLE; cGuids: DWORD; rGuids: PGUID;
  1907.   var ppGuidMap: PDS_SCHEMA_GUID_MAPA): DWORD; stdcall;
  1908. {$EXTERNALSYM DsMapSchemaGuidsA}
  1909. function DsMapSchemaGuidsW(hDs: HANDLE; cGuids: DWORD; rGuids: PGUID;
  1910.   var ppGuidMap: PDS_SCHEMA_GUID_MAPW): DWORD; stdcall;
  1911. {$EXTERNALSYM DsMapSchemaGuidsW}
  1912. procedure DsFreeSchemaGuidMapA(pGuidMap: PDS_SCHEMA_GUID_MAPA); stdcall;
  1913. {$EXTERNALSYM DsFreeSchemaGuidMapA}
  1914. procedure DsFreeSchemaGuidMapW(pGuidMap: PDS_SCHEMA_GUID_MAPW); stdcall;
  1915. {$EXTERNALSYM DsFreeSchemaGuidMapW}
  1916. {$IFDEF UNICODE}
  1917. function DsMapSchemaGuids(hDs: HANDLE; cGuids: DWORD; rGuids: PGUID;
  1918.   var ppGuidMap: PDS_SCHEMA_GUID_MAPW): DWORD; stdcall;
  1919. {$EXTERNALSYM DsMapSchemaGuids}
  1920. procedure DsFreeSchemaGuidMap(pGuidMap: PDS_SCHEMA_GUID_MAPW); stdcall;
  1921. {$EXTERNALSYM DsFreeSchemaGuidMap}
  1922. {$ELSE}
  1923. function DsMapSchemaGuids(hDs: HANDLE; cGuids: DWORD; rGuids: PGUID;
  1924.   var ppGuidMap: PDS_SCHEMA_GUID_MAPA): DWORD; stdcall;
  1925. {$EXTERNALSYM DsMapSchemaGuids}
  1926. procedure DsFreeSchemaGuidMap(pGuidMap: PDS_SCHEMA_GUID_MAPA); stdcall;
  1927. {$EXTERNALSYM DsFreeSchemaGuidMap}
  1928. {$ENDIF}
  1929. type
  1930.   PDS_DOMAIN_CONTROLLER_INFO_1A = ^DS_DOMAIN_CONTROLLER_INFO_1A;
  1931.   {$EXTERNALSYM PDS_DOMAIN_CONTROLLER_INFO_1A}
  1932.   DS_DOMAIN_CONTROLLER_INFO_1A = record
  1933.     NetbiosName: LPSTR; // might be NULL
  1934.     DnsHostName: LPSTR; // might be NULL
  1935.     SiteName: LPSTR; // might be NULL
  1936.     ComputerObjectName: LPSTR; // might be NULL
  1937.     ServerObjectName: LPSTR; // might be NULL
  1938.     fIsPdc: BOOL;
  1939.     fDsEnabled: BOOL;
  1940.   end;
  1941.   {$EXTERNALSYM DS_DOMAIN_CONTROLLER_INFO_1A}
  1942.   TDsDomainControllerInfo1A = DS_DOMAIN_CONTROLLER_INFO_1A;
  1943.   PDsDomainControllerInfo1A = PDS_DOMAIN_CONTROLLER_INFO_1A;
  1944.   PDS_DOMAIN_CONTROLLER_INFO_1W = ^DS_DOMAIN_CONTROLLER_INFO_1W;
  1945.   {$EXTERNALSYM PDS_DOMAIN_CONTROLLER_INFO_1W}
  1946.   DS_DOMAIN_CONTROLLER_INFO_1W = record
  1947.     NetbiosName: LPWSTR; // might be NULL
  1948.     DnsHostName: LPWSTR; // might be NULL
  1949.     SiteName: LPWSTR; // might be NULL
  1950.     ComputerObjectName: LPWSTR; // might be NULL
  1951.     ServerObjectName: LPWSTR; // might be NULL
  1952.     fIsPdc: BOOL;
  1953.     fDsEnabled: BOOL;
  1954.   end;
  1955.   {$EXTERNALSYM DS_DOMAIN_CONTROLLER_INFO_1W}
  1956.   TDsDomainControllerInfo1W = DS_DOMAIN_CONTROLLER_INFO_1W;
  1957.   PDsDomainControllerInfo1W = PDS_DOMAIN_CONTROLLER_INFO_1W;
  1958.   PDS_DOMAIN_CONTROLLER_INFO_2A = ^DS_DOMAIN_CONTROLLER_INFO_2A;
  1959.   {$EXTERNALSYM PDS_DOMAIN_CONTROLLER_INFO_2A}
  1960.   DS_DOMAIN_CONTROLLER_INFO_2A = record
  1961.     NetbiosName: LPSTR; // might be NULL
  1962.     DnsHostName: LPSTR; // might be NULL
  1963.     SiteName: LPSTR; // might be NULL
  1964.     SiteObjectName: LPSTR; // might be NULL
  1965.     ComputerObjectName: LPSTR; // might be NULL
  1966.     ServerObjectName: LPSTR; // might be NULL
  1967.     NtdsDsaObjectName: LPSTR; // might be NULL
  1968.     fIsPdc: BOOL;
  1969.     fDsEnabled: BOOL;
  1970.     fIsGc: BOOL;
  1971.     // Valid iff SiteObjectName non-NULL.
  1972.     SiteObjectGuid: GUID;
  1973.     // Valid iff ComputerObjectName non-NULL.
  1974.     ComputerObjectGuid: GUID;
  1975.     // Valid iff ServerObjectName non-NULL;
  1976.     ServerObjectGuid: GUID;
  1977.     // Valid iff fDsEnabled is TRUE.
  1978.     NtdsDsaObjectGuid: GUID;
  1979.   end;
  1980.   {$EXTERNALSYM DS_DOMAIN_CONTROLLER_INFO_2A}
  1981.   TDsDomainControllerInfo2A = DS_DOMAIN_CONTROLLER_INFO_2A;
  1982.   PDsDomainControllerInfo2A = PDS_DOMAIN_CONTROLLER_INFO_2A;
  1983.   PDS_DOMAIN_CONTROLLER_INFO_2W = ^DS_DOMAIN_CONTROLLER_INFO_2W;
  1984.   {$EXTERNALSYM PDS_DOMAIN_CONTROLLER_INFO_2W}
  1985.   DS_DOMAIN_CONTROLLER_INFO_2W = record
  1986.     NetbiosName: LPWSTR; // might be NULL
  1987.     DnsHostName: LPWSTR; // might be NULL
  1988.     SiteName: LPWSTR; // might be NULL
  1989.     SiteObjectName: LPWSTR; // might be NULL
  1990.     ComputerObjectName: LPWSTR; // might be NULL
  1991.     ServerObjectName: LPWSTR; // might be NULL
  1992.     NtdsDsaObjectName: LPWSTR; // might be NULL
  1993.     fIsPdc: BOOL;
  1994.     fDsEnabled: BOOL;
  1995.     fIsGc: BOOL;
  1996.     // Valid iff SiteObjectName non-NULL.
  1997.     SiteObjectGuid: GUID;
  1998.     // Valid iff ComputerObjectName non-NULL.
  1999.     ComputerObjectGuid: GUID;
  2000.     // Valid iff ServerObjectName non-NULL;
  2001.     ServerObjectGuid: GUID;
  2002.     // Valid iff fDsEnabled is TRUE.
  2003.     NtdsDsaObjectGuid: GUID;
  2004.   end;
  2005.   {$EXTERNALSYM DS_DOMAIN_CONTROLLER_INFO_2W}
  2006.   TDsDomainControllerInfo2W = DS_DOMAIN_CONTROLLER_INFO_2W;
  2007.   PDsDomainControllerInfo2W = PDS_DOMAIN_CONTROLLER_INFO_2W;
  2008. {$IFDEF UNICODE}
  2009.   DS_DOMAIN_CONTROLLER_INFO_1 = DS_DOMAIN_CONTROLLER_INFO_1W;
  2010.   {$EXTERNALSYM DS_DOMAIN_CONTROLLER_INFO_1}
  2011.   DS_DOMAIN_CONTROLLER_INFO_2 = DS_DOMAIN_CONTROLLER_INFO_2W;
  2012.   {$EXTERNALSYM DS_DOMAIN_CONTROLLER_INFO_2}
  2013.   PDS_DOMAIN_CONTROLLER_INFO_1 = PDS_DOMAIN_CONTROLLER_INFO_1W;
  2014.   {$EXTERNALSYM PDS_DOMAIN_CONTROLLER_INFO_1}
  2015.   PDS_DOMAIN_CONTROLLER_INFO_2 = PDS_DOMAIN_CONTROLLER_INFO_2W;
  2016.   {$EXTERNALSYM PDS_DOMAIN_CONTROLLER_INFO_2}
  2017.   TDsDomainControllerInfo1 = TDsDomainControllerInfo1W;
  2018.   PDsDomainControllerInfo1 = PDsDomainControllerInfo1W;
  2019.   TDsDomainControllerInfo2 = TDsDomainControllerInfo2W;
  2020.   PDsDomainControllerInfo2 = PDsDomainControllerInfo2W;
  2021. {$ELSE}
  2022.   DS_DOMAIN_CONTROLLER_INFO_1 = DS_DOMAIN_CONTROLLER_INFO_1A;
  2023.   {$EXTERNALSYM DS_DOMAIN_CONTROLLER_INFO_1}
  2024.   DS_DOMAIN_CONTROLLER_INFO_2 = DS_DOMAIN_CONTROLLER_INFO_2A;
  2025.   {$EXTERNALSYM DS_DOMAIN_CONTROLLER_INFO_2}
  2026.   PDS_DOMAIN_CONTROLLER_INFO_1 = PDS_DOMAIN_CONTROLLER_INFO_1A;
  2027.   {$EXTERNALSYM PDS_DOMAIN_CONTROLLER_INFO_1}
  2028.   PDS_DOMAIN_CONTROLLER_INFO_2 = PDS_DOMAIN_CONTROLLER_INFO_2A;
  2029.   {$EXTERNALSYM PDS_DOMAIN_CONTROLLER_INFO_2}
  2030.   TDsDomainControllerInfo1 = TDsDomainControllerInfo1A;
  2031.   PDsDomainControllerInfo1 = PDsDomainControllerInfo1A;
  2032.   TDsDomainControllerInfo2 = TDsDomainControllerInfo2A;
  2033.   PDsDomainControllerInfo2 = PDsDomainControllerInfo2A;
  2034. {$ENDIF}
  2035. // The following APIs strictly find domain controller account objects 
  2036. // in the DS and return information associated with them.  As such, they
  2037. // may return entries which correspond to domain controllers long since
  2038. // decommissioned, etc. and there is no guarantee that there exists a 
  2039. // physical domain controller at all.  Use DsGetDcName (dsgetdc.h) to find
  2040. // live domain controllers for a domain.
  2041. function DsGetDomainControllerInfoA(hDs: HANDLE; DomainName: LPCSTR;
  2042.   InfoLevel: DWORD; var pcOut: DWORD; ppInfo: PPVOID): DWORD; stdcall;
  2043. {$EXTERNALSYM DsGetDomainControllerInfoA}
  2044. function DsGetDomainControllerInfoW(hDs: HANDLE; DomainName: LPCWSTR;
  2045.   InfoLevel: DWORD; var pcOut: DWORD; ppInfo: PPVOID): DWORD; stdcall;
  2046. {$EXTERNALSYM DsGetDomainControllerInfoW}
  2047. {$IFDEF UNICODE}
  2048. function DsGetDomainControllerInfo(hDs: HANDLE; DomainName: LPCWSTR;
  2049.   InfoLevel: DWORD; var pcOut: DWORD; ppInfo: PPVOID): DWORD; stdcall;
  2050. {$EXTERNALSYM DsGetDomainControllerInfo}
  2051. {$ELSE}
  2052. function DsGetDomainControllerInfo(hDs: HANDLE; DomainName: LPCSTR;
  2053.   InfoLevel: DWORD; var pcOut: DWORD; ppInfo: PPVOID): DWORD; stdcall;
  2054. {$EXTERNALSYM DsGetDomainControllerInfo}
  2055. {$ENDIF}
  2056. procedure DsFreeDomainControllerInfoA(InfoLevel: DWORD; cInfo: DWORD;
  2057.   pInfo: PVOID); stdcall;
  2058. {$EXTERNALSYM DsFreeDomainControllerInfoA}
  2059. procedure DsFreeDomainControllerInfoW(InfoLevel: DWORD; cInfo: DWORD;
  2060.   pInfo: PVOID); stdcall;
  2061. {$EXTERNALSYM DsFreeDomainControllerInfoW}
  2062. {$IFDEF UNICODE}
  2063. procedure DsFreeDomainControllerInfo(InfoLevel: DWORD; cInfo: DWORD;
  2064.   pInfo: PVOID); stdcall;
  2065. {$EXTERNALSYM DsFreeDomainControllerInfo}
  2066. {$ELSE}
  2067. procedure DsFreeDomainControllerInfo(InfoLevel: DWORD; cInfo: DWORD;
  2068.   pInfo: PVOID); stdcall;
  2069. {$EXTERNALSYM DsFreeDomainControllerInfo}
  2070. {$ENDIF}
  2071. type
  2072. // Which task should be run?
  2073.   DS_KCC_TASKID = (DS_KCC_TASKID_UPDATE_TOPOLOGY);
  2074.   {$EXTERNALSYM DS_KCC_TASKID}
  2075.   TDsKccTaskId = DS_KCC_TASKID;
  2076. // Don't wait for completion of the task; queue it and return.
  2077. const
  2078.   DS_KCC_FLAG_ASYNC_OP   = (1 shl 0);
  2079.   {$EXTERNALSYM DS_KCC_FLAG_ASYNC_OP}
  2080. // Don't enqueue the task if another queued task will run soon.
  2081.   DS_KCC_FLAG_DAMPED     = (1 shl 1);
  2082.   {$EXTERNALSYM DS_KCC_FLAG_DAMPED}
  2083. function DsReplicaConsistencyCheck(hDS: HANDLE; TaskID: DS_KCC_TASKID;
  2084.   dwFlags: DWORD): DWORD; stdcall;
  2085. {$EXTERNALSYM DsReplicaConsistencyCheck}
  2086. function DsReplicaVerifyObjectsW(hDS: HANDLE; NameContext: LPCWSTR; const pUuidDsaSrc: UUID; ulOptions: ULONG): DWORD; stdcall;
  2087. {$EXTERNALSYM DsReplicaVerifyObjectsW}
  2088. function DsReplicaVerifyObjectsA(hDS: HANDLE; NameContext: LPCSTR; const pUuidDsaSrc: UUID; ulOptions: ULONG): DWORD; stdcall;
  2089. {$EXTERNALSYM DsReplicaVerifyObjectsA}
  2090. {$IFDEF UNICODE}
  2091. function DsReplicaVerifyObjects(hDS: HANDLE; NameContext: LPCWSTR; const pUuidDsaSrc: UUID; ulOptions: ULONG): DWORD; stdcall;
  2092. {$EXTERNALSYM DsReplicaVerifyObjects}
  2093. {$ELSE}
  2094. function DsReplicaVerifyObjects(hDS: HANDLE; NameContext: LPCSTR; const pUuidDsaSrc: UUID; ulOptions: ULONG): DWORD; stdcall;
  2095. {$EXTERNALSYM DsReplicaVerifyObjects}
  2096. {$ENDIF}
  2097. // Do not delete objects on DsReplicaVerifyObjects call
  2098. const
  2099.   DS_EXIST_ADVISORY_MODE = ($1);
  2100.   {$EXTERNALSYM DS_EXIST_ADVISORY_MODE}
  2101. type
  2102.   _DS_REPL_INFO_TYPE = (
  2103.     DS_REPL_INFO_NEIGHBORS,                  // returns DS_REPL_NEIGHBORS *
  2104.     DS_REPL_INFO_CURSORS_FOR_NC,             // returns DS_REPL_CURSORS *
  2105.     DS_REPL_INFO_METADATA_FOR_OBJ,           // returns DS_REPL_OBJECT_META_DATA *
  2106.     DS_REPL_INFO_KCC_DSA_CONNECT_FAILURES,   // both return
  2107.     DS_REPL_INFO_KCC_DSA_LINK_FAILURES,      //    DS_REPL_KCC_DSA_FAILURES *
  2108.     DS_REPL_INFO_PENDING_OPS,                // returns DS_REPL_PENDING_OPS *
  2109.     ////////////////////////////////////////////////////////////////////////////
  2110.     //
  2111.     //  The following info types are not supported by Windows 2000.  Calling
  2112.     //  DsReplicaGetInfo() with one of the types on a Windows 2000 client or
  2113.     //  where hDS is bound to a Windows 2000 DC will fail with
  2114.     //  ERROR_NOT_SUPPORTED.
  2115.     //
  2116.     DS_REPL_INFO_METADATA_FOR_ATTR_VALUE,   // returns DS_REPL_ATTR_VALUE_META_DATA *
  2117.     DS_REPL_INFO_CURSORS_2_FOR_NC,          // returns DS_REPL_CURSORS_2 *
  2118.     DS_REPL_INFO_CURSORS_3_FOR_NC,          // returns DS_REPL_CURSORS_3 *
  2119.     DS_REPL_INFO_METADATA_2_FOR_OBJ,        // returns DS_REPL_OBJECT_META_DATA_2 *
  2120.     DS_REPL_INFO_METADATA_2_FOR_ATTR_VALUE, // returns DS_REPL_ATTR_VALUE_META_DATA_2 *
  2121.     // <- insert new DS_REPL_INFO_* types here.
  2122.     DS_REPL_INFO_TYPE_MAX);
  2123.   {$EXTERNALSYM _DS_REPL_INFO_TYPE}
  2124.   DS_REPL_INFO_TYPE = _DS_REPL_INFO_TYPE;
  2125.   {$EXTERNALSYM DS_REPL_INFO_TYPE}
  2126.   TDsReplInfoType = DS_REPL_INFO_TYPE;
  2127. // Bit values for flags argument to DsReplicaGetInfo2
  2128. const
  2129.   DS_REPL_INFO_FLAG_IMPROVE_LINKED_ATTRS    =  $00000001;
  2130.   {$EXTERNALSYM DS_REPL_INFO_FLAG_IMPROVE_LINKED_ATTRS}
  2131. // Bit values for the dwReplicaFlags field of the DS_REPL_NEIGHBOR structure.
  2132. // Bit values for the dwReplicaFlags field of the DS_REPL_NEIGHBOR structure.
  2133. // Also used for the ulReplicaFlags argument to DsReplicaModify
  2134.   DS_REPL_NBR_WRITEABLE                     = ($00000010);
  2135.   {$EXTERNALSYM DS_REPL_NBR_WRITEABLE}
  2136.   DS_REPL_NBR_SYNC_ON_STARTUP               = ($00000020);
  2137.   {$EXTERNALSYM DS_REPL_NBR_SYNC_ON_STARTUP}
  2138.   DS_REPL_NBR_DO_SCHEDULED_SYNCS            = ($00000040);
  2139.   {$EXTERNALSYM DS_REPL_NBR_DO_SCHEDULED_SYNCS}
  2140.   DS_REPL_NBR_USE_ASYNC_INTERSITE_TRANSPORT = ($00000080);
  2141.   {$EXTERNALSYM DS_REPL_NBR_USE_ASYNC_INTERSITE_TRANSPORT}
  2142.   DS_REPL_NBR_TWO_WAY_SYNC                  = ($00000200);
  2143.   {$EXTERNALSYM DS_REPL_NBR_TWO_WAY_SYNC}
  2144.   DS_REPL_NBR_RETURN_OBJECT_PARENTS         = ($00000800);
  2145.   {$EXTERNALSYM DS_REPL_NBR_RETURN_OBJECT_PARENTS}
  2146.   DS_REPL_NBR_FULL_SYNC_IN_PROGRESS         = ($00010000);
  2147.   {$EXTERNALSYM DS_REPL_NBR_FULL_SYNC_IN_PROGRESS}
  2148.   DS_REPL_NBR_FULL_SYNC_NEXT_PACKET         = ($00020000);
  2149.   {$EXTERNALSYM DS_REPL_NBR_FULL_SYNC_NEXT_PACKET}
  2150.   DS_REPL_NBR_NEVER_SYNCED                  = ($00200000);
  2151.   {$EXTERNALSYM DS_REPL_NBR_NEVER_SYNCED}
  2152.   DS_REPL_NBR_PREEMPTED                     = ($01000000);
  2153.   {$EXTERNALSYM DS_REPL_NBR_PREEMPTED}
  2154.   DS_REPL_NBR_IGNORE_CHANGE_NOTIFICATIONS   = ($04000000);
  2155.   {$EXTERNALSYM DS_REPL_NBR_IGNORE_CHANGE_NOTIFICATIONS}
  2156.   DS_REPL_NBR_DISABLE_SCHEDULED_SYNC        = ($08000000);
  2157.   {$EXTERNALSYM DS_REPL_NBR_DISABLE_SCHEDULED_SYNC}
  2158.   DS_REPL_NBR_COMPRESS_CHANGES              = ($10000000);
  2159.   {$EXTERNALSYM DS_REPL_NBR_COMPRESS_CHANGES}
  2160.   DS_REPL_NBR_NO_CHANGE_NOTIFICATIONS       = ($20000000);
  2161.   {$EXTERNALSYM DS_REPL_NBR_NO_CHANGE_NOTIFICATIONS}
  2162.   DS_REPL_NBR_PARTIAL_ATTRIBUTE_SET         = ($40000000);
  2163.   {$EXTERNALSYM DS_REPL_NBR_PARTIAL_ATTRIBUTE_SET}
  2164. // This is the mask of replica flags that may be changed on the DsReplicaModify
  2165. // call using the ulReplicaFlags parameter. The other flags are protected
  2166. // system flags.  The previous values of the system flags must be read in
  2167. // advance and merged into the ulReplicaFlags parameter unchanged.
  2168.   DS_REPL_NBR_MODIFIABLE_MASK =
  2169.         DS_REPL_NBR_SYNC_ON_STARTUP or
  2170.         DS_REPL_NBR_DO_SCHEDULED_SYNCS or
  2171.         DS_REPL_NBR_TWO_WAY_SYNC or
  2172.         DS_REPL_NBR_IGNORE_CHANGE_NOTIFICATIONS or
  2173.         DS_REPL_NBR_DISABLE_SCHEDULED_SYNC or
  2174.         DS_REPL_NBR_COMPRESS_CHANGES or
  2175.         DS_REPL_NBR_NO_CHANGE_NOTIFICATIONS;
  2176.   {$EXTERNALSYM DS_REPL_NBR_MODIFIABLE_MASK}
  2177. type
  2178.   _DS_REPL_NEIGHBORW = record
  2179.     pszNamingContext: LPWSTR;
  2180.     pszSourceDsaDN: LPWSTR;
  2181.     pszSourceDsaAddress: LPWSTR;
  2182.     pszAsyncIntersiteTransportDN: LPWSTR;
  2183.     dwReplicaFlags: DWORD;
  2184.     dwReserved: DWORD; // alignment
  2185.     uuidNamingContextObjGuid: UUID;
  2186.     uuidSourceDsaObjGuid: UUID;
  2187.     uuidSourceDsaInvocationID: UUID;
  2188.     uuidAsyncIntersiteTransportObjGuid: UUID;
  2189.     usnLastObjChangeSynced: USN;
  2190.     usnAttributeFilter: USN;
  2191.     ftimeLastSyncSuccess: FILETIME;
  2192.     ftimeLastSyncAttempt: FILETIME;
  2193.     dwLastSyncResult: DWORD;
  2194.     cNumConsecutiveSyncFailures: DWORD;
  2195.   end;
  2196.   {$EXTERNALSYM _DS_REPL_NEIGHBORW}
  2197.   DS_REPL_NEIGHBORW = _DS_REPL_NEIGHBORW;
  2198.   {$EXTERNALSYM DS_REPL_NEIGHBORW}
  2199.   TDsReplNeighborW = DS_REPL_NEIGHBORW;
  2200.   PDsReplNeighborW = ^DS_REPL_NEIGHBORW;
  2201. // Fields can be added only to the end of this structure.
  2202.   _DS_REPL_NEIGHBORW_BLOB = record
  2203.     oszNamingContext: DWORD;
  2204.     oszSourceDsaDN: DWORD;
  2205.     oszSourceDsaAddress: DWORD;
  2206.     oszAsyncIntersiteTransportDN: DWORD;
  2207.     dwReplicaFlags: DWORD;
  2208.     dwReserved: DWORD;
  2209.     uuidNamingContextObjGuid: UUID;
  2210.     uuidSourceDsaObjGuid: UUID;
  2211.     uuidSourceDsaInvocationID: UUID;
  2212.     uuidAsyncIntersiteTransportObjGuid: UUID;
  2213.     usnLastObjChangeSynced: USN;
  2214.     usnAttributeFilter: USN;
  2215.     ftimeLastSyncSuccess: FILETIME;
  2216.     ftimeLastSyncAttempt: FILETIME;
  2217.     dwLastSyncResult: DWORD;
  2218.     cNumConsecutiveSyncFailures: DWORD;
  2219.   end;
  2220.   {$EXTERNALSYM _DS_REPL_NEIGHBORW_BLOB}
  2221.   DS_REPL_NEIGHBORW_BLOB = _DS_REPL_NEIGHBORW_BLOB;
  2222.   {$EXTERNALSYM DS_REPL_NEIGHBORW_BLOB}
  2223.   TDsReplNeighborwBlob = DS_REPL_NEIGHBORW_BLOB;
  2224.   PDsReplNeighborwBlob = ^DS_REPL_NEIGHBORW_BLOB;  
  2225.   _DS_REPL_NEIGHBORSW = record
  2226.     cNumNeighbors: DWORD;
  2227.     dwReserved: DWORD; // alignment
  2228.     rgNeighbor: array [0..0] of DS_REPL_NEIGHBORW;
  2229.   end;
  2230.   {$EXTERNALSYM _DS_REPL_NEIGHBORSW}
  2231.   DS_REPL_NEIGHBORSW = _DS_REPL_NEIGHBORSW;
  2232.   {$EXTERNALSYM DS_REPL_NEIGHBORSW}
  2233.   TDsReplNeighborsW = DS_REPL_NEIGHBORSW;
  2234.   PDsReplNeighborsW = ^DS_REPL_NEIGHBORSW;
  2235.   _DS_REPL_CURSOR = record
  2236.     uuidSourceDsaInvocationID: UUID;
  2237.     usnAttributeFilter: USN;
  2238.   end;
  2239.   {$EXTERNALSYM _DS_REPL_CURSOR}
  2240.   DS_REPL_CURSOR = _DS_REPL_CURSOR;
  2241.   {$EXTERNALSYM DS_REPL_CURSOR}
  2242.   TDsReplCursor = DS_REPL_CURSOR;
  2243.   PDsReplCursor = ^DS_REPL_CURSOR;
  2244.   _DS_REPL_CURSOR_2 = record
  2245.     uuidSourceDsaInvocationID: UUID;
  2246.     usnAttributeFilter: USN;
  2247.     ftimeLastSyncSuccess: FILETIME;
  2248.   end;
  2249.   {$EXTERNALSYM _DS_REPL_CURSOR_2}
  2250.   DS_REPL_CURSOR_2 = _DS_REPL_CURSOR_2;
  2251.   {$EXTERNALSYM DS_REPL_CURSOR_2}
  2252.   TDsReplCursor2 = DS_REPL_CURSOR_2;
  2253.   PDsReplCursor2 = ^DS_REPL_CURSOR_2;
  2254.   _DS_REPL_CURSOR_3W = record
  2255.     uuidSourceDsaInvocationID: UUID;
  2256.     usnAttributeFilter: USN;
  2257.     ftimeLastSyncSuccess: FILETIME;
  2258.     pszSourceDsaDN: LPWSTR;
  2259.   end;
  2260.   {$EXTERNALSYM _DS_REPL_CURSOR_3W}
  2261.   DS_REPL_CURSOR_3W = _DS_REPL_CURSOR_3W;
  2262.   {$EXTERNALSYM DS_REPL_CURSOR_3W}
  2263.   TDsReplCursow3W = DS_REPL_CURSOR_3W;
  2264.   PDsReplCursow3W = ^DS_REPL_CURSOR_3W;
  2265. // Fields can be added only to the end of this structure.
  2266.   _DS_REPL_CURSOR_BLOB = record
  2267.     uuidSourceDsaInvocationID: UUID;
  2268.     usnAttributeFilter: USN;
  2269.     ftimeLastSyncSuccess: FILETIME;
  2270.     oszSourceDsaDN: DWORD;
  2271.   end;
  2272.   {$EXTERNALSYM _DS_REPL_CURSOR_BLOB}
  2273.   DS_REPL_CURSOR_BLOB = _DS_REPL_CURSOR_BLOB;
  2274.   {$EXTERNALSYM DS_REPL_CURSOR_BLOB}
  2275.   TDsReplCursorBlob = DS_REPL_CURSOR_BLOB;
  2276.   PDsReplCursorBlob = ^DS_REPL_CURSOR_BLOB;  
  2277.   _DS_REPL_CURSORS = record
  2278.     cNumCursors: DWORD;
  2279.     dwReserved: DWORD; // alignment
  2280.     rgCursor: array [0..0] of DS_REPL_CURSOR;
  2281.   end;
  2282.   {$EXTERNALSYM _DS_REPL_CURSORS}
  2283.   DS_REPL_CURSORS = _DS_REPL_CURSORS;
  2284.   {$EXTERNALSYM DS_REPL_CURSORS}
  2285.   TDsReplCursors = DS_REPL_CURSORS;
  2286.   PDsReplCursors = ^DS_REPL_CURSORS;
  2287.   _DS_REPL_CURSORS_2 = record
  2288.     cNumCursors: DWORD;
  2289.     dwEnumerationContext: DWORD;
  2290.     // keep this 8 byte aligned
  2291.     rgCursor: array [0..0] of DS_REPL_CURSOR_2;
  2292.   end;
  2293.   {$EXTERNALSYM _DS_REPL_CURSORS_2}
  2294.   DS_REPL_CURSORS_2 = _DS_REPL_CURSORS_2;
  2295.   {$EXTERNALSYM DS_REPL_CURSORS_2}
  2296.   TDsReplCursors2 = DS_REPL_CURSORS_2;
  2297.   PDsReplCursors2 = ^DS_REPL_CURSORS_2;
  2298.   _DS_REPL_CURSORS_3W = record
  2299.     cNumCursors: DWORD;
  2300.     dwEnumerationContext: DWORD;
  2301.     // keep this 8 byte aligned
  2302.     rgCursor: array [0..0] of DS_REPL_CURSOR_3W;
  2303.   end;
  2304.   {$EXTERNALSYM _DS_REPL_CURSORS_3W}
  2305.   DS_REPL_CURSORS_3W = _DS_REPL_CURSORS_3W;
  2306.   {$EXTERNALSYM DS_REPL_CURSORS_3W}
  2307.   TDsReplCursors3W = DS_REPL_CURSORS_3W;
  2308.   PDsReplCursors3W = ^DS_REPL_CURSORS_3W;  
  2309.   _DS_REPL_ATTR_META_DATA = record
  2310.     pszAttributeName: LPWSTR;
  2311.     dwVersion: DWORD;
  2312.     ftimeLastOriginatingChange: FILETIME;
  2313.     uuidLastOriginatingDsaInvocationID: UUID;
  2314.     usnOriginatingChange: USN; // in the originating DSA's USN space
  2315.     usnLocalChange: USN; // in the local DSA's USN space
  2316.   end;
  2317.   {$EXTERNALSYM _DS_REPL_ATTR_META_DATA}
  2318.   DS_REPL_ATTR_META_DATA = _DS_REPL_ATTR_META_DATA;
  2319.   {$EXTERNALSYM DS_REPL_ATTR_META_DATA}
  2320.   TDsReplAttrMetaData = DS_REPL_ATTR_META_DATA;
  2321.   PDsReplAttrMetaData = ^DS_REPL_ATTR_META_DATA;
  2322.   _DS_REPL_ATTR_META_DATA_2 = record
  2323.     pszAttributeName: LPWSTR;
  2324.     dwVersion: DWORD;
  2325.     ftimeLastOriginatingChange: FILETIME;
  2326.     uuidLastOriginatingDsaInvocationID: UUID;
  2327.     usnOriginatingChange: USN;   // in the originating DSA's USN space
  2328.     usnLocalChange: USN;         // in the local DSA's USN space
  2329.     pszLastOriginatingDsaDN: LPWSTR;
  2330.   end;
  2331.   {$EXTERNALSYM _DS_REPL_ATTR_META_DATA_2}
  2332.   DS_REPL_ATTR_META_DATA_2 = _DS_REPL_ATTR_META_DATA_2;
  2333.   {$EXTERNALSYM DS_REPL_ATTR_META_DATA_2}
  2334.   TDsReplAttrMetaData2 = DS_REPL_ATTR_META_DATA_2;
  2335.   PDsReplAttrMetaData2 = ^DS_REPL_ATTR_META_DATA_2;
  2336. // Fields can be added only to the end of this structure.
  2337.   _DS_REPL_ATTR_META_DATA_BLOB = record
  2338.     oszAttributeName: DWORD;
  2339.     dwVersion: DWORD;
  2340.     ftimeLastOriginatingChange: FILETIME;
  2341.     uuidLastOriginatingDsaInvocationID: UUID;
  2342.     usnOriginatingChange: USN;   // in the originating DSA's USN space
  2343.     usnLocalChange: USN;         // in the local DSA's USN space
  2344.     oszLastOriginatingDsaDN: DWORD;
  2345.   end;
  2346.   {$EXTERNALSYM _DS_REPL_ATTR_META_DATA_BLOB}
  2347.   DS_REPL_ATTR_META_DATA_BLOB = _DS_REPL_ATTR_META_DATA_BLOB;
  2348.   {$EXTERNALSYM DS_REPL_ATTR_META_DATA_BLOB}
  2349.   TDsReplAttrMetaDataBlob = DS_REPL_ATTR_META_DATA_BLOB;
  2350.   PDsReplAttrMetaDataBlob = ^DS_REPL_ATTR_META_DATA_BLOB;  
  2351.   _DS_REPL_OBJ_META_DATA = record
  2352.     cNumEntries: DWORD;
  2353.     dwReserved: DWORD; // alignment
  2354.     rgMetaData: array [0..0] of DS_REPL_ATTR_META_DATA;
  2355.   end;
  2356.   {$EXTERNALSYM _DS_REPL_OBJ_META_DATA}
  2357.   DS_REPL_OBJ_META_DATA = _DS_REPL_OBJ_META_DATA;
  2358.   {$EXTERNALSYM DS_REPL_OBJ_META_DATA}
  2359.   TDsReplObjMetaData = DS_REPL_OBJ_META_DATA;
  2360.   PDsReplObjMetaData = ^DS_REPL_OBJ_META_DATA;
  2361.   _DS_REPL_OBJ_META_DATA_2 = record
  2362.     cNumEntries: DWORD;
  2363.     dwReserved: DWORD;             // alignment
  2364.     rgMetaData: array [0..0] of DS_REPL_ATTR_META_DATA_2;
  2365.   end;
  2366.   {$EXTERNALSYM _DS_REPL_OBJ_META_DATA_2}
  2367.   DS_REPL_OBJ_META_DATA_2 = _DS_REPL_OBJ_META_DATA_2;
  2368.   {$EXTERNALSYM DS_REPL_OBJ_META_DATA_2}
  2369.   TDsReplObjMetaData2 = DS_REPL_OBJ_META_DATA_2;
  2370.   PDsReplObjMetaData2 = ^DS_REPL_OBJ_META_DATA_2;  
  2371.   _DS_REPL_KCC_DSA_FAILUREW = record
  2372.     pszDsaDN: LPWSTR;
  2373.     uuidDsaObjGuid: UUID;
  2374.     ftimeFirstFailure: FILETIME;
  2375.     cNumFailures: DWORD;
  2376.     dwLastResult: DWORD; // Win32 error code
  2377.   end;
  2378.   {$EXTERNALSYM _DS_REPL_KCC_DSA_FAILUREW}
  2379.   DS_REPL_KCC_DSA_FAILUREW = _DS_REPL_KCC_DSA_FAILUREW;
  2380.   {$EXTERNALSYM DS_REPL_KCC_DSA_FAILUREW}
  2381.   TDsReplKccDsaFailureW = DS_REPL_KCC_DSA_FAILUREW;
  2382.   PDsReplKccDsaFailureW = ^DS_REPL_KCC_DSA_FAILUREW;
  2383. // Fields can be added only to the end of this structure.
  2384.   _DS_REPL_KCC_DSA_FAILUREW_BLOB = record
  2385.     oszDsaDN: DWORD;
  2386.     uuidDsaObjGuid: UUID;
  2387.     ftimeFirstFailure: FILETIME;
  2388.     cNumFailures: DWORD;
  2389.     dwLastResult: DWORD;   // Win32 error code
  2390.   end;
  2391.   {$EXTERNALSYM _DS_REPL_KCC_DSA_FAILUREW_BLOB}
  2392.   DS_REPL_KCC_DSA_FAILUREW_BLOB = _DS_REPL_KCC_DSA_FAILUREW_BLOB;
  2393.   {$EXTERNALSYM DS_REPL_KCC_DSA_FAILUREW_BLOB}
  2394.   TDsReplKccDsaFailureWBlob = DS_REPL_KCC_DSA_FAILUREW_BLOB;
  2395.   PDsReplKccDsaFailureWBlob = ^DS_REPL_KCC_DSA_FAILUREW_BLOB;  
  2396.   _DS_REPL_KCC_DSA_FAILURESW = record
  2397.     cNumEntries: DWORD;
  2398.     dwReserved: DWORD; // alignment
  2399.     rgDsaFailure: array [0..0] of DS_REPL_KCC_DSA_FAILUREW;
  2400.   end;
  2401.   {$EXTERNALSYM _DS_REPL_KCC_DSA_FAILURESW}
  2402.   DS_REPL_KCC_DSA_FAILURESW = _DS_REPL_KCC_DSA_FAILURESW;
  2403.   {$EXTERNALSYM DS_REPL_KCC_DSA_FAILURESW}
  2404.   TDsReplKccDsaFailuresW = DS_REPL_KCC_DSA_FAILURESW;
  2405.   PDsReplKccDsaFailuresW = ^DS_REPL_KCC_DSA_FAILURESW;
  2406.   _DS_REPL_OP_TYPE = (
  2407.     DS_REPL_OP_TYPE_SYNC,
  2408.     DS_REPL_OP_TYPE_ADD,
  2409.     DS_REPL_OP_TYPE_DELETE,
  2410.     DS_REPL_OP_TYPE_MODIFY,
  2411.     DS_REPL_OP_TYPE_UPDATE_REFS);
  2412.   {$EXTERNALSYM _DS_REPL_OP_TYPE}
  2413.   DS_REPL_OP_TYPE = _DS_REPL_OP_TYPE;
  2414.   {$EXTERNALSYM DS_REPL_OP_TYPE}
  2415.   _DS_REPL_OPW = record
  2416.     ftimeEnqueued: FILETIME; // time at which the operation was enqueued
  2417.     ulSerialNumber: ULONG; // ID of this sync; unique per machine per boot
  2418.     ulPriority: ULONG; // > priority, > urgency
  2419.     OpType: DS_REPL_OP_TYPE;
  2420.     ulOptions: ULONG; // Zero or more bits specific to OpType; e.g.,
  2421.     //  DS_REPADD_* for DS_REPL_OP_TYPE_ADD,
  2422.     //  DS_REPSYNC_* for DS_REPL_OP_TYPE_SYNC, etc.
  2423.     pszNamingContext: LPWSTR;
  2424.     pszDsaDN: LPWSTR;
  2425.     pszDsaAddress: LPWSTR;
  2426.     uuidNamingContextObjGuid: UUID;
  2427.     uuidDsaObjGuid: UUID;
  2428.   end;
  2429.   {$EXTERNALSYM _DS_REPL_OPW}
  2430.   DS_REPL_OPW = _DS_REPL_OPW;
  2431.   {$EXTERNALSYM DS_REPL_OPW}
  2432.   TDsReplOpW = DS_REPL_OPW;
  2433.   PDsReplOpW = ^DS_REPL_OPW;
  2434. // Fields can be added only to the end of this structure.
  2435.   _DS_REPL_OPW_BLOB = record
  2436.     ftimeEnqueued: FILETIME;  // time at which the operation was enqueued
  2437.     ulSerialNumber: ULONG; // ID of this sync; unique per machine per boot
  2438.     ulPriority: ULONG;     // > priority, > urgency
  2439.     OpType: DS_REPL_OP_TYPE;
  2440.     ulOptions: ULONG;      // Zero or more bits specific to OpType; e.g.,
  2441.                            //  DS_REPADD_* for DS_REPL_OP_TYPE_ADD,
  2442.                            //  DS_REPSYNC_* for DS_REPL_OP_TYPE_SYNC, etc.
  2443.     oszNamingContext: DWORD;
  2444.     oszDsaDN: DWORD;
  2445.     oszDsaAddress: DWORD;
  2446.     uuidNamingContextObjGuid: UUID;
  2447.     uuidDsaObjGuid: UUID;
  2448.   end;
  2449.   {$EXTERNALSYM _DS_REPL_OPW_BLOB}
  2450.   DS_REPL_OPW_BLOB = _DS_REPL_OPW_BLOB;
  2451.   {$EXTERNALSYM DS_REPL_OPW_BLOB}
  2452.   TDsReplOpwBlob = DS_REPL_OPW_BLOB;
  2453.   PDsReplOpwBlob = ^DS_REPL_OPW_BLOB;
  2454.   _DS_REPL_PENDING_OPSW = record
  2455.     ftimeCurrentOpStarted: FILETIME;
  2456.     cNumPendingOps: DWORD;
  2457.     rgPendingOp: array [0..0] of DS_REPL_OPW;
  2458.   end;
  2459.   {$EXTERNALSYM _DS_REPL_PENDING_OPSW}
  2460.   DS_REPL_PENDING_OPSW = _DS_REPL_PENDING_OPSW;
  2461.   {$EXTERNALSYM DS_REPL_PENDING_OPSW}
  2462.   TDsReplPendingOpsW = DS_REPL_PENDING_OPSW;
  2463.   PDsReplPendingOpsW = ^DS_REPL_PENDING_OPSW;
  2464.   _DS_REPL_VALUE_META_DATA = record
  2465.     pszAttributeName: LPWSTR;
  2466.     pszObjectDn: LPWSTR;
  2467.     cbData: DWORD;
  2468.     pbData: LPBYTE;
  2469.     ftimeDeleted: FILETIME;
  2470.     ftimeCreated: FILETIME;
  2471.     dwVersion: DWORD;
  2472.     ftimeLastOriginatingChange: FILETIME;
  2473.     uuidLastOriginatingDsaInvocationID: UUID;
  2474.     usnOriginatingChange: USN;   // in the originating DSA's USN space
  2475.     usnLocalChange: USN;         // in the local DSA's USN space
  2476.   end;
  2477.   {$EXTERNALSYM _DS_REPL_VALUE_META_DATA}
  2478.   DS_REPL_VALUE_META_DATA = _DS_REPL_VALUE_META_DATA;
  2479.   {$EXTERNALSYM DS_REPL_VALUE_META_DATA}
  2480.   TDsReplValueMetaData = DS_REPL_VALUE_META_DATA;
  2481.   PDsReplValueMetaData = ^DS_REPL_VALUE_META_DATA;  
  2482.   _DS_REPL_VALUE_META_DATA_2 = record
  2483.     pszAttributeName: LPWSTR;
  2484.     pszObjectDn: LPWSTR;
  2485.     cbData: DWORD;
  2486.     pbData: LPBYTE;
  2487.     ftimeDeleted: FILETIME;
  2488.     ftimeCreated: FILETIME;
  2489.     dwVersion: DWORD;
  2490.     ftimeLastOriginatingChange: FILETIME;
  2491.     uuidLastOriginatingDsaInvocationID: UUID;
  2492.     usnOriginatingChange: USN;   // in the originating DSA's USN space
  2493.     usnLocalChange: USN;         // in the local DSA's USN space
  2494.     pszLastOriginatingDsaDN: LPWSTR;
  2495.   end;
  2496.   {$EXTERNALSYM _DS_REPL_VALUE_META_DATA_2}
  2497.   DS_REPL_VALUE_META_DATA_2 = _DS_REPL_VALUE_META_DATA_2;
  2498.   {$EXTERNALSYM DS_REPL_VALUE_META_DATA_2}
  2499.   TDsReplValueMetaData2 = DS_REPL_VALUE_META_DATA_2;
  2500.   PDsReplValueMetaData2 = ^DS_REPL_VALUE_META_DATA_2;
  2501. // Fields can be added only to the end of this structure.
  2502.   _DS_REPL_VALUE_META_DATA_BLOB = record
  2503.     oszAttributeName: DWORD;
  2504.     oszObjectDn: DWORD;
  2505.     cbData: DWORD;
  2506.     obData: DWORD;
  2507.     ftimeDeleted: FILETIME;
  2508.     ftimeCreated: FILETIME;
  2509.     dwVersion: DWORD;
  2510.     ftimeLastOriginatingChange: FILETIME;
  2511.     uuidLastOriginatingDsaInvocationID: UUID;
  2512.     usnOriginatingChange: USN;   // in the originating DSA's USN space
  2513.     usnLocalChange: USN;         // in the local DSA's USN space
  2514.     oszLastOriginatingDsaDN: DWORD;
  2515.   end;
  2516.   {$EXTERNALSYM _DS_REPL_VALUE_META_DATA_BLOB}
  2517.   DS_REPL_VALUE_META_DATA_BLOB = _DS_REPL_VALUE_META_DATA_BLOB;
  2518.   {$EXTERNALSYM DS_REPL_VALUE_META_DATA_BLOB}
  2519.   TDsReplValueMetaDataBlob = DS_REPL_VALUE_META_DATA_BLOB;
  2520.   PsReplValueMetaDataBlob =  ^DS_REPL_VALUE_META_DATA_BLOB;
  2521.   
  2522.   _DS_REPL_ATTR_VALUE_META_DATA = record
  2523.     cNumEntries: DWORD;
  2524.     dwEnumerationContext: DWORD;
  2525.     rgMetaData: array [0..0] of DS_REPL_VALUE_META_DATA;
  2526.   end;
  2527.   {$EXTERNALSYM _DS_REPL_ATTR_VALUE_META_DATA}
  2528.   DS_REPL_ATTR_VALUE_META_DATA = _DS_REPL_ATTR_VALUE_META_DATA;
  2529.   {$EXTERNALSYM DS_REPL_ATTR_VALUE_META_DATA}
  2530.   TDsReplAttrValueMetaData = DS_REPL_ATTR_VALUE_META_DATA;
  2531.   PDsReplAttrValueMetaData = ^DS_REPL_ATTR_VALUE_META_DATA;
  2532.   _DS_REPL_ATTR_VALUE_META_DATA_2 = record
  2533.     cNumEntries: DWORD;
  2534.     dwEnumerationContext: DWORD;
  2535.     rgMetaData: array [0..0] of DS_REPL_VALUE_META_DATA_2;
  2536.   end;
  2537.   {$EXTERNALSYM _DS_REPL_ATTR_VALUE_META_DATA_2}
  2538.   DS_REPL_ATTR_VALUE_META_DATA_2 = _DS_REPL_ATTR_VALUE_META_DATA_2;
  2539.   {$EXTERNALSYM DS_REPL_ATTR_VALUE_META_DATA_2}
  2540.   TDsReplAttrValueMetaData2 = DS_REPL_ATTR_VALUE_META_DATA_2;
  2541.   PDsReplAttrValueMetaData2 = ^DS_REPL_ATTR_VALUE_META_DATA_2;  
  2542.   _DS_REPL_QUEUE_STATISTICSW = record
  2543.     ftimeCurrentOpStarted: FILETIME;
  2544.     cNumPendingOps: DWORD;
  2545.     ftimeOldestSync: FILETIME;
  2546.     ftimeOldestAdd: FILETIME;
  2547.     ftimeOldestMod: FILETIME;
  2548.     ftimeOldestDel: FILETIME;
  2549.     ftimeOldestUpdRefs: FILETIME;
  2550.   end;
  2551.   {$EXTERNALSYM _DS_REPL_QUEUE_STATISTICSW}
  2552.   DS_REPL_QUEUE_STATISTICSW = _DS_REPL_QUEUE_STATISTICSW;
  2553.   {$EXTERNALSYM DS_REPL_QUEUE_STATISTICSW}
  2554.   TDsReplQueueStatisticsW = DS_REPL_QUEUE_STATISTICSW;
  2555.   PDsReplQueueStatisticsW = ^DS_REPL_QUEUE_STATISTICSW;  
  2556. // Fields can be added only to the end of this structure.
  2557.   DS_REPL_QUEUE_STATISTICSW_BLOB = _DS_REPL_QUEUE_STATISTICSW;
  2558.   {$EXTERNALSYM DS_REPL_QUEUE_STATISTICSW_BLOB}
  2559.   TDsReplQueueStatisticsWBlob = DS_REPL_QUEUE_STATISTICSW_BLOB;
  2560. function DsReplicaGetInfoW(hDS: HANDLE; InfoType: DS_REPL_INFO_TYPE;
  2561.   pszObject: LPCWSTR; puuidForSourceDsaObjGuid: LPUUID; ppInfo: PPVOID): DWORD; stdcall;
  2562. {$EXTERNALSYM DsReplicaGetInfoW}
  2563. procedure DsReplicaFreeInfo(InfoType: DS_REPL_INFO_TYPE; pInfo: PVOID); stdcall;
  2564. {$EXTERNALSYM DsReplicaFreeInfo}
  2565. {$IFDEF UNICODE}
  2566. function DsReplicaGetInfo(hDS: HANDLE; InfoType: DS_REPL_INFO_TYPE;
  2567.   pszObject: LPCWSTR; puuidForSourceDsaObjGuid: LPUUID; ppInfo: PPVOID): DWORD; stdcall;
  2568. {$EXTERNALSYM DsReplicaGetInfo}
  2569. // This API is not supported by Windows 2000 clients or Windows 2000 DCs.
  2570. function DsReplicaGetInfo2W(hDS: HANDLE; InfoType: DS_REPL_INFO_TYPE; pszObject: LPCWSTR; const puuidForSourceDsaObjGuid: UUID; pszAttributeName,
  2571.   pszValue: LPCWSTR; dwFlags, dwEnumerationContext: DWORD; var ppInfo: LPVOID): DWORD; stdcall;
  2572. {$EXTERNALSYM DsReplicaGetInfo2W}
  2573. type
  2574.   DS_REPL_NEIGHBOR         = DS_REPL_NEIGHBORW;
  2575.   {$EXTERNALSYM DS_REPL_NEIGHBOR}
  2576.   DS_REPL_NEIGHBORS        = DS_REPL_NEIGHBORSW;
  2577.   {$EXTERNALSYM DS_REPL_NEIGHBORS}
  2578.   DS_REPL_CURSOR_3         = DS_REPL_CURSOR_3W;
  2579.   {$EXTERNALSYM DS_REPL_CURSOR_3}
  2580.   DS_REPL_CURSORS_3        = DS_REPL_CURSORS_3W;
  2581.   {$EXTERNALSYM DS_REPL_CURSORS_3}
  2582.   DS_REPL_KCC_DSA_FAILURES = DS_REPL_KCC_DSA_FAILURESW;
  2583.   {$EXTERNALSYM DS_REPL_KCC_DSA_FAILURES}
  2584.   DS_REPL_KCC_DSA_FAILURE  = DS_REPL_KCC_DSA_FAILUREW;
  2585.   {$EXTERNALSYM DS_REPL_KCC_DSA_FAILURE}
  2586.   DS_REPL_OP               = DS_REPL_OPW;
  2587.   {$EXTERNALSYM DS_REPL_OP}
  2588.   DS_REPL_PENDING_OPS      = DS_REPL_PENDING_OPSW;
  2589.   {$EXTERNALSYM DS_REPL_PENDING_OPS}
  2590.   TDsReplNeighbor = TDsReplNeighborW;
  2591.   TDsReplNeighbors = TDsReplNeighborsW;
  2592.   TDsReplCursors3 = TDsReplCursors3W;
  2593.   TDsReplKccDsaFailures = TDsReplKccDsaFailuresW;
  2594.   TDsReplKccDsaFailure = TDsReplKccDsaFailureW;
  2595.   TDsReplOp = TDsReplOpW;
  2596.   TDsReplPendingOps = TDsReplPendingOpsW;
  2597. {$ELSE}
  2598. // No ANSI equivalents currently supported.
  2599. {$ENDIF}
  2600. function DsAddSidHistoryA(hDS: HANDLE; Flags: DWORD; SrcDomain: LPCSTR;
  2601.   SrcPrincipal: LPCSTR; SrcDomainController: LPCSTR;
  2602.   SrcDomainCreds: RPC_AUTH_IDENTITY_HANDLE; DstDomain: LPCSTR;
  2603.   DstPrincipal: LPCSTR): DWORD; stdcall;
  2604. {$EXTERNALSYM DsAddSidHistoryA}
  2605. function DsAddSidHistoryW(hDS: HANDLE; Flags: DWORD; SrcDomain: LPCWSTR;
  2606.   SrcPrincipal: LPCWSTR; SrcDomainController: LPCWSTR;
  2607.   SrcDomainCreds: RPC_AUTH_IDENTITY_HANDLE; DstDomain: LPCWSTR;
  2608.   DstPrincipal: LPCWSTR): DWORD; stdcall;
  2609. {$EXTERNALSYM DsAddSidHistoryW}
  2610. {$IFDEF UNICODE}
  2611. function DsAddSidHistory(hDS: HANDLE; Flags: DWORD; SrcDomain: LPCWSTR;
  2612.   SrcPrincipal: LPCWSTR; SrcDomainController: LPCWSTR;
  2613.   SrcDomainCreds: RPC_AUTH_IDENTITY_HANDLE; DstDomain: LPCWSTR;
  2614.   DstPrincipal: LPCWSTR): DWORD; stdcall;
  2615. {$EXTERNALSYM DsAddSidHistory}
  2616. {$ELSE}
  2617. function DsAddSidHistory(hDS: HANDLE; Flags: DWORD; SrcDomain: LPCSTR;
  2618.   SrcPrincipal: LPCSTR; SrcDomainController: LPCSTR;
  2619.   SrcDomainCreds: RPC_AUTH_IDENTITY_HANDLE; DstDomain: LPCSTR;
  2620.   DstPrincipal: LPCSTR): DWORD; stdcall;
  2621. {$EXTERNALSYM DsAddSidHistory}
  2622. {$ENDIF}
  2623. // The DsInheritSecurityIdentity API adds the source principal's SID and
  2624. // SID history to the destination principal's SID history and then DELETES
  2625. // THE SOURCE PRINCIPAL.  Source and destination principal must be in the
  2626. // same domain.
  2627. function DsInheritSecurityIdentityA(hDS: HANDLE; Flags: DWORD;
  2628.   SrcPrincipal: LPCSTR; DstPrincipal: LPCSTR): DWORD; stdcall;
  2629. {$EXTERNALSYM DsInheritSecurityIdentityA}
  2630. function DsInheritSecurityIdentityW(hDS: HANDLE; Flags: DWORD;
  2631.   SrcPrincipal: LPCWSTR; DstPrincipal: LPCWSTR): DWORD; stdcall;
  2632. {$EXTERNALSYM DsInheritSecurityIdentityW}
  2633. {$IFDEF UNICODE}
  2634. function DsInheritSecurityIdentity(hDS: HANDLE; Flags: DWORD;
  2635.   SrcPrincipal: LPCWSTR; DstPrincipal: LPCWSTR): DWORD; stdcall;
  2636. {$EXTERNALSYM DsInheritSecurityIdentity}
  2637. {$ELSE}
  2638. function DsInheritSecurityIdentity(hDS: HANDLE; Flags: DWORD;
  2639.   SrcPrincipal: LPCSTR; DstPrincipal: LPCSTR): DWORD; stdcall;
  2640. {$EXTERNALSYM DsInheritSecurityIdentity}
  2641. {$ENDIF}
  2642. {ifndef MIDL_PASS
  2643. /*++
  2644. ==========================================================
  2645. NTDSAPI
  2646. DWORD
  2647. WINAPI
  2648. DsQuoteRdnValue(
  2649.     IN     DWORD    cUnquotedRdnValueLength,
  2650.     IN     LPCTCH   psUnquotedRdnValue,
  2651.     IN OUT DWORD    *pcQuotedRdnValueLength,
  2652.     OUT    LPTCH    psQuotedRdnValue
  2653.     )
  2654. ++
  2655. Description
  2656.     This client call converts an RDN value into a quoted RDN value if
  2657.     the RDN value contains characters that require quotes. The resultant
  2658.     RDN can be submitted as part of a DN to the DS using various APIs
  2659.     such as LDAP.
  2660.     No quotes are added if none are needed. In this case, the
  2661.     output RDN value will be the same as the input RDN value.
  2662.     The RDN is quoted in accordance with the specification "Lightweight
  2663.     Directory Access Protocol (v3): UTF-8 String Representation of
  2664.     Distinguished Names", RFC 2253.
  2665.     The input and output RDN values are *NOT* NULL terminated.
  2666.     The changes made by this call can be undone by calling
  2667.     DsUnquoteRdnValue().
  2668. Arguments:
  2669.     cUnquotedRdnValueLength - The length of psUnquotedRdnValue in chars.
  2670.     psUnquotedRdnValue - Unquoted RDN value.
  2671.     pcQuotedRdnValueeLength - IN, maximum length of psQuotedRdnValue, in chars
  2672.                         OUT ERROR_SUCCESS, chars utilized in psQuotedRdnValue
  2673.                         OUT ERROR_BUFFER_OVERFLOW, chars needed in psQuotedRdnValue
  2674.     psQuotedRdnValue - The resultant and perhaps quoted RDN value
  2675. Return Value:
  2676.     ERROR_SUCCESS
  2677.         If quotes or escapes were needed, then psQuotedRdnValue contains
  2678.         the quoted, escaped version of psUnquotedRdnValue. Otherwise,
  2679.         psQuotedRdnValue contains a copy of psUnquotedRdnValue. In either
  2680.         case, pcQuotedRdnValueLength contains the space utilized, in chars.
  2681.     ERROR_BUFFER_OVERFLOW
  2682.         psQuotedRdnValueLength contains the space needed, in chars,
  2683.         to hold psQuotedRdnValue.
  2684.     ERROR_INVALID_PARAMETER
  2685.         Invalid parameter.
  2686.     ERROR_NOT_ENOUGH_MEMORY
  2687.         Allocation error.
  2688. --}
  2689. function DsQuoteRdnValueA(cUnquotedRdnValueLength: DWORD;
  2690.   psUnquotedRdnValue: LPCCH; var pcQuotedRdnValueLength: DWORD;
  2691.   psQuotedRdnValue: LPCH): DWORD; stdcall;
  2692. {$EXTERNALSYM DsQuoteRdnValueA}
  2693. function DsQuoteRdnValueW(cUnquotedRdnValueLength: DWORD;
  2694.   psUnquotedRdnValue: LPCWCH; var pcQuotedRdnValueLength: DWORD;
  2695.   psQuotedRdnValue: LPWCH): DWORD; stdcall;
  2696. {$EXTERNALSYM DsQuoteRdnValueW}
  2697. {$IFDEF UNICODE}
  2698. function DsQuoteRdnValue(cUnquotedRdnValueLength: DWORD;
  2699.   psUnquotedRdnValue: LPCWCH; var pcQuotedRdnValueLength: DWORD;
  2700.   psQuotedRdnValue: LPWCH): DWORD; stdcall;
  2701. {$EXTERNALSYM DsQuoteRdnValue}
  2702. {$ELSE}
  2703. function DsQuoteRdnValue(cUnquotedRdnValueLength: DWORD;
  2704.   psUnquotedRdnValue: LPCCH; var pcQuotedRdnValueLength: DWORD;
  2705.   psQuotedRdnValue: LPCH): DWORD; stdcall;
  2706. {$EXTERNALSYM DsQuoteRdnValue}
  2707. {$ENDIF}
  2708. {++
  2709. ==========================================================
  2710. NTDSAPI
  2711. DWORD
  2712. WINAPI
  2713. DsUnquoteRdnValue(
  2714.     IN     DWORD    cQuotedRdnValueLength,
  2715.     IN     LPCTCH   psQuotedRdnValue,
  2716.     IN OUT DWORD    *pcUnquotedRdnValueLength,
  2717.     OUT    LPTCH    psUnquotedRdnValue
  2718.     )
  2719. Description
  2720.     This client call converts a quoted RDN Value into an unquoted RDN
  2721.     Value. The resultant RDN value should *NOT* be submitted as part
  2722.     of a DN to the DS using various APIs such as LDAP.
  2723.     When psQuotedRdnValue is quoted:
  2724.         The leading and trailing quote are removed.
  2725.         Whitespace before the first quote is discarded.
  2726.         Whitespace trailing the last quote is discarded.
  2727.         Escapes are removed and the char following the escape is kept.
  2728.     The following actions are taken when psQuotedRdnValue is unquoted:
  2729.         Leading whitespace is discarded.
  2730.         Trailing whitespace is kept.
  2731.         Escaped non-special chars return an error.
  2732.         Unescaped special chars return an error.
  2733.         RDN values beginning with # (ignoring leading whitespace) are
  2734.         treated as a stringized BER value and converted accordingly.
  2735.         Escaped hex digits (89) are converted into a binary byte (0x89).
  2736.         Escapes are removed from escaped special chars.
  2737.     The following actions are always taken:
  2738.         Escaped special chars are unescaped.
  2739.     The input and output RDN values are not NULL terminated.
  2740. Arguments:
  2741.     cQuotedRdnValueLength - The length of psQuotedRdnValue in chars.
  2742.     psQuotedRdnValue - RDN value that may be quoted and may be escaped.
  2743.     pcUnquotedRdnValueLength - IN, maximum length of psUnquotedRdnValue, in chars
  2744.                           OUT ERROR_SUCCESS, chars used in psUnquotedRdnValue
  2745.                           OUT ERROR_BUFFER_OVERFLOW, chars needed for psUnquotedRdnValue
  2746.     psUnquotedRdnValue - The resultant unquoted RDN value.
  2747. Return Value:
  2748.     ERROR_SUCCESS
  2749.         psUnquotedRdnValue contains the unquoted and unescaped version
  2750.         of psQuotedRdnValue. pcUnquotedRdnValueLength contains the space
  2751.         used, in chars.
  2752.     ERROR_BUFFER_OVERFLOW
  2753.         psUnquotedRdnValueLength contains the space needed, in chars,
  2754.         to hold psUnquotedRdnValue.
  2755.     ERROR_INVALID_PARAMETER
  2756.         Invalid parameter.
  2757.     ERROR_NOT_ENOUGH_MEMORY
  2758.         Allocation error.
  2759. --}
  2760. function DsUnquoteRdnValueA(cQuotedRdnValueLength: DWORD; psQuotedRdnValue: LPCCH;
  2761.   var pcUnquotedRdnValueLength: DWORD; psUnquotedRdnValue: LPCH): DWORD; stdcall;
  2762. {$EXTERNALSYM DsUnquoteRdnValueA}
  2763. function DsUnquoteRdnValueW(cQuotedRdnValueLength: DWORD; psQuotedRdnValue: LPCWCH;
  2764.   var pcUnquotedRdnValueLength: DWORD; psUnquotedRdnValue: LPWCH): DWORD; stdcall;
  2765. {$EXTERNALSYM DsUnquoteRdnValueW}
  2766. {$IFDEF UNICODE}
  2767. function DsUnquoteRdnValue(cQuotedRdnValueLength: DWORD; psQuotedRdnValue: LPCWCH;
  2768.   var pcUnquotedRdnValueLength: DWORD; psUnquotedRdnValue: LPWCH): DWORD; stdcall;
  2769. {$EXTERNALSYM DsUnquoteRdnValue}
  2770. {$ELSE}
  2771. function DsUnquoteRdnValue(cQuotedRdnValueLength: DWORD; psQuotedRdnValue: LPCCH;
  2772.   var pcUnquotedRdnValueLength: DWORD; psUnquotedRdnValue: LPCH): DWORD; stdcall;
  2773. {$EXTERNALSYM DsUnquoteRdnValue}
  2774. {$ENDIF}
  2775. (*++
  2776. ==========================================================
  2777. NTDSAPI
  2778. DWORD
  2779. WINAPI
  2780. DsGetRdnW(
  2781.     IN OUT LPCWCH   *ppDN,
  2782.     IN OUT DWORD    *pcDN,
  2783.     OUT    LPCWCH   *ppKey,
  2784.     OUT    DWORD    *pcKey,
  2785.     OUT    LPCWCH   *ppVal,
  2786.     OUT    DWORD    *pcVal
  2787.     )
  2788. Description
  2789.     This client call accepts a DN with quoted RDNs and returns the address
  2790.     and length, in chars, of the key and value for the first RDN in the DN.
  2791.     The RDN value returned is still quoted. Use DsUnquoteRdnValue to unquote
  2792.     the value for display.
  2793.     This client call also returns the address and length of the rest of the
  2794.     DN. A subsequent call using the returned DN address and length will
  2795.     return information about the next RDN.
  2796.     The following loop processes each RDN in pDN:
  2797.         ccDN = wcslen(pDN)
  2798.         while (ccDN) {
  2799.             error = DsGetRdn(&pDN,
  2800.                              &ccDN,
  2801.                              &pKey,
  2802.                              &ccKey,
  2803.                              &pVal,
  2804.                              &ccVal);
  2805.             if (error != ERROR_SUCCESS) {
  2806.                 process error;
  2807.                 return;
  2808.             }
  2809.             if (ccKey) {
  2810.                 process pKey;
  2811.             }
  2812.             if (ccVal) {
  2813.                 process pVal;
  2814.             }
  2815.         }
  2816.     For example, given the DN "cn=bob,dc=com", the first call to DsGetRdnW
  2817.     returns the addresses for ",dc=com", "cn", and "bob" with respective
  2818.     lengths of 7, 2, and 3. A subsequent call with ",dc=com" returns "",
  2819.     "dc", and "com" with respective lengths 0, 2, and 3.
  2820. Arguments:
  2821.     ppDN
  2822.         IN : *ppDN points to a DN
  2823.         OUT: *ppDN points to the rest of the DN following the first RDN
  2824.     pcDN
  2825.         IN : *pcDN is the count of chars in the input *ppDN, not including
  2826.              any terminating NULL
  2827.         OUT: *pcDN is the count of chars in the output *ppDN, not including
  2828.              any terminating NULL
  2829.     ppKey
  2830.         OUT: Undefined if *pcKey is 0. Otherwise, *ppKey points to the first
  2831.              key in the DN
  2832.     pcKey
  2833.         OUT: *pcKey is the count of chars in *ppKey.
  2834.     ppVal
  2835.         OUT: Undefined if *pcVal is 0. Otherwise, *ppVal points to the first
  2836.              value in the DN
  2837.     pcVal
  2838.         OUT: *pcVal is the count of chars in *ppVal
  2839. Return Value:
  2840.     ERROR_SUCCESS
  2841.         If *pccDN is not 0, then *ppDN points to the rest of the DN following
  2842.         the first RDN. If *pccDN is 0, then *ppDN is undefined.
  2843.         If *pccKey is not 0, then *ppKey points to the first key in DN. If
  2844.         *pccKey is 0, then *ppKey is undefined.
  2845.         If *pccVal is not 0, then *ppVal points to the first value in DN. If
  2846.         *pccVal is 0, then *ppVal is undefined.
  2847.     ERROR_DS_NAME_UNPARSEABLE
  2848.         The first RDN in *ppDN could not be parsed. All output parameters
  2849.         are undefined.
  2850.     Any other error
  2851.         All output parameters are undefined.
  2852. --*)
  2853. function DsGetRdnW(var ppDN: LPCWCH; var pcDN: DWORD; var ppKey: LPCWCH; var pcKey: DWORD; var ppVal: LPCWCH; var pcVal: DWORD): DWORD; stdcall;
  2854. {$EXTERNALSYM DsGetRdnW}
  2855. (*++
  2856. ==========================================================
  2857. NTDSAPI
  2858. BOOL
  2859. WINAPI
  2860. DsCrackUnquotedMangledRdnW(
  2861.      IN LPCWSTR pszRDN,
  2862.      IN DWORD cchRDN,
  2863.      OUT OPTIONAL GUID *pGuid,
  2864.      OUT OPTIONAL DS_MANGLE_FOR *peDsMangleFor
  2865.      );
  2866. Description
  2867. Determine whether the given RDN is in mangled form. If so, the mangled RDN
  2868. is decoded, and the guid and mangle type are returned.
  2869. The RDN should already be in unquoted form. See DsUnquoteRdnValue.
  2870. Arguments:
  2871.     pszRDN (IN) - Character string containing RDN. Termination is optional.
  2872.     cchRDN (IN) - Length of RDN excluding termination, if any
  2873.     pGuid (OUT, OPTIONAL) - Pointer to storage to receive decoded guid.
  2874.                             Only returned if RDN is mangled.
  2875.     peDsMangleFor (OUT, OPTIONAL) - Pointer to storage to receive mangle type.
  2876.                             Only returned if RDN is mangled
  2877. Return Value:
  2878.     BOOL - Whether the RDN is mangled or not
  2879. --*)