Skip to main content

Appliquer les ACL

agdlp.png

Introduction

Nous avonsreprenons crééune nouvelle fois notre fichier CSV :

créé etenplaceleurhiérarchie,neresteplusqu'àdesdroitsànosGDLsurleurrespectifs.

FolderPathGG_RWGG_ROGDL_RWGDL_ROParent_GDL
00-Commun Tous les répertoires,utilisateurs GDL_00_RWGDL_00_RO 
00-Commun\01-ScanTous les GDL,utilisateurs  mis GDL_00-01_RW GDL_00-01_RO GDL_00_RO
00-Commun\02-Sport GG_Sport  appliquer GDL_00-02_RW GDL_00-02_RO GDL_00_RO
01-RH GG_RH, dossiersGG_Direction  GDL_01_RWGDL_01_RO 
01-RH\01-Paie  GDL_01-01_RWGDL_01-01_ROGDL_01_RO
01-RH\01-Paie\01-2025  GDL_01-01-01_RWGDL_01-01-01_ROGDL_01-01_RO
01-RH\01-Paie\01-2025\01-Janvier  GDL_01-01-01-01_RWGDL_01-01-01-01_ROGDL_01-01-01_RO
01-RH\01-Paie\01-2025\02-Février  GDL_01-01-01-02_RWGDL_01-01-01-02_ROGDL_01-01-01_RO
01-RH\01-Paie\01-2025\03-Mars  GDL_01-01-01-03_RWGDL_01-01-01-03_ROGDL_01-01-01_RO
01-RH\01-Paie\01-2025\04-Avril  GDL_01-01-01-04_RWGDL_01-01-01-04_ROGDL_01-01-01_RO
01-RH\01-Paie\01-2025\05-Mai  GDL_01-01-01-05_RWGDL_01-01-01-05_ROGDL_01-01-01_RO
01-RH\02-Formation  GDL_01-02_RWGDL_01-02_ROGDL_01_RO
01-RH\03-Carrière  GDL_01-03_RWGDL_01-03_ROGDL_01_RO
02-InformatiqueGG_InformatiqueTous les utilisateursGDL_02_RWGDL_02_RO 
02-Informatique\01-Procédures Tous les utilisateursGDL_02-01_RWGDL_02-01_ROGDL_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.