Introduction aux applications de service Windows

Remarque

Cet article ne s’applique pas aux services hébergés dans .NET. Pour obtenir le contenu actualisé des services Windows utilisant Microsoft.Extensions.Hosting.BackgroundService et le modèle Service Worker, consultez :

Les services Microsoft Windows, anciennement « services NT », vous permettent de créer des applications exécutables longue durée qui s’exécutent au sein de leurs propres sessions Windows. Ces services peuvent être lancés automatiquement au démarrage de l’ordinateur, et peuvent être suspendus et redémarrés. Ils n’affichent aucune interface utilisateur. Les services sont donc parfaitement adaptés à une utilisation sur un serveur ou chaque fois que vous avez besoin de fonctionnalités longue durée qui n’interfèrent pas avec d’autres utilisateurs travaillant sur le même ordinateur. Vous pouvez également exécuter des services dans le contexte de sécurité d’un compte d’utilisateur spécifique (différent de l’utilisateur connecté ou du compte d’ordinateur par défaut). Pour plus d’informations sur les services et sessions Windows, consultez la documentation du kit SDK Windows.

Vous pouvez facilement créer des services en créant une application qui est installée comme service. Par exemple, supposons que vous souhaitiez monitorer les données d’un compteur de performances et réagir à des valeurs de seuil. Vous pouvez écrire une application de service Windows qui écoute les données du compteur de performances, déployer l’application, puis lancer la collecte et l’analyse des données.

Créez votre service en tant que projet Microsoft Visual Studio. Dans celui-ci, définissez du code qui contrôle les commandes pouvant être envoyées au service et les actions à effectuer quand ces commandes sont reçues. Parmi les commandes que vous pouvez envoyer à un service, citons le démarrage, la suspension, la reprise et l’arrêt. Vous pouvez également exécuter des commandes personnalisées.

Après avoir créé et généré l’application, vous pouvez l’installer en exécutant l’utilitaire de ligne de commande InstallUtil.exe et en passant le chemin au fichier exécutable du service. Vous pouvez ensuite utiliser le Gestionnaire de contrôle des services pour démarrer, arrêter, suspendre, reprendre et configurer votre service. Vous pouvez également accomplir la plupart de ces tâches dans le nœud Services de l’Explorateur de serveurs ou à l’aide de la classe ServiceController.

Applications de service et autres applications Visual Studio

Le fonctionnement des applications de service diffère de celui d’autres types de projets à plusieurs égards :

  • Le fichier exécutable compilé créé par un projet d’application de service doit d’abord être installé sur le serveur pour que le projet puisse fonctionner de manière utile. Vous ne pouvez pas appuyer sur F5 ou F11 pour déboguer ou exécuter une application de service. Par ailleurs, vous ne pouvez ni exécuter immédiatement un service ni effectuer un pas à pas détaillé dans son code. Vous devez installer et démarrer votre service, puis attacher un débogueur au processus du service. Pour plus d’informations, consultez Guide pratique pour déboguer les applications de service Windows.

  • Contrairement à certains types de projets, vous devez créer des composants d’installation pour les applications de service. Les composants d’installation installent le service sur le serveur et l’inscrivent auprès de celui-ci. Ils créent également une entrée pour votre service dans le Gestionnaire de contrôle des services Windows. Pour plus d’informations, consultez Guide pratique pour ajouter des programmes d’installation à votre application de service.

  • La méthode Main de votre application de service doit émettre la commande Run pour les services contenus dans votre projet. La méthode Run charge les services dans le Gestionnaire de contrôle des services sur le serveur approprié. Si vous utilisez le modèle de projet Services Windows, cette méthode est automatiquement écrite pour vous. Notez que le chargement et le démarrage d’un service sont deux choses différentes. Pour plus d’informations, consultez « Durée de vie du service » ci-dessous.

  • Les applications de service Windows s’exécutent dans une station de fenêtre différente de la station interactive de l’utilisateur connecté. Une station de fenêtre est un objet sécurisé contenant un Presse-papiers, un ensemble d’atomes globaux et un groupe d’objets de bureau. Étant donné que la station du service Windows n’est pas une station interactive, les boîtes de dialogue déclenchées à partir d’une application de service Windows ne sont pas visibles et peuvent provoquer le blocage de votre programme. De la même façon, les messages d’erreur doivent être journalisés dans le journal des événements Windows au lieu d’être déclenchés dans l’interface utilisateur.

    Les classes de service Windows prises en charge par le .NET Framework ne prennent pas en charge l’interaction avec des stations interactives, c’est-à-dire l’utilisateur connecté. Le .NET Framework n’inclut pas non plus les classes qui représentent des stations et des bureaux. Si votre service Windows doit interagir avec d’autres stations, vous devez accéder à l’API Windows non managée. Pour plus d’informations, consultez la documentation du SDK Windows.

    Prenez soin de concevoir l’interaction du service Windows avec l’utilisateur ou d’autres stations pour faire face à divers scénarios, notamment l’absence d’un utilisateur connecté ou la présence d’un ensemble inattendu d’objets sur le Bureau d’un utilisateur. Dans certains cas, il peut être plus opportun d’écrire une application Windows qui s’exécute sous le contrôle de l’utilisateur.

  • Les applications de service Windows s’exécutent dans leur propre contexte de sécurité et sont démarrées avant que l’utilisateur ne se connecte à l’ordinateur Windows sur lequel elles sont installées. Réfléchissez bien au compte d’utilisateur sous lequel vous souhaitez que le service s’exécute. En effet, un compte système confère au service davantage de droits et de privilèges qu’un compte d’utilisateur.

Durée de vie d’un service

Un service passe par plusieurs états internes au cours de sa vie. Le service est d’abord installé sur le système sur lequel il doit s’exécuter. Ce processus exécute les programmes d’installation du projet de service et charge le service dans le Gestionnaire de contrôle des services de cet ordinateur. Le Gestionnaire de contrôle des services est l’utilitaire central fourni par Windows pour administrer les services.

Une fois le service chargé, il doit être démarré. Un service qui n’est pas démarré ne fonctionne pas. Vous pouvez démarrer un service à partir du Gestionnaire de contrôle des services, à partir de l’Explorateur de serveurs ou à partir du code en appelant la méthode Start. La méthode Start passe le traitement à la méthode OnStart de l’application et traite le code que vous avez défini à cet emplacement.

Un service en cours d’exécution peut être dans cet état indéfiniment, jusqu’à son arrêt ou sa suspension ou jusqu’à l’arrêt de l’ordinateur. Un service peut être dans l’un des trois états de base suivants : Running, Paused ou Stopped. Le service peut également signaler l’état d’une commande en attente : ContinuePending, PausePending, StartPending ou StopPending. Ces états indiquent qu’une commande a été émise, par exemple pour suspendre un service en cours d’exécution, mais qu’elle n’a pas encore été exécutée. Vous pouvez interroger Status pour déterminer l’état d’un service, ou utiliser WaitForStatus pour effectuer une action quand l’un de ces états se produit.

Vous pouvez suspendre, arrêter ou reprendre un service à partir du Gestionnaire de contrôle des services, à partir de l’Explorateur de serveurs ou en appelant des méthodes dans le code. Chacune de ces actions peut appeler une procédure associée dans le service (OnStop, OnPause ou OnContinue), où vous pouvez définir un traitement supplémentaire à effectuer quand le service change d’état.

Types de services

Dans Visual Studio, vous pouvez créer deux types de services à l’aide du .NET Framework. Un service unique dans un processus se voit affecter le type Win32OwnProcess. Un service qui partage un processus avec un autre service se voit affecter le type Win32ShareProcess. Pour récupérer le type d’un service, interrogez la propriété ServiceType.

Il est possible que vous obteniez d’autres types de services si vous interrogez des services existants qui n’ont pas été créés dans Visual Studio. Pour plus d’informations sur ceux-ci, consultez ServiceType.

Services et composant ServiceController

Le composant ServiceController permet d’établir une connexion à un service installé et de manipuler son état. À l’aide d’un composant ServiceController, vous pouvez démarrer et arrêter un service, suspendre et poursuivre son exécution, et envoyer des commandes personnalisées à un service. Toutefois, il est inutile de recourir à un composant ServiceController quand vous créez une application de service. En fait, dans la plupart des cas, votre composant ServiceController doit se trouver dans une application séparée de l’application de service Windows qui définit votre service.

Pour plus d’informations, consultez ServiceController.

Spécifications

  • Les services doivent être créés dans un projet d’application Service Windows ou un autre projet compatible .NET Framework qui crée un fichier .exe au moment de la génération et qui hérite de la classe ServiceBase.

  • Les projets contenant des services Windows doivent avoir des composants d’installation pour le projet et ses services. Pour y parvenir facilement, utilisez la fenêtre Propriétés. Pour plus d’informations, consultez Guide pratique pour ajouter des programmes d’installation à votre application de service.

Voir aussi