Comment un service Windows peut-il démarrer un processus lorsqu’un événement Timer est déclenché?

J’ai créé un service Windows avec minuteur et en cas d’ timer.Elapsed de timer.Elapsed En cas de timer.Elapsed je crée un processus ( System.Diagnostics.Process.Start(exe path) ) à un intervalle de 5 secondes. Mais ce processus ne se crée pas lors du 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 Files\Messenger\msmsgs.exe"; pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal; pr.StartInfo.CreateNoWindow = false; pr.Start(); } 

Vous ajoutez une description du problème dans les commentaires au fur et à mesure, qu’il aurait été utile de connaître dès le départ. La raison pour laquelle vous pouvez voir que le processus a démarré mais qu’aucune fenêtre ne s’ouvre jamais est due aux modifications apscopes au modèle de sécurité qui ont été apscopes à Windows Services sous Windows Vista et versions ultérieures. Vous n’en avez pas encore parlé, mais je soupçonne fortement que vous essayez de l’exécuter sous l’un de ces systèmes d’exploitation. Le véritable problème ne consiste pas à démarrer un processus, mais à afficher une interface utilisateur.

Ce que vous essayez d’accomplir s’appelle un “service interactif” , c’est-à-dire un service qui permet d’interagir directement avec l’utilisateur et le bureau (c’est-à-dire d’afficher une fenêtre ou une boîte de dialog).
Si vous utilisez Windows XP (et que votre service ne devra être exécuté que sous Windows XP), vous pouvez suivre les instructions de cet article pour permettre à votre service de s’exécuter en mode interactif, ce qui vous permettra d’afficher l’application Adobe Acrobat. fenêtre comme vous l’attendez. Toutefois, comme l’indique également cette documentation, cette fonctionnalité ne fonctionne pas sous Windows Vista et les versions ultérieures:

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.

Plus précisément, dans ces versions, des modifications ont été apscopes à la manière dont les services et les applications sont exécuté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 provenant du code de l’application. Par conséquent, aucune interface utilisateur affichée par un service ne sera jamais visible par un utilisateur du système, y compris par une simple boîte de message. Vous pouvez lire le livre blanc qui explique ces changements plus en détail ici . Si vous êtes plus visuel, reportez-vous au schéma suivant illustrant le nouveau modèle, en accordant une attention particulière aux lignes de démarcation:

Modèle d'isolation de processus Windows sous Windows Vista / 7

Le résultat est que si vous ciblez ces versions ou devez éventuellement cibler ces versions, vous ne pouvez pas utiliser cette échappatoire. Je dis «échappatoire» car, comme je l’ai mentionné dans un commentaire, le but ultime est que les services Windows ne sont pas conçus pour être interactifs . Ce que vous essayez de faire ici va à l’encontre du but et de la conception d’un service. Ce n’était pas recommandé auparavant, et maintenant ça ne marche plus du tout. Si vous avez besoin de cette fonctionnalité particulière, vous devez créer un type d’application différent. Windows Forms et WPF sont conçus pour des applications en mode utilisateur. Ils peuvent tous deux démarrer des processus et ouvrir de nouvelles fenêtres, si nécessaire. Je vous recommande fortement de convertir ce type d’application à la place.

Étant donné que vous n’obtiendrez pas de processus permettant d’afficher l’interface utilisateur du service, il est recommandé d’exécuter le processus d’assistance lorsque l’utilisateur se connecte et de lancer le processus à partir de celui-ci.

Je me rends compte que je suis un peu en retard à cette fête. Mais comme cette question est apparue dans ma recherche d’une solution, je vais répondre à la question du PO.

Vous pouvez démarrer un programme à partir d’un service à l’aide de CreateProcessAsUser, à l’aide du jeton de l’utilisateur connecté. MSDN fournit un bel exemple d’application pour le démontrer. recherchez CSCreateProcessAsUserFromService: https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

Je l’ai essayé et il fonctionne. 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 défini les propriétés d’ouverture de session du service sur Compte système local, mais je n’ai pas coché l’option “Autoriser le service à interagir avec le bureau”. Mon application est créée à l’expiration du minuteur et fonctionne exactement comme lors d’un démarrage normal, y compris la présentation à l’interface graphique et les interactions de l’utilisateur.

Que ce soit une chose impropre ou indésirable à faire est une autre discussion. Mais c’est en effet possible, et vraiment pas si difficile.

Il existe une sorte de solution de contournement, mais je vous conseillerais de ne le faire que si VOUS ÊTES SÛR D’ACCEPTER LA QUESTION DE SÉCURITÉ!

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

L’exemple 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.