Services interactifs

En règle générale, les services sont des applications console conçues pour s’exécuter sans assistance sans interface utilisateur graphique (GUI). Toutefois, certains services peuvent nécessiter une interaction occasionnelle avec un utilisateur. Cette page décrit les meilleures façons d’interagir avec l’utilisateur à partir d’un service.

Important

Les services ne peuvent pas interagir directement avec un utilisateur à partir de Windows Vista. Par conséquent, les techniques mentionnées dans la section intitulée Utilisation d’un service interactif ne doivent pas être utilisées dans le nouveau code.

 

Interaction indirecte avec un utilisateur à partir d’un service

Vous pouvez utiliser les techniques suivantes pour interagir avec l’utilisateur à partir d’un service sur toutes les versions prises en charge de Windows :

  • Affichez une boîte de dialogue dans la session de l’utilisateur à l’aide de la fonction WTSSendMessage .

  • Créez une application d’interface graphique graphique masquée distincte et utilisez la fonction CreateProcessAsUser pour exécuter l’application dans le contexte de l’utilisateur interactif. Concevez l’application GUI pour communiquer avec le service par le biais d’une méthode de communication interprocessus (IPC), par exemple, des canaux nommés. Le service communique avec l’application gui pour lui indiquer quand l’afficher. L’application communique les résultats de l’interaction utilisateur au service afin que le service puisse prendre l’action appropriée. Notez que IPC peut exposer vos interfaces de service sur le réseau, sauf si vous utilisez une liste de contrôle d’accès (ACL) appropriée.

    Si ce service s’exécute sur un système multi-utilisateur, ajoutez l’application à la clé suivante afin qu’elle soit exécutée dans chaque session : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. Si l’application utilise des canaux nommés pour IPC, le serveur peut faire la distinction entre plusieurs processus utilisateur en donnant à chaque canal un nom unique basé sur l’ID de session.

La technique suivante est également disponible pour Windows Server 2003 et Windows XP :

  • Affichez une boîte de message en appelant la fonction MessageBox avec MB_SERVICE_NOTIFICATION. Ceci est recommandé pour afficher des messages status simples. N’appelez pas MessageBox pendant l’initialisation du service ou à partir de la routine HandlerEx , sauf si vous l’appelez à partir d’un thread distinct, afin de revenir au SCM en temps opportun.

Utilisation d’un service interactif

Par défaut, les services utilisent une station de fenêtre non interactive et ne peuvent pas interagir avec l’utilisateur. Toutefois, un service interactif peut afficher une interface utilisateur et recevoir une entrée utilisateur.

Attention

Les services exécutés dans un contexte de sécurité élevé, tels que le compte LocalSystem, ne doivent pas créer de fenêtre sur le bureau interactif, car toute autre application qui s’exécute sur le bureau interactif peut interagir avec cette fenêtre. Cela expose le service à n’importe quelle application exécutée par un utilisateur connecté. En outre, les services qui s’exécutent en tant que LocalSystem ne doivent pas accéder au bureau interactif en appelant la fonction OpenWindowStation ou GetThreadDesktop .

 

Pour créer un service interactif, procédez comme suit lors de l’appel de la fonction CreateService :

  1. Spécifiez NULL pour que le paramètre lpServiceStartName exécute le service dans le contexte du compte LocalSystem.
  2. Spécifiez l’indicateur SERVICE_INTERACTIVE_PROCESS .

Pour déterminer si un service s’exécute en tant que service interactif, appelez la fonction GetProcessWindowStation pour récupérer un handle dans la station de fenêtre, et la fonction GetUserObjectInformation pour tester si la station de fenêtre a l’attribut WSF_VISIBLE .

Toutefois, notez que la clé de Registre suivante contient une valeur, NoInteractiveServices, qui contrôle l’effet de SERVICE_INTERACTIVE_PROCESS :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

La valeur NoInteractiveServices est définie par défaut sur 1, ce qui signifie qu’aucun service n’est autorisé à s’exécuter de manière interactive, qu’il ait SERVICE_INTERACTIVE_PROCESS ou non. Lorsque NoInteractiveServices est défini sur 0, les services avec SERVICE_INTERACTIVE_PROCESS sont autorisés à s’exécuter de manière interactive.

Windows 7, Windows Server 2008 R2, Windows XP et Windows Server 2003 : La valeur par défaut NoInteractiveServices est 0, ce qui signifie que les services avec SERVICE_INTERACTIVE_PROCESS sont autorisés à s’exécuter de manière interactive. Lorsque NoInteractiveServices est défini sur une valeur différente de zéro, aucun service démarré par la suite n’est autorisé à s’exécuter de manière interactive, qu’il ait ou non SERVICE_INTERACTIVE_PROCESS.

Important

Tous les services s’exécutent dans la session Terminal Services 0. Par conséquent, si un service interactif affiche une interface utilisateur, elle est visible uniquement pour l’utilisateur qui s’est connecté à la session 0. Étant donné qu’il n’existe aucun moyen de garantir que l’utilisateur interactif est connecté à la session 0, ne configurez pas un service pour qu’il s’exécute en tant que service interactif sous Services Terminal Ou sur un système qui prend en charge le basculement rapide de l’utilisateur (la commutation utilisateur rapide est implémentée à l’aide des services Terminal).