LaBouaBouate

CanonicalName & DistinguishedName

L’emplacement dans l’arborescence Active Directory est souvent très important et peu s’avérer utile pour la génération de rapports. L’attribut le plus utilisé pour déterminer cette information est le “Distinguished Name”, mais si vous ne connaissez pas son cousin le “Canonical Name”, cet article est fait pour vous !

Arborescence Active Directory

Pour illustrer mon propos, on va prendre l’exemple suivant. C’est une arborescence classique avec différentes OU et un domaine en “labouabouate.com”.

🌐 labouabouate.com
  📁 LBB
    📁 FR
      📁 Rennes
        📁 Users
          🧑‍💼 Pierre Dupont
    📁 US
      📁 Users
        🧑‍💼 John Smith

DistinguishedName

La propriété DistinguishedName dans Active Directory est un attribut fondamental qui identifie de manière unique chaque objet au sein de l’annuaire. Il s’agit d’une chaîne de caractères représentant le chemin complet de l’objet, depuis la racine de l’annuaire jusqu’à son emplacement spécifique. L’attribut DistinguishedName est essentiel pour la localisation et la gestion des objets dans un environnement Active Directory. Il permet de référencer précisément un objet, même s’il partage un nom commun avec d’autres objets, en garantissant son unicité grâce à la hiérarchie de l’annuaire. Les opérations de recherche, d’administration et de liaison d’objets utilisent couramment cette propriété pour identifier et accéder aux ressources de l’annuaire, ce qui en fait un élément clé de l’infrastructure informatique des entreprises utilisant Active Directory.

Pour donner un exemple, voici les DistinguishedName des comptes utilisateurs John Smith et Pierre Dupont :

On part de l’objet cible pour remonter ensuite vers la racine du domaine. On remarque que les éléments de l’arborescence sont séparés entre eux par des virgules et que la nature de l’objet est spécifiée à chaque fois (d’où la présence des “OU=”, “DN=” et “CN=”).

Voici un tableau synthèse sur les différents type d’objets que l’on retrouve couramment dans les DistinguishedName :

Identifiant Type d’attribut
DC domainComponent
CN commonName
OU organizationalUnit

Et le tableau complet est disponible ici : Distinguished Names - Microsoft Docs

On remarque également que le domaine est décomposé : au lieu d’être simplement affiché en “DC=labouabouate.com”, on affiche bien chaque niveau du domaine :

Domaine DistinguishedName
labouabouate.com DC=labouabouate,DC=com
ldap.lbb.com DC=ldap,DC=lbb,DC=com

CanonicalName

La propriété CanonicalName dans Active Directory est un attribut qui stocke le chemin d’accès complet d’un objet dans la hiérarchie de l’annuaire. Il représente un moyen de référencer un objet de manière unique et permet de spécifier son emplacement précis dans la structure de l’Active Directory. Le CanonicalName est souvent utilisé pour effectuer des opérations de recherche et de localisation d’objets au sein de l’annuaire, en garantissant un accès précis et fiable.

Cette propriété est malheureusement en “option” lors des requêtes Active Directory. Il faut donc la spécifier pour l’obtenir lors des requêtes Get-ADUser :

Get-ADUser john.smith -Properties CanonicalName

Les CanonicalName des deux utilisateurs :

Beaucoup plus lisible que le DistinguishedName, on part de la racine du domaine pour descendre vers l’objet cible. Les éléments sont séparés entre eux par des “/” et c’est tout. Simple et efficace !

Cas pratique

On veut générer un rapport avec tous les utilisateurs du domaine en affichant à quelle unité organisationnelle l’utilisateur appartient. Les OUs qui nous intéressent sont “FR” ou “US”. Pour obtenir cette information, on va se baser les valeurs du DistinguishedName et du CanonicalName (évidemment).

Parser le DistinguishedName

Le problème avec le DistinguishedName dans notre cas, c’est que la valeur que l’on recherche “bouge”. Je m’explique :

ID John Smith Pierre Dupont
0 CN=John Smith CN=Pierre Dupont
1 OU=Users OU=Users
2 OU=US OU=Rennes
3 OU=LBB OU=FR
4 DC=labouabouate OU=LBB
5 DC=com DC=labouabouate
6   DC=com

Mais si on retourne notre méthode et que l’on lit le DistinguishedName de droite à gauche (racine vers objet), on retrouvera toujours la valeur recherchée en avant-avant-avant dernière position.

$root = "OU=LBB,DC=labouabouate,DC=com"
$dn = "CN=John Smith,OU=Users,OU=US,$root","CN=Pierre Dupont,OU=Users,OU=Rennes,OU=FR,$root"
$dn | ForEach-Object {
  (($_ -split ',')[-4] -split '=')[1]
}

Comme vous pouvez le voir, ça se fait mais y’a plus simple.

Parser le CanonicalName

Pas besoin de se casser la tête puisque la valeur recherchée est toujours en troisième position :

ID John Smith Pierre Dupont
0 labouabouate.com labouabouate.com
1 LBB LBB
2 US FR
3 Users Rennes
4 John Smith Users
5   Pierre Dupont

Et on se retrouve avec un code PowerShell beaucoup plus simple :

$root = "labouabouate.com/LBB"
$cn = "$root/US/Users/John Smith","$root/FR/Rennes/Users/Pierre Dupont"
$cn | ForEach-Object {
  ($_ -split '/')[2]
}
Cet article pourrait-il vous intéresser ?
Commentaires