PowerShell ACL을 통해 폴더에 대한 직접 액세스를 대량으로 제거

PowerShell ACL을 통해 폴더에 대한 직접 액세스를 대량으로 제거

제가 작업하는 여러 서버에서 공유 폴더 권한은 소유권을 가져야 하는 일부 기술자들에 대한 직접 권한으로 인해 복잡해졌습니다. 더 이상 문제가 발생하지 않도록 소유권 문제를 해결하는 방법을 찾았지만 이러한 권한을 정리하는 데 어려움을 겪고 있습니다. 불행히도 이 명령을 실행하면 오류도 발생하지 않고 아무 일도 일어나지 않습니다. 나는 그것이 내 입장에서 일종의 논리적 오류라고 생각하지만 그것을 발견할 수 없습니다. 어떤 도움이라도 주시면 감사하겠습니다.

# $vData is the root path
Get-Item $vData | foreach { $_ ; $_ | Get-ChildItem -directory -Force -Recurse }| foreach {   $currentDir = $_;  $acl = ($_ | Get-Acl).Access;    $IDs = $acl | select identityreference ;   foreach ($ID in $IDs)      {   if (($ID.ToString()).endswith('-admin')) {      $acesToRemove = $acl | where{ $_.IsInherited -eq $false -and $_.IdentityReference -eq $ID };       $acl.RemoveAccessRuleAll($acesToRemove);        Set-Acl -AclObject $acl $currentDir.ToString();   }    }    }

1개의 라이너이므로 읽기 쉽도록 아래에 분할했습니다.

Get-Item $vData |`
foreach {`
 $_ ; $_ | Get-ChildItem -directory -Force -Recurse `
}`
| foreach {`
   $currentDir = $_;`
   $acl = ($_ | Get-Acl).Access; `
   $IDs = $acl | select identityreference ;`
   foreach ($ID in $IDs)      {   `
     if (($ID.ToString()).endswith('-admin')) {`
        $acesToRemove = $acl | where{ $_.IsInherited -eq $false -and $_.IdentityReference -eq $ID };`
        $acl.RemoveAccessRuleAll($acesToRemove); `
        Set-Acl -AclObject $acl $currentDir.ToString(); `
           }`
     }`
    }

권한을 제거하는 코드는 여기에서 찾은 코드를 기반으로 합니다. PowerShell을 사용하여 ACL에서 사용자를 완전히 제거합니다.

답변1

저는 RemoveAccessRuleAll(및 RemoveAccessRule)이 Access 속성이 아닌 ACL에서 작동한다고 생각합니다. 대신 다음과 같이 시도해 보세요.

Get-ChidItem -Path $root -Directory -Force -Recurse |
  ForEach-Object -Process {
    $path = $_.FullName
    Write-Output "Working on '$path'"
    $acl = Get-Acl -Path $path
    if ($aclsToRemove = $acl.Access | Where-Object -FilterScript { $_.IdentityReference -like '*-admin' }) {
      Write-Output "  Found $($aclsToRemove.Count) ACLs to remove:"
      foreach ($aclToRemove in $aclsToRemove) {
        Write-Output "    Removing $($aclToRemove.IdentityReference) - $($aclToRemove.FileSystemRights) - $($aclToRemove.AccessControlType) from ACL list"
        $acl.RemoveAccessRule($aclToRemove)
      }
      Write-Output "  Setting new ACL on filesystem"
      Set-Acl -Path $_.FullName -AclObject $acl
    }
  }

답변2

reddit에서 아래 답변을 찾았으며 필요한 것을 달성한 것 같습니다.

~에서https://www.reddit.com/r/PowerShell/comments/p19br8/bulk_removing_direct_access_to_a_folder_via/ PS_Alex

여기서 귀하의 문제는 $acl = ($_ | Get-Acl).Access인 것 같습니다. $acl 객체에는 ACE만 포함되어 있습니다. Set-Acl cmdlet은 전체 ACL 개체를 -AclObject 인수에 대한 입력으로 예상합니다.

대신 시도해 볼 수 있습니다.

#Assuming $vdata is your root path

foreach(Get-ChildItem -Path $vdata -Directory -Recurse -Force의 $folder) {

#Get the current ACL of the folder
$acl = Get-Acl -Path $folder.FullName

#Uncomment to explore the $acl object
#$acl | fl

#Filter the ACEs to identify the ones to remove, and remove them
foreach ($aceToRemove in $acl.Access.Where({$psitem.IdentityReference -match "-admin$" -and $psitem.IsInherited -eq $false})) {
    $acl.RemoveAccessRule($aceToRemove)
}

#Uncomment to explore the $acl object
#$acl | fl

#Apply the ACL
Set-Acl -AclObject $acl -Path $folder.FullName

}

관련 정보