Skip to main content

Création des GDL

agdlp.pngIntroduction

On le redit encore, mais le plus long pour l'AGDLP, c'est la mise en place, d'abord des dossiers, et ensuite des groupes GDL, ce que nous allons voir maintenant !

GDL et OU

Reprenons notre fichier modèle :

FolderPath GG_RW GG_RO
00-Commun   Tous les utilisateurs
00-Commun\01-Scan Tous les utilisateurs  
00-Commun\02-Sport GG_Sport  
01-RH GG_RH, GG_Direction  
01-RH\01-Paie\2025\Janvier    
01-RH\01-Paie\2025\Février    
01-RH\01-Paie\2025\Mars    
01-RH\01-Paie\2025\Avril    
01-RH\01-Paie\2025\Mai    
01-RH\02-Formation    
01-RH\03-Carrière    
02-Informatique GG_Informatique Tous les utilisateurs
02-Informatique\01-Procédures Tous les utilisateurs

Et en vue CSV :

FolderPath;GG_RW;GG_RO
00-Commun;;Tous les utilisateurs
00-Commun\01-Scan;Tous les utilisateurs;
00-Commun\02-Sport;GG_Sport;
01-RH;GG_RH, GG_Direction;
01-RH\01-Paie\01-2025\01-Janvier;;
01-RH\01-Paie\01-2025\02-Février;;
01-RH\01-Paie\01-2025\03-Mars;;
01-RH\01-Paie\01-2025\04-Avril;;
01-RH\01-Paie\01-2025\05-Mai;;
01-RH\02-Formation;;
01-RH\03-Carrière;;
02-Informatique;GG_Informatique;Tous les utilisateurs
02-Informatique\01-Procédures;;Tous les utilisateurs

Pour bien faire, il faut créer deux GDL par répertoire, un lecture seule, et un lecture/écriture.

C'est donc ce qu'on va faire, automatiquement, suivant ce nommage : GDL_<numérotation-répertoire>_RO et GDL_<numérotation-répertoire>_RW.

AvecDe cetteplus, structurenous allons préparer la parentalité des GDL, c'est à dire que chaque enfant GDL soit membre de fichier,son parent RO direct, et nous allons également les disposer dans un miroir de dossier,l'arborescence dans l'AD.

Cela permet une gestion plus simple car, si nous voulons ajouter des droits sur un dossier N-15 sous dossiers, il seraest plus simple de procédernaviguer pourdirectement dans l'arborescence miroir de l'AD et ainsi ajouté le bon GG à la suite.GDL finale.
Grâce à la parentalité, les droits seront automatiquement les bons.

OU et GDL

Voici donc le script qui nous permet de faire tout cela :

Param(
    [string]$ModelePath = "C:\chemin\vers\modele.txt",
    [string]$CsvPath = "C:\chemin\Chemin\vers\GDLMapping.fichier.csv",
    [string]$BaseOU = "OU=GDL,OU=AGDLP,DC=domain,DC=local" # Base pour créer les OU
)

Try { Import-Module ActiveDirectory -ErrorAction Stop } Catch {}

$GDLList = @()

# Lire le fichier modèle TXT avec encodage UTF8
$ModeleLines = Get-Content $ModelePath -Encoding UTF8

# HashTable pour garder le mapping FolderPath -> GDL_RO

$FolderToGDL = @{}

Function Create-OU($ouName, $parentDN) {
    $ouDN = "OU=$ouName,$parentDN"
    if (-not (Get-ADOrganizationalUnit -Filter "DistinguishedName -eq '$ouDN'" -ErrorAction SilentlyContinue)) {
        New-ADOrganizationalUnit -Name $ouName -Path $parentDN -ProtectedFromAccidentalDeletion $false
        # retirer -ProtectedFromAccidentalDeletion $false pour la prod, cela autorise la suppression de toute l'arbo dans AGDLP
        Write-Host "OU créée : $ouDN"
    }
    return $ouDN
}

Function Create-GDL($GroupName, $OU) {
    if (-not (Get-ADGroup -Filter "Name -eq '$GroupName'" -ErrorAction SilentlyContinue)) {
        New-ADGroup -Name $GroupName -GroupScope Global -Path $OU
        Write-Host "GDL créé : $GroupName dans $OU"
    }
}

# Importer le CSV existant
if (Test-Path $CsvPath) {
    $GDLList = Import-Csv -Path $CsvPath -Delimiter ';' -Encoding UTF8
} else {
    Write-Error "Le fichier CSV $CsvPath n'existe pas."
    exit
}

foreach ($folderPathrow in $ModeleLines)GDLList) {
    $folderPath = $folderPath.row.FolderPath.Trim()
    if ($folderPath -eq "") { continue }

    # Extraire uniquement les numéros pour le GDL
    $numbers = ($folderPath -split '\\' | ForEach-Object {
        if ($_ -match '^\d+') { $Matches[0] }
    }) -join '-'

    $GDL_RW = "GDL_$numbers`_RW"
    $GDL_RO = "GDL_" + $numbers + "GDL_$numbers`_RO"
    $GDL_RW = "GDL_" + $numbers + "_RW"

    # Création des OU correspondantes
    $parts = $folderPath -split '\\'
    $parentDN = $BaseOU
    foreach ($part in $parts) {
        $ouDN = Create-OU $part $parentDN
        $parentDN = $ouDN
    }

    # Calculer le parent GDL pour le CSVParent_GDL
    $parentFolder = Split-Path $folderPath -Parent
    if ($parentFolder -and $FolderToGDL.ContainsKey($parentFolder)) {
        $parentROparentGDL = $FolderToGDL[$parentFolder]
    } else {
        $parentROparentGDL = $null
    }

    # Ajouter au mapping

    $FolderToGDL[$folderPath] = $GDL_RO

    # Créer les GDL dans l’OU correspondante
    Create-GDL $GDL_ROGDL_RW $ouDN
    Create-GDL $GDL_RWGDL_RO $ouDN

    # Ajouter àles lanouvelles listecolonnes pourau CSV avec Add-Member
    $row | Add-Member -MemberType NoteProperty -Name GDL_RW -Value $GDL_RW -Force
    $row | Add-Member -MemberType NoteProperty -Name GDL_RO -Value $GDL_RO -Force
    $row | Add-Member -MemberType NoteProperty -Name Parent_GDL -Value $parentGDL -Force
}

# Exporter le CSV $GDLListmis +=à [PSCustomObject]@{
        FolderPath   = $folderPath
        GDLNameRO    = $GDL_RO
        GDLNameRW    = $GDL_RW
        ParentGDLRO  = $parentRO
    }
}

# Export CSV avec UTF8 pour les accentsjour
$GDLList | Export-Csv -Path $CsvPath -Delimiter ';' -NoTypeInformation -Encoding UTF8
Write-Host "CSV générémis à jour avec GDL : $CsvPath"

Le tableau CSV qui en ressort devrait ressembler à ça :

       FolderPath GG_RW GG_RO GDL_RW GDL_RO Parent_GDL 00-Commun   Tous les utilisateurs GDL_00_RW GDL_00_RO   00-Commun\01-Scan Tous les utilisateurs   GDL_00-01_RW GDL_00-01_RO GDL_00_RO 00-Commun\02-Sport GG_Sport   GDL_00-02_RW GDL_00-02_RO GDL_00_RO 01-RH GG_RH, GG_Direction   GDL_01_RW GDL_01_RO   01-RH\01-Paie     GDL_01-01_RW GDL_01-01_RO GDL_01_RO 01-RH\01-Paie\01-2025\01-Janvier     GDL_01-01-01_RW GDL_01-01-01_RO GDL_01-01_RO 01-RH\01-Paie\01-2025\02-Février     GDL_01-01-02_RW GDL_01-01-02_RO GDL_01-01_RO 01-RH\01-Paie\01-2025\03-Mars     GDL_01-01-03_RW GDL_01-01-03_RO GDL_01-01_RO 01-RH\01-Paie\01-2025\04-Avril     GDL_01-01-04_RW GDL_01-01-04_RO GDL_01-01_RO 01-RH\01-Paie\01-2025\05-Mai     GDL_01-01-05_RW GDL_01-01-05_RO GDL_01-01_RO 01-RH\02-Formation     GDL_01-01-01_RW GDL_01-02_RO GDL_01_RO 01-RH\03-Carrière     GDL_01-03_RW GDL_01-03_RO GDL_01_RO 02-Informatique GG_Informatique Tous les utilisateurs GDL_02_RW GDL_02_RO   02-Informatique\01-Procédures   Tous les utilisateurs GDL_02-01_RW GDL_02-01_RO GDL_02_RO

Et en version CSV :

FolderPath;GG_RW;GG_RO;GDL_RW;GDL_RO;Parent_GDL
00-Commun;;Tous les utilisateurs;GDL_00_RW;GDL_00_RO;
00-Commun\01-Scan;Tous les utilisateurs;;GDL_00-01_RW;GDL_00-01_RO;GDL_00_RO
00-Commun\02-Sport;GG_Sport;;GDL_00-02_RW;GDL_00-02_RO;GDL_00_RO
01-RH;GG_RH, GG_Direction;;GDL_01_RW;GDL_01_RO;
01-RH\01-Paie;;;GDL_01-01_RW;GDL_01-01_RO;GDL_01_RO
01-RH\01-Paie\01-2025\01-Janvier;;;GDL_01-01-01_RW;GDL_01-01-01_RO;GDL_01-01_RO
01-RH\01-Paie\01-2025\02-Février;;;GDL_01-01-02_RW;GDL_01-01-02_RO;GDL_01-01_RO
01-RH\01-Paie\01-2025\03-Mars;;;GDL_01-01-03_RW;GDL_01-01-03_RO;GDL_01-01_RO
01-RH\01-Paie\01-2025\04-Avril;;;GDL_01-01-04_RW;GDL_01-01-04_RO;GDL_01-01_RO
01-RH\01-Paie\01-2025\05-Mai;;;GDL_01-01-05_RW;GDL_01-01-05_RO;GDL_01-01_RO
01-RH\02-Formation;;;GDL_01-01-01_RW;GDL_01-02_RO;GDL_01_RO
01-RH\03-Carrière;;;GDL_01-03_RW;GDL_01-03_RO;GDL_01_RO
02-Informatique;GG_Informatique;Tous les utilisateurs;GDL_02_RW;GDL_02_RO;
02-Informatique\01-Procédures;;Tous les utilisateurs;GDL_02-01_RW;GDL_02-01_RO;GDL_02_RO

Bien ! A présent nous avons des groupes bien nommés dans des OU bien classées.
Nous allons passer à la mise en place de la hiérarchie des groupes !