fix: jonctions, annulation des ACL, encodage CSV et chemins longs #1

Merged
kawa merged 1 commits from fix/jonctions-acl-csv-chemins-longs into main 2026-08-21 12:40:08 +02:00
1 Commits
Author SHA1 Message Date
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