Skip to main content

Liaison GG-GDL

agdlp.png

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 :

image.png

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 "&nbsp;", " "
    $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."