"允许服务与桌面交互"的替代方案是什么?

19
我有一个Windows服务(C#)安装在服务器上,每10分钟启动一个可执行文件(C#),将一些图像从一个目录处理到另一个目录。不需要与任何用户交互。然而,由于可执行文件具有输出窗口,为了使服务运行,我必须启用“允许服务与桌面交互”复选框,这被认为是不安全和不良实践。我该如何解决这个问题?我喜欢将可执行文件与我的Windows服务分开,因为:
  • 这使得调试更容易,不需要完整的Windows服务重新部署。
  • 有时我使用相同的Windows服务在不同的时间间隔(但都与同一个项目相关)启动多个可执行文件。
编辑: 当未启用与桌面的交互时,控制台应用程序无法正确执行,并且以下错误出现在Windows日志中:
Faulting application myapp.exe, version 1.0.0.0, time stamp 0x4b8304c3, 
faulting module KERNEL32.dll, version 6.0.6002.18005, time stamp 0x49e03821, 
exception code 0xc0000142, fault offset 0x00009eed, process id 0x10ec, 
application start time 0x01cab736950a64b5.

一旦启用桌面交互功能,应用程序将正常执行。
有什么想法吗?
非常感谢您的时间。

调试部分不是一个好的理由。你可以让可执行文件和服务都使用一个包含所有功能的公共程序集。 - user24359
是的,Windows服务正在运行Windows Server 2008 Web Edition操作系统上。 Windows服务和可执行文件是使用Visual Studio 2008生成的,并且基于.NET Framework 3.5。 - jdecuyper
@Isaac:过去我只使用单个程序集进行开发,但自从在同一个项目中开发了许多计划任务后,将执行作业与服务本身分离开来变得更加可管理。但我理解你的观点,也许在同一个程序集中运行所有内容会更“正确”。 - jdecuyper
4个回答

11
如果您使用的是Vista及更高版本,并且您不需要与用户进行任何交互,但有一个交互式exe文件需要执行,则Session 0隔离功能应该有助于缓解关于服务与桌面交互(在Session 0中没有物理控制台)的“不良做法”的一些担忧。
这种Session 0隔离可以防止非特权用户对您的服务执行Shatter攻击,因为他们会在不同的会话中获得他们的交互式桌面。 Shatter攻击是这种“与桌面交互”被认为是不良实践的主要原因,如果您使用Vista或更高版本,则如果无法避免它(或必须花费太多精力来执行),那么应该没问题。
所以,如果现状良好,您可能没问题。
当然,在操作系统更新后,事情可能会突然停止工作,因此最好准备将依赖性从交互性移出,因为您确实不需要它。

Session 0 隔离非常有意义,让我对我的服务的安全性问题稍微放心了一些。但正如您所正确提到的,最好不要包含交互性。在创建进程时,我已经尝试将属性“UseShellExecute”设置为 true,“CreateNoWindow”设置为 false,但服务仍然需要桌面交互。 - jdecuyper
你输入正确了吗?CreateNoWindow应该是true,我认为UseShellExecute应该是false(尽管UseShellExecute可能无关紧要)。 - Weeble
抱歉打错字了!CreateNoWindow确实被设置为true。 - jdecuyper

5

我知道现在有点晚了,但在这种情况下,我会使用任务计划程序,而不要费心去创建Windows服务。任务计划程序具有全面的调度选项,并且可以轻松运行控制台应用程序。


2

如果可以的话,我建议您重新编写处理移动的可执行文件,不要使用输出窗口。如果它们是没有输出的标准控制台应用程序,则可以在服务内部执行它们,而无需“允许服务与桌面交互”。这为您提供了所有好处,而不需要对服务进行任何更改。


你会如何删除应用程序的输出?你是否考虑过和Weeble一样的解决方案?谢谢。 - jdecuyper
是的,那基本上就是我的想法。如果只是一个控制台应用程序,你不需要有桌面交互。然而,如果你正在使用Windows应用程序,它将不起作用... - Reed Copsey

2

非常感谢您提供的链接。我已经尝试过了,但它仍然需要启用复选框。 - jdecuyper
很遗憾,我目前没有Windows机器的访问权限。你知道子进程是启动然后失败了还是根本没有启动吗?它是控制台应用程序还是其他什么东西? - Weeble
这是一个C#控制台应用程序。我编辑了我的问题并添加了被记录的错误消息。 - jdecuyper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接