J’ai développé un script Powershell permettant d’automatiser tout le process de création d’un répertoire partagé et son ajout à un namespace DFS.
Ce script, prenant en paramètre le nom du partage, va réaliser les opérations suivantes :
- Création d’un répertoire sur le disque et création d’un partage SMB sur ce même répertoire ;
- Création et peuplement de groupes AD qui permettront de définir les droits en lecture et écriture ;
- Ajout des ACL sur le partage ;
- Ajout du répertoire dans le namespace DFS.
Il sera nécessaire, avant exécution du script, d’éventuellement modifier les variables déclarées en début de code afin de les adapter à l’environnement d’exécution ou au process habituellement suivi.
param([Parameter(Mandatory=$true)][string]$ShareName)
$path = "D:\DFS"
$dfspath = "\\dundermifflin.com\DFS"
$srvname = "PWFILE01"
$ou = "OU=DFS,OU=Access_Groups,DC=dundermifflin,DC=com"
$readarray = @()
$writearray = @()
$readgroup = "DFS-$ShareName-RX"
$writegroup = "DFS-$ShareName-W"
New-Item -path $path -name $ShareName -ItemType "Directory" -ErrorAction Stop | Out-Null
New-ADGroup -Name $readgroup -GroupCategory Security -GroupScope DomainLocal -Path $ou -Description "\\dundermifflin.com\DFS\$ShareName - Read Only" -ErrorAction Stop
New-ADGroup -Name $writegroup -GroupCategory Security -GroupScope DomainLocal -Path $ou -Description "\\dundermifflin.com\DFS\$ShareName - Write" -ErrorAction Stop
New-SmbShare -Name $ShareName -Path "$path\$ShareName" -FullAccess "BUILTIN\Administrators" -ReadAccess $readgroup -ChangeAccess $writegroup -ErrorAction Stop
Write-Host "You will be prompted the usernames to add to the read-only access group. Please input only one user at a time. When you are done, leave the field empty and press enter."
do {
$readacc = Read-Host "Account name to add to the READ group"
if($readacc -ne "") {$readarray+=$readacc}
}
while($readacc -ne "")
Write-Host "Now you will be prompted the usernames to add to the modification group. Please input only one user at a time. When you are done, leave the field empty and press enter."
do {
$writeacc = Read-Host "Account name to add to the WRITE group"
if($writeacc -ne "") {$writearray+=$writeacc}
}
while($writeacc -ne "")
if($readarray -ne $null) { Add-ADGroupMember -Identity $readgroup -Members $readarray }
if($writearray -ne $null) { Add-ADGroupMember -Identity $writegroup -Members $writearray }
$acl = Get-Acl "$path\$ShareName"
$acl.SetAccessRuleProtection($true,$false)
$readacl = New-Object Security.AccessControl.FileSystemAccessRule("DUNDERMIFFLIN\$readgroup","ReadAndExecute, Synchronize",3,0,"Allow")
$acl.SetAccessRule($readacl)
$writeacl = New-Object Security.AccessControl.FileSystemAccessRule("DUNDERMIFFLIN\$writegroup","Modify, Synchronize",3,0,"Allow")
$acl.SetAccessRule($writeacl)
$sysacl = New-Object Security.AccessControl.FileSystemAccessRule("NT AUTHORITY\System","FullControl",3,0,"Allow")
$acl.SetAccessRule($sysacl)
$admacl = New-Object Security.AccessControl.FileSystemAccessRule("BUILTIN\Administrators","FullControl",3,0,"Allow")
$acl.SetAccessRule($admacl)
$acl | Set-Acl
New-DfsnFolder -path "$dfspath\$ShareName" -Target "\\$srvname\$ShareName"
Une version commentée du script est disponible en téléchargement.