Powershell : automatisation de la création d'un répertoire partagé DFS

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.