Appliquer les ACL
Introduction
Nous reprenons une nouvelle fois notre fichier CSV :
| FolderPath | GG_RW | GG_RO | GDL_RW | GDL_RO | Parent_GDL |
| 00-Commun | Tous les utilisateurs | GDL_00_RW | GDL_00_RO | ||
| 00-Commun\01-Scan | Tous les utilisateurs | 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, GG_Direction | 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 enfants.
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 = "C:\Chemin\Destination\Arbo",
[string]$CsvPath = "C:\Chemin\vers\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) {
$folderFullPath = Join-Path -Path $RootPath -ChildPath $entry.FolderPath
if (-not (Test-Path -LiteralPath $folderFullPath)) {
Write-Warning "Dossier introuvable : $folderFullPath"
continue
}
try {
# Réinitialiser ACL existantes
$acl = Get-Acl -LiteralPath $folderFullPath
$acl.SetAccessRuleProtection($true, $false) # désactiver héritage
$acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) }
# Appliquer RW au GDL_RW
if ($entry.GDL_RW -and $entry.GDL_RW.Trim() -ne "") {
$rwRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$entry.GDL_RW,
"Modify",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($rwRule)
}
# Appliquer RO au GDL_RO
if ($entry.GDL_RO -and $entry.GDL_RO.Trim() -ne "") {
$roRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$entry.GDL_RO,
"ReadAndExecute",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($roRule)
}
# Appliquer RW aux comptes administratifs
foreach ($admin in $RWAdmins) {
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$admin,
"Modify",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($adminRule)
}
# Sauvegarder 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.

No comments to display
No comments to display