Skip to main content

Hiérarchie des GDL

agdlp.png

Introduction

Afin de pouvoir administrer au mieux les droits, il faut une hiérarchie, un exemple avec notre structure de test :

00 - Commun
00 - Commun\01 - Scan
00 - Commun\02 - Sport
01 - RH
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
02 - Informatique\01 - Procédures

Ici, il faut que le GDL "01 - RH\01 - Paie\2025\Janvier" qui est lecture écriture donc "GDL_01-01-2025-Janvier_RW" soit membre de "01 - RH\01 - Paie\2025" lecture donc "GDL_01-01-202_RO", qui lui même sera membre de "GDL_01-01_RO" etc etc

De plus, il faut, au contraire que "GDL_01_RW" par exemple ai des droits récursifs sur l'ensemble des enfants, mais cela sera pour une prochaine partie.

Mise ne place de la hiérarchie

On en vient donc au script qui permet de faire ça :

Import-Module ActiveDirectory

# Fichier modèle
$defFile = "chemin\vers\arborescence.txt"

# Fonction qui transforme un chemin en tokens (premier mot de chaque dossier)
function Get-Tokens($parts) {
    $tokens = @()
    foreach ($p in $parts) {
        $tokens += ($p -split " ")[0]   # premier mot uniquement
    }
    return $tokens
}

# Fonction qui génère le nom d’un groupe (RW ou RO)
function Get-GroupName($tokens, $type) {
    return "GDL_" + ($tokens -join "-") + "_$type"
}

# Lecture du fichier UTF8 pour les accents
$lines = Get-Content -Path $defFile -Encoding UTF8 | Where-Object { $_.Trim().Length -gt 0 }

foreach ($line in $lines) {
    $parts  = $line.Trim().Split('\')
    $tokens = Get-Tokens $parts

    # Créer un tableau avec les tokens de tous les niveaux
    $allTokens = @()
    for ($i = 0; $i -lt $tokens.Count; $i++) {
        $allTokens += ,($tokens[0..$i])
    }

    # Boucle sur tous les niveaux (sauf le premier niveau qui n’a pas de parent)
    for ($i = 1; $i -lt $allTokens.Count; $i++) {
        $currentTokens = $allTokens[$i]
        $parentTokens  = $allTokens[$i-1]

        $currentRO = Get-GroupName $currentTokens "RO"
        $currentRW = Get-GroupName $currentTokens "RW"
        $parentRO  = Get-GroupName $parentTokens "RO"

        # Ajouter RW enfant à parent RO
        if ((Get-ADGroup -Filter "Name -eq '$currentRW'" -ErrorAction SilentlyContinue) -and
            (Get-ADGroup -Filter "Name -eq '$parentRO'" -ErrorAction SilentlyContinue)) {
            try {
                Add-ADGroupMember -Identity $parentRO -Members $currentRW -ErrorAction Stop
                Write-Host "$currentRW → $parentRO (ajouté)"
            } catch {
                Write-Warning "Erreur: $currentRW → $parentRO ($_)"
            }
        }

        # Ajouter RO enfant à parent RO
        if ((Get-ADGroup -Filter "Name -eq '$currentRO'" -ErrorAction SilentlyContinue) -and
            (Get-ADGroup -Filter "Name -eq '$parentRO'" -ErrorAction SilentlyContinue)) {
            try {
                Add-ADGroupMember -Identity $parentRO -Members $currentRO -ErrorAction Stop
                Write-Host "$currentRO → $parentRO (ajouté)"
            } catch {
                Write-Warning "Erreur: $currentRO → $parentRO ($_)"
            }
        }
    }
}

Avec cela, chaque enfant RO et RW est membre de son parent RO direct.
Prochaine étape appliquer les ACL aux répertoires du partage !