1

次のような状況があります。

folder1(最上位フォルダ、user1:フルアクセス、user2:フルアクセス、user3:フルアクセス、system:フル)

folder2 (folder1 にネスト、user1:full、user2:full、継承なし)

folder3 (folder1 にネスト、user3:full、継承なし)

folder4 (folder2 にネスト、user2: 完全、継承なし)

かなり複雑なユーザーと権限の構造を持つファイル サーバーです。

私が(powershellまたはcmdを介して)やりたいことは、フォルダー全体で再帰的に欠落しているすべてのファイルとフォルダーに system:full アクセス許可を追加することです。ファイル共有には 50,000 個のフォルダーと 950,000 個のファイルがあるため、最初から再作成するには永遠に時間がかかります。問題は、すべてのユーザー設定がリセットされるため、継承を上書きできないことです。フォルダーに既に設定されているアクセス許可を変更せずに、不足しているすべてのアイテムにアクセス許可を追加するスクリプトを実行する方法はありますか? 私が制御できないファイルの所有権も取得する必要があると思います。

4

1 に答える 1

1

コマンドレットを使用してすべてのフォルダーを反復処理し、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は、この設定をフォルダーとすべての直下の子ファイルに適用することを示しています。作成に使用される継承フラグに関する情報については、このスタックオーバーフローの質問を参照してください$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 に答える