【问题标题】:Removing all ACL on folder with powershell使用powershell删除文件夹上的所有ACL
【发布时间】:2011-07-04 15:17:55
【问题描述】:

我对 powershell 脚本很陌生(我开始学习 powershell 已经将近 1 个月了。)

我目前正在使用 powershell 2.0 编写一个脚本来清理文件夹 NTFS ACL。我想删除除管理员之外的所有 acl。

我的问题是我无法在不知道它们的情况下删除所有非管理员的 acl。

所以我来这里寻找powershell pro。

【问题讨论】:

    标签: windows powershell acl windows-server-2008-r2 ntfs


    【解决方案1】:

    此代码删除 acl :

    $acl = Get-Acl \\remote_server\share_folder\HAL.9000
    $acl.Access | %{$acl.RemoveAccessRule($_)}
    

    此代码添加管理员acl:

    #BUILTIN administrator
    
    $acl = Get-Acl \\remote_server\share_folder\HAL.9000
    $permission  = "BUILTIN\Administrators","FullControl", "ContainerInherit,ObjectInherit","None","Allow"
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
    $acl.SetAccessRule($accessRule)
    Set-Acl \\remote_server\share_folder\HAL.9000 $acl
    
    #Domain controller administrator
    
    $acl = Get-Acl \\remote_server\share_folder\HAL.9000
    $permission  = "DOMAINCONTROLLER\Administrators","FullControl", "ContainerInherit,ObjectInherit","None","Allow"
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
    $acl.SetAccessRule($accessRule)
    Set-Acl \\remote_server\share_folder\HAL.9000 $acl
    

    希望这会对某人有所帮助:)

    【讨论】:

    • 您是否必须先禁用继承才能删除继承的规则?
    • 嗯,你当然必须禁用继承,但是使用继承对于共享服务器来说是一个坏举动,你会搞砸一切,所以我总是在创建新服务器时禁用它们,这样这不是一个问题。就我的脚本工作而言,继承不是问题,脚本删除了 acl 并创建了一个干净的新的。如果出现问题,将尝试找到一种方法来禁用继承。
    【解决方案2】:

    为方便起见,我将所有这些内容复制/粘贴到一个函数中。如果它对任何人都有用,那就是:

    Function Remove-ACL {    
        [CmdletBinding(SupportsShouldProcess=$True)]
        Param(
            [parameter(Mandatory=$true,ValueFromPipeline=$true,Position=0)]
            [ValidateNotNullOrEmpty()]
            [ValidateScript({Test-Path $_ -PathType Container})]
            [String[]]$Folder,
            [Switch]$Recurse
        )
    
        Process {
    
            foreach ($f in $Folder) {
    
                if ($Recurse) {$Folders = $(Get-ChildItem $f -Recurse -Directory).FullName} else {$Folders = $f}
    
                if ($Folders -ne $null) {
    
                    $Folders | ForEach-Object {
    
                        # Remove inheritance
                        $acl = Get-Acl $_
                        $acl.SetAccessRuleProtection($true,$true)
                        Set-Acl $_ $acl
    
                        # Remove ACL
                        $acl = Get-Acl $_
                        $acl.Access | %{$acl.RemoveAccessRule($_)} | Out-Null
    
                        # Add local admin
                        $permission  = "BUILTIN\Administrators","FullControl", "ContainerInherit,ObjectInherit","None","Allow"
                        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
                        $acl.SetAccessRule($rule)
    
                        Set-Acl $_ $acl
    
                        Write-Verbose "Remove-HCacl: Inheritance disabled and permissions removed from $_"
                    }
                }
                else {
                    Write-Verbose "Remove-HCacl: No subfolders found for $f"
                }
            }
        }
    }
    

    用法:

    # For only one folder:
    Remove-ACL 'C:\Folder' -Verbose
    
    # For all subfolders:
    Remove-ACL 'C:\Folder' -Recurse -Verbose
    
    # Pipe stuff
    'C:\Folder 1', 'C:\Folder 2' | Remove-ACL -Verbose
    

    【讨论】:

      【解决方案3】:

      此代码删除 acl:$acl = Get-Acl \remote_server\share_folder\HAL.9000 $acl.Access | %{$acl.RemoveAccessRule($_)}

      在你这样做之前它不会起作用

      Set-Acl \\remote_server\share_folder\HAL.9000 $acl
      

      【讨论】:

        【解决方案4】:

        为什么不创建一个新列表。例如:

        $identity = New-Object System.Security.Principal.NTAccount('NT AUTHORITY\SYSTEM')
        $acl = New-Object System.Security.AccessControl.DirectorySecurity
        $acl.SetOwner($identity)
        $acl.SetGroup($identity)
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule('NT AUTHORITY\SYSTEM', ’FullControl’, ’ContainerInherit, ObjectInherit’, ’None’,’Allow’)
        $acl.AddAccessRule($rule)
        $rule = New-Object System.Security.AccessControl.FileSystemAccessRule('BUILTIN\Administrators', ’FullControl’, ’ContainerInherit, ObjectInherit’, ’None’, ’Allow’)
        $acl.AddAccessRule($rule)
        Set-Acl -LiteralPath "C:\MyFolder" -AclObject $acl
        Get-Acl -LiteralPath "C:\MyFolder" | Format-List
        

        【讨论】:

          猜你喜欢
          • 2015-08-06
          • 2014-06-15
          • 1970-01-01
          • 2021-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-10
          • 1970-01-01
          相关资源
          最近更新 更多