PowerShell : ajouter tous les utilisateurs de plusieurs OU à un groupe

I. Présentation

Dans ce tutoriel, nous allons voir comment ajouter tous les utilisateurs de plusieurs OU (unités d'organisation) dans un groupe Active Directory à l'aide de PowerShell.

Pour ajouter tous les utilisateurs d'une unité d'organisation, c'est facile puisque l'on peut le faire via l'interface graphique. Par contre, si l'on veut prendre tous les utilisateurs de 5, 10 ou 20 unités d'organisation pour les ajouter dans un groupe, on peut toujours le faire via l'interface graphique, mais ça va être long (et pénible) car il faut le faire OU par OU. C'est d'autant plus chiant s'il y a de nouveaux utilisateurs régulièrement...

Heureusement, PowerShell va pouvoir nous aider à réaliser cette action plus facilement. On peut même imaginer une chose : enregistrer le bout de code dans un script PS1 et l'exécuter une fois par jour via une tâche planifiée afin d'ajouter les éventuels nouveaux utilisateurs à ce groupe. Plutôt sympa, non ?

Pour suivre ce tutoriel, vous avez seulement besoin d'un contrôleur de domaine Active Directory. Je vous rappelle également que vous pouvez suivre mon cours sur l'administration de l'Active Directory avec PowerShell pour approfondir le sujet, et que mon eBook est toujours disponible.

II. PowerShell : prendre les utilisateurs de plusieurs OU et les ajouter à un groupe

Ouvrez PowerShell ISE ou Visual Studio Code pour commencer le script. La première étape consiste à établir la liste des OU. Cette liste pourra évoluer dans le temps si vous le souhaitez.

Au sein de la variable $OU, nous allons stocker la liste des OUs, en précisant le distinguishedName (DN) à chaque fois. Pour ma part, j'ai deux OU nommées "Personnel" et "Admins", ce qui donne :

$OUList = @("OU=Personnel,DC=it-connect,DC=local",
            "OU=Admins,DC=it-connect,DC=local")

Je vous rappelle que pour récupérer cette valeur, vous pouvez passer l'éditeur d'attribut via les propriétés de l'OU.

Sinon, en PowerShell voici comment récupérer le DN d'une OU :

Get-ADOrganizationalUnit -Filter "Name -eq 'Personnel'" | Select-Object DistinguishedName

Remplacez le terme "Personnel" par le nom de votre OU. Attention, si vous avez plusieurs OU avec le même nom, elles seront toutes retournées : à vous de choisir la bonne en regardant le chemin du DN. Cette méthode pourra vous éviter un certain nombre de clics.

Une fois que la liste des OU est établie, nous devons récupérer les utilisateurs de ces différentes OU. Grâce à une boucle ForEach PowerShell, nous allons pouvoir parcourir chaque OU pour récupérer le SamAccountName des utilisateurs et constituer la liste dans la variable $UsersList.

Ce qui donne simplement :

$UsersList = Foreach($OU in $OUList){ Get-ADUser -Filter * -SearchBase $OU | Select-Object SamAccountName }

Si, potentiellement, vous avez des utilisateurs désactivés dans ces OUs, vous pouvez les exclure en prenant que les utilisateurs actifs grâce à un filtre, comme ceci :

$UsersList = Foreach($OU in $OUList){ Get-ADUser -Filter "Enabled -eq '$true'" -SearchBase $OU | Select-Object SamAccountName }

Maintenant que l'on a la liste des utilisateurs, j'ai envie de vous dire que le plus dur est fait. Il ne reste plus qu'à ajouter les utilisateurs à notre groupe. Dans cet exemple, mon groupe se nomme "Salariés".

Pour cela, on va utiliser la commande "Add-AdGroupMember" qui permet d'ajouter des utilisateurs à un groupe. On va préciser le nom du groupe et notre objet $UsersList qui contient les utilisateurs. La commande est toute simple, et pas plus compliquée que pour ajouter un seul utilisateur dans un groupe :

Add-AdGroupMember -Identity "Salariés" -Members $UsersList

Au final, notre script tiens sur quelques lignes :

# Constituer une liste d'OU dans laquelle piocher les utilisateurs
$OUList = @("OU=Personnel,DC=it-connect,DC=local",
            "OU=Admins,DC=it-connect,DC=local")

# Récupérer la liste des utilisateurs actifs des OUs ciblées
$UsersList = Foreach($OU in $OUList){ Get-ADUser -Filter "Enabled -eq '$true'" -SearchBase $OU | Select-Object SamAccountName }

# Ajouter tous les utilisateurs au groupe
Add-AdGroupMember -Identity "Salariés" -Members $UsersList

Si vous souhaitez que ce groupe soit actualisé tout seul, il faudra enregistrer ce bout de code dans un fichier PS1 et l'exécuter via une tâche planifiée.

Par contre, si le contenu du groupe doit être maintenu à jour dans le temps et qu'il doit contenir seulement les utilisateurs de ces unités d'organisation, il faudrait purger le groupe avant d'ajouter tous les utilisateurs. Cela va permettre de s'assurer qu'il reflète bien le contenu des OUs. Pour cela, on va utiliser la commande Remove-ADGroupMember, comme ceci :

Remove-ADGroupMember "Salariés" -Members (Get-ADGroupMember "Salariés") -Confirm:$false

En toute logique, cette ligne doit être ajoutée avant l'ajout des utilisateurs dans le groupe. Ce qui donne :

# Constituer une liste d'OU dans laquelle piocher les utilisateurs
$OUList = @("OU=Personnel,DC=it-connect,DC=local",
            "OU=Admins,DC=it-connect,DC=local")

# Récupérer la liste des utilisateurs actifs des OUs ciblées
$UsersList = Foreach($OU in $OUList){ Get-ADUser -Filter "Enabled -eq '$true'" -SearchBase $OU | Select-Object SamAccountName }

# Purger le groupe
Remove-ADGroupMember "Salariés" -Members (Get-ADGroupMember "Salariés") -Confirm:$false

# Ajouter tous les utilisateurs au groupe
Add-AdGroupMember -Identity "Salariés" -Members $UsersList

Si vous avez une question, n'hésitez pas à publier un commentaire ! 🙂

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.

florian has 3369 posts and counting.See all posts by florian

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.