Failed to execute GetVersionVector Method - erreur DFSR sur 2008 R2

J'ai rencontré ce jour des dysfonctionnements sur un serveur de fichiers (A) dont certains partages sont répliqués sur un autre serveur de fichiers (B). Ces deux serveurs fonctionnent sous Windows Server 2008 R2.

En vérifiant le backlog comme ceci :

dfsrdiag backlog /sendingmember:A /receivingmember:B /rgname:shares /rfname:shares

J'obtenais cette erreur :

Failed to execute GetVersionVector Method. Err: -2147217406 <0x80041002> operation Failed.

En cause, le KB2663685. Ce hotfix change la manière dont DFSR récupère après une coupure inopinée de la réplication ; en effet, afin d'éviter que des données corrompues soit réécrites à la place de données viables, DFSR arrête toute réplication entre les machines concernées et attend une commande bien précise pour reprendre cette réplication. Ce "temps mort" permet donc aux administrateurs de vérifier l'intégrité des données ou d'analyser la raison du dysfonctionnement initial. Pour voir si cette mise à jour a été installée, une requête Powershell très simple peut être utilisée :

Get-Hotfix | Where-Object { $_.HotfixID -eq "KB2663685" }

En fouillant un peu dans le journal d'événements DFS Replication sur le serveur B, il est possible de trouver l'instruction permettant de relancer la réplication. Pour se faire, il suffit de chercher l'ID 2213, qui ressemble à ceci :

En ouvrant une invite de commande en administrateur et en y saisissant l'instruction donnée, on relance donc la synchronisation.

En attendant quelques minutes, on devrait voir apparaître des événements 2212 et 2214 indiquant que la réplication DFSR est en cours de récupération suite à une interruption anormale, puis que celle-ci s'est déroulée avec succès. On peut donc exécuter de nouveau la commande dfsrdiag backlog et celle-ci devrait retourner simplement la liste des éléments qui vont être répliqués tôt ou tard.

Octroi de droits à un compte sur un service grâce à subinacl

En recherchant un moyen d'accorder les droits de démarrage / arrêt sur un service particulier pour un compte d'utilisateur standard, je suis tombé sur cet article sur Serverfault. Le but était d'éviter d'accorder des privilèges d'administration à l'utilisateur en question.

Il existe donc un outil nommé SubInACL, qui fait partie du Windows Resource Kit (aux côtés de nombreux autres outils que je connaissais comme LockOutStatus). Cet outil qui s'exécute en ligne de commande permet de choisir précisément quels privilèges accorder sur un service pour un utilisateur, qu'il soit local ou du domaine.

J'ai testé cet outil sur un serveur de test en 2008 R2 et appliqué le fonctionnement sur un 2016 ; son exécution est très simple. Microsoft explique toute la syntaxe disponible à ce lien. Si je souhaite accorder à l'utilisateur dschrute le droit de voir l'état et de relancer le service NTP, je vais devoir envoyer cette instruction :

subinacl.exe /service w32time /GRANT=DUNDERMIFFLIN\dschrute=STO

Voici sur un Server 2016, le résultat de la commande pour le service Windows Update :

Si SubInACL n'est plus disponible sur le site de Microsoft, il est disponible en téléchargement sur le miroir du blog à ce lien.

Powershell : ActiveDirectory Recycle Bin Explorer

La corbeille ActiveDirectory est une fonctionnalité disponible sur les forêts en niveau fonctionnel 2008 R2. Comme son nom l'indique, elle permet de restaurer des objets qui ont été supprimés, durant un laps de temps qui dépend de la configuration de la forêt.

Cette corbeille n'apparaît pas en tant que telle dans la console ActiveDirectory Users and Computers ou encore dans ADSI Edit, et pourtant elle existe bien dans l'AD en tant que "Deleted Objects".

Si il est possible de parcourir le contenu de la corbeille via la console ActiveDirectory Administrative Center disponible dans le Server Manager à partir de Windows Server 2012, cela implique d'avoir l'environnement graphique d'installé sur les contrôleurs de domaine et cela est surtout incompatible dans un environnement où l'on travaille avec les RSAT.

C'est pourquoi j'ai développé un script Powershell avec une interface graphique simpliste permettant d'afficher le contenu de la corbeille ActiveDirectory et permettant de restaurer en un clic un objet préalablement supprimé.

Les informations sont affichées dans un DataGridView ; il est possible de trier ou de rechercher / filtrer par nom ou type, de réaliser un export CSV de la liste complète des objets étant dans la corbeille.


550 Cannot create a file when that file already exists sur un FTP porté par IIS

J'ai rencontré une erreur 550 ce jour en tentant d'accéder à un répertoire situé à la racine d'un serveur FTP porté par IIS sur 2008 R2 (IIS 7).

Après vérifications dans le IIS Manager, je n'ai rien trouvé de particulier au niveau des autorisations, le compte que j'utilisais avait bien les droits en lecture et en écriture ; les autorisations NTFS sur le répertoire physique étaient également valides. De plus, ce répertoire n'est qu'une variante de deux autres répertoires identiques, créés en même temps, gérés par les mêmes comptes et accédés par les mêmes applications. Il n'y a donc aucune raison d'avoir une différence de configuration.

J'ai donc été vérifier le fichier de configuration des sites IIS dans C:\Windows\System32\inetsrv\config\applicationHost.config. A la toute fin de ce fichier, la première entrée concerne la racine du FTP, la deuxième concerne spécifiquement le répertoire auquel je n'ai pas accès.

En supprimant cette seconde balise <location> et en redémarrant mon site FTP, tout est revenu dans l'ordre.

Il n'y avait aucune raison d'avoir cette balise pour un seul des 3 répertoires ; par ailleurs ajouter une balise <add accessType="Allow" users="MonUser" permissions="Read, Write" /> n'avait rien changé.