Création de l'arborescence
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 :
auront un accès en lecture à partir de ce répertoire, et tous les enfants
Voici le tableau CSV :
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)
Apres
Voici à quoi ressemble le CSV après le premier script :
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 !




