web-dev-qa-db-fra.com

Autoriser le service à interagir avec le bureau sous Windows

Dans services.msc> Action> Propriétés> Connexion> Autoriser le service à interagir avec le bureau, j'ai activé mon service pour interagir avec le bureau. Qu'est-ce que cela signifie exactement? Comment puis-je l'utiliser pour lire le son (MP3, WAV, etc.) de mon service?

services.msc > Action > Properties > Log On > Allow service to interact with desktop

19
user514989

Je vais prendre quelques libertés ici en essayant d'interpréter votre question à partir de mots clés. À l'avenir, veuillez consacrer plus de temps à la rédaction de vos questions afin qu'elles aient un sens pour une autre personne qui essaie de les lire et de les comprendre.

Il y a une case à cocher sous l'onglet Connexion dans la fenêtre des propriétés pour un service Windows qui est appelé "Autoriser le service à interagir avec le bureau." Si vous ' Si vous essayez de cocher cette case par programme, vous devez spécifier le SERVICE_INTERACTIVE_PROCESS flag lorsque vous créez votre service à l'aide de l'API CreateService . (Voir MSDN ).

Cependant, notez qu'à partir de Windows Vista, les services sont strictement interdits d'interagir directement avec un utilisateur:

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.

Cette "fonctionnalité" est rompue, et la sagesse conventionnelle veut que vous ne deviez pas vous y fier de toute façon. Les services ne sont pas destinés à fournir une interface utilisateur ou à autoriser tout type d'interaction directe avec l'utilisateur. Microsoft a mis en garde contre cette fonctionnalité depuis les premiers jours de Windows NT en raison des risques de sécurité possibles. Larry Osterman explique pourquoi c'était toujours une mauvaise idée . Et il est pas le seul .

Il y a sont certains possiblesolutions de contournement , cependant, si vous absolument doit avoir cette fonctionnalité. Mais je vous exhorte fortement à considérer soigneusement sa nécessité et à explorer des conceptions alternatives pour votre service.

28
Cody Gray

Parce que le service ne s'exécute pas dans le contexte d'une session utilisateur, vous créez une deuxième application pour interagir avec le service.

Par exemple, le serveur Microsoft SQL dispose d'un outil de surveillance. Cette application s'exécute dans la session utilisateur et se connecte au service en vous fournissant des informations sur l'exécution du service et en vous permettant d'arrêter et de démarrer le service de base de données.

Étant donné que cette application s'exécute dans une session utilisateur, vous pouvez interagir avec le bureau via cette application.

5
Pieter van Ginkel

Vous devez ajouter serviceinstaller et écrire ci-dessous le code dans l'événement engagé de serviceinstaller.

using System.Management;
using System.ComponentModel;
using System.Configuration.Install;

private void serviceInstaller1_Committed(object sender, InstallEventArgs e)
{
    ConnectionOptions coOptions = new ConnectionOptions();
    coOptions.Impersonation = ImpersonationLevel.Impersonate;
    ManagementScope mgmtScope = new ManagementScope(@"root\CIMV2", coOptions);
    mgmtScope.Connect();
    ManagementObject wmiService;
    wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");
    ManagementBaseObject InParam = wmiService.GetMethodParameters("Change");
    InParam["DesktopInteract"] = true;
    ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", InParam, null);
}
4
Rupesh Kadam