【问题标题】:Open IE from Windows service [duplicate]从 Windows 服务打开 IE [重复]
【发布时间】:2012-02-05 18:59:26
【问题描述】:

可能重复:
How can a Windows service execute a GUI application?
Opening IE through WCF

我有 Windows 服务,在启动时应该使用一些 URl 打开 IE,

这个 URL 的目的是打开一个 IE 插件,所以我不认为 HttpWebRequest 的解决方案应该有效。

我将服务配置为“本地系统帐户”并“允许与桌面交互”

但不知道如何从服务中打开 IE。

【问题讨论】:

    标签: c# user-interface windows-services


    【解决方案1】:

    嗯,长话短说 - 你不应该。我没有说“不能”,但你真的不应该。 从 Windows Vista 开始,会话和桌面之间有了更好的分离,这种分离是有充分理由的。

    首先 - 基础知识:在 Windows 中,您可以有多个会话。在每个会话中,您可以拥有多个 Windows 工作站。在每个 Windows Station 中,您可以拥有多个桌面(用户的桌面通常命名为“默认”)。

    默认情况下,服务使用非交互式 windows 站。如果您使您的服务交互,这意味着您的服务将在会话 0 的 Winsta0(交互式窗口站)中运行 - 因此您可以与桌面进行一些交互(在 windows xp 中 - 如果忽略快速用户切换)。 但是 - 从 Windows Vista 开始(甚至在终端服务场景之前),活动用户 不再在会话 0 中运行。所以你确实打开了 Internet Explorer……但在错误的会话中。

    你能做什么?有一些解决方法。您可以尝试识别您感兴趣的会话(用户当前登录的位置,可能通过查找正在运行 explorer.exe 进程的会话),然后重新使用进程令牌(使用 OpenProcessToken)并复制它(使用 DuplicateTokenEx ) 然后使用该令牌创建新进程(使用 CreateProcessAsUser)并在 Winsta0\Default 中启动新进程(它将在令牌的会话中启动,希望是用户会话 - 所以用户将能够看到它) .

    希望对您有所帮助。

    【讨论】:

    • 我应该如何获取当前会话?
    • 你将在原始进程的会话中运行东西(你复制他的令牌的那个)
    猜你喜欢
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多