📥 Télécharger creation-partages.ps1

Rôle du script

Pour un dossier donné, le script met en place en une seule commande la gestion des accès selon la méthode AGDLP :

  1. crée dans Active Directory les groupes de domaine local (DL) associés au dossier ;
  2. partage le dossier sur le réseau (SMB) ;
  3. pose les droits NTFS des groupes DL sur le dossier et retire les autres.

💡 Rappel AGDLP : les comptes (A) sont membres de groupes globaux (G), eux-mêmes membres des groupes de domaine local (DL) qui portent les permissions (P) sur la ressource. Voir Active Directory et Droits d'accès.


Prérequis


Paramètres

Paramètre Rôle Exemple
-FolderPath Chemin du dossier à partager S:\DATA\COMMUN
-FolderName Nom utilisé pour nommer les groupes DL COMMUN
-share Nom du partage réseau COMMUN

⚠️ Utiliser la même valeur pour -FolderName et -share : la dernière étape du script ne conserve que les droits NTFS des comptes dont le nom contient le nom du partage (voir la section « Points d'attention » ci-dessous).


Fonctionnement

1. Création des groupes DL

Quatre groupes de domaine local sont créés dans l'OU OU=03-Ressources,OU=22-Services,OU=MT,DC=mt,DC=msprsx,DC=eni (s'ils n'existent pas déjà) :

Groupe Usage prévu Droit NTFS appliqué par le script
DL-<FolderName>-CT Contrôle total FullControl
DL-<FolderName>-E Écriture ReadAndExecute
DL-<FolderName>-L Lecture Read
DL-<FolderName>-R Refus aucun

2. Partage SMB (Share-Folder)

Les restrictions réelles sont ainsi portées uniquement par les droits NTFS, conformément à la bonne pratique : partage ouvert aux utilisateurs authentifiés, filtrage fin par NTFS (voir Gestion des partages).

3. Droits NTFS (Permission-Dossier)


Utilisation

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

.\creation-partages.ps1 -FolderPath "S:\DATA\COMMUN" -FolderName "COMMUN" -share "COMMUN"

Vérifier le résultat :

# Groupes créés
Get-ADGroup -Filter 'Name -like "DL-COMMUN-*"' | Select-Object Name, GroupScope

# Autorisations du partage
Get-SmbShareAccess -Name COMMUN

# Droits NTFS du dossier
Get-NTFSAccess -Path "S:\DATA\COMMUN"

Il reste ensuite à ajouter les groupes globaux concernés comme membres des groupes DL :

Add-ADGroupMember -Identity "DL-COMMUN-L" -Members "GG-Comptabilite"

Points d'attention

Comportements constatés à la lecture du code, à connaître avant de l'utiliser en production :


Code source

param (
    [string]$FolderPath,
    [string]$FolderName,
    [string]$share
)
  
# Importer le module Active Directory
Import-Module ActiveDirectory
#Install-Module NTFSSecurity
Import-Module NTFSSecurity
    
# Définir les noms des groupes
$domain = (Get-ADDomain).DNSRoot
$groupPrefix = "DL-$FolderName"
    
$groups = @{
    "Refus"         = "$groupPrefix-R"
    "ControleTotal" = "$groupPrefix-CT"
    "Ecriture"      = "$groupPrefix-E"
    "Lecture"       = "$groupPrefix-L"
}
    
# Créer les groupes dans Active Directory
foreach ($key in $groups.Keys) {
    $groupName = $groups[$key]
    $PathDL = "OU=03-Ressources,OU=22-Services,OU=MT,DC=mt,DC=msprsx,DC=eni"
    if (-Not (Get-ADGroup -Filter { Name -eq $groupName })) {
        New-ADGroup -Name $groupName -SamAccountName $groupName -GroupScope DomainLocal -Path $PathDL
        Write-Host "Created AD Group: $groupName"
    } else {
        Write-Host "AD Group already exists: $groupName"
    }
}
    
# Fonction pour partager un dossier
function Share-Folder {
    if (-Not (Get-SmbShare -Name $share -ErrorAction SilentlyContinue)) {
        New-SmbShare -Name $share -Path $folderPath  
        $droits_partage = Get-SmbShareAccess -Name $share
        foreach ($compte in $droits_partage){
        $compte_list = $compte.AccountName
            if($compte_list -notlike "Utilisateurs du domaine"){
                Revoke-SmbShareAccess -AccountName $compte_list -Name $share -Force
                Grant-SmbShareAccess -Name $share -AccountName "$domain\Utilisateurs du domaine" -AccessRight Full -Force
                }
        }
        Write-Host "Created share: $share"
    } else {
        Write-Host "Share already exists: $share"
    }
}
  
# Fonction gestion des droits NTFS dossier partagé
function Permission-Dossier {
        # Ajout des groupes DL au permission du dossier
        foreach ($key in $groups.Keys) {
        $groupName = $groups[$key]
            if ($groupName -like "*-CT"){
                Add-NTFSAccess -Path $folderPath -Account "$groupName@$domain" -AccessRights FullControl 
            } elseif ($groupName -like "*-E"){
                Add-NTFSAccess -Path $folderPath -Account "$groupName@$domain" -AccessRights ReadAndExecute
            } elseif ($groupName -like "*-L"){
                Add-NTFSAccess -Path $folderPath -Account "$groupName@$domain" -AccessRights Read
            }
        }
        # Obtenir la liste des comptes autorisés et leurs permissions sur le chemin spécifié
        $compt_autor = Get-NTFSAccess -Path $folderPath
   
        # Itérer à travers chaque compte autorisé
        foreach ($compt in $compt_autor) {
            $Account = $compt.Account
            $AccessRights = $compt.AccessRights
   
            # Afficher le nom du compte
            Write-Output "Traitement du compte : $Account"
    
            # Condition pour vérifier si le compte ne contient pas "$share"
            if ($Account -notlike "*$share*") {
                # Retirer les permissions pour le compte
                Write-Output "Retrait des permissions pour le compte : $Account"
                Remove-NTFSAccess -Path $folderPath -Account $Account -AccessRights $AccessRights
            } else {
                Write-Output "Le compte $Account contient 'DATA' et ne sera pas modifié."
            }
        }
    }
   
Share-Folder 
Permission-Dossier
   
Write-Host "Script execution completed."