Comment changer le nom d'un service NT lors de son installation ?

 

J'ai été confronté recemment à un cas de figure , je devais installer un serivce NT sur un serveur et faire tourner celui-ci pour differents clients de manière cloisonnée (Une installation par client). Il existe plusieures solutions pour resoudre ce problème

  • Faire de telle sorte que le service prenne via un fichier de config ou autre tous les clients

Avantage, un seul service (bien pour l'administrateur du serveur), façile a mettre en oeuvre

Inconvenient (tous les clients utilisent les memes versions d'assemblies)

A cause de l'inconvenient je ne pouvais pas utiliser cette solution

  • Compiller un service avec nom par client.

Avantage façile a mettre en oeuvre

Inconvenient (Si beaucoup de client très fastidieux a maintenir)

  • Trouver un moyen de changer le nom d'un service lors de son installation.

C'est la solution que j'ai retenu.

Le projet de depart :

image

donc le service et son installer, c'est lui qui nous interesse, on peut voir la propriété ServiceName, a laquelle j'ai associé el nom MyService

Le code de l'installer est le suivant :

   1: namespace MyService
   2: {
   3:     [RunInstaller(true)]
   4:     public partial class Installer1 : Installer
   5:     {
   6:         public Installer1()
   7:         {
   8:             InitializeComponent();
   9:         }
  10:     }
  11: }

Nous ajoutons un fichier de configuration pour la solution (app.config)



   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <appSettings>
   4:         <add key="serviceName" value="MyService1"/>
   5:     </appSettings>
   6: </configuration>

Maintenant au moment de l'installation il va falloir aller lire dans le fichier de configuration :


voici le fichier Installer1.cs complet et commenté



   1: using System;
   2: using System.Collections;
   3: using System.Collections.Generic;
   4: using System.ComponentModel;
   5: using System.Configuration.Install;
   6: using System.Linq;
   7:  
   8:  
   9: namespace MyService
  10: {
  11:     [RunInstaller(true)]
  12:     public partial class Installer1 : Installer
  13:     {
  14:         string m_ServiceName = null;
  15:  
  16:         public Installer1()
  17:         {
  18:             InitializeComponent();
  19:             // lecture du fichier de config de myservice.exe
  20:             // soit myservice.exe.config
  21:             string exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "MyService.exe");
  22:             System.Configuration.Configuration config
  23:                 = System.Configuration.ConfigurationManager.OpenExeConfiguration(exePath);
  24:             // recuperation du nom du service dans la section appSettings
  25:             m_ServiceName = config.AppSettings.Settings["serviceName"].Value;
  26:         }
  27:  
  28:         protected override void OnBeforeInstall(IDictionary savedState)
  29:         {
  30:             // on affecte au savedState le nom du service récupéré 
  31:             // dans le fichier de config
  32:             savedState["ServiceName"] = m_ServiceName;
  33:             // et on affecte la valeur "nom du service" au composant d'installation du service
  34:             this.MyServiceInstaller.DisplayName = m_ServiceName;
  35:             this.MyServiceInstaller.ServiceName = m_ServiceName;
  36:  
  37:             base.OnBeforeInstall(savedState);
  38:         }
  39:  
  40:         protected override void OnBeforeUninstall(IDictionary savedState)
  41:         {
  42:             // On recupere le nom de serivce indiqué dans le state
  43:             string serviceName = (string)savedState["ServiceName"];
  44:             // on réaffecte au composant d'installation le nom du service
  45:             // pour qu'il retrouve quel service il doit desinstaller
  46:             this.MyServiceInstaller.DisplayName = serviceName;
  47:             this.MyServiceInstaller.ServiceName = serviceName;
  48:  
  49:             base.OnBeforeUninstall(savedState);
  50:         }
  51:     }
  52: }

Pour installer le service une fois compilé il suffit de lancer la commande suivante dans le repertoire du service :


"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" "MyService.exe"


J'ai installé le meme service dans 2 repertoires differents voici le resultat :


image image


pour desinstaller toujours dans le repertoire du service :


"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" /u "MyService.exe"


Voici le code complet :


MyService.zip

Aucun commentaire: