1

在我的环境中,我有几个项目涉及在多个文件服务器上运行 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 设置的工具。)

4

1 回答 1

0

在MS 知识库文章中找到了答案:

使用 Active Directory 服务接口 (ADSI) 和 ADSI 资源工具包实用程序 ADsSecurity.DLL 对文件和文件夹设置的文件权限不会自动沿子树向下传播到现有文件夹和文件。

不能使用 ADSI 将 ACE 设置为向下传播到现有文件和文件夹的原因是因为 ADSSecurity.dll 使用低级别的 SetFileSecurity 函数来设置文件夹的安全描述符。没有可以通过使用 SetFileSecurity 自动将 ACE 向下传播到现有文件和文件夹来设置的标志。SE_DACL_AUTO_INHERIT_REQ 控制标志只会在与文件夹关联的安全描述符中设置 SE_DACL_AUTO_INHERITED 标志。

所以我必须使用低级别的 SetFileSecurity Win32 API 函数(在其MSDN 条目中被标记为过时)来设置 ACL 并且应该防止它自动向下流动。

当然,我宁愿用勺子挖出我的眼球,也不愿尝试 P/Invoke 一些带有所有缺陷的遗留 Win32 API,所以我可能最终只使用一个名为FILEACL的旧 NT4 工具,它类似于 CACLS,但有一个使用 SetFileSecurity API 的选项,因此更改不会自动向下传播。

于 2009-06-11T14:23:56.047 回答