Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1578 lines
36 KiB

  1. /*++
  2. Copyright (c) 2001 Microsoft Corporation
  3. Module Name:
  4. adstore.hxx
  5. Abstract:
  6. This file provides needed structure and functions for the
  7. AD store provider.
  8. Author:
  9. Chaitanya Upadhyay (chaitu) Aug-2001
  10. --*/
  11. #ifndef __ADSTORE_HXX_
  12. #define __ADSTORE_HXX_
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. //
  17. // defines
  18. //
  19. //
  20. // AzRoles objects in AD store
  21. //
  22. #define AZ_AD_AZ_STORE L"msDS-AzAdminManager"
  23. #define AZ_AD_APPLICATION L"msDS-AzApplication"
  24. #define AZ_AD_OBJECT_CONTAINER L"container"
  25. #define AZ_AD_OPERATION L"msDS-AzOperation"
  26. #define AZ_AD_TASK L"msDS-AzTask"
  27. #define AZ_AD_ROLE L"msDS-AzRole"
  28. #define AZ_AD_SCOPE L"msDS-AzScope"
  29. #define AZ_AD_GROUP L"group"
  30. #define AZ_AD_USER L"user"
  31. //
  32. // The root domain naming context
  33. //
  34. #define AZ_AD_ADAM_OID L"1.2.840.113556.1.4.1851"
  35. //
  36. // The minimum behavior version of the domain
  37. //
  38. #define AZ_AD_MIN_DOMAIN_BEHAVIOR_VERSION 2
  39. #define AZ_AD_DOMAIN_BEHAVIOR L"msDS-Behavior-Version"
  40. //
  41. // The minimum schema object version of the DC
  42. //
  43. #define AZ_AD_SCHEMA_OBJECT_VERSION L"objectVersion"
  44. #define AZ_AD_MIN_SCHEMA_OBJECT_VERSION 26
  45. //
  46. // Object type for application/scope child container for task,
  47. // role, group and operation objects
  48. //
  49. #define AZ_AD_OBJECT_CONTAINER_TYPE OBJECT_TYPE_COUNT
  50. //
  51. // Different Group types
  52. //
  53. #define AZ_AD_BASIC_GROUP GROUP_TYPE_APP_BASIC_GROUP
  54. #define AZ_AD_QUERY_GROUP GROUP_TYPE_APP_QUERY_GROUP
  55. //
  56. // Bool values
  57. //
  58. #define AZ_AD_TRUE L"TRUE"
  59. #define AZ_AD_FALSE L"FALSE"
  60. #define AZ_AD_MAX_CLASS_NAME_LENGTH 64
  61. #define AZ_AD_PAGE_SEARCH_COUNT 1000
  62. #define MAX_RANGE_ATTR_READ_ATTEMPT 1500
  63. //
  64. // Maximum number of server side LDAP controls that will be set
  65. // Currently three:
  66. // LDAP_SERVER_TREE_DELETE_OID_W
  67. // LDAP_SERVER_PERMISSIVE_MODIFY_OID_W
  68. // LDAP_SERVER_EXTENDED_DN_OID_W
  69. //
  70. #define AZ_AD_MAX_SERVER_CONTROLS 3
  71. const PWSTR AZ_AD_SERVER_CONTROLS[] = {
  72. LDAP_SERVER_TREE_DELETE_OID_W,
  73. LDAP_SERVER_PERMISSIVE_MODIFY_OID_W,
  74. LDAP_SERVER_EXTENDED_DN_OID_W
  75. };
  76. //
  77. // AzRoles object attributes in AD store
  78. //
  79. //
  80. // Common attributes to be read
  81. //
  82. #define AZ_AD_OBJECT_CLASS L"objectClass"
  83. #define AZ_AD_OBJECT_NAME L"name"
  84. #define AZ_AD_OBJECT_DESCRIPTION L"description"
  85. #define AZ_AD_OBJECT_GUID L"objectGUID"
  86. #define AZ_AD_OBJECT_SID L"objectSid"
  87. #define AZ_AD_OBJECT_DN L"distinguishedName"
  88. #define AZ_AD_OBJECT_CN L"cn"
  89. #define AZ_AD_OBJECT_WRITEABLE L"allowedAttributesEffective"
  90. #define AZ_AD_OBJECT_CHILD_CREATE L"allowedChildClassesEffective"
  91. #define AZ_AD_GROUP_TYPE L"groupType"
  92. #define AZ_AD_NT_SECURITY_DESCRIPTOR L"NTSecurityDescriptor"
  93. //
  94. // Name attributes for AzApplication, AzScope
  95. //
  96. #define AZ_AD_APPLICATION_NAME L"msDS-AzApplicationName"
  97. #define AZ_AD_SCOPE_NAME L"msDS-AzScopeName"
  98. #define AZ_AD_AZSTORE L"msDS-AzAdminManager"
  99. #define AD_USNCHANGED L"uSNChanged"
  100. #define AD_OBJECTVERSION L"objectVersion"
  101. //
  102. // Operation Id for AzOperation
  103. //
  104. #define AZ_AD_OPERATION_ID L"msDS-AzOperationID"
  105. //
  106. // Application Data
  107. //
  108. #define AZ_AD_OBJECT_APPLICATION_DATA L"msDS-AzApplicationData"
  109. #define AZ_AD_END_LIST 0xffffffff
  110. //
  111. // Name attribute for different objects
  112. //
  113. const PWSTR AZ_AD_OBJECT_NAMES[] = {
  114. NULL, // OBJECT_TYPE_AZAUTHSTORE
  115. AZ_AD_APPLICATION_NAME, // OBJECT_TYPE_APPLICATION
  116. AZ_AD_OBJECT_CN, // OBJECT_TYPE_OPERATION
  117. AZ_AD_OBJECT_CN, // OBJECT_TYPE_TASK
  118. AZ_AD_SCOPE_NAME, // OBJECT_TYPE_SCOPE
  119. AZ_AD_OBJECT_CN, // OBJECT_TYPE_GROUP
  120. AZ_AD_OBJECT_CN, // OBJECT_TYPE_ROLE
  121. };
  122. //
  123. // List of objects that have children
  124. //
  125. BOOL AZ_AD_PARENT_OBJECT[] = {
  126. TRUE, // OBJECT_TYPE_AZAUTHSTORE
  127. TRUE, // OBJECT_TYPE_APPLICATION
  128. FALSE, // OBJECT_TYPE_OPERATION
  129. FALSE, // OBJECT_TYPE_TASK
  130. TRUE, // OBJECT_TYPE_SCOPE
  131. FALSE, // OBJECT_TYPE_GROUP
  132. FALSE // OBJECT_TYPE_ROLE
  133. };
  134. //
  135. // List of attributes
  136. //
  137. typedef struct _AZ_AD_ATTRS {
  138. //
  139. //type of attribute ID
  140. //
  141. ULONG AttrType;
  142. //
  143. // Attribute name
  144. //
  145. PWSTR Attr;
  146. //
  147. // Data Type of Attribute
  148. //
  149. ENUM_AZ_DATATYPE DataType;
  150. //
  151. // Dirty bit for attribute
  152. //
  153. ULONG lDirtyBit;
  154. } AZ_AD_ATTRS;
  155. //
  156. // Maximum number of attributes (linked attributes counted twice - once for addition and once for
  157. // deletion)
  158. //
  159. #define AZ_AD_MAX_NON_COMMON_ATTRS 20
  160. //
  161. // Number of common attrbiutes
  162. //
  163. #define AZ_AD_COMMON_ATTRS 3
  164. //
  165. // Minimum Number of attributes needed to create any object in AD
  166. //
  167. #define AZ_AD_MIN_CREATE_ATTRS 1
  168. #define AZ_AD_MAX_ATTRS (AZ_AD_MAX_NON_COMMON_ATTRS + AZ_AD_COMMON_ATTRS + AZ_AD_MIN_CREATE_ATTRS)
  169. //
  170. // Common Attributes (not including objectClass attribute)
  171. //
  172. AZ_AD_ATTRS CommonAttrs[] = {
  173. { AZ_PROP_NAME, AZ_AD_OBJECT_NAME,
  174. ENUM_AZ_BSTR, AZ_DIRTY_NAME },
  175. { AZ_PROP_DESCRIPTION, AZ_AD_OBJECT_DESCRIPTION,
  176. ENUM_AZ_BSTR, AZ_DIRTY_DESCRIPTION },
  177. { AZ_PROP_APPLICATION_DATA, AZ_AD_OBJECT_APPLICATION_DATA,
  178. ENUM_AZ_BSTR, AZ_DIRTY_APPLICATION_DATA },
  179. { AZ_AD_END_LIST }
  180. };
  181. //
  182. // For AzAuthorizationStore
  183. //
  184. AZ_AD_ATTRS AzStoreAttrs[] = {
  185. { AZ_PROP_GENERATE_AUDITS, L"msDS-AzGenerateAudits",
  186. ENUM_AZ_BOOL, AZ_DIRTY_GENERATE_AUDITS },
  187. { AZ_PROP_AZSTORE_DOMAIN_TIMEOUT, L"msDS-AzDomainTimeout",
  188. ENUM_AZ_LONG, AZ_DIRTY_AZSTORE_DOMAIN_TIMEOUT },
  189. { AZ_PROP_AZSTORE_MAX_SCRIPT_ENGINES, L"msDS-AzScriptEngineCacheMax",
  190. ENUM_AZ_LONG, AZ_DIRTY_AZSTORE_MAX_SCRIPT_ENGINES },
  191. { AZ_PROP_AZSTORE_SCRIPT_ENGINE_TIMEOUT, L"msDS-AzScriptTimeout",
  192. ENUM_AZ_LONG, AZ_DIRTY_AZSTORE_SCRIPT_ENGINE_TIMEOUT },
  193. { AZ_PROP_AZSTORE_MAJOR_VERSION, L"msDS-AzMajorVersion",
  194. ENUM_AZ_LONG, AZ_DIRTY_AZSTORE_MAJOR_VERSION },
  195. { AZ_PROP_AZSTORE_MINOR_VERSION, L"msDS-AzMinorVersion",
  196. ENUM_AZ_LONG, AZ_DIRTY_AZSTORE_MINOR_VERSION },
  197. { AZ_AD_END_LIST }
  198. };
  199. PWCHAR AuthorizationStoreReadAttrs[] = {
  200. AZ_AD_OBJECT_DN,
  201. AZ_AD_OBJECT_CN,
  202. AZ_AD_OBJECT_WRITEABLE,
  203. AZ_AD_OBJECT_CHILD_CREATE,
  204. CommonAttrs[0].Attr,
  205. CommonAttrs[1].Attr,
  206. CommonAttrs[2].Attr,
  207. AzStoreAttrs[0].Attr,
  208. AzStoreAttrs[1].Attr,
  209. AzStoreAttrs[2].Attr,
  210. AzStoreAttrs[3].Attr,
  211. AzStoreAttrs[4].Attr,
  212. AzStoreAttrs[5].Attr,
  213. AD_OBJECTVERSION,
  214. AD_USNCHANGED,
  215. NULL
  216. };
  217. //
  218. // for AzApplication
  219. //
  220. AZ_AD_ATTRS ApplicationAttrs[] = {
  221. { AZ_PROP_APPLICATION_AUTHZ_INTERFACE_CLSID, L"msDS-AzClassId",
  222. ENUM_AZ_BSTR, AZ_DIRTY_APPLICATION_AUTHZ_INTERFACE_CLSID },
  223. { AZ_PROP_APPLICATION_VERSION, L"msDS-AzApplicationVersion",
  224. ENUM_AZ_BSTR, AZ_DIRTY_APPLICATION_VERSION },
  225. { AZ_PROP_GENERATE_AUDITS, L"msDS-AzGenerateAudits",
  226. ENUM_AZ_BOOL, AZ_DIRTY_GENERATE_AUDITS },
  227. { AZ_AD_END_LIST }
  228. };
  229. PWCHAR ApplicationReadAttrs[] = {
  230. AZ_AD_OBJECT_DN,
  231. AZ_AD_OBJECT_CN,
  232. AZ_AD_OBJECT_GUID,
  233. AZ_AD_APPLICATION_NAME,
  234. AZ_AD_OBJECT_WRITEABLE,
  235. AZ_AD_OBJECT_CHILD_CREATE,
  236. CommonAttrs[1].Attr,
  237. CommonAttrs[2].Attr,
  238. ApplicationAttrs[0].Attr,
  239. ApplicationAttrs[1].Attr,
  240. ApplicationAttrs[2].Attr,
  241. NULL
  242. };
  243. //
  244. // For AzOperation
  245. //
  246. AZ_AD_ATTRS OperationAttrs[] = {
  247. { AZ_PROP_OPERATION_ID, L"msDS-AzOperationID",
  248. ENUM_AZ_LONG, AZ_DIRTY_OPERATION_ID },
  249. { AZ_AD_END_LIST }
  250. };
  251. PWCHAR OperationReadAttrs[] = {
  252. AZ_AD_OBJECT_DN,
  253. AZ_AD_OBJECT_CN,
  254. AZ_AD_OBJECT_GUID,
  255. CommonAttrs[0].Attr,
  256. CommonAttrs[1].Attr,
  257. CommonAttrs[2].Attr,
  258. OperationAttrs[0].Attr,
  259. NULL
  260. };
  261. //
  262. // For AzTask
  263. //
  264. AZ_AD_ATTRS TaskAttrs[] = {
  265. { AZ_PROP_TASK_BIZRULE, L"msDS-AzBizRule",
  266. ENUM_AZ_BSTR, AZ_DIRTY_TASK_BIZRULE },
  267. { AZ_PROP_TASK_BIZRULE_LANGUAGE, L"msDS-AzBizRuleLanguage",
  268. ENUM_AZ_BSTR, AZ_DIRTY_TASK_BIZRULE_LANGUAGE },
  269. { AZ_PROP_TASK_BIZRULE_IMPORTED_PATH, L"msDS-AzLastImportedBizRulePath",
  270. ENUM_AZ_BSTR, AZ_DIRTY_TASK_BIZRULE_IMPORTED_PATH },
  271. { AZ_PROP_TASK_OPERATIONS, L"msDS-OperationsForAzTask",
  272. ENUM_AZ_GUID_ARRAY, AZ_DIRTY_TASK_OPERATIONS },
  273. { AZ_PROP_TASK_TASKS, L"msDS-TasksForAzTask",
  274. ENUM_AZ_GUID_ARRAY, AZ_DIRTY_TASK_TASKS },
  275. { AZ_PROP_TASK_IS_ROLE_DEFINITION, L"msDS-AzTaskIsRoleDefinition",
  276. ENUM_AZ_BOOL, AZ_DIRTY_TASK_IS_ROLE_DEFINITION },
  277. { AZ_AD_END_LIST }
  278. };
  279. PWCHAR TaskReadAttrs[] = {
  280. AZ_AD_OBJECT_DN,
  281. AZ_AD_OBJECT_CN,
  282. AZ_AD_OBJECT_GUID,
  283. CommonAttrs[0].Attr,
  284. CommonAttrs[1].Attr,
  285. CommonAttrs[2].Attr,
  286. TaskAttrs[0].Attr,
  287. TaskAttrs[1].Attr,
  288. TaskAttrs[2].Attr,
  289. TaskAttrs[3].Attr,
  290. TaskAttrs[4].Attr,
  291. TaskAttrs[5].Attr,
  292. NULL
  293. };
  294. //
  295. // For AzScope
  296. //
  297. AZ_AD_ATTRS ScopeAttrs[] = {
  298. { AZ_AD_END_LIST }
  299. };
  300. PWCHAR ScopeReadAttrs[] = {
  301. AZ_AD_OBJECT_DN,
  302. AZ_AD_OBJECT_CN,
  303. AZ_AD_OBJECT_GUID,
  304. AZ_AD_SCOPE_NAME,
  305. AZ_AD_OBJECT_WRITEABLE,
  306. AZ_AD_OBJECT_CHILD_CREATE,
  307. CommonAttrs[1].Attr,
  308. CommonAttrs[2].Attr,
  309. NULL
  310. };
  311. //
  312. // For AzRole
  313. //
  314. AZ_AD_ATTRS RoleAttrs[] = {
  315. { AZ_PROP_ROLE_MEMBERS, L"msDS-MembersForAzRole",
  316. ENUM_AZ_SID_ARRAY, AZ_DIRTY_ROLE_MEMBERS },
  317. { AZ_PROP_ROLE_OPERATIONS, L"msDS-OperationsForAzRole",
  318. ENUM_AZ_GUID_ARRAY, AZ_DIRTY_ROLE_OPERATIONS },
  319. { AZ_PROP_ROLE_TASKS, L"msDS-TasksForAzRole",
  320. ENUM_AZ_GUID_ARRAY, AZ_DIRTY_ROLE_TASKS },
  321. { AZ_AD_END_LIST }
  322. };
  323. PWCHAR RoleReadAttrs[] = {
  324. AZ_AD_OBJECT_DN,
  325. AZ_AD_OBJECT_CN,
  326. AZ_AD_OBJECT_GUID,
  327. CommonAttrs[0].Attr,
  328. CommonAttrs[1].Attr,
  329. CommonAttrs[2].Attr,
  330. RoleAttrs[0].Attr,
  331. RoleAttrs[1].Attr,
  332. RoleAttrs[2].Attr,
  333. NULL
  334. };
  335. //
  336. // For AzApplicationGroups
  337. //
  338. AZ_AD_ATTRS ApplicationGroupAttrs[] = {
  339. { AZ_PROP_GROUP_TYPE, L"groupType",
  340. ENUM_AZ_GROUP_TYPE, AZ_DIRTY_GROUP_TYPE },
  341. { AZ_PROP_GROUP_LDAP_QUERY, L"msDS-AzLDAPQuery",
  342. ENUM_AZ_BSTR, AZ_DIRTY_GROUP_LDAP_QUERY },
  343. { AZ_PROP_GROUP_MEMBERS, L"member",
  344. ENUM_AZ_SID_ARRAY, AZ_DIRTY_GROUP_MEMBERS },
  345. { AZ_PROP_GROUP_NON_MEMBERS, L"msDS-NonMembers",
  346. ENUM_AZ_SID_ARRAY, AZ_DIRTY_GROUP_NON_MEMBERS },
  347. { AZ_AD_END_LIST }
  348. };
  349. PWCHAR ApplicationGroupReadAttrs[] = {
  350. AZ_AD_OBJECT_DN,
  351. AZ_AD_OBJECT_CN,
  352. AZ_AD_OBJECT_GUID,
  353. CommonAttrs[0].Attr,
  354. CommonAttrs[1].Attr,
  355. ApplicationGroupAttrs[0].Attr,
  356. ApplicationGroupAttrs[1].Attr,
  357. ApplicationGroupAttrs[2].Attr,
  358. ApplicationGroupAttrs[3].Attr,
  359. NULL
  360. };
  361. //
  362. // For AZ_AD_OBJECT_CONTAINER
  363. //
  364. AZ_AD_ATTRS ObjectContainerAttrs[] = {
  365. //
  366. // This object does not exist in the core cache. Thus,
  367. // no attributes are to be read
  368. //
  369. { AZ_AD_END_LIST }
  370. };
  371. PWCHAR ObjectContainerReadAttrs[] = {
  372. AZ_AD_OBJECT_DN,
  373. NULL
  374. };
  375. //
  376. // Table of objects, and their attributes
  377. //
  378. typedef struct _AZ_AD_OBJECT_ATTRIBUTE {
  379. //
  380. // Object type
  381. //
  382. ULONG lObjectType;
  383. //
  384. // Object class
  385. //
  386. PWCHAR pObjectClass;
  387. //
  388. // Object Attributes
  389. //
  390. AZ_AD_ATTRS *pObjectAttrs;
  391. } AZ_AD_OBJECT_ATTRIBUTE;
  392. //
  393. // It is imperative that this list be kept synchronized with the OBJET_TYPE_*
  394. // list defined in azper.h
  395. //
  396. AZ_AD_OBJECT_ATTRIBUTE ObjectAttributes[OBJECT_TYPE_COUNT+1] = {
  397. // OBJECT_TYPE_AZAUTHSTORE
  398. { OBJECT_TYPE_AZAUTHSTORE, AZ_AD_AZ_STORE, AzStoreAttrs },
  399. // OBJECT_TYPE_APPLICATION
  400. { OBJECT_TYPE_APPLICATION, AZ_AD_APPLICATION, ApplicationAttrs },
  401. // OBJECT_TYPE_OPERATION
  402. { OBJECT_TYPE_OPERATION, AZ_AD_OPERATION, OperationAttrs },
  403. // OBJECT_TYPE_TASK
  404. { OBJECT_TYPE_TASK, AZ_AD_TASK, TaskAttrs },
  405. // OBJECT_TYPE_SCOPE
  406. { OBJECT_TYPE_SCOPE, AZ_AD_SCOPE, ScopeAttrs },
  407. // OBJECT_TYPE_GROUP
  408. { OBJECT_TYPE_GROUP, AZ_AD_GROUP, ApplicationGroupAttrs },
  409. // OBJECT_TYPE_ROLE
  410. { OBJECT_TYPE_ROLE, AZ_AD_ROLE, RoleAttrs },
  411. // AZ_AD_OBJECT_CONTAINER_TYPE
  412. { AZ_AD_OBJECT_CONTAINER_TYPE, AZ_AD_OBJECT_CONTAINER, ObjectContainerAttrs }
  413. };
  414. PWCHAR *AllObjectReadAttrs[OBJECT_TYPE_COUNT+1] = {
  415. // OBJECT_TYPE_AZAUTHSTORE
  416. AuthorizationStoreReadAttrs,
  417. // OBJECT_TYPE_APPLICATION
  418. ApplicationReadAttrs,
  419. // OBJECT_TYPE_OPERATION
  420. OperationReadAttrs,
  421. // OBJECT_TYPE_TASK
  422. TaskReadAttrs,
  423. // OBJECT_TYPE_SCOPE
  424. ScopeReadAttrs,
  425. // OBJECT_TYPE_GROUP
  426. ApplicationGroupReadAttrs,
  427. // OBJECT_TYPE_ROLE
  428. RoleReadAttrs,
  429. // AZ_AD_OBJECT_CONTAINER_TYPE
  430. ObjectContainerReadAttrs
  431. };
  432. //
  433. // LDAP URL component structure. The policy URL will be cracked
  434. // to retrieve the various components using LdapCrackUrl
  435. //
  436. typedef struct _LDAP_URL_COMPONENTS
  437. {
  438. //
  439. // host name
  440. //
  441. PWSTR pszHost;
  442. //
  443. // port to connect to (if specified in URL)
  444. //
  445. ULONG Port;
  446. //
  447. // DN of the DC to bind to
  448. //
  449. PWSTR pszDN;
  450. } LDAP_URL_COMPONENTS, *PLDAP_URL_COMPONENTS;
  451. //
  452. // AD storage
  453. //
  454. // Each provider is given a single PVOID on the AZP_AZSTORE structure.
  455. // That PVOID is a pointer to whatever context the provider needs to maintain a
  456. // description of the local storage.
  457. // The structure below is that context for the xml store provider.
  458. //
  459. typedef struct _AZP_AD_CONTEXT
  460. {
  461. //
  462. // AzAuthorizationStore handle
  463. //
  464. AZPE_OBJECT_HANDLE AzStoreHandle;
  465. //
  466. // LDAP connection structure pointer to AD store
  467. //
  468. PLDAP ld;
  469. //
  470. // LDAP Control Structure for change notification
  471. //
  472. PLDAPControl pLdapControls[AZ_AD_MAX_SERVER_CONTROLS + 1];
  473. //
  474. // Number of references to this context handle
  475. //
  476. ULONG referenceCount;
  477. //
  478. // Other information that needs to be stored
  479. // For example, DN from LDAP policy URL
  480. //
  481. PWSTR pContextInfo;
  482. //
  483. // Pointer to the PolicyUrl
  484. //
  485. PWSTR PolicyUrl;
  486. //
  487. // TRUE if the current user has SE_SECURITY_PRIVILEGE on the server containing the store.
  488. //
  489. BOOLEAN HasSecurityPrivilege;
  490. BOOLEAN HasObjectVersion;
  491. ULONGLONG ullUSNChanged;
  492. } AZP_AD_CONTEXT, *PAZP_AD_CONTEXT;
  493. //
  494. // Rights for policy users
  495. #define AZ_POLICY_ADMIN_MASK DS_GENERIC_ALL
  496. #define AZ_POLICY_READER_MASK DS_GENERIC_READ
  497. #define AZ_POLICY_ACE_FLAGS CONTAINER_INHERIT_ACE
  498. //
  499. // Delegated user rights
  500. //
  501. #define AZ_DELEGATED_USER_MASK GENERIC_READ
  502. #define AZ_DELEGATED_USER_EXPLICIT_FLAG 0x0
  503. #define AZ_DELEGATED_USER_CONTAINER_FLAG CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE | NO_PROPAGATE_INHERIT_ACE
  504. #define AZ_DELEGATED_USER_CHILD_FLAG CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE
  505. #define AZ_DELEGATED_SCOPE_ADMIN_MASK DS_GENERIC_READ | ACTRL_DS_CREATE_CHILD | ACTRL_DS_DELETE_CHILD
  506. #define AZ_DELEGATED_USER_ATTR_WRITE ACTRL_DS_WRITE_PROP
  507. //
  508. // User rights for AD policy admins
  509. //
  510. AZP_POLICY_USER_RIGHTS PolicyAdminsRights = {
  511. AZ_POLICY_ADMIN_MASK,
  512. AZ_POLICY_ACE_FLAGS
  513. };
  514. PAZP_POLICY_USER_RIGHTS ADPolicyAdminsRights[] = {
  515. &PolicyAdminsRights,
  516. NULL
  517. };
  518. //
  519. // User rights for AD policy readers
  520. //
  521. AZP_POLICY_USER_RIGHTS PolicyReadersRights = {
  522. AZ_POLICY_READER_MASK,
  523. AZ_POLICY_ACE_FLAGS
  524. };
  525. PAZP_POLICY_USER_RIGHTS ADPolicyReadersRights[] = {
  526. &PolicyReadersRights,
  527. NULL
  528. };
  529. //
  530. // Rights for the SACL.
  531. // We only audit modifications to the objects.
  532. // Inherit the SACL to all children
  533. //
  534. AZP_POLICY_USER_RIGHTS AdSaclRights = {
  535. DELETE|WRITE_DAC|WRITE_OWNER|ACTRL_DS_DELETE_TREE|ACTRL_DS_WRITE_PROP|ACTRL_DS_CREATE_CHILD|ACTRL_DS_DELETE_CHILD|ACTRL_DS_SELF|ACTRL_DS_CONTROL_ACCESS,
  536. CONTAINER_INHERIT_ACE
  537. };
  538. //
  539. // User rights for delegated users on parent
  540. //
  541. AZP_POLICY_USER_RIGHTS DelegatedParentReadersExplicitRights = {
  542. AZ_DELEGATED_USER_MASK,
  543. AZ_DELEGATED_USER_EXPLICIT_FLAG
  544. };
  545. AZP_POLICY_USER_RIGHTS StoreDelegatedUsersAttributeRights = {
  546. AZ_DELEGATED_USER_ATTR_WRITE,
  547. AZ_DELEGATED_USER_EXPLICIT_FLAG
  548. };
  549. AZP_POLICY_USER_RIGHTS DelegatedParentReadersInheritRights = {
  550. AZ_DELEGATED_USER_MASK,
  551. AZ_DELEGATED_USER_CONTAINER_FLAG
  552. };
  553. PAZP_POLICY_USER_RIGHTS ADDelegatedParentReadersRights[] = {
  554. &DelegatedParentReadersInheritRights, // This entry must be first
  555. &DelegatedParentReadersExplicitRights,
  556. NULL
  557. };
  558. //
  559. // User rights for delegated users on Scope objects
  560. //
  561. AZP_POLICY_USER_RIGHTS DelegatedScopeAdminsRights = {
  562. AZ_DELEGATED_SCOPE_ADMIN_MASK,
  563. AZ_DELEGATED_USER_EXPLICIT_FLAG
  564. };
  565. AZP_POLICY_USER_RIGHTS DelegatedScopeAdminsInheritRights = {
  566. AZ_POLICY_ADMIN_MASK,
  567. AZ_DELEGATED_USER_CHILD_FLAG
  568. };
  569. PAZP_POLICY_USER_RIGHTS ADDelegatedScopeAdminsRights[] = {
  570. &DelegatedScopeAdminsRights,
  571. &DelegatedScopeAdminsInheritRights,
  572. NULL
  573. };
  574. //
  575. // User rights for delegated users on container objects
  576. //
  577. AZP_POLICY_USER_RIGHTS DelegatedContainerReadersRights = {
  578. AZ_DELEGATED_USER_MASK,
  579. AZ_DELEGATED_USER_CHILD_FLAG
  580. };
  581. PAZP_POLICY_USER_RIGHTS ADDelegatedContainerReadersRights[] = {
  582. &DelegatedContainerReadersRights,
  583. NULL
  584. };
  585. //
  586. // GUID for Container object in DS
  587. //
  588. const GUID AZ_AD_CONTAINER_GUID = { /*bf967a8b-0de6-11d0-a285-00aa003049e2*/
  589. 0xbf967a8b,
  590. 0x0de6,
  591. 0x11d0,
  592. {0xa2, 0x85, 0x00, 0xaa, 0x00, 0x30, 0x49, 0xe2}
  593. };
  594. GUID AZ_AD_OBJECT_VERSION_GUID = { //16775848-47f3-11d1-a9c3-0000f80367c1
  595. 0x16775848,
  596. 0x47f3,
  597. 0x11d1,
  598. {0xa9, 0xc3, 0x00, 0x00, 0xf8, 0x03, 0x67, 0xc1}
  599. };
  600. #define BUILD_CN_PREFIX L"CN="
  601. #define BUILD_CN_PREFIX_LENGTH ((sizeof(BUILD_CN_PREFIX)/sizeof(WCHAR))-1)
  602. #define BUILD_CN_SUFFIX L","
  603. #define BUILD_CN_SUFFIX_LENGTH ((sizeof(BUILD_CN_SUFFIX)/sizeof(WCHAR))-1)
  604. #define SID_LINK_PREFIX L"<SID="
  605. #define SID_LINK_PREFIX_LENGTH ((sizeof(SID_LINK_PREFIX)/sizeof(WCHAR))-1)
  606. #define GUID_LINK_PREFIX L"<GUID="
  607. #define GUID_LINK_PREFIX_LENGTH ((sizeof(GUID_LINK_PREFIX)/sizeof(WCHAR))-1)
  608. #define GUIDSID_LINK_SUFFIX L">"
  609. #define GUIDSID_LINK_SUFFIX_LENGTH ((sizeof(GUIDSID_LINK_SUFFIX)/sizeof(WCHAR))-1)
  610. #define OP_OBJECT_CONTAINER_NAME_PREFIX L"AzOpObjectContainer-"
  611. #define OP_OBJECT_CONTAINER_NAME_PREFIX_LENGTH ((sizeof(OP_OBJECT_CONTAINER_NAME_PREFIX)/sizeof(WCHAR))-1)
  612. #define TASK_OBJECT_CONTAINER_NAME_PREFIX L"AzTaskObjectContainer-"
  613. #define TASK_OBJECT_CONTAINER_NAME_PREFIX_LENGTH ((sizeof(TASK_OBJECT_CONTAINER_NAME_PREFIX)/sizeof(WCHAR))-1)
  614. #define ROLE_OBJECT_CONTAINER_NAME_PREFIX L"AzRoleObjectContainer-"
  615. #define ROLE_OBJECT_CONTAINER_NAME_PREFIX_LENGTH ((sizeof(ROLE_OBJECT_CONTAINER_NAME_PREFIX)/sizeof(WCHAR))-1)
  616. #define GROUP_OBJECT_CONTAINER_NAME_PREFIX L"AzGroupObjectContainer-"
  617. #define GROUP_OBJECT_CONTAINER_NAME_PREFIX_LENGTH ((sizeof(GROUP_OBJECT_CONTAINER_NAME_PREFIX)/sizeof(WCHAR))-1)
  618. typedef struct _AZ_AD_CHILD_OBJECT_CONTAINERS {
  619. //
  620. // Object container prefix
  621. //
  622. PWCHAR pObjectContainerPrefix;
  623. //
  624. // Prefix length
  625. //
  626. ULONG lPrefixLength;
  627. } AZ_AD_CHILD_OBJECT_CONTAINERS, *PAZ_AD_CHILD_OBJECT_CONTAINERS;
  628. AZ_AD_CHILD_OBJECT_CONTAINERS AdChildObjectContainers[] = {
  629. // AzAuthorizationStore
  630. { NULL },
  631. // AzApplication
  632. { NULL },
  633. // AzOperation
  634. { OP_OBJECT_CONTAINER_NAME_PREFIX, OP_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  635. // AzTask
  636. { TASK_OBJECT_CONTAINER_NAME_PREFIX, TASK_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  637. // AzScope
  638. { NULL },
  639. // AzGroup
  640. { GROUP_OBJECT_CONTAINER_NAME_PREFIX, GROUP_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  641. // AzRole
  642. { ROLE_OBJECT_CONTAINER_NAME_PREFIX, ROLE_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  643. };
  644. //
  645. // Filters to read different objects
  646. //
  647. #define AZ_AD_AZSTORE_FILTER L"(objectClass=msDS-AzAdminManager)"
  648. #define AZ_AD_APPLICATION_FILTER L"(objectClass=msDS-AzApplication)"
  649. #define AZ_AD_OBJECT_CONTAINER_FILTER L"(objectClass=container)"
  650. #define AZ_AD_OPERATION_FILTER L"(objectClass=msDS-AzOperation)"
  651. #define AZ_AD_TASK_FILTER L"(objectClass=msDS-AzTask)"
  652. #define AZ_AD_ROLE_FILTER L"(objectClass=msDS-AzRole)"
  653. #define AZ_AD_SCOPE_FILTER L"(objectClass=msDS-AzScope)"
  654. #define AZ_AD_APP_GROUP_FILTER L"(objectClass=group)"
  655. #define AZ_AD_ALL_CLASSES L"(objectClass=*)"
  656. //
  657. // List of all AzRoles object filters
  658. //
  659. const PWCHAR AzRolesObjectFilters[] = {
  660. AZ_AD_AZSTORE_FILTER, // OBJECT_TYPE_AZAUTHSTORE
  661. AZ_AD_APPLICATION_FILTER, // OBJECT_TYPE_APPLICATION
  662. AZ_AD_OPERATION_FILTER, // OBJECT_TYPE_OPERATION
  663. AZ_AD_TASK_FILTER, // OBJECT_TYPE_TASK
  664. AZ_AD_SCOPE_FILTER, // OBJECT_TYPE_SCOPE
  665. AZ_AD_APP_GROUP_FILTER, // OBJECT_TYPE_GROUP
  666. AZ_AD_ROLE_FILTER, // OBJECT_TYPE_ROLE
  667. };
  668. //
  669. // Filters for AzApplication and AzScope children
  670. //
  671. typedef struct _AZ_AD_CHILD_FILTERS {
  672. //
  673. // Object Type
  674. //
  675. ULONG lObjectType;
  676. //
  677. // Filter type
  678. //
  679. PWSTR Filter;
  680. //
  681. // Container Prefix
  682. //
  683. PWSTR pContainerPrefix;
  684. //
  685. // Container Prefix length
  686. //
  687. ULONG lPrefixLength;
  688. } AZ_AD_CHILD_FILTERS, *PAZ_AD_CHILD_FILTERS;
  689. #define AZ_AD_MAX_CHILD_FILTERS 6
  690. AZ_AD_CHILD_FILTERS ApplicationChildFilters[] = {
  691. //
  692. // Application Child Filters
  693. //
  694. { OBJECT_TYPE_SCOPE, AZ_AD_SCOPE_FILTER, NULL, 0 },
  695. { OBJECT_TYPE_GROUP, AZ_AD_APP_GROUP_FILTER, GROUP_OBJECT_CONTAINER_NAME_PREFIX, GROUP_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  696. { OBJECT_TYPE_ROLE, AZ_AD_ROLE_FILTER, ROLE_OBJECT_CONTAINER_NAME_PREFIX, ROLE_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  697. { OBJECT_TYPE_TASK, AZ_AD_TASK_FILTER, TASK_OBJECT_CONTAINER_NAME_PREFIX, TASK_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  698. { OBJECT_TYPE_OPERATION, AZ_AD_OPERATION_FILTER, OP_OBJECT_CONTAINER_NAME_PREFIX, OP_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  699. NULL
  700. };
  701. AZ_AD_CHILD_FILTERS ScopeChildFilters[] = {
  702. //
  703. // Scope Child container filters
  704. //
  705. { OBJECT_TYPE_GROUP, AZ_AD_APP_GROUP_FILTER, GROUP_OBJECT_CONTAINER_NAME_PREFIX, GROUP_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  706. { OBJECT_TYPE_ROLE, AZ_AD_ROLE_FILTER, ROLE_OBJECT_CONTAINER_NAME_PREFIX, ROLE_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  707. { OBJECT_TYPE_TASK, AZ_AD_TASK_FILTER, TASK_OBJECT_CONTAINER_NAME_PREFIX, TASK_OBJECT_CONTAINER_NAME_PREFIX_LENGTH },
  708. NULL,
  709. NULL,
  710. NULL
  711. };
  712. //
  713. // Routine used by AzpADPersistOpen
  714. //
  715. //
  716. // This routine is called if there is a new policy not being created and
  717. // there does not exist a policy in cache already. This routine will read
  718. // the policy from the AD store into the cache.
  719. //
  720. DWORD
  721. AzpReadADStore(
  722. IN PAZP_AD_CONTEXT pContext,
  723. IN AZPE_OBJECT_HANDLE pAzStore,
  724. IN ULONG lPersistFlags
  725. );
  726. //
  727. // This routine reads in the specific children of Authorization Store that a user
  728. // may have access to.
  729. //
  730. DWORD
  731. AzpADReadAzStoreChildren(
  732. IN PAZP_AD_CONTEXT pContext,
  733. IN AZPE_OBJECT_HANDLE pParentObject,
  734. IN ULONG lPersistFlags
  735. );
  736. //
  737. // This routine reads conatiner objects for the AzRoles objects that they store
  738. //
  739. DWORD
  740. AzpReadADObjectContainer(
  741. IN PAZP_AD_CONTEXT pContext,
  742. IN PWCHAR pParentDN,
  743. IN PWCHAR pContainerPrefix,
  744. IN ULONG lPrefixLength,
  745. IN PWCHAR pChildFilter,
  746. IN ULONG lObjectType,
  747. IN AZPE_OBJECT_HANDLE pParentObject,
  748. IN ULONG lPersistFlags
  749. );
  750. //
  751. // This routine reads paged results returned from a ldap search
  752. //
  753. DWORD
  754. AzpADReadPagedResult(
  755. IN PAZP_AD_CONTEXT pADContext,
  756. IN LDAPSearch *pSearchHandle,
  757. IN AZPE_OBJECT_HANDLE ParentObjectHandle,
  758. IN ULONG ChildObjectType,
  759. IN ULONG lPersistFlags
  760. );
  761. //
  762. // This routine creates a new object of type object type (if not
  763. // AzAuthorizationStore) and populates it with common data information such as
  764. // description, GUID (for non authorization store objects).
  765. //
  766. DWORD
  767. AzpReadADStoreForCommonData(
  768. IN PAZP_AD_CONTEXT pContext,
  769. IN LDAP* pLdapHandle,
  770. IN LDAPMessage* pEntry,
  771. IN ULONG ObjectType,
  772. IN AZPE_OBJECT_HANDLE pParentObject,
  773. OUT AZPE_OBJECT_HANDLE *ppObject,
  774. IN ULONG lPersistFlags
  775. );
  776. //
  777. // This routine gets the name of the object from AD so that the object
  778. // may be created in cache
  779. //
  780. DWORD
  781. AzpInitializeObjectName(
  782. IN LDAP* pLdapH,
  783. OUT LPWSTR *pObjectName,
  784. IN LDAPMessage* pEntry,
  785. IN ULONG ObjectType
  786. );
  787. //
  788. // This routine reads creates an object in cache (if needed) and then
  789. // reads in the values of the attributes for Az object
  790. // from the AD store into the local cache.
  791. //
  792. DWORD
  793. AzpReadADStoreObject(
  794. IN PAZP_AD_CONTEXT pContext,
  795. IN LDAP* pLdapHandle,
  796. IN LDAPMessage* pEntry,
  797. IN OUT AZPE_OBJECT_HANDLE *ppObject,
  798. IN ULONG ObjectType,
  799. IN AZPE_OBJECT_HANDLE pParentObject,
  800. IN AZ_AD_ATTRS Attrs[],
  801. IN ULONG lPersistFlags
  802. );
  803. //
  804. // This routine reads the values from a passed LDAPMessage structure, and
  805. // calls persistence layer API to update the cache.
  806. //
  807. DWORD
  808. AzpReadAttributeAndSetProperty(
  809. IN PAZP_AD_CONTEXT pContext,
  810. IN LDAPMessage *pAttrEntry,
  811. IN LDAP* pLdapH,
  812. IN AZPE_OBJECT_HANDLE pObject,
  813. IN ULONG AttrType,
  814. IN LPWSTR pAttr,
  815. IN ULONG DataType,
  816. IN ULONG lPersistFlags
  817. );
  818. //
  819. // This routine reads the linked attributes of objects and stores the
  820. // SID or GUID value in the linked attribute of the cache object linking
  821. // to them.
  822. //
  823. DWORD
  824. AzpReadLinkedAttribute(
  825. IN PAZP_AD_CONTEXT pContext,
  826. IN LDAP* pLdapH,
  827. IN LDAPMessage *pAttrEntry,
  828. IN AZPE_OBJECT_HANDLE pObject,
  829. IN ULONG AttrType,
  830. IN LPWSTR pAttr,
  831. IN ULONG lPersistFlags
  832. );
  833. //
  834. // This routine parses a linked attribute value to return the GUID string,
  835. // or SID string (if present).
  836. //
  837. DWORD
  838. AzpADParseLinkedAttributeValue(
  839. IN PWCHAR pValue,
  840. OUT PSID *ppSid,
  841. OUT GUID *pGuid,
  842. IN OUT PULONG pAttrType,
  843. IN PAZP_AD_CONTEXT pContext
  844. );
  845. //
  846. // This routine parses the pwstrValue and extract the GUID and SID (if present)
  847. // If succeeded, the passed back *ppwstrDN points to the DN portion of the value.
  848. //
  849. DWORD
  850. AzpADGetGuidAndSID (
  851. IN LPCWSTR pwstrValue,
  852. OUT GUID * pGuid,
  853. OUT PSID * ppSid OPTIONAL,
  854. OUT LPWSTR * ppwstrDN
  855. );
  856. //
  857. // This routine applies the store ACLs into the policy admins and readers
  858. // list for the passed in object.
  859. //
  860. DWORD
  861. AzpApplyPolicyAcls(
  862. IN PAZP_AD_CONTEXT pContext,
  863. IN OUT AZPE_OBJECT_HANDLE pObject,
  864. IN PWCHAR pDN,
  865. IN ULONG lPersistFlags,
  866. IN BOOL OnlyAddPolicyAdmins
  867. );
  868. //
  869. // Routines used by AzpADPersistSubmit
  870. //
  871. //
  872. // This routine updates the DS for a object according
  873. // to the dirty bits of the object.
  874. //
  875. DWORD
  876. AzpUpdateADObject(
  877. IN PAZP_AD_CONTEXT pContext,
  878. IN LDAP* pLdapHandle,
  879. IN AZPE_OBJECT_HANDLE pObject,
  880. IN PWCHAR pDN,
  881. IN PWCHAR pObjectClass,
  882. IN AZ_AD_ATTRS ObjectAttrs[],
  883. IN ULONG lPersistFlags
  884. );
  885. //
  886. // This routine adds a child object container to parent objects
  887. // in the DS store
  888. //
  889. DWORD
  890. AzpCreateADObject(
  891. IN LDAP *pLdapHandle,
  892. IN PWCHAR pDN
  893. );
  894. //
  895. // This routine get the attributes needed to create an object
  896. //
  897. DWORD
  898. AzpGetAttrsForCreateObject(
  899. IN PWCHAR pObjectClass,
  900. IN LDAPMod **ppAttributeList
  901. );
  902. //
  903. // This routine gets the common attributes of all objects
  904. //
  905. DWORD
  906. AzpGetADCommonAttrs(
  907. IN LDAP* pLdapHandle,
  908. IN AZPE_OBJECT_HANDLE pObject,
  909. IN AZ_AD_ATTRS ObjectAttrs[],
  910. IN ULONG lPersistFlags,
  911. OUT LDAPMod** ppAttributeList,
  912. IN OUT PULONG plIndex,
  913. IN BOOL bCreateFlag
  914. );
  915. //
  916. // This routine reads in specific attributes of objects to
  917. // an attribute list array element.
  918. //
  919. DWORD
  920. AzpGetSpecificProperty(
  921. IN AZPE_OBJECT_HANDLE pObject,
  922. OUT PLDAPMod *ppAttribute,
  923. IN PULONG lIndex,
  924. IN AZ_AD_ATTRS ObjectAttr,
  925. IN ULONG lPersistFlags,
  926. IN BOOL bCreateFlag
  927. );
  928. //
  929. // This routine handles the linked attribute of an object being
  930. // submitted to the AD policy store.
  931. //
  932. DWORD
  933. AzpHandleSubmitLinkedAttribute(
  934. IN AZPE_OBJECT_HANDLE pObject,
  935. IN OUT PLDAPMod *ppAttribute,
  936. IN AZ_AD_ATTRS ObjectAttr,
  937. IN OUT PULONG plIndex
  938. );
  939. //
  940. // This routine adds an input string to a multi-valued linked attribute value
  941. //
  942. DWORD
  943. AzpADAllocateHeapLinkAttribute(
  944. IN PWCHAR pString,
  945. IN OUT PWCHAR **ppModVals,
  946. IN BOOLEAN bIsSid
  947. );
  948. //
  949. // This routine submits any ACL changes to the persist
  950. // object passed
  951. //
  952. DWORD
  953. AzpUpdateObjectAcls(
  954. IN PAZP_AD_CONTEXT pContext,
  955. IN AZPE_OBJECT_HANDLE pObject,
  956. IN PWCHAR pDN,
  957. IN ULONG lPersistFlags,
  958. IN BOOL bIsOnObjectSelf,
  959. IN PAZP_POLICY_USER_RIGHTS *ppPolicyAdminRights OPTIONAL,
  960. IN PAZP_POLICY_USER_RIGHTS *ppPolicyReaderRights OPTIONAL,
  961. IN PAZP_POLICY_USER_RIGHTS *ppDelegatedPolicyUsersRights OPTIONAL
  962. );
  963. DWORD
  964. AzpADSetSacl(
  965. IN PAZP_AD_CONTEXT pContext,
  966. IN OUT AZPE_OBJECT_HANDLE pObject,
  967. IN PWCHAR pDN
  968. );
  969. //
  970. // Utility routines used by AD policy store APIs
  971. //
  972. //
  973. // This routine builds the DN for an object.
  974. //
  975. DWORD
  976. AzpADBuildDN(
  977. IN PAZP_AD_CONTEXT pContext,
  978. IN OUT AZPE_OBJECT_HANDLE pObject,
  979. IN OUT PWCHAR *ppDN,
  980. IN PWCHAR pParentDN,
  981. IN BOOL bBuiltinObject,
  982. IN PAZ_AD_CHILD_OBJECT_CONTAINERS ChildObjectContainer
  983. );
  984. //
  985. // This routine is a worker routine for AzpADBuildDN.
  986. //
  987. DWORD
  988. AzpADBuildChildObjectDN(
  989. IN AZPE_OBJECT_HANDLE pObject,
  990. OUT PWCHAR *ppDN,
  991. IN PWCHAR pParentDN,
  992. IN PWCHAR pPolicyDN
  993. );
  994. //
  995. // This routine generates a CN for the passed in object.
  996. //
  997. DWORD
  998. AzpGetCNForDN(
  999. IN AZPE_OBJECT_HANDLE pObject,
  1000. OUT PWCHAR *ppCN
  1001. );
  1002. //
  1003. // This routine creates the GUIDized CN.
  1004. //
  1005. DWORD
  1006. AzpCreateGuidCN(
  1007. OUT PWCHAR *ppCN,
  1008. IN PWCHAR pGuidString OPTIONAL
  1009. );
  1010. //
  1011. // This routine creates a RDN for AZ_AD_OBJECT_CONTAINER
  1012. //
  1013. DWORD
  1014. AzpADObjectContainerRDN(
  1015. IN AZPE_OBJECT_HANDLE pParentAppObject,
  1016. OUT PWCHAR *ppCN,
  1017. IN LPCWSTR pParentDN OPTIONAL,
  1018. IN LPCWSTR pPolicyDN,
  1019. IN BOOL bObjectContainerCreate,
  1020. IN PAZ_AD_CHILD_OBJECT_CONTAINERS ChildObjectContainer
  1021. );
  1022. //
  1023. // This routine builds a DN for the container object in DS
  1024. // that contains (will contain) the AzAuthorizationStore object
  1025. //
  1026. DWORD
  1027. AzpADBuildDNForAzStoreParent(
  1028. IN PAZP_AD_CONTEXT pContext,
  1029. OUT PWCHAR *ppDN
  1030. );
  1031. //
  1032. // This routine gets the AzAuthorizationStore object's parent
  1033. // It also acts as a worked routine for AzpADBuildDNForAzStoreParent
  1034. //
  1035. LPCWSTR
  1036. AzpGetAuthorizationStoreParent(
  1037. IN LPCWSTR PolicyDN
  1038. );
  1039. //
  1040. // Crack an LDAP URL into its relevant parts.
  1041. //
  1042. BOOL
  1043. AzpLdapCrackUrl(
  1044. IN OUT PWCHAR *ppszUrl,
  1045. OUT PLDAP_URL_COMPONENTS pLdapUrlComponents
  1046. );
  1047. //
  1048. // This procedure parses the cracked host string from LdapCrackUrl
  1049. //
  1050. BOOL
  1051. AzpLdapParseCrackedHost(
  1052. IN PWCHAR pszHost,
  1053. OUT PLDAP_URL_COMPONENTS pLdapUrlComponents
  1054. );
  1055. //
  1056. // This procedure parses the cracked DNstring from LdapCrackUrl
  1057. //
  1058. BOOL
  1059. AzpLdapParseCrackedDN(
  1060. IN PWCHAR pszDN,
  1061. OUT PLDAP_URL_COMPONENTS pLdapUrlComponents
  1062. );
  1063. //
  1064. // Frees allocated URL components returned from LdapCrackUrl
  1065. //
  1066. VOID
  1067. AzpLdapFreeUrlComponents(
  1068. IN OUT PLDAP_URL_COMPONENTS pLdapUrlComponents
  1069. );
  1070. //
  1071. // This routine compares two strings for the qsort/bsearch API
  1072. //
  1073. INT __cdecl
  1074. AzpCompareSortStrings(
  1075. IN const void *pArg1,
  1076. IN const void *pArg2
  1077. );
  1078. //
  1079. // This routine check if the AzAuthStore's version is compatible enough
  1080. // to let us continue reading or not.
  1081. //
  1082. DWORD
  1083. AzpCheckVersions(
  1084. LDAP * pLdapH,
  1085. LDAPMessage * pResult
  1086. );
  1087. //
  1088. // This routine runs a preliminary base scope search on the passed
  1089. // DN to check if the policy exists for the given URL.
  1090. //
  1091. DWORD
  1092. AzpCheckPolicyExistence(
  1093. LDAP* pLdapH,
  1094. PWCHAR pDN,
  1095. BOOL bCreatePolicy
  1096. );
  1097. //
  1098. // This routine ensures that the DC is compatible with the Azroles
  1099. // version
  1100. //
  1101. DWORD
  1102. AzpADCheckCompatibility(
  1103. LDAP* pLdapH
  1104. );
  1105. //
  1106. // This routine searches for the domainDNS object/schema object
  1107. // to make sure that the domain is in native mode/schema is
  1108. // compatible - Worker routine for AzpADCheckCompatibility
  1109. //
  1110. DWORD
  1111. AzpADCheckCompatibilityEx(
  1112. LDAP* pLdapH,
  1113. PWCHAR pDN,
  1114. ULONG index
  1115. );
  1116. //
  1117. // This routine is a worker routine that reads the NT security
  1118. // descriptor for a given object
  1119. //
  1120. DWORD
  1121. AzpADReadNTSecurityDescriptor(
  1122. IN PAZP_AD_CONTEXT pContext,
  1123. IN AZPE_OBJECT_HANDLE pObject,
  1124. IN PWCHAR pOptDN OPTIONAL,
  1125. IN BOOL bAzStoreParent,
  1126. OUT PSECURITY_DESCRIPTOR *pSD,
  1127. IN BOOL bReadDacl,
  1128. IN BOOL bReadSacl
  1129. );
  1130. //
  1131. // This routine stamps an updated security descriptor onto the passed
  1132. // object in DS.
  1133. //
  1134. DWORD
  1135. AzpADStampSD(
  1136. IN PAZP_AD_CONTEXT pContext,
  1137. IN PWCHAR pDN,
  1138. IN SECURITY_INFORMATION SeInfo,
  1139. IN PSECURITY_DESCRIPTOR pSD
  1140. );
  1141. //
  1142. // This routine determines if a particular attribute is dirty.
  1143. //
  1144. BOOL
  1145. AzpIsAttrDirty(
  1146. IN AZPE_OBJECT_HANDLE pObject,
  1147. IN AZ_AD_ATTRS ObjectAttr
  1148. );
  1149. //
  1150. // This routine allocates memory to a attribute list structure
  1151. //
  1152. DWORD
  1153. AzpADAllocateAttrHeap(
  1154. IN DWORD dwCount,
  1155. OUT PLDAPMod **ppAttrList
  1156. );
  1157. //
  1158. // This routine allocated memory to the mod_val structure of an
  1159. // attribute list
  1160. //
  1161. DWORD
  1162. AzpADAllocateAttrHeapModVals(
  1163. IN OUT LDAPMod **pAttribute,
  1164. IN ULONG lCount
  1165. );
  1166. //
  1167. // This routine frees the heap allocated to the LDAPMod structures
  1168. //
  1169. VOID
  1170. AzpADFreeAttrHeap(
  1171. OUT PLDAPMod **ppAttribute,
  1172. IN BOOL bDeleteAttrList
  1173. );
  1174. DWORD
  1175. AzpADStoreHasUpdate (
  1176. IN BOOL bUpdateContext,
  1177. IN OUT PAZP_AD_CONTEXT pContext,
  1178. OUT BOOL * pbNeedUpdate
  1179. );
  1180. ULONGLONG
  1181. AzpADReadUSNChanged (
  1182. IN LDAP * pLdapHandle,
  1183. IN LDAPMessage * pEntry,
  1184. OUT BOOLEAN * pbHasObjVersion
  1185. );
  1186. BOOL
  1187. AzpADNeedUpdateStoreUSN (
  1188. IN PAZP_AD_CONTEXT pContext,
  1189. IN AZPE_OBJECT_HANDLE hObject,
  1190. OUT BOOL *pbReadBackUSN
  1191. );
  1192. DWORD
  1193. AzpADUpdateStoreObjectForUSN (
  1194. IN BOOL bReadBackUSN,
  1195. IN AZPE_OBJECT_HANDLE hObject,
  1196. IN OUT PAZP_AD_CONTEXT pContext
  1197. );
  1198. #ifdef __cplusplus
  1199. }
  1200. #endif
  1201. #endif //__ADSTORE_HXX_