Comment un service Windows peut-il Démarrer un processus lorsqu'un événement Timer est soulevé?

j'ai créé un service Windows avec minuterie et en cas de mise à feu de timer.Elapsed je crée un processus ( System.Diagnostics.Process.Start(exe path) ) à un intervalle de 5 secondes. Mais ce processus n'est pas créé sur le déclenchement d'un événement.

y a-t-il une autre façon de faire cela?

Merci d'avance.

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{       

    Process pr = new Process();
    pr.StartInfo.FileName = @"C:Program FilesMessengermsmsgs.exe";
    pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
    pr.StartInfo.CreateNoWindow = false;
    pr.Start();
}
7
demandé sur Cody Gray 2010-12-23 08:46:41

4 réponses

vous ajoutez des descriptions du problème dans les commentaires au fur et à mesure que vous avancez qui auraient été utiles de savoir au début. La raison pour laquelle vous pouvez voir que le processus a commencé, mais aucune fenêtre n'est jamais ouverte est en raison des changements de modèle de sécurité qui ont été faits aux Services Windows sous Windows Vista et plus tard. Vous ne l'avez pas encore mentionné spécifiquement, mais je soupçonne fortement que vous essayez de l'exécuter sous l'un de ces systèmes d'exploitation. Le vrai problème ne commence pas un processus, il montre une interface utilisateur.

ce que vous essayez d'accomplir est appelé un "Service interactif" , qui est celui qui est autorisé à interagir directement avec l'utilisateur et le bureau (c.-à-d. afficher une fenêtre ou un dialogue).

si vous utilisez Windows XP (et votre service ne sera que ever avoir à exécuter sous Windows XP), vous pouvez suivre les instructions dans cet article pour activer votre service à exécuter en mode interactif, qui vous permettra d'afficher la fenêtre de L'application Adobe Acrobat comme vous vous y attendez. Cependant, comme cette documentation l'indique également, cette fonctionnalité ne fonctionne pas sous Windows Vista et plus tard:

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 devrait ne pas utiliser dans le nouveau code.

plus précisément, dans ces versions, des changements ont été apportés à la façon dont les services et les applications sont gérés. Les Services sont maintenant isolés par le système dans la Session 0, tandis que les applications sont exécutées dans d'autres sessions. Ceci est destiné à isoler les services des attaques qui proviennent du code d'application. Par conséquent, aucune interface utilisateur affichée par un service ne sera jamais visible par un utilisateur sur le système, y compris une simple boîte de message. Vous pouvez lire le livre blanc explique ces changements plus en détail ici . Si vous êtes une personne plus visuelle, reportez-vous au diagramme suivant illustrant le nouveau modèle, en accordant une attention particulière aux lignes de division:

Windows process isolation model under Windows Vista/7

le résultat est que si vous ciblez ces versions, ou pourrait avoir besoin de cibler ces versions, vous ne pouvez pas utiliser cette faille. Je dis "faille" parce que la ligne de fond, comme je l'ai mentionné dans un commentaire, est que les Services Windows ne sont pas destinés à être interactifs . Ce que vous essayez de faire ici va à l'encontre du but et de la conception d'un service. Il n'est pas recommandé avant, et maintenant c'plat ne fonctionne pas du tout. Si vous avez besoin de cette fonctionnalité, vous devez créer un autre type d'application. Les formulaires Windows et WPF sont conçus pour les applications en mode utilisateur, et les deux peuvent démarrer des processus et ouvrir de nouvelles fenêtres si nécessaire. Je vous recommande vivement de convertir pour ce style d'application à la place.

19
répondu Cody Gray 2010-12-23 06:54:33

comme vous n'obtiendrez pas de processus pour afficher L'UI du service, je vous recommande d'exécuter le processus helper lorsque l'utilisateur se connecte et de démarrer votre processus à partir de celui-ci.

0
répondu Daniel Mošmondor 2010-12-23 08:06:17

je me rends compte que je suis un peu en retard à cette fête. Mais puisque cette question a été soulevée dans ma recherche d'une solution, je vais fournir une réponse à la question de L'OP.

vous pouvez démarrer un programme à partir d'un service en utilisant CreateProcessAsUser, en utilisant le token de l'utilisateur connecté. MSDN fournit un bel exemple d'application démontrant ceci; rechercher des CSCreateProcessAsUserFromService: https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

j'ai essayé, et ça marche. Je suis capable de créer un nouveau processus pour mon application .NET existante à partir d'un service, et cela fonctionne très bien. J'ai paramétré les propriétés du journal de service sur le compte système Local, mais j'ai laissé le" autoriser le service à interagir avec le bureau " non vérifié. Mon application est créée lorsque le timer expire, et fonctionne exactement comme lorsqu'il est démarré normalement, y compris la présentation graphique et l'interaction utilisateur.

S'il s'agit d'une une autre discussion est une chose inappropriée ou indésirable à faire. Mais c'est effectivement possible, et pas si difficile que ça.

0
répondu Gary Burgess 2015-07-10 15:08:57

il y a une sorte de travail autour, mais je conseillerais de ne le faire que si vous êtes sûr d'accepter la question de la sécurité!

cela pourrait être la réponse à votre problème: CreateProcessAsUser .

l'échantillon montre comment créer/lancer un processus de manière interactive dans la session de l'utilisateur connecté à partir d'une application de service écrite en C#.Net.

0
répondu Carsten Schildknecht 2015-08-12 14:19:14