2010-02-24 192 views
1

是否可以从Windows服务启动Web浏览器?我在C#中创建了一项基本服务,并将其安装在“LocalSystem”安全配置文件下。从Windows服务启动Web浏览器

该服务的代码如下:

namespace Bootloader 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      string target = "http://www.microsoft.com"; 
      System.Diagnostics.Process.Start(target); 
     } 

     protected override void OnStop() 
     { 
     } 
    } 
} 

当服务运行时,没有任何反应。关于windows服务的文档说他们没有任何UI,但这是否意味着启动一个Web浏览器是不可能的。

+2

我很好奇你在努力完成什么。你需要你的Windows服务与当前登录的用户进行交互吗?如果是这样,为什么它是一个Windows服务?当没有用户登录时会发生什么?为什么后台服务需要与用户交互?等等。 – jrista 2010-02-24 23:43:32

+0

你期待什么发生?根据您运行的Windows版本,浏览器窗口可能会(也可能不会)不显示。有一个服务提供的用户界面是一个**糟糕的事情** ...谷歌“粉碎攻击” – Rob 2010-02-24 23:57:29

+0

我正在研究一个程序,将运行在后台侦听端口,将弹出一个互联网浏览器和其他用户界面时它接收某些命令。这听起来像一个隐藏窗口的应用程序是要走的路。 – mon4goos 2010-04-06 00:09:19

回答

5

只有在XP和更低版本中才有可能。在Vista中,Windows服务完全在单独的桌面上运行。您必须在用户的桌面上运行某些内容才能完成此操作。

用一个隐藏窗口编写一个应用程序,该窗口在启动时作为解决方法开始。

0

我不认为这是可能的。我知道,如果你想运行Watin(在浏览器实例中运行的功能测试)不能从我的CI环境运行,如果这是作为一个服务运行的,但只有它作为一个应用程序运行。

0

我相信它可以完成,但您需要做额外的工作来处理进程隔离模型(窗口站和桌面)。看看这个页面:Process Connection to a Window Station。既然你不能修改浏览器,你可能需要编写一个shim来改变上下文,然后调用浏览器。

解决方法是将您的服务作为交互式服务运行,但这已过时并且不适用于较新版本的Windows。

0

服务明确禁止与用户交互。由于Vista的这个强制执行,看Interactive Services

重要服务不能直接 与用户交互与Windows Vista的 的。因此,标题为使用 交互式服务的部分中提到的技术 不应该在新代码中使用 。

解决方案是将inteactive部分分成用户会话启动时启动的正常进程(即启动程序)。然后这个过程可以通过它选择的IPC与服务进行通信(共享memeory,净管道,TCP等)。该服务可以指导此过程在需要时启动程序。