J’ai été confronté à un problème provenant de la bureautique. Des utilisateurs voyaient dans leur liste de répertoires partagés sous Windows des partages DFS auxquels ils n’avaient pas accès, en plus de leurs répertoires DFS usuels. Normalement, Windows n’affiche pas de répertoire partagé si l’utilisateur n’a pas d’accès en lecture. Par exemple, si l’on considère la racine \\dundermifflin.inc\ et 3 répertoires DFS Sales, Accounting et Boss, si l’utilisateur n’a accès qu’au dernier il ne peut pas voir les dossiers Sales et Accounting.
Or dans mon cas, ces répertoires étaient bien visibles. La cause provient de la manière dont les permissions ont été positionnées dans la console DFS. Lors de la création d’un répertoire DFS, il est possible de positionner les privilèges de deux manières : en utilisant soit les permissions NTFS, soit DFS.
En choisissant l’option Use inherited permissions from the local file system, Windows ne va pas appliquer de permissions DFS sur le répertoire. Ainsi, comme son nom l’indique, les droits seront les mêmes que ceux positionnés sur le serveur qui héberge le répertoire en question. C’est justement ce réglage qui déclenche l’affichage dans l’explorateur. N’ayant aucune permission DFS de configurée, Windows ne sait pas avant d’interroger le serveur qui porte le répertoire si l’utilisateur a le droit de se connecter au non ; le répertoire est donc affiché. Ce n’est que lorsque l’utilisateur tente d’y accéder que Windows va récupérer les ACL et empêcher l’accès. Le comportement est par ailleurs expliqué dans la fenêtre ci-dessus.
La deuxième option, Set explicit view permissions on the DFS folder, place donc des permissions DFS directement sur le lien DFS (traduction de \\FileServer03.dundermifflin.inc\Shares vers \\dundermifflin.inc\shares). Ainsi, dès l’ouverture de l’explorateur, Windows lit ces ACL et n’affiche pas le répertoire puisqu’il sait que l’utilisateur n’y a pas accès.
Ce script Powershell permet d’afficher les répertoires DFS qui sont configurés avec la première option et qui apparaissent dans l’explorateur, si jamais vous souhaitez faire une passe complète sur tous vos shares DFS afin d’adopter une configuration homogène :
Param([Parameter(Mandatory=$true)][string] $Namespace)
$fNameSpace = "$Namespace\*"
Get-DfsnFolder $fNameSpace | where-object { (Get-DfsnAccess $_.Path) -eq $null }
Il suffit de l’appeler de cette manière :
.\DFS-NoPerm.ps1 -Namespace \\dundermifflin.inc\shares