在我的环境中,我有几个项目涉及在多个文件服务器上运行 NTFS ACL 审核报告和各种 ACL 清理活动。我无法在服务器上本地执行这些活动有两个主要原因:

1)我没有对服务器的本地访问权限,因为它们实际上由另一家公司拥有和管理。

2)他们是 SNAP NAS 服务器 它运行修改后的 Linux 操作系统(称为 GuardianOS),因此即使我可以获得本地访问权限,我也不确定是否有工具可以执行我需要的操作。

解决这个问题后,我最终推出了自己的 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 设置的工具。)

有帮助吗?

解决方案

在a中找到了答案 微软知识库文章:

使用Active Directory Services接口(ADSI)和ADSI Resource套件实用程序,adsSecurity.dll在文件和文件夹上设置的文件权限,请勿自动将子树传播到现有文件夹和文件。

您无法使用ADSI设置ACE来传播到现有文件和文件夹的原因是因为AdsSecurity.dll使用低级SetFileSecurity函数来将安全描述符设置在文件夹上。没有可以通过使用setFileSecurity来自动将ACE传播到现有文件和文件夹来设置的标志。SE_DACL_AUTO_INHERIT_REQ CONTROL FLAG仅在与文件夹关联的安全描述符中设置SE_DACL_AUTO_INHERITED标志。

所以我必须使用低级 SetFileSecurity Win32 API 函数(该函数在其 MSDN条目)来设置 ACL,这应该可以防止它自动向下流动。

当然,我宁愿用勺子把我的眼球挖出来,也不愿尝试 P/Invoke 一些遗留的 Win32 API 及其所有缺点,所以我最终可能只使用一个名为的旧 NT4 工具 文件访问控制列表 它类似于 CACLS,但可以选择使用 SetFileSecurity API,因此更改不会自动向下传播。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top