Création des GG
Introduction
Nous allons attaquer la partie des groupes globaux, les créer automatiquement via un script, et y ajouter des membres avec le même principe.
Tableau modèle
Il nous faut d'abord le fichier qui servira de modèle, que l'on mettra à jour, pour faire les modifications.
Le gros avantage est que ce fichier peut-être divisé par service, et distribué aux responsables et directeurs de services pour avoir des infos toujours à jour, sans donner accès à une console d'administration.
| Groupe | Prenom | Nom |
| GG_Direction |
Rozenn |
LUCAS |
|
GG_Direction |
Philippe | PALAS |
| GG_Comptablité | Bertrand | KANMEM |
| GG_Comptablité | Céline | DUPUI |
| GG_Comptablité | Dylan | BLOT |
| GG_Comptablité | Anthony | VORPAL |
| GG_RH | Stéphanie | ROBERT |
| GG_RH | Paul | MORINIERE |
| GG_RH | Francois | PARLAT |
Il faut ensuite exporter, ou convertir ce tableau en csv, encodage UTF8, séparateur ";" point virgule.
On obtient alors ce fichier :
Groupe;Prenom;Nom
GG_Direction;Rozenn;LUCAS
GG_Direction;Philippe;PALAS
GG_Comptablité;Bertrand;KANMEM
GG_Comptablité;Céline;DUPUI
GG_Comptablité;Dylan;BLOT
GG_Comptablité;Anthony;VORPAL
GG_RH;Stéphanie;ROBERT
GG_RH;Paul;MORINIERE
GG_RH;Francois;PARLAT
Création des GG
Voici à présent le script qui permet de créer tous les GG, dans un seul et même endroit, dans OU=GG,OU=AGDLP,DC=domain,DC=local :
Import-Module ActiveDirectory
# -----------------------------
# CONFIGURATION
# -----------------------------
$CSVPath = "C:\chemin\vers\GG.csv"
$OUPath = "OU=GG,OU=AGDLP,DC=domain,DC=local"
$LogFile = "C:\chemin\vers\AD_Group_Update_Errors.txt"
# Nettoyage du fichier de logs
"" | Out-File $LogFile
# Import sans lignes vides
$data = Import-Csv -Path $CSVPath -Delimiter ";" |
Where-Object { $_.Groupe -and $_.Groupe.Trim() -ne "" }
# Regroupement par groupe
$groupes = $data | Group-Object -Property Groupe
foreach ($grp in $groupes) {
$GroupName = $grp.Name.Trim()
Write-Host "`n=== Groupe : $GroupName ==="
# --- Créer le groupe s'il n'existe pas ---
try {
$ADGroup = Get-ADGroup -Identity $GroupName -ErrorAction Stop
$members = Get-ADGroupMember $GroupName -ErrorAction SilentlyContinue
if ($members) {
Remove-ADGroupMember -Identity $GroupName -Members $members -Confirm:$false
}
}
catch {
try {
$ADGroup = New-ADGroup -Name $GroupName `
-SamAccountName $GroupName `
-Path $OUPath `
-GroupScope Global -ErrorAction Stop
}
catch {
"ERREUR création du groupe '$GroupName' : $_" | Out-File $LogFile -Append
continue
}
}
# --- Ajout des membres ---
foreach ($ligne in $grp.Group) {
# Colonnes sans accents
$Prenom = $ligne.Prenom
$Nom = $ligne.Nom
# Vérification des champs
if (-not $Prenom -or -not $Nom) {
"Ligne invalide dans CSV : '$($ligne)' (groupe : $GroupName)" | Out-File $LogFile -Append
continue
}
# Construction DisplayName
$FullName = "$Prenom $Nom".Trim()
Write-Host " → Recherche : $FullName"
# Recherche AD par DisplayName
$User = Get-ADUser -Filter { DisplayName -eq $FullName } -ErrorAction SilentlyContinue
if (!$User) {
"Utilisateur introuvable : $FullName (groupe : $GroupName)" | Out-File $LogFile -Append
continue
}
# Ajout au groupe
try {
Add-ADGroupMember -Identity $GroupName -Members $User.SamAccountName -ErrorAction Stop
}
catch {
"ERREUR ajout : $FullName → $GroupName : $_" | Out-File $LogFile -Append
}
}
}
Si les utilisateurs existes, il se retrouves dans les groupes GG qui leurs correspondant dans le tableau.
J'ai pendant un moment pensé à faire une ligne par GG et séparer les utilisateurs par une ",", mais cela n'aurait pas été pratique pour les éventuels utilisateurs d'autres services.
