Liaison GG-GDL
Introduction
Il s'agit de la dernière étape pour mettre en place des droits AGDLP, ajout les GG comme membres des GDLP afin que les utilisateurs puissent accéder aux ressources partagées.
Introduction
Nous reprenons une nouvelle fois notre fichier CSV :
NIVEAU 1;NIVEAU FolderPath2;NIVEAU GG_RW3;NIVEAU GG_RO4;NIVEAU GDL_RW5;NIVEAU GDL_RO6;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;
00-Commun02-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;
Tous les utilisateurs
GDL_00_RW
GDL_00_RO
00-Commun\03-RH;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-CONTRATS;;;;;;;03-RH\01-PaieCONTRATS;;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
GDL_01-01_RW04-IT;02-PROJETS;2026;;;;;;04-IT\02-PROJETS\2026;NON;;;;;;
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
Ajouter les GG dans les GDL
Pour cette dernière étape, le script va utiliser les colonnes GG_RW qui va ajouter comme membre du GDL_RW correspondant, idem pour GG_RO avec GDL_RO :
<#
===============================================================================
SCRIPT : 6.1 - Ajout_G_dans_GDL.ps1
OBJET : Aligne les GDL avec les GG listes dans le CSV (GG_ECRITURE / GG_LECTURE)
===============================================================================
DESCRIPTION :
- Pour chaque ligne du CSV :
* Nettoie les membres "groupes non GDL" des GDL cibles
* Ajoute les GG_ECRITURE dans GDL_ECRITURE
* Ajoute les GG_LECTURE dans GDL_LECTURE
- Ignore proprement les cellules vides
- Logue les groupes AD introuvables (UTF8-BOM)
- Une seule barre de progression Write-Progress
- Messages sans accents (compatibilite)
PREREQUIS :
- 2.1 : GDL crees (GDL_ECRITURE / GDL_LECTURE renseignes dans CSV)
- 5.1 : GG crees (version 2-passes recommande)
===============================================================================
#>
Param(
[string]$CsvPath = "C:\Chemin\vers\fichier.AGDLP\ORG_ARBO_GDL.csv",
[string]$LogFile = "C:\AGDLP\GG_to_GDL_Errors.txt"
)
Try$ErrorActionPreference = "Stop"
# ----------------------------------------------------------------------------
# 0) Chargement module Active Directory
# ----------------------------------------------------------------------------
try { Import-Module ActiveDirectory -ErrorAction Stop }
Catchcatch { Write-Error "Module ActiveDirectory introuvable (installer RSAT)."; exit 1 }
# Import----------------------------------------------------------------------------
# 1) Initialisation log
# ----------------------------------------------------------------------------
$utf8Bom = New-Object System.Text.UTF8Encoding($true)
[System.IO.File]::WriteAllText($LogFile, "", $utf8Bom)
# ----------------------------------------------------------------------------
# 2) Lecture / validations de base
# ----------------------------------------------------------------------------
if (-not (Test-Path $CsvPath)) { Write-Error "CSV avecintrouvable UTF8: et séparateur $CsvPath"; exit 1 }
$GDLListrows = Import-Csv -Path $CsvPath -Delimiter '";'" -Encoding UTF8
foreach$total = $rows.Count
$index = 0
Write-Host "Ajout des GG dans les GDL a partir : $CsvPath"
Write-Host "Log : $LogFile"
Write-Host ""
# ----------------------------------------------------------------------------
# 3) Fonctions utilitaires
# ----------------------------------------------------------------------------
# Nettoyage leger des cellules (supprime NBSP, guillemets typographiques, espaces parasites)
function Clean-Cell([string]$s) {
if (-not $s) { return "" }
$s = $s -replace " ", " "
$s = $s -replace "\u00A0", " " # NBSP
$s = $s -replace "\u200B", "" # ZWSP
$s = $s -replace "[«»“”‘’]", ""
return ($rows in-replace "\s+", " ").Trim()
}
# Transforme "A, B , C" -> tableau ["A","B","C"] en nettoyant chaque element
function Parse-GGList([string]$GDLList)cell) {
$gdlROcell = $row.GDL_ROClean-Cell $gdlRWcell
=if (-not $row.GDL_RWcell) #{ Récupérer les GG de la colonne GG_RO (séparateur ,)
$ggRO =return @() if}
($row.GG_RO -andreturn $row.GG_RO.Trim() -ne cell.Split(",") {
$ggRO = $row.GG_RO.Split(',') | ForEach-Object { $_.Trim() } | Where-Object {Clean-Cell $_ -ne "" }
}
# Récupérer les GG de la colonne GG_RW (séparateur ,)
$ggRW = @()
if ($row.GG_RW -and $row.GG_RW.Trim() -ne "") {
$ggRW = $row.GG_RW.Split(',') | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" }
}
# ----------------------------------------------------------------------------
Supprimer# uniquement4) lesParcours des lignes
# ----------------------------------------------------------------------------
foreach ($row in $rows) {
$index++
Write-Progress -Activity "Ajout GG existants-> duGDL" GDL_RO-Status "$index / $total" -PercentComplete (($index / $total) * 100)
# Recup GDL cibles
$gdlE = Clean-Cell $row.GDL_ECRITURE
$gdlL = Clean-Cell $row.GDL_LECTURE
# Rien a faire si pas de GDL cible
if ([string]::IsNullOrWhiteSpace($gdlE) -and [string]::IsNullOrWhiteSpace($gdlL)) { continue }
# Parse des listes de GG declarees
$ggE = Parse-GGList $row.GG_ECRITURE
$ggL = Parse-GGList $row.GG_LECTURE
# ---------------------------
# 4.1) Nettoyage GDL_ECRITURE
# ---------------------------
if ($gdlRO)gdlE) {
# On ne retire que les "groupes non GDL_*" (on conserve chainages/parents GDL)
$currentMembersROcurrentE = Get-ADGroupMember -Identity $gdlROgdlE -ErrorAction SilentlyContinue |
Where-Object { $_.objectClass -eq 'group' -and $_.distinguishedNameName -notlike "CN=GDL_*" }
if ($currentMembersRO)currentE) {
Trytry {
Remove-ADGroupMember -Identity $gdlROgdlE -Members $currentMembersROcurrentE -Confirm:$false -ErrorAction StopSilentlyContinue
Write-Host "TousNettoye les GG supprimés de: $gdlRO"gdlE (groupes non GDL)"
}
Catchcatch {
$msg = "Nettoyage impossible GDL_ECRITURE=$gdlE : $_`r`n"
[System.IO.File]::AppendAllText($LogFile, $msg, $utf8Bom)
Write-Warning "ImpossibleNettoyage de supprimer certains GG de $gdlROpartiel : $_"gdlE (voir log)."
}
}
}
# -------------------------
Supprimer# uniquement4.2) lesNettoyage GGGDL_LECTURE
existants# du GDL_RW -------------------------
if ($gdlRW)gdlL) {
$currentMembersRWcurrentL = Get-ADGroupMember -Identity $gdlRWgdlL -ErrorAction SilentlyContinue |
Where-Object { $_.objectClass -eq 'group' -and $_.distinguishedNameName -notlike "CN=GDL_*" }
if ($currentMembersRW)currentL) {
Trytry {
Remove-ADGroupMember -Identity $gdlRWgdlL -Members $currentMembersRWcurrentL -Confirm:$false -ErrorAction StopSilentlyContinue
Write-Host "TousNettoye les GG supprimés de: $gdlRW"gdlL (groupes non GDL)"
}
Catchcatch {
$msg = "Nettoyage impossible GDL_LECTURE=$gdlL : $_`r`n"
[System.IO.File]::AppendAllText($LogFile, $msg, $utf8Bom)
Write-Warning "ImpossibleNettoyage de supprimer certains GG de $gdlRWpartiel : $_"gdlL (voir log)."
}
}
}
# ---------------------------------
Ajouter# les4.3) GG_ROAjout audes GDL_ROGG_ECRITURE -> GDL_ECRITURE
# ---------------------------------
if ($ggRO.gdlE -and $ggE.Count -gt 0 -and $gdlRO)0) {
foreach ($memberm in $ggRO)ggE) {
$grp = Get-ADGroup -Identity $m -ErrorAction SilentlyContinue
if (Get-ADGroup-not -Filter "Name -eq '$member'" -ErrorAction SilentlyContinue)grp) {
Try$msg {= "GG_ECRITURE introuvable : $m (cible : $gdlE)`r`n"
[System.IO.File]::AppendAllText($LogFile, $msg, $utf8Bom)
Write-Warning "GG introuvable : $m -> ignore"
continue
}
Add-ADGroupMember -Identity $gdlROgdlE -Members $membergrp -ErrorAction StopSilentlyContinue
Write-Host "Ajout de '$member' dans $gdlRO"
} Catch {
Write-Warning "Impossible d'ajouter '$member' à $gdlROAjoute : $_"m }-> } else {
Write-Warning "GG_RO '$member' introuvable dans AD"
}gdlE"
}
}
# -------------------------------
Ajouter# les4.4) GG_RWAjout audes GDL_RWGG_LECTURE -> GDL_LECTURE
# -------------------------------
if ($ggRW.gdlL -and $ggL.Count -gt 0 -and $gdlRW)0) {
foreach ($memberm in $ggRW)ggL) {
$grp = Get-ADGroup -Identity $m -ErrorAction SilentlyContinue
if (Get-ADGroup-not -Filter "Name -eq '$member'" -ErrorAction SilentlyContinue)grp) {
Try$msg {= "GG_LECTURE introuvable : $m (cible : $gdlL)`r`n"
[System.IO.File]::AppendAllText($LogFile, $msg, $utf8Bom)
Write-Warning "GG introuvable : $m -> ignore"
continue
}
Add-ADGroupMember -Identity $gdlRWgdlL -Members $membergrp -ErrorAction StopSilentlyContinue
Write-Host "Ajout de '$member' dans $gdlRW"
} Catch {
Write-Warning "Impossible d'ajouter '$member' à $gdlRWAjoute : $_"m }-> } else {
Write-Warning "GG_RW '$member' introuvable dans AD"gdlL"
}
}
}
}Write-Progress -Activity "Ajout GG -> GDL" -Completed
Write-Host ""
Write-Host "Alignement GG -> GDL termine. Voir le log si des avertissements apparaissent."

