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 :
- Automatique : le service démarre automatiquement une fois le pc démarré ;
- Désactivé : le service ne sera jamais utilisé ;
- 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 :
- 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é ;
- 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 ;
- 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. À utiliser avec précaution.
- Utilisateur (User) : ce compte nécessite une authentification par login/mot de passe.
I. Les services Windows▲
I-A. 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 :
On peut d'ores et déjà modifier certaines propriétés de notre service en double-cliquant sur le fichier [Service.cs].
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 :
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.
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.
[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);
}
}
II. 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.
II-A. 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
II-B. 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.
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.
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 :
Il suffit de valider pour permettre à notre service de disposer des différentes actions possibles.
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é.
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.
III. 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.
IV. Téléchargements▲
Le code source du tutoriel est disponible à cette adresse : Sources