从Windows服务运行外部进程

时间:2011-07-01 19:37:52

标签: c# windows

我有一个使用某些第三方应用程序的Windows服务。该应用程序是从一个窗口构建的,用于登录,登录后进程在后台运行,而不是打扰任何人。

我有打开此应用程序的代码(使用Process类),填写所有必填字段并点击连接按钮。当我从命令行或win表单使用它时,此代码工作正常,但是从Windows服务执行此代码不执行任何操作 - 不是错误,并且没有exe正在运行!

我知道这听起来有点奇怪,Windows服务应该是UI免费的设计,但我需要在我的服务开始工作之前午餐这个应用程序,我不想通过两个步骤进行此操作 - 午餐外部所有和启动服务。

我尝试从服务属性的登录标签中检查“允许服务与桌面交互”,但这没有做任何事情。

任何建议如何使这项工作,或者可能是这个问题的其他设计让我设法一步完成操作。

感谢。

3 个答案:

答案 0 :(得分:1)

也许这可以帮到你? http://blogs.msdn.com/b/winsdk/archive/2009/07/14/launching-an-interactive-process-from-windows-service-in-windows-vista-and-later.aspx

请注意,它适用于Windows SDK,您需要使用PInvoke来执行那里的方法。

另请参阅此相关问题:How to start a process from windows service into currently logged in user's session

答案 1 :(得分:1)

您需要重新调整您的期望。系统启动时自动启动服务。用户登录时启动您的应用(例如HKLM\Software\Windows\CurrentVersion\Run)。安排该服务在应用程序之前具有弹性。还要确保服务可以在应用程序停止(例如崩溃)和重新启动后继续存在。

为什么我要说这一切?那么,即使没有连接的交互式用户,服务也始终在运行。如果是这样,那么您就不能指望您的交互式应用程序在服务启动之前运行。

答案 2 :(得分:0)

我之前遇到过类似的问题,需要在某些条件下显示表单的Windows服务,但大部分时间只是在后台闲置。

不确定您的要求是什么,但我最终将其编写为没有主要表单的表单应用程序。

将此与在启动时启动程序相结合,效果非常好。

基本上

[STAThread]
    static void Main(string[] args)
    {
        // Launch your stuff in a separate thread like you would in the Service Start method.      

        Application.Run();       
    }

就是这样。希望它有所帮助。