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