Maison >développement back-end >C++ >Comment un service Windows peut-il exécuter des fichiers EXE externes ?

Comment un service Windows peut-il exécuter des fichiers EXE externes ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-06 03:09:38567parcourir

How Can a Windows Service Execute External EXE Files?

Exécuter des programmes EXE à partir des services Windows en C#

L'exécution de programmes EXE à partir des services Windows à l'aide de C# nécessite une attention particulière en raison des limitations inhérentes.

Énoncé du problème

Tentatives de le lancement de programmes EXE à l'aide de System.Diagnostics.Process.Start() à partir d'un service Windows peut échouer. Le code fourni dans la question illustre ce problème :

System.Diagnostics.Process.Start(@"E:\PROJECT XL\INI SQLLOADER\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2\bin\Debug\ConsoleApplication2.exe");

Explication du problème

Les services Windows fonctionnent dans une session isolée, les empêchant d'interagir avec les utilisateurs ou le bureau. Cette restriction leur interdit d'exécuter des applications qui nécessitent une interaction de l'utilisateur ou un accès au bureau.

Considérations

  • Windows Vista et versions ultérieures : Cette limitation est devenue plus prononcée dans Windows Vista et les versions ultérieures.
  • Contexte utilisateur : Les services sont non associé à un utilisateur spécifique, contrairement aux applications classiques.
  • Isolement des processus : Les services Windows sont exécutés dans un processus distinct et ne peuvent pas interagir avec les applications exécutées dans d'autres processus.

Solutions

1. Utiliser une application Windows standard :

Migrez l'exécution du code vers une application Windows standard (par exemple Windows Forms, WPF, Console). Cela permet à l'application de s'exécuter dans le contexte de l'utilisateur actuel et d'interagir avec le bureau.

2. Supprimer la création de fenêtre :

Modifiez le code de l'application Console pour supprimer la création d'une fenêtre Console. Ceci peut être réalisé en ajoutant CreateNoWindow aux options ProcessStartInfo :

ProcessStartInfo psi = new ProcessStartInfo()
{
    FileName = @"E:\PROJECT XL\INI SQLLOADER\ConsoleApplication2\ConsoleApplication2\ConsoleApplication2\bin\Debug\ConsoleApplication2.exe",
    CreateNoWindow = true
};
System.Diagnostics.Process.Start(psi);

Ressources supplémentaires :

  • [Comment un service Windows peut-il démarrer un processus lorsqu'un L'événement du minuteur est soulevé?](https://stackoverflow.com/questions/7744185/how-can-a-windows-service-start-a-process-when-a-timer-event-is-raised)
  • [quel processus dans Windows est l'utilisateur spécifique ?](https://stackoverflow.com/questions/5697405/which-process-in-windows-is-user-special)
  • [service Windows (autoriser le service à interagir avec le bureau)](https ://stackoverflow.com/questions/1644285/windows-service-allow-service-to-interact-with-desktop)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn