En varios de los servidores donde trabajo, los permisos de las carpetas compartidas se han visto saturados con permisos directos para algunos de nuestros técnicos debido a que necesitan tomar posesión. He descubierto cómo solucionar el problema de propiedad para que no vuelva a suceder, pero estoy atascado en la limpieza de estos permisos. desafortunadamente cuando ejecuto este comando no pasa nada ni siquiera un error. Supongo que es algún tipo de error lógico de mi parte, pero no puedo detectarlo. Cualquier ayuda sería apreciada.
# $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(); } } }
Como es de 1 línea, lo he dividido a continuación para facilitar la lectura.
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(); `
}`
}`
}
el código para eliminar los permisos se basa en el código que encontré aquí Eliminar completamente a un usuario de ACL usando PowerShell
Respuesta1
Creo que RemoveAccessRuleAll (y RemoveAccessRule) funcionan en la ACL, no en la propiedad de Access. Pruebe algo como esto en su lugar:
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
}
}
Respuesta2
Encontré la respuesta a continuación en reddit y parece lograr lo que necesitaba.
dehttps://www.reddit.com/r/PowerShell/comments/p19br8/bulk_removing_direct_access_to_a_folder_via/ PS_Alex
Creo que su problema aquí es $acl = ($_ | Get-Acl).Access. Su objeto $acl solo contiene ACE. El cmdlet Set-Acl espera el objeto ACL completo como entrada para el argumento -AclObject.
Podrías intentar eso en su lugar:
#Assuming $vdata is your root path
foreach ($carpeta en 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
}