可能重复:
How can a Windows service execute a GUI application?
Opening IE through WCF
我有启动的Windows服务,用一些URl打开IE,
这个URL的目的是打开一个IE插件,所以我不认为HttpWebRequest的解决方案应该有效。
我将服务配置为“本地系统帐户”,并“允许与桌面交互”
但不知道如何从服务中打开IE。
答案 0 :(得分:3)
嗯,长话短说 - 你不应该。我不是说“不能”,但你真的不应该。 从Windows Vista开始,会话和桌面之间有更好的分离,并且有充分的理由进行分离。
首先 - 基础知识:在Windows中,您可以拥有多个会话。在每个会话中,您可以拥有多个Windows工作站。在每个Windows Station中,您可以拥有多个桌面(用户的桌面通常名为“默认”)。
默认情况下,服务使用非交互式Windows工作站。如果您使服务交互,则意味着您的服务将在会话0的Winsta0(交互式窗口站)中运行 - 因此您可以与桌面进行一些交互(在Windows XP中 - 如果忽略快速用户切换)。 但是 - 从Windows Vista开始(甚至在使用终端服务方案之前),活动用户不再在会话0中运行。所以你确实打开了Internet Explorer ......但是在错误的会话中。
你能做什么?有一些解决方法。您可以尝试识别您感兴趣的会话(用户当前的loggen,可能是通过查找运行explorer.exe进程的会话),然后重新使用进程令牌(使用OpenProcessToken)并复制它(使用DuplicateTokenEx) )然后使用该令牌创建新进程(使用CreateProcessAsUser)并在Winsta0 \ Default中启动新进程(它将在令牌的会话中启动,希望是用户会话 - 因此用户将能够看到它) 。
希望有所帮助。