feat: sélection de dossiers réseau (lecteurs mappés, UNC, partages)

Remplace FolderBrowserDialog par un sélecteur maison, dans l'onglet
d'analyse comme dans l'onglet Renommer :

- inventaire des lecteurs fusionnant IO.DriveInfo, HKCU\Network et
  Get-PSDrive, donc un lecteur mappé reste visible même absent du jeton
  élevé (les mappages appartiennent à la session qui les a créés) ;
- réécriture automatique d'une lettre réseau vers sa cible UNC, appliquée
  aussi aux -Path du mode sans interface ;
- navigation partage par partage via NetShareEnum (repli WMI) et
  connexion authentifiée via WNetAddConnection2, lettre facultative ;
- chemin \serveur\partage collable, sélection multiple par cases ;
- toute énumération réseau bornée par un délai sur un runspace jeté
  après usage, pour qu'un partage hors ligne ne fige plus l'interface ;
- erreurs de racine distinctes : introuvable, lecteur non monté,
  serveur injoignable.

Ce commit embarque aussi les travaux locaux antérieurs qui n'avaient
jamais été poussés (onglet Renommer, export CSV par catégorie, filtres
de permissions) : le dépôt distant était resté sur une version plus
ancienne que la copie de travail.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-21 11:20:41 +02:00
co-authored by Claude Opus 5
parent 2f2e963c6e
commit 29e79a2529
2 changed files with 1614 additions and 30 deletions
+57 -10
View File
@@ -1,4 +1,3 @@
![logo](https://f003.backblazeb2.com/file/KawaPublicCDN/logos/filermanager-smol.png)
# Filer Manager
Un outil PowerShell mono-fichier pour les serveurs de fichiers Windows. Il analyse des dossiers et rapporte :
@@ -8,16 +7,44 @@ Un outil PowerShell mono-fichier pour les serveurs de fichiers Windows. Il analy
- **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.
**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). 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 HTML…**) qu'en mode sans interface (`-Category`).
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+**.
@@ -30,11 +57,18 @@ ou depuis une console :
pwsh -STA -File .\filer-manager.ps1
```
Dans la fenêtre : **Ajouter…** un ou plusieurs dossiers, ajustez *Longueur max* / *Profondeur des permissions* /
*Inclure les fichiers dans l'arborescence*, 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 HTML…** — la boîte de dialogue
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 dans le fichier ; toutes sont sélectionnées par défaut.
à 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é.
@@ -45,20 +79,28 @@ d'export vous laisse **cocher les catégories** (Tailles des dossiers, Chemins t
```powershell
.\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. |
| `-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 `-Output`). |
| `-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 :
@@ -80,5 +122,10 @@ Register-ScheduledTask -TaskName "Filer Report" -Action $action -Trigger $trigge
## 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.
+1557 -20
View File
File diff suppressed because it is too large Load Diff