创建或修改 ACL

Windows支持一组函数,这些函数 (ACL) 创建访问控制列表,或修改现有 ACL 中 (ACL) 的访问控制条目

SetEntriesInAcl 函数创建新的 ACL。 SetEntriesInAcl 可以为 ACL 指定全新的 ACE 集,也可以将一个或多个新 ACE 与现有 ACL 的 ACL 合并。 SetEntriesInAcl 函数使用EXPLICIT_ACCESS结构的数组来指定新 ACE 的信息。 每个 EXPLICIT_ACCESS 结构都包含描述单个 ACE 的信息。 此信息包括访问权限、ACE 的类型、控制 ACE 继承的标志以及标识受 托人的受托人 结构。

将新的 ACE 添加到现有 ACL

  1. 使用 GetSecurityInfo 或 GetNamedSecurityInfo 函数从对象的安全描述符获取现有的 DACL 或 SACL。
  2. 对于每个新的 ACE,调用 BuildExplicitAccessWithName 函数,以使用描述 ACE 的信息填充 EXPLICIT_ACCESS 结构。
  3. 调用 SetEntriesInAcl,指定新 ACL 的现有 ACL 和 EXPLICIT_ACCESS 结构数组。 SetEntriesInAcl 函数分配并初始化 ACL 及其 ACE。
  4. 调用 SetSecurityInfoSetNamedSecurityInfo 函数,将新的 ACL 附加到对象的安全描述符。

如果调用方指定现有的 ACL, SetEntriesInAcl 会将新的 ACE 信息与 ACL 中的现有 ACE 合并。 例如,假设现有 ACL 授予对指定受托人的访问权限, EXPLICIT_ACCESS 结构拒绝对同一受托人的访问权限。 在这种情况下, SetEntriesInAcl 为受托人添加了一个新的拒绝访问的 ACE,并删除或修改受托人现有的允许访问的 ACE。

有关将新 ACE 合并到现有 ACL 的示例代码,请参阅 修改 C++ 中对象的 ACL