# 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 : ```powershell 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 `.html` plus `-tree.csv`, `-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) ```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. 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 : ```powershell .\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 ```powershell $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.