我正在尝试构建一系列批处理文件,通过右键单击上下文菜单来控制文件和文件夹的权限。我知道有现成的解决方案,但我正在尝试自己编写代码。
理想情况下,我希望使用以下单独的命令:
- 获取目录的所有权(递归)
- 取得文件所有权
- 将所有者设置为当前用户
- 将所有者设置为管理员
- 将所有者设置为 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)
这就是我现在得到的:
访问列表看起来更干净,但是没有继承。
我想我的问题是:
- 当以递归方式获取文件夹所有权时,我应该保持继承启用吗?
- 我如何正确地删除重复的权限条目,希望不完全禁用继承?
- 我应该使用 iCACLS
/grant:r
来替换权限吗? - 我是不是想太多了?!
非常感谢对此的任何意见。
答案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/
我总是建议先导出,然后再更改,因为如果犯了错误,你可以恢复。