Introduction

Un service windows permet d'effectuer une tâche en background sans qu'il n'y ait une interface utilisateur. Ils sont très utiles si l'on souhaite notamment lancer une application au démarrage de l'ordinateur sans pour autant qu'un utilisateur ne soit connecté, ou encore surveiller une activité de façon constante. Un service se caractérise par plusieurs paramètres à prendre en compte. Tout d'abord, son type de démarrage. Il existe trois types de démarrages pour un service :

  1. Automatique : Le service démarre automatiquement une fois le pc démarré.
  2. Désactivé : Le service ne sera jamais utilisé.
  3. Manuel : Le service ne démarre que si un utilisateur l'y autorise.

Il faut également choisir l'un des comptes suivants qui attribuera certains droits au service :

  1. Service local (LocalService) : Le compte de service local est un compte intégré qui autorise le service à accéder aux ressources réseau sans informations d'identification. Ce compte représente le moins de risques en terme de sécurité.
  2. Service réseau (NetworkService): Le compte de service réseau est un compte intégré qui autorise le service à accéder aux ressources réseau à l'aide des informations d'identification du compte d'ordinateur.
  3. Compte système local (LocalSystem) : Le compte système local est un compte intégré doté de privilèges très élevés. Il dispose de privilèges étendus sur le système local et représente l'ordinateur sur le réseau. A utilisé avec précaution.
  4. Utilisateur (User) : Ce compte nécessite une authentification par login/mot de passe.

1. Les services Windows

1.1. Création d'un service windows

On va créer un service qui écrira dans un fichier l'heure du système. Dans un premier temps, on lance Visual Studio, puis on crée un projet de type 'Service Windows' comme le montre l'image suivante :

Image non disponible

On peut d'ores et déjà modifier certaines propriétés de notre service en double-cliquant sur le fichier [Service.cs] .

Image non disponible

Certaines propriétés sont explicites, telles que CanPauseAndContinue, CanShutDown, CanStop ou encore ServiceName qui correspond au nom de notre service. Celle-ci est très importante, car nous aurons besoin par la suite de retrouver notre service dans la liste des services windows et donc de connaître son nom :)

Nous allons appeler notre service "Developpez" et mettre à "true" les propriétés précédemment citées.

Dans la partie code de [Service.cs], on surcharge les méthodes OnShutDown(), OnPause() et OnContinue() comme suit :

Service.cs
Sélectionnez
      
    protected override void OnShutdown()
    {
        base.OnShutdown();
    }

    protected override void OnPause()
    {
        base.OnPause();
    }

    protected override void OnContinue()
    {
        base.OnContinue();
    }

Ensuite, on crée un timer et on implémente les méthodes OnStart() et OnStop() ainsi que l'événement Elapsed du timer qui se déclenchera toutes les 10 secondes.

Service.cs
Sélectionnez
   
	private Timer t = null;
	   
    protected override void OnStart(string[] args)
    {
        t = new Timer(10000); // Timer de 10 secondes.
        t.Elapsed +=new ElapsedEventHandler(t_Elapsed);
        t.Start();
    }

    protected override void OnStop()
    {
        t.Stop();
    }
    
    protected void t_Elapsed(object sender, EventArgs e)
    {
        if(File.Exists(@"C:\temp\test.txt"))
        {
            StreamWriter sw = new StreamWriter(@"C:\temp\test.txt");
            sw.WriteLine(DateTime.Now.ToString());
            sw.Close();
        }
        else
        {
            TextWriter file = File.CreateText(@"C:\temp\test.txt");
            file.WriteLine(DateTime.Now.ToString());
            file.Close();
        }
    }

Avant de procéder à la deuxième partie du projet, il va falloir créer une classe dans le fichier [Service.cs] qui sera appelée par l'utilitaire d'installation au moment de l'installation du service.

Service.cs
Sélectionnez
   
    [RunInstaller(true)]
    public class ServiceInstall : Installer
    {
        public ServiceInstall() : base()
        {
            // On définit le compte sous lequel le service sera lancé (compte Système)
            ServiceProcessInstaller process = new ServiceProcessInstaller();
            process.Account = ServiceAccount.LocalSystem;

            // On définit le mode de lancement (Manuel), le nom du service et sa description
            ServiceInstaller service = new ServiceInstaller();
            service.StartType = ServiceStartMode.Manual;
            service.ServiceName = "Developpez";
            service.DisplayName = "Developpez";
            service.Description = "Service de test pour DVP";

            // On ajoute les installeurs à la collection (l'ordre n'a pas d'importance) 
            Installers.Add(service);
            Installers.Add(process);
        }
    }

2. Installer un service windows

Il existe deux façons d'installer un service windows : Soit de façon manuelle, soit avec un projet d'installation.

2.1. Installation manuelle

Pour installer manuellement un service, il faut exécuter la commande InstallUtil.exe via le cmd.exe avec pour paramètre le nom du service de la façon suivante : InstallUtil 'nom du service.exe'. De même, pour désinstaller un service manuellement, on utilise la commande InstallUtil /u 'nom du service.exe'.Installutil.exe, disponible dans le répertoire suivant : %windir%\Microsoft.NET\Framework\v2.0.50727\folder

2.2. Installation via un projet d'installation

Pour créer un setup à notre service, on ajoute un projet de type 'projet d'installation' à notre solution que l'on appelle SetupService.

Image non disponible

On configure, ensuite, le projet en faisant un clic-droit, Ajouter, Sortie de projet. On sélectionne le projet de service WindowsServiceDVP en tant que Sortie Principale.

Image non disponible

Il ne nous reste plus qu'à "autoriser" notre service à commettre plusieurs actions. Pour ce faire, effectuez un clic-droit sur le projet SetupService, Affichage, Actions personnalisées. Une fois dans la fenêtre des actions, on fait, de nouveau, un clic-droit, Ajouter une action personnalisée. On sélectionne Dossier d'application comme le montre l'image suivante :

Image non disponible

Il suffit de valider pour permettre à notre service de disposer des différentes actions possibles.

Image non disponible

On peut maintenant générer le projet d'installation qui va créer un fichier setup.exe permettant d'installer le service et un fichier SetupService.msi pour déployer automatiquement le service. Je vous laisse le soin d'installer votre nouveau service, puis d'aller vérifier dans la liste des services que tout s'est bien déroulé.

Image non disponible

Comme prévu, le service s'appelle bien 'Developpez' et son type de démarrage est bien en mode Manuel. On peut donc démarrer le service et vérifier dans le fichier c:\temp\test.txt que l'heure est bien inscrite.

3. Conclusion

Je tiens à remercier l'ensemble de l'équipe .NET de développez pour ses conseils avisés ainsi que pixelomilcouleurs pour sa relecture et les corrections apportées.

4. Téléchargements

Le code source du tutoriel est disponible à cette adresse : Sources