创建或修改 ACL

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

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

将新的 ACE 添加到现有 ACL

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

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

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