我正在构建一个Windows服务,它将监视特定事件和磁盘活动的发生。发生此类事件时,我的计划是通过客户端应用程序提醒用户该事件,并在必要时提供补救措施。我(大部分)都完成了客户端和服务组件,这些组件运行良好......除非客户端应用程序没有运行。
简而言之,我正在寻找一种通过CreateProcess从Windows服务启动客户端应用程序的方法,以便为用户提供信息。但是,似乎服务甚至无法看到客户端应用程序的文件/文件夹来执行它。我怀疑这是由于服务运行的凭据,或者可能是由于服务级别的限制,但是在我深入了解之前想要提供一些建议。
所以,首先是明显的问题......我是否清楚地思考这个问题?架构计划是健全的,还是我应该看另一种方法?我不想重新完成我已经完成的任何工作,但显然希望确保计划和流程是可靠的。
问题#2,我对这个型号有什么限制?是否有允许此级别访问的服务帐户?
我现在显然正在努力解决这个问题,所以任何想法或帮助都将不胜感激!
谢谢, 克里斯
答案 0 :(得分:4)
正如其他人已经提到的,你不能(轻松)直接从服务启动应用程序,所以我认为解决问题的最简单方法是创建一个在登录时启动并使用记录的凭据运行的进程在用户中,例如位于系统托盘中的应用程序,它打开命名管道或服务的网络端口。如果服务需要提醒用户,它会向该通道发送消息,然后客户端进程可以显示自己的UI或启动应用程序。使用管道或端口进行进程间通信是处理会话0进程限制的最简单方法。
答案 1 :(得分:3)
Windows服务无权访问Vista及更高版本中的用户会话,因此阻止其在该会话上启动可执行文件。您可以从Microsoft下载详细说明的白皮书:Impact of Session 0 Isolation on Services and Drivers in Windows。
答案 2 :(得分:3)
自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