eliminación masiva del acceso directo a una carpeta a través de PowerShell ACL

eliminación masiva del acceso directo a una carpeta a través de PowerShell ACL

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

}

información relacionada