Question
Retirer les ACL inutiles
- xGreed
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
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 :
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.
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.
- xGreed
- Auteur du sujet
- Hors Ligne
- Nouveau membre
Réduire
Plus d'informations
- Messages : 7
- Remerciements reçus 0
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 2 ans 2 heures - il y a 2 ans 2 heures #32236
par Laurent Dardenne
Tutoriels PowerShell
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...
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
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Retirer les ACL inutiles