Services interactifs
En règle générale, les services sont des applications console conçues pour s’exécuter sans assistance sans interface graphique utilisateur (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 avec un utilisateur à partir d’un service indirectement
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 fonctionCreateProcessAsUserpour exécuter l’application dans le contexte de l’utilisateur interactif. Concevez l’application GUI pour communiquer avec le service via une méthode de communication interprocesseur (IPC), par exemple, des canaux nommés. Le service communique avec l’application GUI pour lui indiquer quand afficher l’interface utilisateur utilisateur utilisateur. L’application communique les résultats de l’interaction utilisateur vers le service afin que le service puisse effectuer 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 appropriée (ACL).
Si ce service s’exécute sur un système multiutilisateur, 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 fonctionMessageBoxavec MB_SERVICE_NOTIFICATION. Il est recommandé d’afficher des messages d’état simples. N’appelez pas MessageBox pendant l’initialisation du service ou à partir de la routineHandlerEx, sauf si vous l’appelez à partir d’un thread distinct, afin que vous reveniez au SCM en temps opportun.
Utilisation d’un service interactif
Par défaut, les services utilisent une station de fenêtre noninteractive et ne peuvent pas interagir avec l’utilisateur. Toutefois, un service interactif peut afficher une interface utilisateur et recevoir une entrée utilisateur.
Prudence
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 à toute 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 Fonction GetThreadDesktop.
Pour créer un service interactif, procédez comme suit lors de l’appel de la fonction CreateService :
- Spécifiez NULL pour le paramètre lpServiceStartName pour exécuter le service dans le contexte du compte localsystem .
- 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 vers 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 par défaut est 1, ce qui signifie qu’aucun service n’est autorisé à s’exécuter de manière interactive, qu’il ait SERVICE_INTERACTIVE_PROCESS. Lorsque NoInteractiveServices a la valeur 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 NoInteractiveServices valeur par défaut 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 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, il est visible uniquement par l’utilisateur 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 Terminal Services ou sur un système prenant en charge le basculement rapide des utilisateurs (le basculement rapide d’utilisateur est implémenté à l’aide des services Terminal).