8

I have created a Windows Service with Timer and in firing event of timer.Elapsed I am creating a process (System.Diagnostics.Process.Start(exe path)) at interval of 5 seconds. But this process does not get created on the firing of an event.

Is there any other way of doing this?

Thanks in advance.

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();
}
4

4 回答 4

21

您在评论中添加了对问题的描述,这将有助于在一开始就知道。您可以看到进程已启动但没有打开任何窗口的原因是因为在 Windows Vista 及更高版本下对 Windows 服务进行了安全模型更改。你还没有具体提到它,但我强烈怀疑你正试图在其中一个操作系统下运行它。真正的问题不是启动一个进程,而是显示一个 UI。

您要完成的工作称为“交互式服务”,它允许直接与用户和桌面进行交互(即显示窗口或对话框)。如果
您使用的是 Windows XP(并且您的服务只需要在 Windows XP 下运行),您可以按照该文章中的说明使您的服务以交互模式运行,这将允许您显示 Adob​​e Acrobat 应用程序如您所愿的窗口。但是,正如该文档还指出的那样,此功能在 Windows Vista 及更高版本下不起作用:

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

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

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

结果是,如果您要针对这些版本,或者可能需要针对这些版本,您就不能利用这个漏洞。我说“漏洞”是因为,正如我在评论中提到的那样,底线是Windows 服务不打算是交互式的。您在这里尝试做的事情与服务的目的和设计背道而驰。以前不推荐,现在平板根本不行。如果您需要此特定功能,您应该创建不同类型的应用程序。Windows 窗体和 WPF 都适用于用户模式应用程序,并且都可以根据需要启动进程和打开新窗口。我强烈建议您改用这种风格的应用程序。

于 2010-12-23T06:54:33.043 回答
1

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

于 2010-12-23T08:06:17.307 回答
1

我意识到我参加这个聚会有点晚了。但是由于这个问题是在我寻找解决方案时出现的,所以我将提供对 OP 问题的答案。

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

我试过了,它有效。我可以通过服务为我现有的 .NET 应用程序创建一个新进程,并且它工作得很好。我将服务登录属性设置为本地系统帐户,但未选中“允许服务与桌面交互”。我的应用程序是在计时器到期时创建的,它的工作方式与正常启动时一样,包括 GUI 演示和用户交互。

这是否是不适当或不受欢迎的事情是另一个讨论。但这确实是可能的,而且真的没有那么困难。

于 2015-07-10T15:08:57.973 回答
1

有一种解决方法,但我建议只有在您确定接受安全问题的情况下才这样做!

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

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

于 2015-08-12T14:19:14.000 回答