使用Powershell递归设置文件夹的权限?

时间:2018-01-23 20:37:39

标签: powershell powershell-v3.0 acl

我有一个目录,我想通过递归方式完成并设置所有文件夹的权限。所以操作的顺序应该是:

  1. 从文件夹
  2. 中删除所有ACL
  3. 将ACL添加到文件夹
  4. 设置ACL
  5. 我尝试了下面的代码,但是我收到了错误

      

    无法设置ACL,因为它需要调用的方法SetSecurityDescriptor不存在。

    foreach ($folder in Get-ChildItem -Path c:\perms -Recurse -Directory) {
        $AccessRule = New-Object System.Security.Accesscontrol.FileSystemAccessRule ("user", "FullControl", "ContainerInherit,ObjectInherit", "InheritOnly", "Allow")
        $acl = Get-Acl $folder
        $acl.SetAcccessRule($AccessRule)
        Set-Acl -Path $folder.FullName -AclObject $acl
    }
    

    我摆脱了错误消息,并添加了ACL,但我想基本上从文件夹中删除所有ACL并添加新的。

    我将脚本更新为:

    $acl = Get-Acl -Path "c:\perms"
    $acl.SetAccessRuleProtection($true,$false)
    $acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) | Out-Null }
    $ace = New-Object System.Security.Accesscontrol.FileSystemAccessRule ("user", "FullControl", "ContainerInherit,ObjectInherit", "InheritOnly", "Allow")
    $acl.AddAccessRule($ace)
    Set-Acl -Path "c:\perms" -AclObject $acl
    

    如果我想添加多个$ace,只需声明$ace2$ace3然后调用$acl.AddAccessRule($ace2)$acl.AddAccessRule($ace3)

1 个答案:

答案 0 :(得分:2)

使用SetAccessRuleProtection()禁用继承并删除继承的ACE:

$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) | Out-Null }

使用RemoveAccessRule()删除现有(非继承)ACE:

$ace = New-Object Security.AccessControl.FileSystemAccessRule "user", ...
$acl.AddAccessRule($ace)
...

使用AddAccessRule()添加新的ACE:

Excel.Application application = new Excel.Application();
Excel.Workbook wb = application.Workbooks.Add("C:\\Temp\\Template1.xlsm");
wb.SaveAs("Igloo_Bulk_Import_Template1.xls",Excel.XlFileFormat.xlExcel8)

仅对最顶层的文件夹执行此操作。在下面的任何地方都启用了继承,因此您的更改会自动传播。