我在服务器上安装了一个Windows服务(C#),它每隔10分钟启动一个可执行文件(C#),将一些图像从一个目录处理到另一个目录。任何用户都不需要进行任何交互。不过,由于可执行文件作为输出窗口,为了使服务运行,我必须启用“允许服务与桌面交互”复选框,这被视为insecure and bad practice 即可。我该如何解决这个问题?我喜欢将可执行文件与我的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.
启用桌面交互后,应用程序将正常执行。
有什么想法?
非常感谢你的时间。
答案 0 :(得分:11)
如果您使用的是Vista及更高版本而且您并不真正需要与用户进行任何交互,但要执行交互式exe,Session 0 isolation feature应该有助于减轻对“不良做法”的一些担忧使服务与桌面交互(在会话0中没有物理控制台)。
此会话0隔离将阻止非特权用户在您的服务上执行Shatter Attacks,因为他们在不同的会话中获取其交互式桌面。粉碎攻击是这种“与桌面交互”被认为是不良做法的主要原因,如果您使用的是Vista或更高版本,如果您无法避免它(或者将不得不花费太多精力去做它)应该没问题。 / p>
所以,如果事情正常,你可能还可以。
当然,在操作系统更新之后,事情可能会停止工作,因此最好准备将依赖性转移到外部,因为您并不真正需要它。
答案 1 :(得分:5)
我知道这有点晚了但是在这种情况下我会使用任务调度程序,而不是打扰Windows服务。任务调度程序具有一组全面的调度选项,可以毫无问题地运行控制台应用程序。
答案 2 :(得分:2)
如果可以,我建议重写处理移动的可执行文件,以便不使用输出窗口。如果它们是标准的,没有输出的控制台应用程序,您可以在服务中执行它们,而无需“允许服务与桌面交互”。这为您提供了所有好处,而无需对您的服务进行任何更改。
答案 3 :(得分:2)
子流程只是一个控制台应用程序吗?我没有编写Windows服务,但我想也许只是在没有窗口的情况下启动子进程就足够了。使用Process.Start的重载,它接受ProcessStartInfo并将ProcessStartInfo.CreateNoWindow设置为true。
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx