1

我有这样的情况:

文件夹 1(顶层文件夹,用户 1:完全访问权限,用户 2:完全访问权限,用户 3:完全访问权限,系统:完全)

文件夹 2(嵌套在文件夹 1,用户 1:完整,用户 2:完整,无继承)

文件夹 3(嵌套在文件夹 1,用户 3:完整,无继承)

文件夹 4(嵌套在文件夹 2 中,用户 2:已满,无继承)

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

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

4

1 回答 1

1

您可以使用 cmdlet 遍历所有文件夹Get-ChildItem,并检查每个 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是将此设置应用于文件夹和所有直接子文件。有关用于创建的继承标志的信息,请参阅此 stackoverflow 问题$accessRule

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

$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)
    }
}
于 2013-11-22T16:57:32.973 回答