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
Owner

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

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>
kawa added 1 commit 2026-08-21 12:39:58 +02:00
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>
kawa merged commit 08ee699e44 into main 2026-08-21 12:40:08 +02:00
kawa deleted branch fix/jonctions-acl-csv-chemins-longs 2026-08-21 12:40:12 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kawa/FilerManager#1