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 plusieurs colonnes :

  • NIVEAU1-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 former un chemin absolu
  • CREER_GROUPE permet de définir si on à besoin de GDL pour ce répertoire, si c'est le niveau final souhaité ici
  • GG_ECRITURE on liste les groupes de personnes qui auront un accès en écriture à partir de ce répertoire, et tous les enfants
  • GG_LECTURE on liste les groupes de personnes qui auront un accès en lecture à partir de ce répertoire, et tous les enfants

Voici le tableau CSV :

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;;;;;;;;;;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;;;;;;;;;;ORG_GG_RH;ORG_GG_DIRECTION
03-RH;01-CONTRATS;;;;;;;;;ORG_GG_RH;ORG_GG_DIRECTION
03-RH;02-PAIE;;;;;;;;NON;;
04-IT;;;;;;;;;;ORG_GG_IT;ORG_GG_DIRECTION
04-IT;01-INFRA;;;;;;;;;ORG_GG_IT;ORG_GG_DIRECTION
04-IT;02-PROJETS;;;;;;;;;ORG_GG_IT;ORG_GG_DIRECTION
04-IT;02-PROJETS;2026;;;;;;;NON;;

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:\AGDLP\ORG_ARBO_GDL.csv",
    [string]$Destination = "\\SRV-DATAS\datas\"
)

$ErrorActionPreference = "Stop"

# ---------------------------------------------------------------------------
# 1. Verification des pre-requis
# ---------------------------------------------------------------------------

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

if (-not (Test-Path $Destination)) {
    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 $rows) {
    $index++

    # 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.$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 }

    # Nettoyage du chemin : caracteres interdits + majuscules
    $raw       = $niveaux -join "\"
    $parts     = $raw.Split("\")
    $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
    }

    # Creation physique des dossiers
    $current = $Destination
    foreach ($sp in $safeParts) {
        $current = Join-Path $current $sp

        if (-not (Test-Path -LiteralPath $current)) {
            try {
                New-Item -Path $current -ItemType Directory -Force | Out-Null
                Write-Host "Cree :    $current"
            }
            catch {
                Write-Warning "Erreur lors de la creation : $current -> $_"
            }
        }
        else {
            Write-Host "Existe :  $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.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 !