Hiérarchie des GDL
Introduction
Nous reprenons une nouvelle fois notre fichier CSV :
NIVEAU 1;NIVEAU 2;NIVEAU 3;NIVEAU 4;NIVEAU 5;NIVEAU 6;NIVEAU 7;NIVEAU 8;FolderPath;CREER_GROUPES;GG_ECRITURE;GG_LECTURE;GDL_ECRITURE;GDL_LECTURE;GDL_VUE;Parent_GDL
01-DIRECTION;;;;;;;;01-DIRECTION;;ORG_GG_DIRECTION;;GDL_01_ECRITURE;GDL_01_LECTURE;GDL_01_VUE;
02-FINANCE;;;;;;;;02-FINANCE;;ORG_GG_FINANCE;ORG_GG_DIRECTION;GDL_02_ECRITURE;GDL_02_LECTURE;GDL_02_VUE;
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
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-CONTRATS;;;;;;;03-RH\01-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;;;;;;;03-RH;NON;;;;;;
04-IT;;;;;;;;04-IT;;ORG_GG_IT;ORG_GG_DIRECTION;GDL_04_ECRITURE;GDL_04_LECTURE;GDL_04_VUE;
04-IT;01-INFRA;;;;;;;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-PROJETS;;;;;;;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
04-IT;02-PROJETS;2026;;;;;;04-IT\02-PROJETS\2026;NON;;;;;;
Ici, il faut que le GDL "04-IT\02-PROJETS" qui est lecture ou écriture donc "GDL_04-02_ECRITURE" ou "GDL_04-02_LECTURE soient membre de "04-IT" vue donc "GDL_04_VUE" etc etc
De plus, il faut, au contraire que "GDL_01_ECRITURE"ou "GDL_04-02_LECTURE" par exemple aient des droits récursifs sur l'ensemble des enfants, mais cela sera pour une prochaine partie.
Mise neen place de la hiérarchie
On en vient donc au script qui permet de faire ça.
Il va simplement lire les colonnes GDL_ECRITURE, GDL_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:\AGDLP\ORG_ARBO_GDL.csv"
)
$ErrorActionPreference = "Stop"
# ----------------------------------------------------------------------------
# Module ActiveDirectory
# ----------------------------------------------------------------------------
try {
Import-Module ActiveDirectory -ErrorAction Stop
}
catch {
Write-Error "Module ActiveDirectory introuvable. Installer RSAT AD PowerShell."
exit 1
}
# ----------------------------------------------------------------------------
# Lecture du CSV
# ----------------------------------------------------------------------------
if (-not (Test-Path $CsvPath)) {
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 ($row in $rows) {
$index++
# Mettre a jour la progression
Write-Progress -Activity "Chainage GDL enfant -> Parent_GDL" `
-Status "$index / $total" `
-PercentComplete (($index/$total)*100)
# Recuperation du parent
$parent = $row.Parent_GDL
if ([string]::IsNullOrWhiteSpace($parent)) {
# Aucun parent pour cette ligne
continue
}
# Verifier que le parent existe dans l AD
$parentGroup = Get-ADGroup -Filter "Name -eq '$parent'" -ErrorAction SilentlyContinue
if (-not $parentGroup) {
Write-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 dans 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 $parent -Members $cg -ErrorAction Stop
Write-Host "Chaine : $cg -> $parent"
}
catch {
Write-Warning "Erreur chainage : $cg -> $parent ($_ )"
}
}
}
# Effacer la barre de progression
Write-Progress -Activity "Chainage GDL enfant -> Parent_GDL" -Completed
Write-Host ""
Write-Host "Chainage parental GDL termine." -ForegroundColor Green
Avec cela, chaque enfant VUE, LECTURE et ECRITURE est membre de son parent VUE direct.
Prochaine étape appliquer les ACL aux répertoires du partage !

