为嵌套文件夹添加安全权限

时间:2013-11-22 12:34:26

标签: powershell cmd file-security

我有这样的情况:

folder1(顶层文件夹,user1:完全访问权限,user2:完全访问权限,user3:完全访问权限,系统:已满)

folder2(嵌套在folder1中,user1:完整,user2:完整,没有继承)

folder3(嵌套在folder1中,user3:完整,没有继承)

folder4(嵌套在folder2中,user2:完整,没有继承)

它是一个具有相当复杂的用户和权限结构的文件服务器。

我想做的事情(通过powershell或cmd)将添加系统:对整个文件夹中递归丢失的所有文件和文件夹的完全权限。文件共享有50k文件夹和950k文件,因此从头开始重新创建它将需要永远。问题是我不能只是覆盖继承,因为这将重置所有用户设置。有没有办法运行一个脚本,可以在没有更改文件夹上已设置的权限的情况下为缺少它的所有项添加权限?我假设我还需要获得我无法控制的文件的所有权。

1 个答案:

答案 0 :(得分:1)

您可以使用Get-ChildItem cmdlet遍历所有文件夹,并检查每个ACL,在需要的地方添加权限,但您必须下载到某些部分的.Net类和方法。

假设您只需在直接父目录上设置ACL并允许文件继承(而不是子文件夹),您可以这样做:

     $identity = "NT AUTHORITY\SYSTEM"
$basePath = "U:\"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $identity,"FullControl","ObjectInherit","None","Allow"
foreach($folder in Get-ChildItem -Path $basePath -Recurse -Directory)
{
    $acl = $folder.GetAccessControl("Access")
    if(!($acl.Access | ? { $_.IdentityReference -eq $identity -and $_.FileSystemRights -eq "FullControl" }))
    {
        $acl.AddAccessRule($accessRule)
        $folder.SetAccessControl($acl)
    }
}

规则$accessRule表示将此设置应用于文件夹和所有直接子文件。有关用于创建$accessRule

的继承标志的信息,请参阅this stackoverflow question

如果您需要单独设置每个文件(我真诚地希望您不必处理),您可以稍微修改以上内容:

$identity = "NT AUTHORITY\dd"
$basePath = "U:\"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $identity,"FullControl","None","None","Allow"
foreach($folder in Get-ChildItem -Path $basePath -Recurse)
{
    $acl = $folder.GetAccessControl("Access")
    if(!($acl.Access | ? { $_.IdentityReference -eq $identity -and $_.FileSystemRights -eq "FullControl" }))
    {
        $acl.AddAccessRule($accessRule)
        $folder.SetAccessControl($acl)
    }
}