Skip to main content

Appliquer les ACL

agdlp.png

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 répertoires,utilisateurs crééGDL_00_RW GDL_00_RO   00-Commun\01-Scan Tous les GDL,utilisateurs et mis enGDL_00-01_RW placeGDL_00-01_RO leurGDL_00_RO hiérarchie, nereste00-Commun\02-Sport plusGG_Sport qu'à appliquer desGDL_00-02_RW droitsGDL_00-02_RO àGDL_00_RO nos GDLsur01-RH leurGG_RH, dossiersGG_Direction respectifs.  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.