2014-01-14 91 views

回答

3

沿着这些线?

# 1. Get list of folders 
$FolderList = Get-ChildItem -Path c:\test\everyone -Directory -Recurse; 

# 2. Iterate over folders and remove 'everyone' rules 
foreach ($Folder in $FolderList) { 
    $Acl = Get-Acl -Path $Folder.FullName; 
    $Everyone = $Acl.Access.Where({ $PSItem.IdentityReference -eq 'Everyone' }); 
    foreach ($Ace in $Everyone) { 
     [void] $Acl.RemoveAccessRule($Ace); 
    } 
    Set-Acl -Path $Folder.FullName -AclObject $Acl; 
} 

重要:这个脚本需要的PowerShell 版本4.0,因为它使用去哪儿 “方法的语法。”

+2

在网络上两次遍历大量文件夹/文件可能会非常缓慢。我会使用where命令将gci管道输入到get-acl cmdlet中,然后删除...它可以将操作时间缩短一半或更多 - 尽管如此,仍然是一个+1 –

+1

谢谢@AustinFrench :)好的提示。 –

3

翻译Trevor's solution将根据PowerShell V2/V3:

$rootFolder = '\\server\c$\some\folder' 

# get locale-specific name for 'Everyone' security principal 
$sid = New-Object Security.Principal.SecurityIdentifier('S-1-1-0') 
$everyone = $sid.Translate([Security.Principal.NTAccount]).Value 

Get-ChildItem $rootFolder -Recurse | ? { $_.PSIsContainer } | % { 
    $acl = Get-Acl $_.FullName 
    $acl.Access | ? { $_.IdentityReference -eq $everyone } | % { 
    $acl.RemoveAccessRule($_) 
    } 
    Set-Acl $_.FullName -Acl $acl | Out-Null 
} 

在PowerShell中V3可以用-Directory取代| ? { $_.PSIsContainer }

请注意,这不会删除根文件夹本身的Everyone ACE,也不会删除继承的Everyone ACE。

+0

也很好的答案:) –

相关问题