NtDsAPI.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:107k
源码类别:

模拟服务器

开发平台:

C/C++

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