Windows NTFS - 为所有子文件夹中的每个显式 ACL 添加权限

Windows NTFS - 为所有子文件夹中的每个显式 ACL 添加权限

我们有一个具有许多明确权利的文件夹结构,例如

root Folder
- subfolder 1 (explicit acl, no inherit acl)
- subfolder 2 (explicit acl, no inherit acl)
--subsubfolder 1 (no explicit rights, inherit acl)
--subsubfolder 2 (explicit acl, no inherit acl)

等等

我想为所有显式 ACL 添加权限(系统帐户),但不为非显式 ACL 添加权限。当然,有些文件夹甚至管理员帐户也无法访问,所以我需要忽略错误。

有谁知道可以实现这个功能的脚本吗?

編輯1
感谢 Hardoman,这里为当前文件夹、子文件夹和文件提供了可行的解决方案,并且不会捕获错误......

$folders = (Get-ChildItem C:\Temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
    $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
    if ($inheritance -eq $false) {
            icacls.exe $item /grant 'System:(OI)(CI)(RX)'
    }
}

没有找到使用 set-acl 的解决方案,也许有人有想法,这是我当前的 set-acl 状态,但子文件夹即使被继承也无法获得权限。

$folders = (Get-ChildItem C:\Temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
    $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
    if ($inheritance -eq $false) {
    try {
        $acl = Get-Acl $item
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("System","FullControl, Synchronize", "ContainerInherit,ObjectInherit", "None", "Allow")
        $acl.SetAccessRule($AccessRule)
        Set-Acl $item $acl
    }
    catch {
        "Failed to access folder $item"
        "Exception type is $($_.Exception.GetType().Name)"
        }
    }
}

答案1

您需要为此编写一个 Powershell 脚本。您需要递归获取所有文件夹和子文件夹,检查每个文件夹的继承性并使用获取 ACL设置ACLcommadlets 添加权限系统帐户。如果脚本无法访问该文件夹,Try/catch 将处理错误。

这是我为您编写的示例,假设您在 C:\temp 文件夹中递归作为示例。

$folders = (Get-ChildItem c:\temp -Directory -Recurse) | select -ExpandProperty fullname
foreach ($item in $folders) {
    $inheritance = (Get-Acl $item).access[0] | select -ExpandProperty isinherited
    if ($inheritance -eq $false) {
    try {
        $acl = Get-Acl $item
        $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ("System","FullControl","Allow")
        $acl.SetAccessRule($AccessRule)
        $acl | Set-Acl $item
    }
    catch {
        "Failed to access folder $item"
        "Exception type is $($_.Exception.GetType().Name)"
        }
    }
}

PS 要使 Get-ChildItem 和 -Directory 正常工作,您需要安装 Powershell 4+。PS 2.0 中缺少此开关

相关内容