【问题标题】:Running GUI application in the Windows service mode在 Windows 服务模式下运行 GUI 应用程序
【发布时间】:2010-04-05 21:50:04
【问题描述】:

我正在编写一个作为 Windows 服务运行的服务器,它通过请求调用 Firefox 来生成网页的 pdf 快照。

我知道在服务模式下运行 GUI 程序是个坏主意,但是我的程序的服务器性质限制了在用户模式下运行它。运行用户级“代理”也不是一种选择,因为在服务器运行的机器上可能没有交互式用户登录。

在我的实验中,当服务在已经登录的用户帐户下运行时,Firefox 成功生成了 pdf。显然它在其他情况下不起作用:对于未登录的本地系统和用户帐户。在启用了“允许服务与桌面交互”选项的 LocalSystem 下,我可以看到 Firefox 启动并报告它无法找到打印机。

既然要求一个打开的用户会话来运行 pdf 服务器是不切实际的,那么除了从虚拟机运行整个事情之外,是否有任何解决方法?

更新:我认为问题不在于帐户权限,而在于 FF 在服务模式下运行时正在等待的不可见模式对话框。

但是,当 FF 在 LocalSystem 帐户下运行时,它仍然无法创建 pdf。 FF 说它找不到打印机,我想知道这是否是可以以某种方式启用的权限?

【问题讨论】:

    标签: windows user-interface firefox windows-services


    【解决方案1】:

    您可能想尝试一种不同的方法,在您的项目中包含一些 .NET PDF 库(PDFsharp 是一个很好的开源选择),而不是将其与 WebBrowser 控件结合使用包含在您的项目中以呈现 PDF。

    如果你尝试这个,不要忘记使用 STAThread 属性。

    【讨论】:

    • +1 说真的,正如 kzen 所提到的,您确实应该考虑使用创建 pdf 的组件,而不是打开 GUI 应用程序来执行此操作。如果这可以由多个用户调用,那么你就是在自找麻烦。大多数 GUI 应用程序都不是为这种情况而构建的,许多人走这条路只是为了遇到争用问题。不是为了他们,但 Aspose 有许多为这种场景构建的组件作为 PDFSharp 的另一个候选者。我也经常问“为什么选择 PDF”?对于人们来说,这是一个默认的答案,以至于他们通常不会问更简单的格式是否可以。
    • 在不知道原始发帖人想要什么的情况下,这种解决方案在“浏览器截图”这种情况下是行不通的。如果该项目的目的是大致了解页面的外观,那么使用 PDF 生成器并不是正确的答案。
    • 你是对的,克里斯蒂安。问题是在将结果保存到 PDF 之前,我需要先对可能启用了 flash 和 js 的页面进行有效渲染。这意味着我应该要么坚持使用现有的引擎,如 Gecko 或 Webkit,要么自己编写。幸运的是,带有 'cmdlnprint' 附加组件的 FF 解决了这两个问题。但将这个捆绑包作为服务运行是主要挑战。
    【解决方案2】:

    在 MS Word 无人值守的情况下,我也遇到过类似的难题。您需要做的是以您设置的用户身份登录以用于运行 firefox 进程并完成设置打印机的过程。

    可能仅以该用户身份登录就足够了 - 在第一次登录期间执行了一些操作。

    抱歉,我不够清楚 - 我的意思是您必须使用该帐户以交互方式登录,配置默认打印机,注销,然后运行您的服务

    【讨论】:

    • 是的,事实上这已经对我有用了。正如我在第 3 段中提到的,GUI 应用程序在登录帐户下运行得很好。但我不能依赖打开的用户会话,因为用户最终可能会决定注销或忘记登录。
    • @Leonid:您的服务在其自己的登录会话中运行,而不是交互式会话,因此用户是否注销无关紧要。
    • 谢谢你,本。事实上,上周我发现我的问题不是在非活动帐户下启动时 FF 无法打印,而是在一个模式对话框窗口中,因为它在服务模式下运行时我看不到。现在它可以在任何LocalSystem 以外的帐户。它仍然抱怨无法找到任何打印机(即使我使用的是虚拟打印机 - 请参阅我关于 cmdlnprint FF 插件的其他评论)。
    【解决方案3】:

    您可以将程序作为计划任务运行吗?可以将任务分配给应该解决服务限制的给定用户帐户。

    【讨论】:

    • 因为我认为问题不在于帐户权限,而是使用不可见的模式对话框,所以这不再是问题。不过我相信这也可能奏效。
    【解决方案4】:

    几年前,我遇到了一个相关问题:虚拟设备上的共享网络打印机启动 Ghostscript 以进行 PS->PCL 转换并打印到真实打印机。 print-spooler 服务作为本地系统运行,伪设备驱动程序无法从服务模式执行 Ghostscript。我可以通过将几个注册表项从 HKCU-hive 复制到 HKLM 来解决这个问题。

    【讨论】:

    • 谢谢你,埃德加。这似乎是个好主意,但我试图尽可能少地侵入用户的环境。
    猜你喜欢
    • 2010-09-08
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多