Skip to main content

Création de l'arborescence

agdlp.png

Introduction

Comme vu plus tôt dans ce chapitre, il est très long et complexe de mettre en place l'AGDLP car il faut des GDL (Groupe de Domaine Local)
C'est pourquoi j'ai mis en place une série de script, qui permet d'automatiser la création des dossiers, si on part de zéro, mais aussi la création des GDL, la parentalité des GDL, ainsi que l'application des droits sur les répertoires !

Structure et nomenclature

Commençons par définir la structure de notre arborescence dans un petit fichier csv : 
Il y aura troisplusieurs colonnes :

une
premièreNIVEAU1-8 représentent les différents niveau de répertoires gérés par le SI de l'organisation FolderPath sera généré par un script, ce sera la concaténation de NIVEAU1-8 pour lesformer cheminsun absoluschemin desabsolu répertoiresCREER_GROUPE permet de définir si on à créer,besoin lesde deuxGDL autrespour serontce répertoire, si c'est le niveau final souhaité ici GG_ECRITURE on liste les groupes globauxde (GG)personnes respectivementqui Lectureauront un accès en écriture à partir de ce répertoire, et Lecture/Ecriture
Pourtous bienles faire,enfants GG_LECTURE on valiste toujoursles définir le chemin absolugroupes de chaquepersonnes répertoirequi :
auront un accès en lecture à partir de ce répertoire, et tous les enfants

Voici le tableau CSV :

FolderPath GG_RW GG_RO 00-Commun   Tous les utilisateurs 00-Commun\01-Scan Tous les utilisateurs   00-Commun\02-Sport GG_Sport   01-RH GG_RH, GG_Direction   01-RH\01-Paie     01-RH\01-Paie\01-2025     01-RH\01-Paie\01-2025\01-Janvier     01-RH\01-Paie\01-2025\02-Février     01-RH\01-Paie\01-2025\03-Mars     01-RH\01-Paie\01-2025\04-Avril     01-RH\01-Paie\01-2025\05-Mai     01-RH\02-Formation     01-RH\03-Carrière     02-Informatique GG_Informatique Tous les utilisateurs 02-Informatique\01-Procédures   Tous les utilisateurs

Et en vue CSV :
image.png

NIVEAU 1;NIVEAU 2;NIVEAU 3;NIVEAU 4;NIVEAU 5;NIVEAU 6;NIVEAU 7;NIVEAU 8;FolderPath;GG_RW;GG_RO
00-Commun;;Tous les utilisateurs
00-Commun\01-Scan;Tous les utilisateurs;
00-Commun\02-Sport;GG_Sport;CREER_GROUPES;GG_ECRITURE;GG_LECTURE
01-DIRECTION;;;;;;;;;;ORG_GG_DIRECTION;
02-FINANCE;;;;;;;;;;ORG_GG_FINANCE;ORG_GG_DIRECTION
02-FINANCE;01-BUDGET;;;;;;;;;ORG_GG_FINANCE;ORG_GG_DIRECTION
02-FINANCE;02-FACTURES;;;;;;;;;ORG_GG_FINANCE;ORG_GG_DIRECTION
03-RH;GG_RH,;;;;;;;;;ORG_GG_RH;ORG_GG_DIRECTION
GG_Direction;03-RH;01-CONTRATS;;;;;;;;;ORG_GG_RH;ORG_GG_DIRECTION
01-RH\01-Paie;03-RH;02-PAIE;;;;;;;;NON;;
04-IT;;;;;;;;;;ORG_GG_IT;ORG_GG_DIRECTION
04-IT;01-RH\01-Paie\01-2025;INFRA;;;;;;;;;ORG_GG_IT;ORG_GG_DIRECTION
01-RH\01-Paie\01-2025\01-Janvier;04-IT;02-PROJETS;;;;;;;;;ORG_GG_IT;ORG_GG_DIRECTION
01-RH\01-Paie\01-2025\04-IT;02-Février;PROJETS;2026;;
01-RH\01-Paie\01-2025\03-Mars;;
01-RH\01-Paie\01-2025\04-Avril;;
01-RH\01-Paie\01-2025\05-Mai;;
01-RH\02-Formation;;
01-RH\03-Carrière;;
02-Informatique;GG_Informatique;Tous les utilisateurs
02-Informatique\01-Procédures;NON;;Tous les utilisateurs

Avec cette structure de fichier, et de dossier, il sera plus simple de procéder pour la suite.

J'ai fait le choix, pour des questions de simplicité, de numéroter l'ensemble des répertoire, ce qui permet de choisir l'ordre de ces derniers, et rendra bien plus lisible les GDL, et leur gestion automatisée. Nous verrons cela dans les pages suivantes.

Il faut bien penser à créer une ligne par répertoire, car chaque ligne représente ces derniers, avec leur permissions qui leurs sont propres.

Création des dossiers

La structure du fichier, avec des chemins absolus, permet de faciliter l'écriture du script.
En effet, chaque ligne représentant un chemin absolu donc chaque nom de répertoire est séparé des autres par un "\".
Il suffit alors de créer les dossiers en lisant le fichier comme cela.

<#
===============================================================================
SCRIPT : 1.1 - Creation_Arborescence.ps1
OBJET  : Creation de l arborescence de dossiers a partir du CSV source
===============================================================================

DESCRIPTION :
  - Ce script lit le fichier CSV contenant les colonnes NIVEAU 1 .. NIVEAU 8
  - Construit un chemin "FolderPath" en concatenant les niveaux non vides
  - Remplace les caracteres interdits Windows et force les noms en majuscules
  - Cree les dossiers physiquement dans le partage cible
  - Met a jour la colonne FolderPath dans le CSV

Toutes les chaines visibles sont sans accents pour compatibilite maximum.
Les commentaires interne sont en francais normal.
===============================================================================
#>

Param(
    [string]$CsvPath    = "C:\Chemin\vers\fichier.AGDLP\\ORG_ARBO_GDL.csv",
    [string]$Destination = "C:\Chemin\Destination\Arbo"\SRV-DATAS\datas\"
)

$ErrorActionPreference = "Stop"

# Import---------------------------------------------------------------------------
CSV# avec1. UTF8Verification etdes séparateurpre-requis
;# ---------------------------------------------------------------------------

if (-not (Test-Path $CsvPath)) {
    Write-Error "Le fichier CSV est introuvable : $CsvPath n'existe pas."CsvPath"
    exit 1
}

if (-not (Test-Path $GDLListDestination)) {
    Write-Error "Le dossier de destination est introuvable : $Destination"
    exit 1
}

# ---------------------------------------------------------------------------
# 2. Lecture du CSV
# ---------------------------------------------------------------------------

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

Write-Host "Creation des dossiers a partir du fichier : $CsvPath"
Write-Host "Dossier cible : $Destination"
Write-Host ""

# ---------------------------------------------------------------------------
# 3. Boucle principale
# ---------------------------------------------------------------------------

foreach ($row in $GDLList)rows) {
    $ligneindex++

    # Mise a jour de la barre de progression
    Write-Progress `
        -Activity "Creation des dossiers" `
        -Status "$index / $total" `
        -PercentComplete (($index / $total) * 100)

    # Construction du chemin logique a partir des colonnes NIVEAU X
    $niveaux = @()
    for ($i = 1; $i -le 8; $i++) {
        $col = "NIVEAU $i"
        if ($row.PSObject.Properties.Name -contains $col) {
            $val = $row.FolderPath.Trim()$col
            if ($val -and $val.Trim() -ne "") {
                $niveaux += $val.Trim()
            }
        }
    }

    # Si la ligne ne contient aucun niveau, on passe
    if ($niveaux.Count -eq "")0) { continue }

    # DécouperNettoyage ledu chemin sur: lescaracteres interdits + majuscules
    $raw       = $niveaux -join "\"
    $parts     = $ligne.raw.Split('"\'")

    # Nettoyer les caractères interdits pour Windows
    $safeParts = foreach ($p in $parts) {
        ($p -replace '[:*?"<>|]', '_'"_").ToUpper()
    }

    $folderPath = $safeParts -join "\"

    # Ajout ou mise a jour de FolderPath dans la ligne CSV
    if ($row.PSObject.Properties.Name -contains "FolderPath") {
        $row.FolderPath = $folderPath
    }
    else {
        $row | Add-Member -Name FolderPath -MemberType NoteProperty -Value $folderPath -Force
    }

    # CréerCreation lesphysique des dossiers
    $fullPathcurrent = $Destination
    foreach ($partsp in $safeParts) {
        $fullPathcurrent = Join-Path $fullPathcurrent $partsp

        if (-not (Test-Path -LiteralPath $fullPath)current)) {
            try {
                New-Item -Path $fullPathcurrent -ItemType Directory -Force | Out-Null
                Write-Host "CréationCree :    $fullPath"current"
            }
            catch {
                Write-Warning "Erreur créationlors de $fullPathla creation : $current -> $_"
            }
        }
        else {
            Write-Host "Existe déjà :  $fullPath"current"
        }
    }
}

# Effacer la barre de progression
Write-Progress -Activity "Creation des dossiers" -Completed

# ---------------------------------------------------------------------------
# 4. Sauvegarde du CSV mis a jour
# ---------------------------------------------------------------------------

$utf8 = New-Object System.Text.UTF8Encoding($true)
$content = $rows | ConvertTo-Csv -Delimiter ";" -NoTypeInformation
[System.IO.File]::WriteAllLines($CsvPath, $content, $utf8)

Write-Host ""
Write-Host "CSV mis a jour : $CsvPath" -ForegroundColor Green
Write-Host "Creation arborescence terminee."

Avec cela, nous avons une arborescence toute neuve et propre (presque, celle-ci n'est évidemment la que pour le test)

image.pngimage.png

Apres

Voici à quoi ressemble le CSV après le premier script :

image.png

NIVEAU 1;NIVEAU 2;NIVEAU 3;NIVEAU 4;NIVEAU 5;NIVEAU 6;NIVEAU 7;NIVEAU 8;FolderPath;CREER_GROUPES;GG_ECRITURE;GG_LECTURE
01-DIRECTION;;;;;;;;01-DIRECTION;;ORG_GG_DIRECTION;
02-FINANCE;;;;;;;;02-FINANCE;;ORG_GG_FINANCE;ORG_GG_DIRECTION
02-FINANCE;01-BUDGET;;;;;;;02-FINANCE\01-BUDGET;;ORG_GG_FINANCE;ORG_GG_DIRECTION
02-FINANCE;02-FACTURES;;;;;;;02-FINANCE\02-FACTURES;;ORG_GG_FINANCE;ORG_GG_DIRECTION
03-RH;;;;;;;;03-RH;;ORG_GG_RH;ORG_GG_DIRECTION
03-RH;01-CONTRATS;;;;;;;03-RH\01-CONTRATS;;ORG_GG_RH;ORG_GG_DIRECTION
03-RH;02-PAIE;;;;;;;03-RH;NON;;
04-IT;;;;;;;;04-IT;;ORG_GG_IT;ORG_GG_DIRECTION
04-IT;01-INFRA;;;;;;;04-IT\01-INFRA;;ORG_GG_IT;ORG_GG_DIRECTION
04-IT;02-PROJETS;;;;;;;04-IT\02-PROJETS;;ORG_GG_IT;ORG_GG_DIRECTION
04-IT;02-PROJETS;2026;;;;;;04-IT\02-PROJETS\2026;NON;;

La colonne FolderPath est remplie.

Passons à la suite, avec les GDL !