当一个Timer事件引发时,Windows服务如何启动一个进程?

我创build了一个Windows服务与计时器和定时器的触发事件。我创build了一个进程( System.Diagnostics.Process.Start(exe path) ),间隔为5秒。 但是这个过程并没有在事件发生时被创build。

还有其他的方法吗?

提前致谢。

 private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Process pr = new Process(); pr.StartInfo.FileName = @"C:\Program Files\Messenger\msmsgs.exe"; pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal; pr.StartInfo.CreateNoWindow = false; pr.Start(); } 

你在评论中join了对问题的描述,从一开始就会有所帮助。 您可以看到该进程的原因已经开始,但是没有任何窗口被打开是因为在Windows Vista及更高版本下对Windows服务所做的安全模型更改。 你还没有具体提到它,但是我强烈怀疑你试图在这些操作系统下运行它。 真正的问题不是开始一个过程,而是展示一个UI。

你想要完成的是一个“交互式服务” ,它被允许直接与用户和桌面交互(即显示一个窗口或对话框)。
如果您使用的是Windows XP(并且您的服务只能在Windows XP下运行),则可以按照该文章中的说明启用服务以交互模式运行,这将允许您显示Adobe Acrobat应用程序窗户,你所期望的。 但是,正如该文档还指出的,此function在Windows Vista和更高版本下不起作用

重要服务从Windows Vista开始,无法直接与用户交互。 因此,标题为“使用交互式服务”一节中提到的技术不应在新代码中使用。

更具体地说,在这些版本中,更改了服务和应用程序的运行方式。 现在服务在会话0中被系统隔离,而应用程序在其他会话中运行。 这旨在将服务与源自应用程序代码的攻击隔离开来。 因此,系统上的任何用户都不会看到服务所显示的UI,包括简单的消息框。 您可以在这里阅读更详细地解释这些更改的白皮书。 如果你是一个更具视觉效果的人,请参考下图来说明新模型,特别注意分界线:

Windows Vista / 7下的Windows进程隔离模型

结果是,如果你针对这些版本,或者可能需要针对这些版本,你不能使用这个漏洞。 我说“漏洞”,因为正如我在评论中提到的那样,底线是Windows服务不是为了交互 。 你在这里试图做的是违背服务的目的和devise。 之前没有推荐过,现在它一直不工作。 如果你需要这个特定的function,你应该创build一个不同types的应用程序。 Windows窗体和WPF都适用于用户模式的应用程序,并且都可以根据需要启动进程并打开新窗口。 我强烈build议您改为使用这种风格的应用程序。

由于您不会获得从服务中显示UI的过程,因此我build议您在用户login时运行帮助程序并从中启动您的过程。

我意识到我对这个派对有点晚了。 但是,既然这个问题出现在我寻求解决scheme的时候,我会回答OP的问题。

您可以使用CreateProcessAsUser使用login用户的令牌从服务启动程序。 MSDN提供了一个很好的示例应用程序来演示这个; 查找CSCreateProcessAsUserFromService: https ://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

我试了一下,它的工作原理。 我能够从一个服务为我现有的.NET应用程序创build一个新的进程,它工作得很好。 我将“服务login属性”设置为“本地系统”帐户,但未选中“允许服务与桌面交互”。 我的应用程序是在计时器到期时创build的,并且像正常启动时一样工作,包括GUI演示和用户交互。

这是不是一个不恰当的或不好的事情是另一个讨论。 但确实有可能,而且确实不是那么困难。

有一种解决方法,但我会build议只有这样做,如果你有接受安全问题!

这可能是您的问题的答案: CreateProcessAsUser 。

该示例演示了如何在用C#.Net编写的服务应用程序中以login用户的会话交互式创build/启动进程。