在我的环境中,我有几个项目涉及在多个文件服务器上运行 NTFS ACL 审计报告和各种 ACL 清理活动。我无法在服务器上本地执行这些活动的主要原因有两个:
1)我没有对服务器的本地访问权限,因为它们实际上是由另一家公司拥有和管理的。
2) 它们是运行经过修改的 Linux 操作系统(称为 GuardianOS)的SNAP NAS 服务器,因此即使我可以获得本地访问权限,我也不确定是否可以使用工具来执行我需要的操作。
解决了这个问题,我最终推出了自己的 ACL 审计报告工具,该工具将从指定的顶级路径开始向下递归文件系统,并针对在 ACL 上遇到的所有组/用户生成 HTML 报告以及显示权限的变化,因为它下降了树。在开发这个工具时,我发现网络开销是执行这些操作的最糟糕的部分,通过多线程处理,我可以实现更高的性能。
但是,我仍然坚持寻找一个好的工具来执行 ACL 修改和清理。您的标准开箱即用工具(cacls、xcacls、Explorer)似乎是单线程的,并且在通过网络时会遭受显着的性能损失。我看过滚动我自己的多线程 ACL 设置程序,但我熟悉的唯一 API 是 .NET FileSystemAccessRule 的东西,问题是如果我在文件夹中设置权限,它会自动想要“流动”权限下降。这会导致一个问题,因为我想自己使用多线程来“流动”。
我知道NTFS“允许”继承权限不一致,因为我已经看到它在具有不同继承权限的两个父文件夹之间的同一卷上移动文件夹/文件,并将旧权限保持为“继承”。
问题
1) 有没有办法设置适用于当前文件夹和所有子文件夹的 ACL(您的标准“适用于文件、文件夹和子文件夹”ACL)但不会自动向下流向子对象?基本上,我希望能够告诉 Windows“是的,这个 ACL 应该应用于子对象,但现在,直接在这个对象上设置它”。
为了清楚起见,我知道适用于“仅此文件夹”的 ACL 选项,但随后我失去了继承,这是一项要求,因此该选项对我的用例无效。
2) 任何人都知道以多线程方式执行 ACL 修改的任何好的算法或方法吗?我的直觉是文件系统的任何递归遍历在理论上都应该有效,特别是如果您只是在顶级文件夹上定义一个新的 ACL 并且只想“清理”所有子文件夹。您将在顶层标记新的 ACL,然后递归向下删除任何显式 ACE,然后将继承的权限“向下流动”。
(仅供参考,这个问题与 ServerFault部分重复,因为它实际上既是系统管理员问题又是编程问题。在另一个问题上,我问是否有人知道任何可以通过网络进行快速 ACL 设置的工具。)