从Windows服务启动应用程序

我正在构build一个Windows服务,将监视事件和磁盘活动的特定事件。 发生此类事件时,我的计划是通过客户端应用程序提醒用户该事件,并在必要时提供补救措施。 我(大部分)完成了客户端和服务组件,这很好用,除非客户端程序没有运行。

总之,我正在寻找一种方法来通过CreateProcess从Windows服务启动客户端应用程序,以向用户提供信息。 但是,它似乎甚至无法看到客户端应用程序的文件/文件夹执行它。 我怀疑这是由于服务正在运行的凭据,或者可能是由于服务级别的限制,但是我想深入了解一些build议之前,我深入了解了这一点。

所以,首先显而易见的问题是…我是否清楚地思考这个问题? 架构计划是否听起来,还是应该看另一种方法? 我宁愿不重做我已经完成的任何工作,但显然要确保计划和过程是坚实的。

问题#2,这个模型面临的局限性是什么? 有没有一个服务帐户,将允许这个级别的访问?

我显然正在努力,所以任何想法或援助将不胜感激!

谢谢,克里斯

Solutions Collecting From Web of "从Windows服务启动应用程序"

正如其他人已经提到的,你不能(直接)从服务中直接启动一个应用程序,所以我认为解决这个问题的最简单的方法是创建一个在登录时开始并且以登录用户的凭据运行的进程,例如位于系统托盘中的应用程序,并打开命名管道或服务的网络端口。 如果服务需要提醒用户,它会在该通道中发送消息,然后客户端进程可以显示自己的UI或启动应用程序。 使用管道或端口的进程间通信是处理会话0进程限制的最简单方法。

Windows服务无法访问Vista及以上版本的用户会话,因此在该会话中阻止启动可执行文件。 您可以从Microsoft下载一份白皮书,详细介绍: Windows中的服务和驱动程序中的会话0隔离的影响 。

从Vista开始,服务在会话0中运行,用户的桌面始终在不同的会话中。 因此,您需要努力在用户的桌面上启动服务。

它可以完成,但是非常棘手。 详情可以在这里找到: http : //blogs.msdn.com/b/winsdk/archive/2009/07/14/launching-an-interactive-process-from-windows-service-in-windows-vista-and- later.aspx?WA = wsignin1.0