2010-11-21 10 views

Répondre

5

Parce que le service ne fonctionne pas dans le cadre 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 vous fournissant des informations sur l'exécution du service et 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.

+0

J'ai timer et notifyicon dans le service Windows où warning avec notify dans taskabar Le menu contextuel n'est pas activé – user514989

+1

J'ai un bon exemple de pourquoi j'ai besoin que cela soit activé. Mon service peut exécuter des scripts utilisateur personnalisés. Parfois, les applications de ces scripts ont une interface utilisateur d'application et aucune version de console correspondante. Si cette option n'est pas activée, les applications ne peuvent pas démarrer et les scripts échouent essentiellement. Ce n'est pas que j'ai personnellement codé le service d'une manière où j'ai besoin de l'option, c'est un véritable cas d'utilisation pour l'activer. – BrutalDev

23

Je vais prendre quelques libertés ici en essayant d'interpréter votre question à partir de mots-clés. À l'avenir, s'il vous plaît passer plus de temps à écrire vos questions afin qu'ils aient un sens à une autre personne qui essaie de les lire et de les comprendre.

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

Toutefois, notez que de Windows Vista, les services sont strictement interdits d'interagir directement avec un utilisateur:

Important: services ne peuvent pas interagir directement avec un utilisateur au 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 un nouveau code.

Cette "caractéristique" est cassée, et la sagesse conventionnelle veut que vous n'ayez pas dû vous y fier de toute façon. Les services ne sont pas destinés à fournir une interface utilisateur ou à permettre tout type d'interaction directe avec l'utilisateur. Microsoft a averti que cette fonctionnalité est évitée depuis les premiers jours de Windows NT en raison des risques de sécurité possibles. Larry Osterman explique pourquoi c'était always a bad idea. Et il est not the only one.

Il sont certains possibleworkarounds, cependant, si vous absolument devez avoir cette fonctionnalité. Mais je vous encourage fortement à considérer sa nécessité avec soin et à explorer d'autres conceptions pour votre service.

+1

+1 Une bonne rédaction, surtout si l'on tient compte du manque d'information de l'OP – mandreko

2

Vous devez ajouter serviceinstaller et écrire le code ci-dessous dans l'événement commuté 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); 
     } 
+0

Pouvez-vous expliquer comment ce code va permettre d'interagir avec le service? – Newbee

-4

wmiService = new ManagementObject("Win32_Service.Name='" + serviceInstaller1.ServiceName + "'");

sur machine 64 bits?

+5

Comment utiliser la ligne de code fournie pour permettre à un service d'interagir avec le bureau? Vous voudrez peut-être passer plus de temps à écrire vos réponses afin que les gens puissent les comprendre. – mandreko