Skip to main content

Appliquer les ACL

agdlp.pngagdlp.png

Introduction

Nous en arrivons à la dernière étape, nous avons créé les répertoires, créé les GDL, et mis en place leur hiérarchie, ne reste plus qu'à appliquer des droits à nos GDL sur leur dossiers respectifs.

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 :

Import-ModuleParam(
    ActiveDirectory

# Racine des dossiers
[string]$SourcePathRootPath = "D:\Chemin\destination",
    [string]$CsvPath = "C:\chemin\vers\Partage"GDLMapping.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
$GDLMapping = Import-Csv -Path $CsvPath -Encoding UTF8

# Comptes supplémentaires à toujours en Full ControlRW
$alwaysRWRWAdmins = @("Administrateurs", "Admins du domaine", "SYSTEM")

# Fonction pour récupérer les tokens (premier mot de chaque dossier)
function Get-Tokens($parts) {
    $tokens = @()

foreach ($pentry in $parts)GDLMapping) {
    # Construire le chemin complet correctement
    $tokensfolderFullPath += ($pJoin-Path -splitPath $RootPath -ChildPath $entry.FolderPath

    if (-not (Test-Path -LiteralPath $folderFullPath)) {
        Write-Warning "Dossier ")[0]
    }
    return $tokens
}

# Fonctionintrouvable pour générer$($entry.GDLNameRO) le nom de groupe
function Get-GroupName($tokens, $type)folderFullPath"
        {
    returnWrite-Warning "GDL_"Dossier +introuvable pour $($tokensentry.GDLNameRW) -join "-")$folderFullPath"
        + "_$type"continue
    }

# --- Réinitialiser les droits sur la racine et appliquer Full Control aux comptes admin ---

    try {
        # ---Réinitialiser PartieACL resetexistantes
        des$acl droits= !Get-Acl ---LiteralPath $folderFullPath
        $acl.SetAccessRuleProtection($true, $false) # --- A désactiver sihéritage, voussupprimer nerègles partezexistantes
        pas$acl.Access de| zéroForEach-Object !{ $acl.RemoveAccessRule($_) }

        # Appliquer RW aux groupes RW (récursif)
        $rwRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
            $entry.GDLNameRW,
            "Modify",
            "ContainerInherit,ObjectInherit",
            "None",
            "Allow"
        )
        $acl.AddAccessRule($rwRule)

        # Appliquer RO aux groupes RO (uniquement dossier)
        $roRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
            $entry.GDLNameRO,
            "ReadAndExecute",
            "ContainerInherit",
            "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 "RéinitialisationDroits des droits sur la racine $SourcePath ..."
    icacls $SourcePath /reset /T /C
    # --- Partie droits totals pour les admins et system ---
    foreach ($account in $alwaysRW) {
        icacls $SourcePath /grant "${account}:(OI)(CI)F" /T /C
        Write-Host "Full Control appliqué à $accountappliqués sur $SourcePath (hérité sur tous les sous-dossiers)"
    }folderFullPath"
    } catch {
        Write-Warning "Erreur sur la racine$folderFullPath : $_"
}

# Parcours récursif des dossiers
Get-ChildItem -Path $SourcePath -Directory -Recurse | ForEach-Object {
    $fullPath = $_.FullName
    $relativePath = $fullPath.Substring($SourcePath.Length).Trim("\")
    $parts = $relativePath -split "\\"

    if ($parts.Count -gt 0) {
        $tokens = Get-Tokens $parts

        $groupRO = Get-GroupName $tokens "RO"
        $groupRW = Get-GroupName $tokens "RW"

        # Vérifier que les groupes existent
        $adRO = Get-ADGroup -Filter "Name -eq '$groupRO'" -ErrorAction SilentlyContinue
        $adRW = Get-ADGroup -Filter "Name -eq '$groupRW'" -ErrorAction SilentlyContinue

        if (-not $adRO -or -not $adRW) {
            Write-Warning "Groupes manquants pour $fullPath : $groupRO / $groupRW"
            return
        }

        try {
            # RO → lecture minimale
            icacls $fullPath /grant "${groupRO}:(OI)(CI)(RX)" /C
            Write-Host "Droits RO appliqués : $groupRO → $fullPath"

            # RW → modification complète
            icacls $fullPath /grant "${groupRW}:(OI)(CI)(M)" /C
            Write-Host "Droits RW appliqués : $groupRW → $fullPath"

        } catch {
            Write-Warning "Erreur application droits sur $fullPath : $_"
        }
    }
}

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.