2014-12-01 139 views
0

我有一个服务应该打开一个EXE应用程序(C#应用程序)根据一定的条件。当服务以调试模式启动时(Visual Studio),它将打开应用程序。但是,当它作为服务安装时,它并不这样做。它无法打开应用程序。这是为什么发生?从Windows服务启动一个EXE应用程序

+0

用户是否必须查看该应用程序?这是不可能的。你的服务在会话中运行吗?这可能是必需的。 – TomTom 2014-12-01 16:28:44

+0

服务默认情况下运行在不允许用户交互的隔离会话中。 Windows服务不是用来交互的,所以你在这里试图做的不是服务的目的。您可能需要考虑将代码重构为用户模式应用程序。澄清你需要执行的exe程序,以及该服务的功能是什么? – 2014-12-01 16:35:15

+0

是的,用户必须看到应用程序。不,不是的。任何解决此问题的方法? – 2014-12-01 16:35:16

回答

0

感谢您的答案!我找到了一个解决方案,并在这里发布。 我创建了一个在启动时隐藏的虚拟应用程序,它的功能与服务的目的完全相同。

1.创建一个虚拟应用程序(从服务中复制粘贴代码以形成应用程序) 启动后隐藏它。 2.安装后立即启动应用程序。 3.添加注册表项,以便在系统重新引导后启动。

用简单的话说,克隆服务行为。

1

你试图做的事情在正常情况下不是直接可能的 - 简单地从Windows服务代码启动新过程中的应用程序不会与当前登录用户的GUI进行交互害怕。

然而,在服务和GUI之间有通信方式。

This discussion might point you in the right direction

+0

嗨@olitee感谢您的答复。我尝试使用“与桌面互动”选项。这会成功启动应用程序,但要求用户有权读取消息或放弃。申请的目的是强制填写考勤,而不是推迟考勤。有没有可能覆盖用户权限并直接启动应用程序? – 2014-12-01 16:54:22

+0

我不知道的迂回方式,任何方式 - 默认行为是有原因的。首选方法是让您的服务通过命名管道与桌面应用进行通信。您可以创建一个在用户会话中静默运行的助手应用程序,并监视该管道的消息。该应用程序既可以展示它的图形用户界面给用户,当一个消息收到 - 或启动在你已经描述的方式另一个应用程序。 – olitee 2014-12-01 16:59:18

0

根据你的意见,我认为你真正在寻找的是一个普通的用户空间应用程序和一个调度程序。您可能希望使用Windows自己的调度程序在每个星期一运行应用程序(如果它是一个永远在线的框),或者将应用程序放在启动中。当应用程序运行时,它应该检查当前的星期几,如果它是星期一,并且应用程序以前没有运行过,那么应用程序应该启动。如果没有,你可以安全地终止应用程序。

+0

调度部分可以通过我的配置为我的电脑吧?但是这个应用程序有一个多用户基础,它必须预先配置这个逻辑。服务完成了我的工作,但我意识到只有在安装后才会失败。 – 2014-12-01 17:00:02