Utilisation de Get-ACL sur une arborescence ActiveDirectory

Cet article fait plus ou moins écho à celui d’hier où j’explique comment accorder des droits spécifiques à un utilisateur ou un groupe sur une OU ActiveDirectory. Get-ACL est une instruction Powershell permettant de retourner les permissions d’un fichier, répertoire ou même clef de registre. Par défaut, Get-ACL ne permet pas de retourner les autorisations d’un objet ActiveDirectory, mais il existe une technique de sioux permettant d’utiliser cette instruction sur un AD.

Sur une station ayant les RSAT d’installés ou bien directement sur un contrôleur de domaine, il suffit d’importer le module AD pour Powershell :

Import-Module ActiveDirectory

Ensuite, se placer dans l’arborescence AD :

Set-Location AD:

Un simple dir permet de retourner des informations nous confirmant que nous sommes bien dans l’AD.

Lancer un Get-ACL à la racine de AD: n’aura aucun effet. Il est tout de même nécessaire d’indiquer un chemin à la commande ; on utilisera alors le DistingushedName. Par exemple, pour récupérer l’intégralité des permissions à la racine du domaine (attention, ce n’est pas récursif !) :

(Get-Acl (Get-ADDomain).DistinguishedName).Access

Ainsi, il est possible de se concocter un petit snippet si l’on souhaite parcourir tout l’AD à la recherche de privilèges accordés à un groupe ou à un utilisateur sur des OU, par exemple :

Import-Module ActiveDirectory
Set-Location AD:
$oulist = Get-ADOrganizationalUnit -Filter * | select DistinguishedName
foreach($ou in $oulist){
$privileges = (Get-Acl $ou.DistinguishedName).Access | Where-Object { $_.IdentityReference -eq "DUNDERMIFFLIN\gclooney" }
if($privileges -ne $null) { Write-Host "OU:"$ou.DistinguishedName ; $privileges }
}

Par exemple, ayant accordé les droits à l’utilisateur gclooney sur l’OU End-Users, il récupère par héritage ces mêmes privilèges sur les 3 OU enfant.

Cela se vérifie avec le snippet plus haut :

Ce code peut naturellement être modifié pour interroger des groupes ou des utilisateurs. Par exemple, je vais octroyer des droits au groupe US-Presidents sur le groupe Actors. La capture suivante montre bien que le droit WriteProperty a été attribué.

En jouant sur la clause Where-Object de ce snippet, on peut modifier le filtre de recherche. Par exemple, afin rechercher tous les utilisateurs ayant le droit WriteProperty sur un objet défini, il suffit de modifier le snippet :

$grplist = Get-ADgroup -Identity "Actors" | select DistinguishedName
$privileges = (Get-Acl $grp.DistinguishedName).Access | Where-Object { $_.ActiveDirectoryRights -like "*WriteProperty*" }

Au final, la seule limite de Get-Acl et du code que l’on adapte autour, ce sont les informations que l’on souhaite récupérer et les actions éventuelles à mener pour cadrer au mieux les privilèges attribués au fil du temps !

Lien pour marque-pages : Permaliens.

2 Commentaires

  1. Bonjour,

    Je trouve votre procédure très pédagogique merci.

    J’ai essayé la commande ci-dessous pour exporter vers un fichiers csv les autorisations sur les groupes de mon active directory mais le script se bloque avec la commande Get-ADGroup mon powershell ise reste figé

    le script ne fonctionne qu’avec la commande Get-ADOrganizationalUnit

    Set-Location AD:
    $oulist = Get-ADGroup -Filter * | select DistinguishedName

    foreach($ou in $oulist)
    {

    $privileges = (Get-Acl $ou.DistinguishedName).Access }
    if($privileges -ne $null) { Write-Host « OU: »$ou.DistinguishedName ; $privileges | Export-Csv C:\Temp\ACLExport.csv -Encoding default -Delimiter « ; » -NoTypeInformation

    }

    Pourriez-vous m’aider s’il vous plait ?

    mon objectif est d’envoyer vers un csv tous les autorisations des groupes de mon contrôleur de domaine.

    Je vous remercie pour le travail que vous avez déjà fait sur votre blog qui est vraiment magnifique

    Cordialement

    Maxime

  2. Bonjour,

    Ce traitement peut être très long en fonction du nombre de groupes présents dans l’AD. Par exemple, l’AD sur lequel j’ai essayé votre snippet contient plus de 2000 groupes et l’export des ACL d’un groupe renvoie un fichier CSV de 35 Ko.

    Au niveau de votre script, il vous faut changer le nom du fichier CSV d’export car étant donné que vous êtes dans la boucle ForEach, vous allez sans arrêt écraser le fichier en question. Ce qu’il est possible de faire, c’est de stocker le DistinguishedName dans une variable (p. ex. $dn) et ensuite apposer cette variable dans le nom du fichier : Export-Csv C:\Temp\ACLExport-$dn.csv, en fonction des noms de vos groupes.

    Cela vous permettra déjà de voir la progression lors de l’export CSV.
    Individuellement, ces commandes fonctionnent et donnent des retours cohérents. Essayez de manière unitaire de jouer le snippet pour vous assurer qu’il fonctionne, ligne par ligne, avec VS Code par exemple.

    Ce qu’il est possible de faire, c’est par exemple ceci pour vérifier que vous récupérez les bonnes données (exécutez cela ligne par ligne) :

    $oulist = Get-ADGroup -Filter * | select DistinguishedName
    $priv = (Get-Acl $oulist[0].DistinguishedName).Access
    $priv

    Normalement $priv doit contenir les ACL du premier groupe contenu dans $oulist qui est une collection de groupes.
    Si tout est cohérent, il ne reste plus qu’à mettre tout cela dans la boucle ForEach et à gérer l’export.

    Bon courage 🙂

Répondre à EnguerrandAnnuler la réponse.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.