使用此信息。
6. 计算精确要通过只从 GetAclInformation 函数获得信息分配对新 DACL 的字节数。 AclBytesInUse 属于 ACL_SIZE_INFORMATION 结构表示的正在使用该文件的 DACL 中字节数。 将此号码添加到一个 ACCESS_ALLOWED_ACE 的大小和用户的 SID 的大小。 然后减去 DWORD 以获得精确的字节数有关 DACL 的大小。
7. 为新 ACL 最终包含该文件的现有 ACE 加访问允许 ACE 分配内存。
8. 初始化 ACL 结构。
9. 检查由 GetSecurityDescriptorDacl 函数以确定是否位于文件 SD. DACL 返回标志 如果没有 DACL, 然后跳代码复制到新 DACL 文件的 ACE。 是否存在, DACL 将所有 ACE 从旧 DACL 复制到新 DACL。 该示例代码假定旧 DACL 已经处于 Windows 2000 首选顺序。 要符合新 Windows 2000 喜欢以便新 DACL, 首先代码将所有非继承 ACE 从旧 DACL 复制到新 DACL, 无关的 ACE 类型。 AceCount 属于 ACL_SIZE_INFORMATION 结构包含的 DACL 中 ACE 数目。 一旦为每个 ACE 循环。
10. 检索到该文件的现有 DACL 中 ACE 指针。
11. 检查是否非继承 ACE 获得 ACE。 ACE 副本仅非继承此首先 for 循环函数中。 ACE 是否继承 ACE, 从这个中断 for 循环, 函数以便允许非继承 ACE 可在正确位置, 添加新访问 ACE 非继承立即毕竟现有。
12. 如果与指定, 帐户 SID 匹配跳因为我们正在添加访问允许 ACE 与不同访问掩码添加 ACE。
13. ACE 复制到新 ACL。 为 AddAce 函数以确保 ACE 添加到末尾 DACL dwStartingAceIndex 参数传递 MAXDWORD。 ACE_HEADER AceSize 成员提供的 ACE 大小
14. 新 ACL, 复制所有文件的原始非继承 ACE 后添加访问允许 ACE, 根据 dwAccessMask 的值。 此处添加新 ACE 会在正确首选顺序, 立即毕竟现有非继承 ACE 中。
15. 如果旧 DACL 已存在, 从旧 DACL 复制到新 DACL, 从 CurrentAceIndex 其余的继承 ACE。 循环后对每继承 ACE。
16. 检索到该文件的现有 DACL 中 ACE 指针。
17. ACE 复制到新 ACL。 为 AddAce 函数以确保 ACE 添加到末尾 DACL dwStartingAceIndex 参数传递 MAXDWORD。 ACE_HEADER AceSize 成员提供的 ACE 大小
18. 通过使用 SetSecurityDescriptorDacl 函数新 DACL 设置到新 SD。
19. 旧安全描述符控制标志关于 DACL 自动继承复制到新的安全描述符。 这样通过前者可只在 Windows 2000 和上面 SetSecurityDescriptorControl 函数。 示例代码只有 API 是位于 advapi 32 .dll 在运行时, 调用 API。
20. 通过调用 SetFileSecurity 函数设置新 SD。 要应用于文件 SD. 新 SD 中 DACL_SECURITY_INFORMATION 标志使 DACL 只有该文件的 DACL 设置。 其他安全信息文件 SD 保持不变。
21. 释放示例代码中分配内存。
访问 Denied ACE
请注意可将使用类似过程要访问拒绝 ACE 添加到一个文件的 DACL。 访问拒绝 ACE 用于拒绝特定用户或组访问到一个文件。 拒绝访问的 ACE 之前访问允许 ACE ACL 中出现。 因此, adapting 示例代码以添加访问拒绝 ACE, 时对 AddAccessDeniedAce 函数调用应之前代码复制到新 ACL 现有 ACE。
保护其他对象
访问通过替换 GetFileSecurity 函数调用使用 GetKernelObjectSecurity 、 GetUserObjectSecurity 或 GetPrivateObjectSecurity 函数调用可授予对象以外文件。