2013-11-22 8 views
1

나는이 같은 상황이 보안 권한을 추가 폴더 1, USER1에 중첩 : 전체, 사용자 2 : 전체, 아니 상속)중첩 된 폴더

FOLDER3 (폴더 1에 중첩, 사용자 3 : 전체, 아니 상속)

folder4 (Folder2 폴더에 중첩, 사용자 2 : 전체, 아니 상속)

상당히 복잡한 사용자 및 권한 구조가있는 파일 서버입니다.

내가 뭘하고 싶은지 (powershell 또는 cmd를 통해) 시스템을 추가하는 것입니다 : 모든 파일과 폴더에 전체 권한을 폴더 전체에서 누락 된 전체 권한. 파일 공유에는 50k 개의 폴더와 950k 개의 파일이 있으므로 처음부터 다시 만들면 영원히 걸릴 수 있습니다. 문제는 모든 사용자 설정을 다시 설정하기 때문에 상속을 무시할 수 없다는 것입니다. 이미 폴더에 설정된 사용 권한을 변경하지 않고 누락 된 모든 항목에 대한 사용 권한을 추가하는 스크립트를 실행할 수 있습니까? 나는 내가 통제 할 수없는 파일의 소유권을 가져갈 필요가 있다고 가정한다.

답변

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