Skip to main content

Création des GG

agdlp.png

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.