Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

[REX] DistinguishedName incorrect : comprendre, diagnostiquer et corriger

Dans de nombreux scripts PowerShell Active Directory, le DistinguishedName (DN) est utilisé comme point d’entrée pour cibler des objets précis : utilisateurs, ordinateurs ou unités d’organisation. Il est courant de récupérer un DN une première fois, puis de le réutiliser tel quel dans des scripts automatisés ou des tâches planifiées.

Ce fonctionnement semble fiable, mais il devient rapidement fragile dans des environnements Active Directory vivants, où les OU sont régulièrement déplacées, renommées ou restructurées.

Problème rencontré

Plusieurs scripts d’audit ou d’administration ne retournaient aucun résultat, ou échouaient partiellement sans générer d’erreur explicite.
Dans certains cas, les mêmes scripts fonctionnaient parfaitement sur un domaine, mais pas sur un autre.

Le comportement était trompeur : aucune exception PowerShell, aucun message d’erreur AD, simplement zéro objet retourné.

Analyse

Après investigation, les causes les plus fréquentes étaient :

  • un DistinguishedName mal formé (virgule manquante, casse incorrecte)
  • une OU déplacée ou renommée
  • un DN codé en dur devenu obsolète
  • une OU supprimée puis recréée (DN identique visuellement, mais objet différent)
  • une différence de structure entre environnements (prod / préprod)

Active Directory ne valide pas toujours explicitement un DN incorrect : la requête est acceptée, mais ne retourne aucun résultat, ce qui complique fortement le diagnostic.

Exemples concrets

Get-ADUser -SearchBase "OU=Users,OU=IT,DC=corp,DC=contoso,DC=com" -Filter *

Échoue silencieusement si l’OU est déplacée ou renommée car le DN est codé en dur.

$OU = Get-ADOrganizationalUnit -LDAPFilter "(ou=Users)" -SearchBase "DC=corp,DC=contoso,DC=com"
Get-ADUser -SearchBase $OU.DistinguishedName -Filter *

Le script s’adapte automatiquement à l’arborescence réelle car le DN est dynamique.

[Active Directory] Rechercher efficacement des objets AD avec LDAPFilter

Lors d’audits Active Directory, la recherche d’objets via PowerShell est une opération critique.
Les cmdlets telles que Get-ADUser, Get-ADComputer ou Get-ADObject proposent le paramètre -Filter, souvent suffisant pour des requêtes simples. Cependant, dès que les critères se complexifient, ce mode de filtrage montre rapidement ses limites.

Dans plusieurs scripts d’audit, certaines recherches retournaient un volume excessif d’objets, tandis que d’autres ne renvoyaient aucun résultat sans erreur explicite. Ces comportements étaient dus à des filtres trop permissifs, mal interprétés, ou difficiles à maintenir lorsque plusieurs conditions entraient en jeu.

L’utilisation des filtres LDAP via le paramètre -LDAPFilter s’est alors révélée être une solution plus robuste. Les filtres LDAP sont interprétés nativement par Active Directory, ce qui garantit une meilleure précision et des performances supérieures, notamment dans des environnements de grande taille.

Exemples concrets

Get-ADUser -LDAPFilter "(&(objectClass=user)(employeeID=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"

Cela retourne uniquement les comptes utilisateurs activés disposant d’un EmployeeID.

Get-ADUser -LDAPFilter "(&(objectClass=user)(servicePrincipalName=*))"

Très efficace pour détecter les comptes exposés à des risques de type Kerberoasting.

[PowerShell] Attribution de permissions à une App registrations sur un site SharePoint Online

Attribuer des permissions site-scopées à une application sur SharePoint Online peut rapidement devenir complexe, même avec un compte Global Administrator.
Après plusieurs tentatives infructueuses (App-Only, Client Secret, Certificat, Sites.Selected, etc.), une seule méthode s’est révélée fonctionnelle, supportée et cohérente avec les contraintes de sécurité imposées par Microsoft.

Pré-requis

  • Un compte Global Administrator
  • Module : PnP.PowerShell
  • Une app registration « cible » sur laquelle on souhaite accorder l’accès au site SharePoint
  • Une app registration « admin » avec la permission delegated :
    • AllSites.FullControl

Connexion interactive via l’application admin

Connect-PnPOnline `
  -Url "https://tenant.sharepoint.com/sites/MonSite" `
  -ClientId "AppId_de_l_application_AllSites.FullControl" `
  -Interactive

Se connecter ensuite avec son compte Global Admin sur la fenêtre.

Attribution de la permission write à l’application cible

Grant-PnPAzureADAppSitePermission `
  -AppId "AppId_de_l_application_cible" `
  -DisplayName "Nom_de_l_application" `
  -Site "https://tenant.sharepoint.com/sites/MonSite" `
  -Permissions Write

Permissions disponibles :

  • Read
  • Write
  • FullControl
  • Owner

Vérification des permissions sur le site

Get-PnPAzureADAppSitePermission `
  -Site "https://tenant.sharepoint.com/sites/MonSite"

L’AppId de l’application cible doit apparaître avec le rôle attribué.