Appliquer les ACL
Introduction
Nous avonsreprenons crééune nouvelle fois notre fichier CSV :
| FolderPath | GG_RW | GG_RO | GDL_RW | GDL_RO | Parent_GDL |
| 00-Commun | Tous les |
GDL_00_RW | GDL_00_RO | ||
| 00-Commun\01-Scan | Tous les |
|
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, |
GDL_01_RW | GDL_01_RO | ||
| 01-RH\01-Paie | GDL_01-01_RW | 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 |
Application des droits
Voici le script qui permet d'appliquer les droits à chaque GDL homonymique de son répertoire, ainsi que l'héritage des groupes RW à l'ensemble des enfantsenfants.
Encore une fois, le script ne ce sert que des colonnes utiles dans le cas présent : FolderPath, GDL_RW et GDL_RO :
Param(
[string]$RootPath = "D:C:\Chemin\destination"Destination\Arbo",
[string]$CsvPath = "C:\chemin\Chemin\vers\GDLMapping.fichier.csv"
)
# Vérifier droits administratifs
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Warning "Le script doit être lancé en tant qu'administrateur."
exit
}
# Lecture du CSV avec séparateur ; et UTF8
$GDLMapping = Import-Csv -Path $CsvPath -Delimiter ';' -Encoding UTF8
# Comptes supplémentaires à RW
$RWAdmins = @("Administrateurs", "Admins du domaine", "SYSTEM")
foreach ($entry in $GDLMapping) {
# Construire le chemin complet correctement
$folderFullPath = Join-Path -Path $RootPath -ChildPath $entry.FolderPath
if (-not (Test-Path -LiteralPath $folderFullPath)) {
Write-Warning "Dossier introuvable pour $($entry.GDLNameRO) → $folderFullPath"
Write-Warning "Dossier introuvable pour $($entry.GDLNameRW) →: $folderFullPath"
continue
}
try {
# Réinitialiser ACL existantes
$acl = Get-Acl -LiteralPath $folderFullPath
$acl.SetAccessRuleProtection($true, $false) # désactiver héritage, supprimer règles existanteshéritage
$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) }
# Appliquer RW auxau groupesGDL_RW
RWif (récursif)$entry.GDL_RW -and $entry.GDL_RW.Trim() -ne "") {
$rwRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$entry.GDLNameRW,GDL_RW,
"Modify",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($rwRule)
}
# Appliquer RO auxau groupesGDL_RO
ROif (uniquement$entry.GDL_RO dossier)-and $entry.GDL_RO.Trim() -ne "") {
$roRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$entry.GDLNameRO,GDL_RO,
"ReadAndExecute",
"ContainerInherit"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($roRule)
}
# Appliquer RW aux comptes administratifs (récursif)
foreach ($admin in $RWAdmins) {
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$admin,
"Modify",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($adminRule)
}
# Sauvegarder les ACL
Set-Acl -LiteralPath $folderFullPath -AclObject $acl
Write-Host "Droits appliqués sur $folderFullPath"
} catch {
Write-Warning "Erreur sur $folderFullPath : $_"
}
}
Parfait ! Nous avons à présent mise en place l'AGDLP pour une gestion des droits beaucoup plus fine, facile, et modulable dans le temps.
De plus, ce script s'appuie sur un répertoire racine qui peut etre modifié, si jamais une nouvelle branche devait être créé dans le partage.
