Skip to main content

Hiérarchie des GDL

agdlp.png

Introduction

Nous reprenons une nouvelle fois notre fichier 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     GDL_01-01-01_RW GDL_01-01-01_RO GDL_01-01_RO 01-RH\01-Paie\01-2025\01-Janvier     GDL_01-01-01-01_RW GDL_01-01-01-01_RO GDL_01-01-01_RO 01-RH\01-Paie\01-2025\02-Février     GDL_01-01-01-02_RW GDL_01-01-01-02_RO GDL_01-01-01_RO 01-RH\01-Paie\01-2025\03-Mars     GDL_01-01-01-03_RW GDL_01-01-01-03_RO GDL_01-01-01_RO 01-RH\01-Paie\01-2025\04-Avril     GDL_01-01-01-04_RW GDL_01-01-01-04_RO GDL_01-01-01_RO 01-RH\01-Paie\01-2025\05-Mai     GDL_01-01-01-05_RW GDL_01-01-01-05_RO GDL_01-01-01_RO 01-RH\02-Formation     GDL_01-02_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

image.png

NIVEAU 1;NIVEAU 2;NIVEAU 3;NIVEAU 4;NIVEAU 5;NIVEAU 6;NIVEAU 7;NIVEAU 8;FolderPath;GG_RW;GG_RO;GDL_RW;GDL_RO;CREER_GROUPES;GG_ECRITURE;GG_LECTURE;GDL_ECRITURE;GDL_LECTURE;GDL_VUE;Parent_GDL
00-Commun;01-DIRECTION;;Tous;;;;;;01-DIRECTION;;ORG_GG_DIRECTION;;GDL_01_ECRITURE;GDL_01_LECTURE;GDL_01_VUE;
les02-FINANCE;;;;;;;;02-FINANCE;;ORG_GG_FINANCE;ORG_GG_DIRECTION;GDL_02_ECRITURE;GDL_02_LECTURE;GDL_02_VUE;
utilisateurs;GDL_00_RW;GDL_00_RO;02-FINANCE;01-BUDGET;;;;;;;02-FINANCE\01-BUDGET;;ORG_GG_FINANCE;ORG_GG_DIRECTION;GDL_02-01_ECRITURE;GDL_02-01_LECTURE;GDL_02-01_VUE;GDL_02_VUE
00-Commun\02-FINANCE;02-FACTURES;;;;;;;02-FINANCE\02-FACTURES;;ORG_GG_FINANCE;ORG_GG_DIRECTION;GDL_02-02_ECRITURE;GDL_02-02_LECTURE;GDL_02-02_VUE;GDL_02_VUE
03-RH;;;;;;;;03-RH;;ORG_GG_RH;ORG_GG_DIRECTION;GDL_03_ECRITURE;GDL_03_LECTURE;GDL_03_VUE;
03-RH;01-Scan;Tous les utilisateurs;CONTRATS;;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-;;;03-RH\01-Paie;CONTRATS;;ORG_GG_RH;ORG_GG_DIRECTION;GDL_03-01_ECRITURE;GDL_03-01_LECTURE;GDL_03-01_VUE;GDL_03_VUE
03-RH;02-PAIE;;;GDL_01-01_RW;GDL_01-01_RO;GDL_01_RO
01-RH\01-Paie\01-2025;;;GDL_01-01-01_RW;GDL_01-01-01_RO;GDL_01-01_RO
01-RH\01-Paie\01-2025\01-Janvier;;;GDL_01-01-01-01_RW;GDL_01-01-01-01_RO;GDL_01-01-01_RO
01-RH\01-Paie\01-2025\02-Février;03-RH;NON;;;GDL_01-01-01-02_RW;GDL_01-01-01-02_RO;GDL_01-01-01_RO
01-RH\01-Paie\01-2025\03-Mars;;;GDL_01-01-01-03_RW;GDL_01-01-01-03_RO;GDL_01-01-01_RO;
01-RH\01-Paie\01-2025\04-Avril;IT;;;GDL_01-01-01-04_RW;GDL_01-01-01-04_RO;GDL_01-01-01_RO
01-RH\01-Paie\01-2025\05-Mai;;;GDL_01-01-01-05_RW;GDL_01-01-01-05_RO;GDL_01-01-01_RO
01-RH\02-Formation;;;GDL_01-02_RW;GDL_01-02_RO;GDL_01_RO;04-IT;;ORG_GG_IT;ORG_GG_DIRECTION;GDL_04_ECRITURE;GDL_04_LECTURE;GDL_04_VUE;
04-IT;01-RH\03-Carrière;INFRA;;;GDL_01-03_RW;GDL_01-03_RO;GDL_01_RO;;;;04-IT\01-INFRA;;ORG_GG_IT;ORG_GG_DIRECTION;GDL_04-01_ECRITURE;GDL_04-01_LECTURE;GDL_04-01_VUE;GDL_04_VUE
04-IT;02-Informatique;GG_Informatique;TousPROJETS;;;;;;;04-IT\02-PROJETS;;ORG_GG_IT;ORG_GG_DIRECTION;GDL_04-02_ECRITURE;GDL_04-02_LECTURE;GDL_04-02_VUE;GDL_04_VUE
les utilisateurs;GDL_02_RW;GDL_02_RO;
04-IT;02-Informatique\01-Procédures;PROJETS;2026;;Tous les utilisateurs;GDL_02-01_RW;GDL_02-01_RO;GDL_02_RO;;;;04-IT\02-PROJETS\2026;NON;;;;;;

Ici, il faut que le GDL "01 - RH\01 - Paie\2025\Janvier"04-IT\02-PROJETS" qui est lecture ou écriture donc "GDL_01-01-01-01_RWGDL_04-02_ECRITURE" soitou "GDL_04-02_LECTURE soient membre de "0104-IT" - RH\01 - Paie\2025" lecturevue donc "GDL_01-01-01_RO", qui lui même sera membre de "GDL_01-01_ROGDL_04_VUE" etc etc

De plus, il faut, au contraire que "GDL_01_RWGDL_01_ECRITURE"ou "GDL_04-02_LECTURE" par exemple aiaient 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.
Il va simplement lire les colonnes GDL_RW,GDL_ECRITURE, GDL_ROGDL_LECTURE, GDL_VUE et Parent_GDL, ce qui lui donnes toutes les infos nécessaires :

<#
===============================================================================
SCRIPT : 3.1 - Creation_Parentalite.ps1
OBJET  : Chainer les GDL de chaque dossier vers le GDL_VUE de leur parent
===============================================================================

DESCRIPTION :
  - Pour chaque ligne du CSV :
        * Si Parent_GDL est renseigne :
             - Ajouter GDL_ECRITURE   -> Parent_GDL
             - Ajouter GDL_LECTURE    -> Parent_GDL
             - Ajouter GDL_VUE        -> Parent_GDL
  - Tous les messages visibles sont sans accents.
  - Commentaires en francais pour clarifier chaque etape.

NOTE :
  - Ce script n effectue PAS de creation de groupes.
    Il se contente de realiser le chainage entre niveaux.
  - Fonctionne sur les noms de groupes crees dans le script 2.1.

===============================================================================
#>

Param(
    [string]$CsvPath = "C:\Chemin\vers\fichier.AGDLP\ORG_ARBO_GDL.csv"
)

Try$ErrorActionPreference = "Stop"

# ----------------------------------------------------------------------------
# Module ActiveDirectory
# ----------------------------------------------------------------------------
try {
    Import-Module ActiveDirectory -ErrorAction Stop
}
Catchcatch {
    Write-Error "Module ActiveDirectory introuvable. Installer RSAT AD PowerShell."
    exit 1
}

# Import----------------------------------------------------------------------------
# Lecture du CSV
avec# UTF8----------------------------------------------------------------------------
etif séparateur(-not ;(Test-Path $GDLListCsvPath)) {
    Write-Error "CSV introuvable : $CsvPath"
    exit 1
}

$rows  = Import-Csv -Path $CsvPath -Delimiter '";'" -Encoding UTF8
$total = $rows.Count
$index = 0

Write-Host "Application de la parentalite GDL a partir du fichier : $CsvPath"
Write-Host ""

# ----------------------------------------------------------------------------
# Boucle principale
# ----------------------------------------------------------------------------
foreach ($gdlrow in $GDLList)rows) {
    $childROindex++

    # Mettre a jour la progression
    Write-Progress -Activity "Chainage GDL enfant -> Parent_GDL" `
                   -Status "$index / $total" `
                   -PercentComplete (($index/$total)*100)

    # Recuperation du parent
    $parent = $gdl.GDL_RO
    $childRW = $gdl.GDL_RW
    $parentRO = $gdl.row.Parent_GDL

    # Si pas de parent, on passe à la ligne suivante
    if ([string]::IsNullOrEmpty(IsNullOrWhiteSpace($parentRO)parent)) {
        # Aucun parent pour cette ligne
        continue
    }

    # VérifierVerifier que le parent existe dans l AD
    if$parentGroup (= Get-ADGroup -Filter "Name -eq '$parentRO'parent'" -ErrorAction SilentlyContinue)SilentlyContinue
    if (-not $parentGroup) {
        TryWrite-Warning "Parent GDL introuvable dans AD : $parent"
        continue
    }

    # Groupes enfants a chainer
    $childGroups = @()

    if ($row.GDL_ECRITURE -and $row.GDL_ECRITURE.Trim() -ne "") {
        $childGroups += $row.GDL_ECRITURE.Trim()
    }
    if ($row.GDL_LECTURE -and $row.GDL_LECTURE.Trim() -ne "") {
        $childGroups += $row.GDL_LECTURE.Trim()
    }
    if ($row.GDL_VUE -and $row.GDL_VUE.Trim() -ne "") {
        $childGroups += $row.GDL_VUE.Trim()
    }

    # Ajouter les groupes enfants audans le groupe parent
    foreach ($cg in $childGroups) {

        $exists = Get-ADGroup -Filter "Name -eq '$cg'" -ErrorAction SilentlyContinue
        if (-not $exists) {
            Write-Warning "GDL enfant introuvable : $cg"
            continue
        }

        try {
            Add-ADGroupMember -Identity $parentROparent -Members $childRO,$childRWcg -ErrorAction Stop
            Write-Host "$childROChaine et: $childRWcg ajoutés à-> $parentRO"parent"
        }
        Catchcatch {
            Write-Warning "ImpossibleErreur d'ajouter $childRO/$childRW à $parentROchainage : $_"cg -> $parent   ($_ )"
        }
    }
else}

{# Effacer la barre de progression
Write-WarningProgress -Activity "ParentChainage GDL_ROGDL '$parentRO'enfant non-> trouvéParent_GDL" dans-Completed

l'AD"Write-Host }""
}Write-Host "Chainage parental GDL termine." -ForegroundColor Green

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