Cinq correctifs sur le coeur du scan, plus deux problemes decouverts en les
validant. Verifie sur PowerShell 7.6.5 et Windows PowerShell 5.1 : 43
assertions, aucun echec.
Jonctions et liens symboliques (Test-IsReparsePoint)
Le parcours descendait dans les points de reparse. Une jonction pointant
vers un ancetre relancait la recursion jusqu'a la limite de longueur de
chemin ; une jonction laterale comptait deux fois les memes octets. Sur un
arbre de test de 3 004 octets reels, le rapport annoncait 310,92 Ko, 320
dossiers, 191 fichiers et 350 faux « chemins trop longs » -- des donnees
fausses mais parfaitement plausibles. Les liens sont desormais listes comme
feuilles de taille nulle (type « Lien ») et jamais parcourus, dans le calcul
des tailles, la lecture des permissions et l'onglet Renommer.
Annulation des acces accordes (journal + garde-fous)
Fermer la fenetre pendant un scan -GrantAccess tuait le runspace avant
Restore-Grants : Administrators restait proprietaire avec FullControl, sans
aucune trace. Chaque octroi est maintenant journalise sous
%LOCALAPPDATA%\FilerManager avant d'etre applique, FormClosing avertit
quand un scan est en cours, et les journaux orphelins sont proposes a la
restauration au demarrage ou rejoues par -RevertPendingGrants. Un journal
dont le process est encore vivant est ignore.
Encodage CSV sous PowerShell 7
-Encoding UTF8 ecrit un BOM en 5.1 mais pas en 7, et Excel lit un fichier
sans BOM comme du CP1252, ce qui transforme chaque accent des en-tetes en
mojibake. Utilise utf8BOM la ou le nom existe.
Enumeration independante de LongPathsEnabled (FilerManager.LongPath)
Le parcours passe par FindFirstFileW au lieu de Get-ChildItem, dont la
limite a 260 caracteres depend du reglage registre LongPathsEnabled, absent
par defaut sous Windows -- alors que signaler les chemins longs est l'objet
meme de l'outil. Non reproduit sur la machine de developpement, ou ce
reglage est actif : durcissement, pas correctif observe. Les erreurs sont
renvoyees en codes Win32 plutot que levees, ce qui supprime le depaquetage
d'exceptions dans le chemin chaud.
Noms courts 8.3 (Expand-FilerShortPath)
La racine etait rapportee telle que saisie alors que Get-ChildItem
canonisait les enfants. Sur une racine 8.3, les longueurs etaient donc
mesurees sur un alias plus court que le chemin reel, sous-estimant le
critere « chemin trop long ». La racine est canonisee une fois via
GetLongPathNameW.
Detection des acces refuses (Test-IsAccessDenied)
Inspecte aussi l'exception de base : un appel .NET arrive enveloppe dans
MethodInvocationException, et 5.1 remonte parfois un Win32Exception nu
portant ERROR_ACCESS_DENIED.
Resolution des SID (Resolve-SidName)
Lit proprietaire et ACE en SID bruts puis traduit chaque nom separement,
avec cache, en remplacement d'un aller-retour LSA/AD non mis en cache par
ACE. Sortie identique ligne pour ligne a la precedente sur un arbre sans
jonction.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Filer Manager
Un outil PowerShell mono-fichier pour les serveurs de fichiers Windows. Il analyse des dossiers et rapporte :
- Tailles des dossiers — arborescence visuelle et repliable avec barres de taille (arbre GUI + HTML).
- Chemins trop longs — fichiers/dossiers dont le chemin complet atteint ou dépasse un seuil (260 par défaut, le
MAX_PATHde Windows). - Permissions NTFS — propriétaire + ACL (identité, droits, allow/deny, hérité) par dossier, jusqu'à une profondeur configurable.
Dans l'interface, cliquez sur n'importe quel en-tête de colonne (Dossier / Identité / Droits / Type / Hérité) pour une
fenêtre de type Excel : tri A→Z / Z→A et sélection des valeurs à conserver. Les filtres se combinent entre les colonnes ;
Effacer les filtres réinitialise le tout. Deux cases à cocher permettent en outre de masquer les permissions héritées
et de masquer les comptes/groupes système (
NT AUTHORITY\SYSTEM,BUILTIN\Administrators,CREATOR OWNER,NT SERVICE\*…) afin de ne garder que les identités métier. La détection des comptes système se fait par SID (indépendante de la langue), avec un repli sur le nom. Les mêmes filtres sont disponibles dans le rapport HTML (cases à cocher) et en mode sans interface (-HideSystemPrincipals). - Exclusion de dossiers — ignore certains dossiers de toute l'analyse (tailles, chemins trop longs et permissions). Par
défaut, les corbeilles et dossiers système courants sont exclus :
#recycleet@eaDir(NAS Synology) et$RECYCLE.BIN(corbeille Windows). La liste est modifiable (jokers*/?acceptés, insensible à la casse) et il est possible d'exclure en plus les dossiers masqués. Disponible dans l'interface (champ Exclure dossiers + case Dossiers masqués) et en mode sans interface (-ExcludeFolder,-ExcludeHidden). - Sélection de dossiers réseau — le sélecteur Ajouter… liste les disques locaux et tous les lecteurs réseau connus
avec leur cible UNC, parcourt un serveur partage par partage (Ajouter un serveur…), accepte un chemin
\\serveur\partagecollé directement et sait ouvrir une connexion authentifiée (identifiants, lettre de lecteur facultative). Plusieurs dossiers se cochent en une seule fois. Les chemins réseau sont convertis en UNC (case cochée par défaut) : un lecteur mappé appartient au jeton de session qui l'a créé, il est donc invisible depuis une exécution en mode Administrateur, alors que l'UNC reste valable partout — la même conversion est appliquée en mode sans interface, y compris pour un-Pathdu typeZ:\dossier. Toute énumération réseau est bornée par un délai : un partage hors ligne ne fige plus la fenêtre et se signale dans la barre d'état. - Octroi automatique en cas de refus (optionnel) — lorsqu'un élément ne peut pas être lu, l'outil s'approprie la
propriété pour Administrators et accorde le
FullControlàBUILTIN\Administratorsafin que l'analyse puisse se terminer. Chaque modification est consignée dans l'onglet/la section de rapport Accès accordé, et par défaut chacune est annulée après l'analyse (propriétaire + ACL d'origine restaurés là où ils ont pu être lus au préalable). Nécessite une exécution en mode élevé. - Renommage par lot (onglet Renommer) — renomme en série les fichiers et dossiers d'un dossier choisi avec des règles
avancées : rechercher/remplacer littéral (avec option Ignorer la casse), expression régulière (.NET) avec
groupes de capture (
$1,${nom}), transformation de casse (MAJUSCULES / minuscules / Première Lettre Des Mots / première lettre), ajout de préfixe/suffixe et numérotation séquentielle (jeton{n}, début / pas / nombre de chiffres réglables). Une grille d'aperçu affiche en direct ancien nom → nouveau nom avec un état par ligne et détecte les conflits (doublons ou nom déjà existant), qui sont ignorés. Options Inclure les sous-dossiers, Fichiers / Dossiers et exclusion des dossiers masqués ; l'extension des fichiers peut être préservée. Cochez les lignes à appliquer puis Renommer la sélection (les dossiers sont renommés après leur contenu pour rester cohérents).
Tout est exportable vers un rapport HTML autonome (aucune ressource externe — fonctionne hors ligne, facile à envoyer par
e-mail ou à archiver) et/ou vers des fichiers CSV (un fichier par catégorie, prêt pour Excel / un tableur). Les deux formats
peuvent être générés en même temps : l'interface comme le mode sans interface produisent le HTML et les CSV en une seule
opération. Les rapports peuvent devenir volumineux, vous pouvez donc n'exporter que les catégories nécessaires —
une, plusieurs ou toutes — aussi bien dans l'interface (sélecteur à cases sur Exporter…) qu'en mode sans interface (-Category).
Aucune installation ni dépendance. Fonctionne sur Windows PowerShell 5.1 et PowerShell 7+.
Lancer l'interface graphique
Double-cliquez sur Run-FilerManager.cmd (il se lance avec -ExecutionPolicy Bypass pour cette exécution uniquement),
ou depuis une console :
pwsh -STA -File .\filer-manager.ps1
Dans la fenêtre : Ajouter… un ou plusieurs dossiers — locaux, sur un lecteur réseau mappé ou sur un chemin UNC — ajustez Longueur max / Profondeur des permissions /
Inclure les fichiers dans l'arborescence, précisez les dossiers à ignorer dans Exclure dossiers (par défaut #recycle; @eaDir; $RECYCLE.BIN,
séparés par ;) et cochez au besoin Dossiers masqués, cochez éventuellement Accorder l'accès Administrators aux éléments refusés
(et Annuler les modifications après l'analyse), cliquez sur Analyser, puis Exporter… — la boîte de dialogue
d'export vous laisse cocher les catégories (Tailles des dossiers, Chemins trop longs, Permissions, Accès accordé, Erreurs)
à inclure ainsi que les formats à générer : HTML (rapport unique) et/ou CSV (un fichier par catégorie). Si les deux
formats sont cochés, choisissez un nom de base et l'outil écrit <base>.html plus <base>-tree.csv, <base>-permissions.csv,
etc. en une seule fois ; toutes les catégories sont sélectionnées par défaut, HTML coché et CSV décoché.
Pour renommer des fichiers ou des dossiers, ouvrez l'onglet Renommer : choisissez un dossier (Parcourir…), cliquez sur Lister, réglez les règles (rechercher/remplacer, regex, casse, préfixe/suffixe, numérotation), vérifiez l'aperçu, puis Renommer la sélection.
L'octroi automatique n'agit que sur les éléments refusés, un élément à la fois. Exécutez Filer Manager en tant qu'administrateur pour qu'il fonctionne — il vous avertit si vous n'êtes pas en mode élevé.
L'analyse s'exécute sur un thread d'arrière-plan, la fenêtre reste donc réactive sur les grosses arborescences.
Lancer sans interface (pour le Planificateur de tâches / cron)
.\filer-manager.ps1 -Path "\\FILER01\Data","D:\Profiles" -Output C:\Reports\filer.html -NoGui
# HTML + CSV en même temps (les CSV sont dérivés du nom de base : filer-tree.csv, filer-permissions.csv, ...)
.\filer-manager.ps1 -Path "D:\Shares" -Output C:\Reports\filer.html -CsvOutput C:\Reports\filer.csv -NoGui
Paramètres
| Paramètre | Défaut | Description |
|---|---|---|
-Path |
— | Un ou plusieurs dossiers racines à analyser. Chemin local, UNC (\\serveur\partage) ou lecteur réseau mappé (réécrit en UNC si la lettre n'est pas montée dans la session). |
-Output |
— | Chemin du rapport HTML (mode sans interface). |
-CsvOutput |
— | Chemin de base des rapports CSV (un fichier par catégorie : base-tree.csv, base-permissions.csv, …). Combinable avec -Output ou utilisable seul. |
-MaxPathLength |
260 |
Signale les éléments dont la longueur de chemin complet est ≥ ce nombre de caractères. |
-PermissionDepth |
1 |
Niveaux de dossiers sous chaque racine pour lesquels collecter les ACL (0 = racines uniquement). |
-IncludeFilesInTree |
off | Liste les fichiers individuels dans l'arborescence des tailles, pas seulement les dossiers. |
-ExcludeFolder |
#recycle, @eaDir, $RECYCLE.BIN |
Noms de dossiers à exclure de l'analyse (jokers acceptés, insensible à la casse). -ExcludeFolder @() pour ne rien exclure par nom. |
-ExcludeHidden |
off | Exclut aussi les dossiers portant l'attribut « masqué ». |
-HideInheritedChildPerms |
off | Omet les permissions héritées portées par les dossiers enfants (les racines conservent les leurs). |
-HideSystemPrincipals |
off | Masque les ACL des comptes/groupes système bien connus (NT AUTHORITY\SYSTEM, BUILTIN\*, CREATOR OWNER, NT SERVICE\*…). Détection par SID, indépendante de la langue. |
-GrantAccess |
off | S'approprie la propriété + accorde le FullControl à Administrators sur les éléments refusés, puis réessaye. Nécessite le mode élevé. |
-KeepGrants |
off | Conserve l'accès accordé par -GrantAccess (par défaut : annulé après l'analyse). |
-NoGui |
off | Force le mode sans interface (nécessite -Path et au moins un de -Output / -CsvOutput). |
-Category |
All |
Catégories à inclure dans le rapport — toute combinaison de Tree, LongPaths, Permissions, Grants, Errors (pour garder les gros rapports petits). |
N'exporter que les permissions, ou seulement les tailles + chemins trop longs :
.\filer-manager.ps1 -Path "D:\Shares" -Output perms.html -NoGui -Category Permissions
.\filer-manager.ps1 -Path "D:\Shares" -Output sizes.html -NoGui -Category Tree,LongPaths
Planifier un rapport hebdomadaire
$action = New-ScheduledTaskAction -Execute "pwsh.exe" `
-Argument '-NoProfile -File "C:\Tools\filer-manager\filer-manager.ps1" -Path "D:\Shares" -Output "C:\Reports\filer.html" -NoGui'
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At 6am
Register-ScheduledTask -TaskName "Filer Report" -Action $action -Trigger $trigger -RunLevel Highest
Notes
- Exécutez l'outil avec un compte disposant d'un accès en lecture aux dossiers (et
SeBackupPrivilege/ Administrateur aide à atteindre les ACL et à contourner les refus par dossier). Les éléments qui ne peuvent pas être lus sont listés dans la section Erreurs / accès refusé au lieu de faire échouer l'analyse — ou, avec-GrantAccess(en mode élevé), l'outil s'accorde l'accès et liste les modifications dans Accès accordé. - Les chemins réseau sont analysés sous leur forme UNC. Un lecteur mappé (
Z:) est réécrit automatiquement vers sa cible (\\serveur\partage) quand la lettre n'existe pas dans le jeton courant — le cas classique d'une exécution en mode Administrateur. Un lecteur créé avecNew-PSDriven'existe que dans la session PowerShell : indiquez son chemin UNC. En tâche planifiée sous un autre compte (ouSYSTEM), les mappages de l'utilisateur n'existent pas du tout : passez toujours un-Pathen UNC. - Taille d'un dossier = somme des longueurs des fichiers (taille logique), pas la taille sur le disque.
- Le rapport est un seul fichier
.htmlavec CSS/JS inline — sans risque à envoyer par e-mail ou à conserver comme instantané d'audit.