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

9

我有一个目录,想要递归地设置所有文件夹的权限。所以操作顺序应该是:

  1. 删除文件夹上的所有ACL
  2. 添加文件夹的ACL
  3. 设置ACL

我尝试了下面的代码,但是出现了错误:

无法设置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。

我更新了我的脚本,如下所示:

$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)即可。


如果我想添加多个 $ace,只是一个简单的问题吗?在发布问题之前,请先自行测试一些简单的内容。将此更新添加到您的问题可能比通过快速测试验证它所需的时间更长。我不会为您提供解决方案。 - Ansgar Wiechers
1个回答

8

使用SetAccessRuleProtection()方法来禁用继承并移除继承的ACE:

$acl.SetAccessRuleProtection($true, $false)

使用RemoveAccessRule()方法来删除现有的(非继承的)ACE:

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

使用 AddAccessRule() 方法添加新的ACE:
$ace = New-Object Security.AccessControl.FileSystemAccessRule "user", ...
$acl.AddAccessRule($ace)
...

只针对最顶层文件夹进行此操作。在下面的所有地方保持继承启用,这样您的更改会自动传播。


嗨,我有些困惑应该把 $acl.SetAccessRuleProtection 放在哪里。我在循环中得到了 $acl,但你说只将其应用于最顶层的文件夹。 - xaisoft
1
不要递归。让继承来处理权限传播。 - Ansgar Wiechers
那么,通过在根文件夹上设置权限,它会自动设置所有子文件夹(甚至是子/子文件夹)的权限吗? - xaisoft
我还注意到,当我添加用户时,它会检查“特殊权限”,而不是其他权限(完全控制、修改等)。 - xaisoft
@xaisoft 关于继承和传播标志的影响的信息,请参见此处:(https://stackoverflow.com/a/32382956/1630171)。 - Ansgar Wiechers
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接