从 Windows 服务启动浏览器

Ayr*_*nna 2 .net c# windows windows-services

我对 Microsoft 世界有点陌生。我已经阅读了这个答案和许多其他链接,我知道在 Vista 之后,Windows 服务无法与桌面交互。

但是,我遇到了紧急情况,必须快速找到解决方法。我需要我的 Windows 服务以某种方式打开带有 URL 的浏览器(现在任何类型的丑陋黑客都可以)。答案指出:

您需要编写一个单独的代理应用程序,它将在用户登录时自动启动,并与您的服务进行通信。然后代理可以启动浏览器或执行您需要的任何其他操作。

有人可以向我解释我如何以简单的方式做到这一点吗?该服务将如何与这个“代理”交谈?这个“代理”究竟是什么?

任何链接或建议将不胜感激。

编辑:目前。我的服务尝试运行以下代码:System.Diagnostics.Process.Start("www.google.com");

后来我发现,这不起作用

The*_*aot 5

是的,从服务中您可以在桌面上运行代码...问题是在哪个桌面上?因为可能有多个用户同时登录(例如在 Windows Server 中可能有多个远程登录的用户)。

如果Process.Start在您的示例中从服务中使用:

System.Diagnostics.Process.Start("www.google.com");
Run Code Online (Sandbox Code Playgroud)

该程序不会出现在任何用户的桌面中,因为该服务与用户的任何桌面都没有关联。


解决方案是检测本地登录的用户,然后以该用户身份(并在该用户的权限下)执行程序。为此,我想将您链接到我的另一个答案,在那里我演示了如何从服务调用程序。那个答案中,我介绍了这项技术所需的代码

注意:那个答案是关于屏幕截图的,我描述的技术仍然是在用户会话中调用程序,并且该方法从服务中工作。所以它适用于你的问题。

您可以使用此方法直接执行所需的浏览器。作为替代方案,您可以使用它来调用您的服务可执行文件,您可以在其中System.Environment.UserInteractive检测该可执行文件是否未作为服务运行。如果您将 url 作为执行参数传递给您的服务可执行文件,那么您可以使用默认浏览器打开它,Process.Start就像上面的示例一样。

注意:代码在 Windows 7 上测试过。