在对象的 ACL 中读取控制访问权限集

使用 ADSI 读取控制访问权 ACE,就像读取 ACL 中的其他 ACE 一样。 请注意,也可以使用 Win32 安全 API 来读取 Directory 对象上的 ACL。 但是,控制访问权限以特定于授予和拒绝控制访问权限的方式使用 IADsAccessControlEntry 接口的属性:

  • AccessMask 必须包含 ADS_RIGHT_DS_CONTROL_ACCESS
  • Flags 值为 ADS_FLAG_OBJECT_TYPE_PRESENT
  • ObjectType 是控制访问权限的 rightsGUID 属性的字符串形式。 GUID 的字符串格式与 StringFromGUID2 COM 库函数的字符串格式相同。
  • AceType 要么是表示授予受托管理人控制访问权的 ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,要么是表示拒绝受托管理人控制访问权的 ADS_ACETYPE_ACCESS_DENIED_OBJECT
  • 受托人 是安全主体,即 ACE 适用的用户、组、计算机等。

按照以下过程读取 ADSI 对象的 ACE。 以下过程适用于 C 和 C++ 应用程序。

读取 ADSI 对象的 ACE

  1. 获取指向该对象的 IADs 接口指针。
  2. 使用 IADs::Get 方法获取对象的安全描述符。 包含此安全描述符的属性名称为“nTSecurityDescriptor”。 属性将以 VARIANT 的形式返回,其中包含一个 IDispatch 指针。 请注意,vt 成员是 VT_DISPATCH。 在该 IDispatch 指针上调用 QueryInterface 以获得 IADsSecurityDescriptor 接口,从而使用该接口上的方法来访问安全描述符的 ACL。
  3. 使用 IADsSecurityDescriptor::get_DiscretionaryAcl 方法来获取 ACL。 该方法会返回一个 IDispatch 指针。 在 IDispatch 指针上调用 QueryInterface 以获得 IADsAccessControlList 接口,从而使用该接口上的方法来访问 ACL 中的单个 ACE。
  4. 使用 IADsAccessControlList::get__NewEnum 方法来枚举 ACE。 该方法返回一个 IUnknown 指针。 在该 IUnknown 指针上调用 QueryInterface 以获取 IEnumVARIANT 接口。
  5. 使用 IEnumVARIANT::Next 方法来枚举 ACL 中的 ACE。 属性会以 VARIANT 的形式返回,其中包含一个 IDispatch 指针。 请注意,vt 成员是 VT_DISPATCH。 在该 IDispatch 指针上调用 QueryInterface 来获取 IADsAccessControlEntry 接口,以读取 ACE。
  6. 调用 IADsAccessControlEntry::get_AccessMask 方法获取 AccessMask 并验证 AccessMaskADS_RIGHT_DS_CONTROL_ACCESS 标志值。 如果有此标记,则 ACE 包含控制访问权限。
  7. 调用 IADsAccessControlEntry::get_Flags 方法来获取对象类型的标志。
  8. 检查 ADS_FLAG_OBJECT_TYPE_PRESENT 标志的 Flags 值。 如果 Flags 设置为 ADS_FLAG_OBJECT_TYPE_PRESENT,则调用 IADsAccessControlEntry::get_ObjectType 方法来获取一个字符串,其中包含 ACE 适用的控制访问权限的 rightsGUID。
  9. 调用 IADsAccessControlEntry::get_AceType 方法以获取 ACE 类型。 该类型将是表示授予受托人控制访问权限的 ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,或者表示拒绝控制访问权限的 ADS_ACETYPE_ACCESS_DENIED_OBJECT
  10. 调用 IADsAccessControlEntry::get_Trustee 方法获取安全主体;即 ACE 适用的用户、组、计算机等。
  11. 用完 ObjectTypeTrustee 字符串后,使用 SysFreeString 来释放这些字符串的内存。
  12. 用完接口后,调用 Release 来递减或释放所有接口引用。