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>