为什么我不能在Windows服务中使用UI组件(Windows窗体)?

时间:2010-07-20 21:16:57

标签: winforms windows-services automation

我见过几篇帖子,主要说明UI组件不应该作为服务运行。我理解没有人可以响应UI事件等的理性但事实仍然是许多自动化任务只有Windows窗体才有可能。

以下是一些很好的例子:

  1. 我想建立一个网址抓取工具 制作缩略图的服务 网页。目前我唯一的方式 看到实现这一点就是尝试和 自动化.Net WebBroswer 成分

  2. 自动打印MS-Word 文档。

  3. 在Vista之前有一些技巧来解决这个问题,但现在没有。我的问题是为什么会出现这种情况,以及真正有哪些替代方案?

3 个答案:

答案 0 :(得分:6)

查找Shatter AttacksSession 0 Isolation Feature

基本上,如果两个进程(不同用户)共享同一个桌面,则一个进程可以通过发送Windows消息来执行其他进程中所需的任何代码,这称为粉碎攻击。

有很多关于这是否是设计错误的讨论,并且在发布Vista后,微软决定删除任何交互式桌面对服务的支持,因为这是一个潜在的安全漏洞。

作为替代方案,您可以考虑将您的图像生成/打印代码作为登录用户运行,该用户可以访问交互式桌面。

答案 1 :(得分:1)

像莫伦一样,最好的办法就是不把它作为一种服务来运行。

也许你无论如何都无法从服务中运行它,因为你需要运行代码的某种现有框架。

因此,解决方法是编写以登录用户身份运行的服务器程序。您将从必须所在的代码中点击该服务器程序一项服务。服务器将完成工作并返回结果。

您可以使用WCF通过命名管道作为传输进行通信,或者使用其他任何方法进行通信。如果没有,您可以在localhost上使用裸命名管道或tcp / ip。从您的userprofile中的网站判断,您应该了解localhost!

答案 2 :(得分:0)

从技术上讲,UI组件需要启动Windows Message Queue才能工作。您可以从Windows服务运行它(可能允许与桌面交互,据我所知,在Windows Vista及更高版本中禁用此功能)。

但是你所谈论的不是UI组件,它是COM组件,你可以使用它。至少MS Office,但微软不推荐,因为内存泄漏是可能的。最新的MS Office具有服务器版本,可以在没有用户界面的应用程序中使用。