2013-11-22 29 views
1

我有這樣的情況:添加安全權限嵌套的文件夾

文件夾1(頂層文件夾,用戶1:完全訪問權限,用戶2:完全訪問權限,用戶3:完全訪問權限,系統:全)

文件夾2(嵌套在文件夾1中,用戶1:滿,用戶2:滿,無繼承)

folder3(嵌套在文件夾1,用戶3:滿,無繼承)

folder4(嵌套在文件夾2,用戶2:滿,無繼承)

其文件服務器具有相當複雜的用戶和權限結構。

我想要做的事(通過PowerShell或cmd)將是添加系統:對所有文件和文件夾的完整權限在文件夾中遞歸地丟失。文件共享有50k文件夾和950k文件,因此從頭開始重新創建文件需要永久。問題是我不能重寫繼承,因爲這會重置所有的用戶設置。有沒有辦法運行一個腳本,可以在缺少它的所有項目上添加權限,而無需更改文件夾中已設置的所有權限?我想我還需要對我無法控制的文件擁有所有權。

回答

1

您可以使用Get-ChildItem cmdlet遍歷所有文件夾,並檢查每個ACL,在需要的位置添加權限,但必須將某些部分下載到.Net類和方法。 $accessRule是說應用此設置

 $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) 
    } 
} 

規則:

假設你可以只設置於眼前的父目錄的ACL,並允許文件繼承(沒有子文件夾),你可以這樣做到文件夾和所有直接的子文件。見this stackoverflow question的信息有關用於創建$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) 
    } 
}