Active Directory : comment dupliquer plusieurs OUs ?

I. Présentation

Lorsque l'on crée une arborescence Active Directory pour plusieurs sites au sein du même domaine, il y a de fortes chances pour que l'on essaie de reproduire la même arborescence pour les différents sites afin d'avoir quelque chose d'homogène. Néanmoins, c'est plutôt pénible à faire et très chronophage... Une nouvelle fois, PowerShell va nous sauver la vie 😉

L'idée est la suivante : créer l'arborescence type pour un premier site avec toutes les unités d'organisation et sous-OU et dupliquer cette arborescence d'OU pour vos autres sites grâce à PowerShell. Le script que je vous propose aujourd'hui peut fonctionner qu'il y ait 2, 10 ou même 100 sites à gérer. La seule condition : tous les sites doivent avoir un nom différent. En quelque sorte, nous allons voir comment faire un copier-coller d'OUs.

II. Dupliquer des OUs

Dans cet exemple, je vais prendre l'arborescence de Paris comme modèle et je souhaite dupliquer cette arborescence avec deux autres noms : Caen et Rouen.

Le résultat obtenu après copier-coller de la racine Paris sera :

Voici le script avec les quatre variables à adapter :

# DC cible
$DC = "SRV-ADDS-01.it-connect.local"

# OU à dupliquer
$OUSource = "OU=Paris,OU=Agences,DC=IT-CONNECT,DC=LOCAL"

# OU dans laquelle créer les racines supplémentaires
$RootNewOU = "OU=Agences,DC=IT-CONNECT,DC=LOCAL"

# Liste des racines à créer
$RootDestList = @("Caen","Rouen")

<# SCRIPT #>

# Récupérer la liste des OUs avec récursivité
$GetOUStructure = Get-ADOrganizationalUnit -SearchBase $OUSource -Filter * -SearchScope Subtree -Server $DC

# Récupérer le DN de l'OU Source et le nom de l'OU de plus bas niveau de ce DN
$BaseDNSource = $GetOUStructure.distinguishedname[0]

# Traiter chaque racine
Foreach($RootDest in $RootDestList){

  # Traiter chaque OU de l'arborescence
  Foreach($OU in $GetOUStructure){

    if($OU.DistinguishedName -eq $BaseDNSource){

      # Attention si le terme $RootSource se trouve plusieurs fois dans le $BaseDNSource
      $RootSource = (($BaseDNSource).Split(",")[0]).Split("=")[1]
      $BaseDNDest = $GetOUStructure.distinguishedname[0] -replace $RootSource , $RootDest

      # Créer la racine de la nouvelle arborescence
      New-ADOrganizationalUnit -Name $RootDest -Path $RootNewOU -Server $DC
      Write-Host -f Yellow "Création de l'OU racine '$RootDest' sous la base DN : $RootNewOU"

    }else{

      # On crée l'OU enfant seulement si l'OU racine
      if(Get-ADOrganizationalUnit -Identity "OU=$RootDest,$RootNewOU" -ErrorAction SilentlyContinue -Server $DC){

        $DN = $OU.distinguishedname.replace($BaseDNSource,$BaseDNDest)
        $ParentDN = $DN.trimstart($DN.split(',')[0]).trim(",")
        $OUName = $OU.name

        New-ADOrganizationalUnit -Name $OUName -Path $ParentDN -Server $DC
        Write-Host -f Cyan "Création de l'OU '$OUName' sous la base DN : $ParentDN"

      }else{

        Write-Host -f Red "ERREUR ! La racine $RootDest n'existe pas sous : $RootNewOU"
      }
    }
  }
}

Lorsque les variables sont adaptées, il ne vous reste plus qu'à exécuter le script et à le laisser travailler pour vous ! ?

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5575.Voir tous les posts

2 thoughts on “Active Directory : comment dupliquer plusieurs OUs ?

  • Bonjour,

    Aujourd’hui, j’ai eu un cours sur l’utilisation de l’AD. J’ai demandé à mon professeur s’il était possible de dupliquer des OUs avec leurs composants pour gagner en efficacité. Il m’a répondu que non.

    Merci à vous pour avoir mis en ligne la solution à mon problème. Tout est possible, il faut juste chercher jusqu’à trouver la solution !

    PS: ça va faire 5 heures que je cherche. Vous m’avez sauvée d’une nuit blanche.

    Répondre
    • Bonjour Lucie,
      Je suis déçu, j’aurais préféré que tu trouves cet article beaucoup plus rapidement! 🙂
      Grâce à PowerShell et un peu d’imagination, on peut en général faire ce que l’on ne peut pas faire avec l’interface graphique, la preuve avec ce cas de figure.
      Bonne journée
      Florian

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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