kawaandClaude Opus 5 8a6657f496 fix: jonctions, annulation des ACL, encodage CSV et chemins longs
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>
2026-08-21 12:37:46 +02:00
2026-06-05 11:36:54 +02:00

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_PATH de 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 : #recycle et @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\partage collé 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 -Path du type Z:\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\Administrators afin 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éé avec New-PSDrive n'existe que dans la session PowerShell : indiquez son chemin UNC. En tâche planifiée sous un autre compte (ou SYSTEM), les mappages de l'utilisateur n'existent pas du tout : passez toujours un -Path en UNC.
  • Taille d'un dossier = somme des longueurs des fichiers (taille logique), pas la taille sur le disque.
  • Le rapport est un seul fichier .html avec CSS/JS inline — sans risque à envoyer par e-mail ou à conserver comme instantané d'audit.
S
Description
No description provided
Readme
344 KiB
2026-08-21 13:46:58 +02:00
Languages
PowerShell 99.8%
Batchfile 0.2%