Question Retirer les ACL inutiles

Plus d'informations
il y a 2 ans 5 jours #32231 par xGreed
Retirer les ACL inutiles a été créé par xGreed
Bonjour tout le monde,

Ces derniers jours j'ai commencé à écrire un script afin de retirer les ACL des dossiers de mon serveur de fichiers qui se répètent et sont inutiles (ex: si un utilisateur à le FullControl quel intérêt de lui ajouter le droit de read ?). Afin de faire cela j'ai procédé ainsi :

- Je récupère les ACL de mon dossier que je place dans un tableau. ($folderRights)
- Ensuite je scinde chaque chaine de caractères représentant les droits et j'associe une valeur décimale à chaque situation possible que je place dans un autre tableau. ( ligne 19 - 68)
- Je créé un tableau d'objets contenant chaque droits et leurs valeurs en décimales. ( $tmpACL )
- Puis, comparaison de chaque droits entres eux, ils doivent avoirs les mêmes cible (IdentityReference), Hérédité (Inheritance flags), le premier doit être hérité et le deuxième non, puis distinction selon si la règle Allow ou Deny et comparaison via les valeurs décimales.
- Création d'un nouveau tableau avec uniquement les accès conservés suite au tri.
- Enfin je récupère les ACL d'un dossier ne contenant aucune autorisation. Puis j'ajoute toutes les autorisations une à une via SetAccessRule et je Set-Acl sur mon dossier en cours

Voici le code :
function Set-RightACL
{
    Param
    (
        [Parameter(Mandatory = $true)]
        $Path
    )
    
    $x = (Get-Item $Path | get-acl).Access # récupere les ACL
    
    $folderRights = @() # créé un tableau
    ForEach ($item in $x)
    {
        $folderRights += $item # ajoute chaque ACL un a la fois dans l'objet qui va se comporter comme un tableau
    }
    
    $value = @()
    
    foreach ($right in $folderRights)
    {
        $i = [string]$right.FileSystemRights
        $i = $i.Split(', ')
        for ($k = 0; $k -lt $i.Length; $k = $k + 2)
        {
            
            if (($i[$k] -eq "Write") -and ($i.Length -eq 3))
            {
                $value += 1
            }
            elseif (($i[$k] -eq "Read") -and ($i.Length -eq 3))
            {
                $value += 2
            }
            elseif (($i[$k] -eq "ReadAndExecute") -and ($i.Length -eq 3))
            {
                if ($right.InheritanceFlags -eq "ContainerInherit, ObjectInherit")
                {
                    $value += 5
                }
                elseif ($right.InheritanceFlags -eq "ContainerInherit")
                {
                    $value += 4
                }
            }
            elseif (($i[$k] -eq "Modify") -and ($i.Length -eq 3))
            {
                $value += 7
            }
            elseif (($i[$k] -eq "FullControl") -and ($i.Length -lt 2))
            {
                $value += 9
            }
            elseif (($i[$k] -eq "Special") -and ($i.Length -eq 3))
            {
                $value += 8
            }
            elseif (($i[$k] -eq "Write") -and ($i[$k + 2] -eq "Read"))
            {
                $value += 3
                $k = $k + 2
            }
            elseif (($i[$k] -eq "Write") -and ($i[$k + 2] -eq "ReadAndExecute"))
            {
                $value += 6
                $k = $k + 2
            }
        }        
    }
    
    $k = 0
    $tmpACL = @()
    foreach ($right in $folderRights)
    {
        $object = @{
            #créé un objet
            first             = $right
            second             = $value[$k]
        }
        
        $tmpACL += $object
        $k++
    }
    $k = 0
    
    
    foreach ($comparateur in $tmpACL.first)
    {
        $comparateurvalue = 0;
        foreach ($compare in $tmpACL.first)
        {
            $comparevalue = 0;
            $degage = 0;
            if (-not ($comparateur -eq $compare))
            {
                if ($comparateur.IdentityReference -eq $compare.IdentityReference)
                {
                    if ($comparateur.InheritanceFlags -eq $compare.InheritanceFlags)
                    {
                        if (($comparateur.IsInherited -eq $True) -and ($compare.IsInherited -eq $False))
                        {
                            if ((-not (Compare-Object $comparateur.AccessControlType Allow)) -and (-not (Compare-Object $compare.AccessControlType Deny)))
                            {
                                #on garde
                            }
                            if ((-not (Compare-Object $comparateur.AccessControlType Deny)) -and (-not (Compare-Object $compare.AccessControlType Allow)))
                            {
                                #à faire
                                
                            }
                            if ((-not (Compare-Object $comparateur.AccessControlType Allow)) -and (-not (Compare-Object $compare.AccessControlType Allow)))
                            {
                                foreach ($finder in $tmpACL)
                                {
                                    if ($finder.first -eq $comparateur)
                                    {
                                        $comparateurvalue = $finder.second
                                        $k++
                                    }
                                    if ($finder.first -eq $compare)
                                    {
                                        $comparevalue = $finder.second
                                        $k++
                                    }
                                    
                                }
                                
                                if ($comparateurvalue -eq 9)
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 7) -and ($comparevalue -le 7))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 6) -and ($comparevalue -le 6))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 5) -and ($comparevalue -eq 2))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 4) -and ($comparevalue -eq 4))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 3) -and ($comparevalue -le 3))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 2) -and ($comparevalue -eq 2))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 1) -and ($comparevalue -eq 1))
                                {
                                    $degage = 1
                                }
                                
                                if ($degage -eq 1)
                                {
                                    $newACL = @()
                                    
                                    foreach ($newRight in $tmpACL)
                                    {
                                        if ($newRight.first -ne $compare)
                                        {
                                            $newACL += $newRight
                                        }
                                    }
                                    $tmpACL = $newACL
                                }
                            }
                        }
                        
                    }
                }
            }
        }
    }
    
    $finalACL = @()
    foreach ($thing in $tmpACL)
    {
        $finalACL += $thing.first
        
    }
    $y = Get-Item \\FileServer\NoACLFolder | Get-acl
  
  
   foreach ($object in $finalACL)
   {
        $y.SetAccessRule($object)
   }
   
      Set-Acl -Path $Path -AclObject $y
 
    
    
    #faire une fonction qui recurse avec un foreach pour chaque child
}


Set-RightACL -Path \\FileServer\TestFolder\ChildFolder


Malheureusement j'ai deux problèmes, le premier est que je n'ai pas gardé certains droits alors que cela aurait du (par exemple j'ai un droit hérité pour quelqu'un en ReadAndExecute et un droit ajouté au dossier à cette même personne en Write, après execution du script le droit Write a été supprimé ??). Deuxièmement, lors du Set-Acl, il semblerait que cela ne conserve pas le paramètres IsInherited ( ce qui est la finalité du script, distinguer les droits hérédités et ceux ajoutés en supprimant uniquement les droits ajoutés inutiles), pour palier à ce problème j'ai pensé à ne pas changer les droits du dossier de 0 mais plutôt supprimer ceux qui corrèlent avec mon tableau $finalACL et dont le paramètre IsInherited a comme valeur False, mais je ne trouve pas comment faire .


Merci pour votre aide !


PS: Au moment ou j'écris ce post je viens de m'apercevoir que les autorisations spéciales sont entièrement détaillé via la ligne ( (Get-Item $Path | get-acl).Access) et qu'ainsi je dois repenser ma manière de gérer ces droits la, cependant cela ne semble pas justifier la première erreur.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 7 heures #32234 par xGreed
Réponse de xGreed sur le sujet Retirer les ACL inutiles
Finalement voici le code final qui marche aux premiers abords.
function Set-RightACL
{
    Param
    (
        [Parameter(Mandatory = $true)]
        $Path
    )
    
    $x = (get-acl $Path).Access # récupere les ACL
    
    $folderRights = @() # créé un tableau
    ForEach ($item in $x)
    {
        $folderRights += $item # ajoute chaque ACL un a la fois dans l'objet qui va se comporter comme un tableau
    }
    
    $value = @()
    
    foreach ($right in $folderRights)
    {
        $i = [string]$right.FileSystemRights
        $i = $i.Split(', ')
        for ($k = 0; $k -lt $i.Length; $k = $k + 2)
        {
            
            if (($i[$k] -eq "Write") -and ($i.Length -eq 3))
            {
                $value += 1
            }
            elseif (($i[$k] -eq "Read") -and ($i.Length -eq 3))
            {
                $value += 2
            }
            elseif (($i[$k] -eq "ReadAndExecute") -and ($i.Length -eq 3))
            {
                if ($right.InheritanceFlags -eq "ContainerInherit, ObjectInherit")
                {
                    $value += 5
                }
                elseif ($right.InheritanceFlags -eq "ContainerInherit")
                {
                    $value += 4
                }
            }
            elseif (($i[$k] -eq "Modify") -and ($i.Length -eq 3))
            {
                $value += 7
            }
            elseif (($i[$k] -eq "FullControl") -and ($i.Length -lt 2))
            {
                $value += 9
            }
            elseif (($i[$k] -eq "Write") -and ($i[$k + 2] -eq "Read"))
            {
                $value += 3
                $k = $k + 4
            }
            elseif (($i[$k] -eq "Write") -and ($i[$k + 2] -eq "ReadAndExecute"))
            {
                $value += 6
                $k = $k + 4
            }
            elseif ($i.Length -gt 5)
            {
                $value += 8
            }
        }
    }
    
    $k = 0
    $tmpACL = @()
    foreach ($right in $folderRights)
    {
        $object = @{
            #créé un objet
            first             = $right
            second             = $value[$k]
        }
        
        $tmpACL += $object
        $k++
    }
    $k = 0
    
    
    foreach ($comparateur in $tmpACL.first)
    {
        $comparateurvalue = 0;
        foreach ($compare in $tmpACL.first)
        {
            $comparevalue = 0;
            $degage = 0;
            if (-not ($comparateur -eq $compare))
            {
                if ($comparateur.IdentityReference -eq $compare.IdentityReference)
                {
                    if ($comparateur.InheritanceFlags -eq $compare.InheritanceFlags)
                    {
                        if (($comparateur.IsInherited -eq $True) -and ($compare.IsInherited -eq $False))
                        {
                            if ((-not (Compare-Object $comparateur.AccessControlType Allow)) -and (-not (Compare-Object $compare.AccessControlType Allow)))
                            {
                                foreach ($finder in $tmpACL)
                                {
                                    if ($finder.first -eq $comparateur)
                                    {
                                        $comparateurvalue = $finder.second
                                        $k++
                                    }
                                    if ($finder.first -eq $compare)
                                    {
                                        $comparevalue = $finder.second
                                        $k++
                                    }
                                }
                                if (($comparateurvalue -eq 0) -or ($comparevalue -eq 0))
                                {
                                    Write-Host "OMEGABOUM"
                                }
                                if ($comparateurvalue -eq 9)
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 7) -and ($comparevalue -le 7))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 6) -and ($comparevalue -le 6))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 5) -and ($comparevalue -eq 2))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 4) -and ($comparevalue -eq 4))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 3) -and ($comparevalue -le 3))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 2) -and ($comparevalue -eq 2))
                                {
                                    $degage = 1
                                }
                                elseif (($comparateurvalue -eq 1) -and ($comparevalue -eq 1))
                                {
                                    $degage = 1
                                }
                                
                            }
                            if ($degage -eq 1)
                            {
                                $newACL = @()
                                
                                foreach ($newRight in $tmpACL)
                                {
                                    if ($newRight.first -ne $compare)
                                    {
                                        $newACL += $newRight
                                    }
                                }
                                $tmpACL = $newACL
                            }
                        }
                        
                    }
                }
            }
        }
    }
    
    $finalACL = @()
    foreach ($thing in $tmpACL)
    {
        $finalACL += $thing.first
        
        
    }
    
    $x = Get-acl $Path
    
    foreach ($access in $x.Access)
    {
        if ($access.IsInherited -eq $False)
        {
            $x.RemoveAccessRule($access)
        }
    }
    
    foreach ($access in $finalACL)
    {
        if ($access.IsInherited -eq $False)
        {
            $y = New-Object System.Security.AccessControl.FileSystemAccessRule("$($access.IdentityReference)", "$($access.FileSystemRights)", "$($access.InheritanceFlags)", "$($access.PropagationFlags)", "$($access.AccessControlType)")
            $x.AddAccessRule($y)
        }
    }
    
    $x | Set-Acl
    
    $family = Get-ChildItem $Path
    
    foreach ($children in $family) {
        
        if ((Get-Item -Path $children.PSPath) -is [system.io.directoryinfo])
        {
            Set-RightACL -Path $children.PSPath
        }
        
    }
   
}


Set-RightACL -Path LePathDuDossier

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 2 heures - il y a 2 ans 2 heures #32236 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Retirer les ACL inutiles
Salut,
il y a fort longtemps que je n'ai pas manipulé les ACL, mais en lisant la première partie de ton code, basé sur une analyse de chaîne et des elseif, je pense que tu peux simplifier cette partie.

FileSystemRights est un champ de bit on peut donc utiliser des bitmask pour aider à la relecture du code.
Je ne suis pas allé plus loin...

Tutoriels PowerShell
Dernière édition: il y a 2 ans 2 heures par Laurent Dardenne. Raison: coquilles

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.093 secondes
Propulsé par Kunena