Pour un dossier donné, le script met en place en une seule commande la gestion des accès selon la méthode AGDLP :
💡 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.
Le dossier existe déjà (par exemple créé avec le script de création de l'arborescence).
Serveur membre du domaine, console PowerShell lancée en administrateur avec un compte autorisé à créer des groupes dans l'OU cible.
Module ActiveDirectory (outils RSAT, présents sur un contrôleur de domaine) :
Install-WindowsFeature RSAT-AD-PowerShell
Module NTFSSecurity (PowerShell Gallery) :
Install-Module NTFSSecurity
Un Active Directory en français : le script utilise le nom du groupe « Utilisateurs du domaine ».
| 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
-FolderNameet-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).
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 |
Share-Folder)-share sur -FolderPath ;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).
Permission-Dossier)-CT, -E et -L sur le dossier ;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"
Comportements constatés à la lecture du code, à connaître avant de l'utiliser en production :
$PathDL pointe vers l'OU du domaine mt.msprsx.eni. À adapter pour un autre domaine, sinon la création des groupes échoue.DL-<FolderName>-E reçoit ReadAndExecute. Le droit d'écriture correspondrait à Modify.DL-<FolderName>-R est créé, mais aucune entrée de refus n'est posée sur le dossier.SYSTEM et Administrateurs. Si -FolderName et -share diffèrent, les droits des groupes DL tout juste ajoutés sont retirés aussi.Disable-NTFSAccessInheritance) ; elles restent donc en place.DL--CT, etc.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."