Thème
Gestionnaire de service
Application WinForms résidant dans la zone de notification Windows. Elle pilote le service Windows du backend (démarrer, arrêter, redémarrer), ouvre le client de supervision, affiche le journal du backend en direct et porte la boîte d'activation de licence.
| Technologie | WinForms .NET 9 (net9.0-windows) |
| Point d'entrée | Program.cs |
| Nom d'assembly | Superviseur-ServiceManager |
| Référence projet | dotnet/shared |
| Paquets | System.ServiceProcess.ServiceController, System.Text.Json |
| Service piloté | Superviseur-Service (ServiceName de app.config.json) |
Structure
| Fichier | Rôle |
|---|---|
Program.cs | Mutex d'instance unique, puis lancement du contexte d'application |
TrayApplicationContext.cs | Icône, menu contextuel, minuteur d'état, actions sur le service |
AppConfig.cs | Chargement de app.config.json par la classe partagée |
Loc.cs | Libellés français / anglais |
LicenseDialog.cs | Demande d'activation et application d'une licence |
PasswordDialog.cs | Saisie du mot de passe administrateur |
Mécanismes non évidents
Le gestionnaire pilote le service installé, jamais un backend lancé depuis le dépôt
Il s'adresse à Superviseur-Service par ServiceController. Un dotnet run --project dotnet/backend n'est pas un service Windows : le menu le montre alors comme arrêté ou inconnu, et les actions échouent.
Les actions sur le service passent par une élévation
| Élément | Détail |
|---|---|
| Mécanisme | Process.Start avec le verbe runas |
| Refus de l'invite UAC | Windows lève une Win32Exception de code natif 1223 (ERROR_CANCELLED), interceptée pour afficher « opération annulée » au lieu d'une erreur brute |
Le menu est construit une fois, puis mis à jour en place
Un minuteur rafraîchit l'état toutes les 5 s. Les libellés et l'activation des entrées sont ajustés sur le ContextMenuStrip existant : le reconstruire ferait scintiller un menu ouvert.
Le mot de passe est vérifié par le backend, en HTTPS de bouclage
| Élément | Détail |
|---|---|
| Appel | POST https://localhost:{DefaultPort}/api/auth/verify-admin-password |
| Certificat | Le rappel de validation accepte le certificat uniquement si l'URI est de bouclage — le certificat auto-signé du service n'a donc pas à être approuvé par le magasin Windows |
| Service injoignable | Un message d'erreur réseau, et l'action est refusée |
La console du backend lit un fichier, pas un flux
L'entrée « Voir la console du backend » ouvre une fenêtre PowerShell sur le journal le plus récent.
| Emplacement cherché | Cas |
|---|---|
%ProgramData%\Superviseur\logs | Poste installé, cherché en premier |
%LOCALAPPDATA%\Superviseur_Dev\logs | Repli, poste de développement |
Le fichier retenu est le plus récent log-*.txt, suivi par Get-Content -Wait -Tail 200.
Le client est cherché à deux endroits
..\client\{ClientName}.exe relativement au répertoire de l'exécutable — la disposition d'un poste installé — puis {ClientName}.exe à côté du gestionnaire.
app.config.json est copié auprès de l'exécutable
Le gestionnaire est installé dans {app}\manager, hors de portée du app.config.json déposé auprès du backend. Le .csproj en copie donc un exemplaire à la compilation ; sans lui, AppConfig.Load() retombe sur ses valeurs par défaut — version, URL et port erronés.
La langue suit celle du système
Loc choisit le français si CultureInfo.CurrentUICulture a pour code langue fr, l'anglais sinon. Même règle que le client de supervision, pour qu'un poste n'affiche jamais deux langues selon la fenêtre ouverte.
JwtSecret n'est délibérément pas chargé
AppConfig.Load mappe la configuration partagée à l'exception du secret JWT : le gestionnaire s'authentifie auprès de l'API et ne signe jamais de jeton lui-même.
Contraintes actives
| Contrainte | Conséquence si elle est ignorée |
|---|---|
| Une seule instance à la fois | Un mutex nommé {AppName}ServiceManager-Mutex fait sortir silencieusement la seconde |
Les gestionnaires de clic sont async void | Chacun encapsule son corps dans un try/catch : une exception non capturée ferait tomber tout le processus |
Le projet cible net9.0-windows | Il ne se compile ni ne s'exécute hors Windows |
Tests
dotnet/tests/manager — couverture du chargement de configuration.
powershell
dotnet test dotnet/tests/manager/manager.tests.csproj