Le blog technique

Toutes les astuces #tech des collaborateurs de PI Services.

#openblogPI

Retrouvez les articles à la une

[Active Directory] OU protégée contre la suppression : comprendre les impacts réels

Lors de la mise en place de délégations Active Directory, le ciblage et la gestion des droits sur les unités d’organisation semblent, en théorie, relativement simples. Les permissions sont correctement attribuées, les groupes sont en place, et pourtant certaines actions échouent systématiquement avec des erreurs de type Access Denied. Dans ce contexte, le diagnostic peut rapidement devenir frustrant, car les droits semblent cohérents et conformes aux attentes.

Ce type de situation est fréquemment lié à l’option “Protect object from accidental deletion”, souvent activée par défaut sur les OU sensibles. Cette protection est une bonne pratique, mais son impact réel est souvent sous-estimé, notamment lors de la mise en œuvre de délégations.

Concrètement, cette option ne se limite pas à empêcher une suppression accidentelle via l’interface graphique. Lorsqu’elle est activée, Active Directory ajoute automatiquement des entrées explicites de type Deny dans les ACL de l’OU. Ces entrées bloquent des actions critiques comme la suppression de l’OU, la suppression d’objets enfants ou certains déplacements dans l’arborescence.

Le point clé à comprendre est que, dans Active Directory, un Deny explicite prévaut toujours sur un Allow, quel que soit le niveau de privilège accordé par ailleurs. Ainsi, même une délégation correctement configurée peut être partiellement inefficace tant que ces ACE de protection sont présentes. Le résultat est souvent une erreur peu explicite, sans lien apparent avec la protection active.

C’est précisément ce comportement qui explique pourquoi certaines délégations semblent « ne pas fonctionner”, alors que les permissions sont correctes sur le papier. Sans analyse des paramètres de sécurité avancés, il est facile de conclure à une erreur de configuration, alors que le blocage est en réalité intentionnel.

La résolution passe par une analyse systématique des ACL de l’OU concernée. Dans certains cas, il est nécessaire de désactiver temporairement la protection afin d’effectuer l’opération prévue, puis de la réactiver une fois la modification terminée. Cette approche permet de conserver le niveau de sécurité attendu tout en évitant les blocages inutiles.

Avec cette compréhension, les délégations deviennent plus prévisibles, les erreurs Deny plus faciles à expliquer, et l’administration Active Directory globalement plus fiable. La protection contre la suppression reste un mécanisme essentiel, à condition d’en connaître les impacts réels et de l’intégrer consciemment dans les scénarios d’administration.

[PowerShell] Gestion des erreurs avec Try / Catch

PowerShell est largement utilisé pour automatiser des tâches d’administration système, aussi bien en local que sur des serveurs ou dans des environnements cloud (Azure Automation, pipelines CI/CD, tâches planifiées).
Dans ces contextes, un script qui “semble” fonctionner peut pourtant masquer des erreurs critiques, conduisant à des résultats partiels, incohérents, voire dangereux.

La gestion des erreurs devient alors un élément central de la fiabilité des scripts PowerShell.

Problématique rencontrée

Lors de l’exécution de plusieurs scripts automatisés, certaines commandes échouaient sans interrompre le script.
Aucune alerte claire n’était remontée, et l’exécution se terminait avec succès, alors que certaines actions n’avaient jamais été effectuées.

Les symptômes étaient typiques :

  • aucune interruption du script
  • aucune gestion centralisée des erreurs
  • résultats incomplets ou faux positifs
  • difficulté à diagnostiquer a posteriori

PowerShell distingue principalement deux catégories d’erreurs, avec des comportements très différents.

Erreurs non bloquantes (Non-terminating errors)

Ce sont les erreurs les plus courantes.
Par défaut, PowerShell affiche l’erreur à l’écran mais continue l’exécution du script.

Exemples :

  • objet introuvable
  • accès refusé
  • commande partiellement invalide

Ces erreurs ne déclenchent pas un Catch.

Erreurs bloquantes (Terminating errors)

Ces erreurs interrompent immédiatement l’exécution du script et déclenchent automatiquement un Catch.

Exemples :

  • cmdlet critique en échec
  • erreur levée manuellement
  • erreur forcée via configuration

Le rôle clé de -ErrorAction

Le paramètre -ErrorAction permet de contrôler le comportement des erreurs.

Valeurs principales de -ErrorAction :

  • Continue (par défaut)
    Affiche l’erreur et poursuit l’exécution.
  • SilentlyContinue
    Ignore l’erreur sans affichage (dangereux en automatisation).
  • Stop
    Transforme une erreur non bloquante en erreur bloquante.
  • Ignore
    Ignore totalement l’erreur (rarement recommandé).
  • Inquire
    Demande une confirmation interactive (peu adapté à l’automatisation).

Un piège courant consiste à utiliser Try / Catch sans forcer les erreurs à être bloquantes.

Try {
    Get-ADUser -Identity "UserInexistant"
}
Catch {
    Write-Host "Erreur détectée: $($_.Exception.Message)"
}

Dans ce cas :

  • l’erreur s’affiche
  • le script continue
  • le Catch n’est jamais exécuté

Bonne pratique : combiner Try / Catch et -ErrorAction Stop

Try {
    Get-ADUser -Identity "UserInexistant" -ErrorAction Stop
}
Catch {
    Write-Host "Erreur détectée: $($_.Exception.Message)"
}

Toute erreur est :

  • interceptée
  • traitée
  • journalisée proprement

[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.