列出文件夹 ACL 及其当前继承

列出文件夹 ACL 及其当前继承

我正在尝试构建一系列批处理文件,通过右键单击上下文菜单来控制文件和文件夹的权限。我知道有现成的解决方案,但我正在尝试自己编写代码。

理想情况下,我希望使用以下单独的命令:

  • 获取目录的所有权(递归)
  • 取得文件所有权
  • 将所有者设置为当前用户
  • 将所有者设置为管理员
  • 将所有者设置为 TrustedInstaller

现在我专注于“取得所有权”功能。我的问题是我不知道“正确”地取得目录及其所有文件和子目录的所有权的方法。

互联网上散布着各种“有效”的实现,但最终的权限看起来确实被大量重复的条目污染了。

流传的“取得所有权”命令基本上都是这样的:

cmd.exe /c takeown /f "%~1" /r /d Y && icacls "%~1" /grant *S-1-3-4:F /t /c /l /q

但是,当我在 Program Files 中的目录上运行该命令时,我得到的结果如下:

重复的权限条目

我不知道您怎么想,但我认为访问列表看起来非常丑陋/污染严重。每个条目都有重复项。

因此我开始摆弄/inheritance:d标志,以禁用继承并复制 ACE:

cmd.exe /c takeown /r /d Y /f "%~1" && icacls "%~1" /inheritance:d /grant *S-1-3-4:(OI)(CI)F /T /C /L /Q icacls "%~1" /grant administrators:(OI)(CI)F /T /C /L /Q

此命令以递归方式将所有权转移给当前用户,禁用继承,并授予当前用户和管理员对“此文件夹、子文件夹和文件”的完全访问权限。(OI)(CI)

这就是我现在得到的:

更清洁的 ACL

访问列表看起来更干净,但是没有继承。

我想我的问题是:

  1. 当以递归方式获取文件夹所有权时,我应该保持继承启用吗?
  2. 我如何正确地删除重复的权限条目,希望不完全禁用继承?
  3. 我应该使用 iCACLS/grant:r来替换权限吗?
  4. 我是不是想太多了?!

非常感谢对此的任何意见。

答案1

是的,我会一直保留继承。我会使用 PowerShell 而不是 icacls:复制权限:

获取 ACL C:\Shared | 设置 Acl C:\Shared1

在对多个文件和文件夹设置权限之前,始终建议您使用 -WhatIf 参数来了解正在应用哪些文件或文件夹权限。虽然 Set-ACL 工作正常,但它是一段笨重的代码,不太“强大”。正如 tfl 提到的,有一个名为 NTFSSecurity 的外部模块可以使这变得容易得多:https://www.powershellgallery.com/packages/NTFSSecurity/4.2.4

电源外壳

列出文件夹 ACL 及其当前继承

Get-Item .\Data -Recurse | where {$_.psiscontainer -eq $true} | Get-NTFSAccess | select fullname,inheritanceenabled

要更改权限,您需要更改继承,否则您无法修改它。但是使用 $permissions = Get-Acl,您可以将其保存在变量中并在需要时重新应用,或者导出到 csv 等等。 https://thesleepyadmins.com/2020/04/28/export-folder-permission-using-powershell/

我总是建议先导出,然后再更改,因为如果犯了错误,你可以恢复。

相关内容