3

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

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

所以,首先是显而易见的问题......我是否清楚地考虑过这个问题?架构计划是否合理,或者我应该看看另一种方法?我不想重新做任何我已经完成的工作,但显然想确保计划和过程是可靠的。

问题 #2,我在使用此模型时面临哪些限制?是否有允许此级别访问的服务帐户?

我现在显然正在为此苦苦挣扎,因此将不胜感激任何想法或帮助!

谢谢,克里斯

4

3 回答 3

4

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

于 2011-09-29T20:56:34.623 回答
3

Windows 服务无法访问 Vista 及更高版本中的用户会话,因此它被阻止在该会话上启动可执行文件。您可以从 Microsoft 下载详细介绍的白皮书:Session 0 Isolation on Services and Drivers in Windows 的影响

于 2011-09-29T18:28:36.580 回答
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

于 2011-09-29T18:36:25.773 回答