Auf einigen der Server, auf denen ich arbeite, sind die Berechtigungen für freigegebene Ordner mit direkten Berechtigungen für einige unserer Techniker überfüllt, da diese die Eigentümerschaft übernehmen müssen. Ich habe herausgefunden, wie ich das Eigentumsproblem beheben kann, sodass es nicht mehr auftritt, aber ich stecke beim Bereinigen dieser Berechtigungen fest. Leider passiert nichts, wenn ich diesen Befehl ausführe, nicht einmal ein Fehler. Ich vermute, es handelt sich um einen Logikfehler meinerseits, aber ich kann ihn nicht erkennen. Für jede Hilfe wäre ich dankbar.
# $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(); } } }
Da es sich um einen Einzeiler handelt, habe ich ihn unten der besseren Lesbarkeit halber aufgeteilt.
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(); `
}`
}`
}
Der Code zum Entfernen der Berechtigungen basiert auf Code, den ich hier gefunden habe Einen Benutzer mithilfe von PowerShell vollständig aus der ACL entfernen
Antwort1
Ich glaube, dass RemoveAccessRuleAll (und RemoveAccessRule) auf der ACL und nicht auf der Access-Eigenschaft funktionieren. Versuchen Sie stattdessen etwas wie das hier:
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
}
}
Antwort2
Ich habe die folgende Antwort auf Reddit gefunden und sie scheint das zu leisten, was ich brauchte.
aushttps://www.reddit.com/r/PowerShell/comments/p19br8/bulk_removing_direct_access_to_a_folder_via/ PS_Alex
Ich denke, Ihr Problem hier ist $acl = ($_ | Get-Acl).Access. Ihr $acl-Objekt enthält nur den ACE. Das Cmdlet Set-Acl erwartet das vollständige ACL-Objekt als Eingabe für das Argument -AclObject.
Sie könnten stattdessen Folgendes versuchen:
#Assuming $vdata is your root path
foreach ($Ordner in Get-ChildItem -Path $vdata -Directory -Recurse -Force) {
#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
}