Hiérarchie des GDL
Introduction
Afin de pouvoir administrer au mieux les droits, il faut une hiérarchie, un exemple avec notre structure de test :
00 - Commun
00 - Commun\01 - Scan
00 - Commun\02 - Sport
01 - RH
01 - RH\01 - Paie\2025\Janvier
01 - RH\01 - Paie\2025\Février
01 - RH\01 - Paie\2025\Mars
01 - RH\01 - Paie\2025\Avril
01 - RH\01 - Paie\2025\Mai
01 - RH\02 - Formation
01 - RH\03 - Carrière
02 - Informatique
02 - Informatique\01 - Procédures
Ici, il faut que le GDL "01 - RH\01 - Paie\2025\Janvier" qui est lecture écriture donc "GDL_01-01-2025-Janvier_RW" soit membre de "01 - RH\01 - Paie\2025" lecture donc "GDL_01-01-202_RO", qui lui même sera membre de "GDL_01-01_RO" etc etc
De plus, il faut, au contraire que "GDL_01_RW" par exemple ai des droits récursifs sur l'ensemble des enfants, mais cela sera pour une prochaine partie.
Mise ne place de la hiérarchie
On en vient donc au script qui permet de faire ça :
Import-Module ActiveDirectory
# Fichier modèle
$defFile = "chemin\vers\arborescence.txt"
# Fonction qui transforme un chemin en tokens (premier mot de chaque dossier)
function Get-Tokens($parts) {
$tokens = @()
foreach ($p in $parts) {
$tokens += ($p -split " ")[0] # premier mot uniquement
}
return $tokens
}
# Fonction qui génère le nom d’un groupe (RW ou RO)
function Get-GroupName($tokens, $type) {
return "GDL_" + ($tokens -join "-") + "_$type"
}
# Lecture du fichier UTF8 pour les accents
$lines = Get-Content -Path $defFile -Encoding UTF8 | Where-Object { $_.Trim().Length -gt 0 }
foreach ($line in $lines) {
$parts = $line.Trim().Split('\')
$tokens = Get-Tokens $parts
# Créer un tableau avec les tokens de tous les niveaux
$allTokens = @()
for ($i = 0; $i -lt $tokens.Count; $i++) {
$allTokens += ,($tokens[0..$i])
}
# Boucle sur tous les niveaux (sauf le premier niveau qui n’a pas de parent)
for ($i = 1; $i -lt $allTokens.Count; $i++) {
$currentTokens = $allTokens[$i]
$parentTokens = $allTokens[$i-1]
$currentRO = Get-GroupName $currentTokens "RO"
$currentRW = Get-GroupName $currentTokens "RW"
$parentRO = Get-GroupName $parentTokens "RO"
# Ajouter RW enfant à parent RO
if ((Get-ADGroup -Filter "Name -eq '$currentRW'" -ErrorAction SilentlyContinue) -and
(Get-ADGroup -Filter "Name -eq '$parentRO'" -ErrorAction SilentlyContinue)) {
try {
Add-ADGroupMember -Identity $parentRO -Members $currentRW -ErrorAction Stop
Write-Host "$currentRW → $parentRO (ajouté)"
} catch {
Write-Warning "Erreur: $currentRW → $parentRO ($_)"
}
}
# Ajouter RO enfant à parent RO
if ((Get-ADGroup -Filter "Name -eq '$currentRO'" -ErrorAction SilentlyContinue) -and
(Get-ADGroup -Filter "Name -eq '$parentRO'" -ErrorAction SilentlyContinue)) {
try {
Add-ADGroupMember -Identity $parentRO -Members $currentRO -ErrorAction Stop
Write-Host "$currentRO → $parentRO (ajouté)"
} catch {
Write-Warning "Erreur: $currentRO → $parentRO ($_)"
}
}
}
}
Avec cela, chaque enfant RO et RW est membre de son parent RO direct.
Prochaine étape appliquer les ACL aux répertoires du partage !
No comments to display
No comments to display