Skip to main content

Appliquer les ACL

agdlp.png

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.