Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “替代方案”;是否允许服务与桌面交互;?_C#_Windows Services_Exe - Fatal编程技术网

C# “替代方案”;是否允许服务与桌面交互;?

C# “替代方案”;是否允许服务与桌面交互;?,c#,windows-services,exe,C#,Windows Services,Exe,我在服务器上安装了一个windows服务(C#),每10分钟启动一个可执行文件(C#),以处理从一个目录到另一个目录的一些图像。不需要与任何用户进行交互。然而,由于可执行文件是一个输出窗口,为了使服务运行,我必须启用“允许服务与桌面交互”复选框,该复选框被视为一个。我该如何处理这个问题?我喜欢将可执行文件与windows服务分离,因为 它使调试和测试变得更容易 不需要重新部署完整的windows服务 有时我使用相同的窗口 服务将启动多个 不同位置的可执行文件 时间间隔(但都与相同的时间间隔相关

我在服务器上安装了一个windows服务(C#),每10分钟启动一个可执行文件(C#),以处理从一个目录到另一个目录的一些图像。不需要与任何用户进行交互。然而,由于可执行文件是一个输出窗口,为了使服务运行,我必须启用“允许服务与桌面交互”复选框,该复选框被视为一个。我该如何处理这个问题?我喜欢将可执行文件与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.
启用桌面交互后,应用程序将正常执行

有什么想法吗


非常感谢您的时间。

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

子流程只是一个控制台应用程序吗?我还没有编写Windows服务,但我认为在没有窗口的情况下启动子流程就足够了。使用Process.Start重载,该重载接受ProcessStartInfo并将ProcessStartInfo.CreateNowInow设置为true


如果您使用的是Vista及更高版本,并且您实际上不需要与用户进行任何交互,但需要执行一个交互式exe,则应该有助于缓解有关服务与桌面交互(会话0中没有物理控制台)的“不良做法”的一些担忧

此会话0隔离将防止未经授权的用户在不同会话中使用交互式桌面时在您的服务上执行操作。粉碎攻击是这种“与桌面的交互”被认为是不好的做法的主要原因,如果您使用Vista或更高版本,如果您无法避免它(或者必须花费太多的精力来实现它),则应该可以

所以,如果事情进展顺利,你可能就没事了


当然,在操作系统更新之后,事情可能会停止工作,因此最好准备将对交互性的依赖性移出,因为您并不真正需要它。

我知道这有点晚,但在这种情况下,我会使用任务计划程序,而不必为windows服务费心。任务计划程序有一套全面的计划选项,可以毫无问题地运行控制台应用程序。

调试部分不是一个很好的理由。您可以有一个可执行文件,并且服务都使用包含所有功能的公共程序集。是的,windows服务正在运行windows Server 2008 Web Edition。Windows服务和可执行文件是使用Visual Studio 2008针对.NET Framework 3生成的。5@Isaac:在过去,我只使用一个程序集进行此操作,但自从我开始在同一个项目上开发许多计划任务以来,将正在执行的作业与服务本身隔离变得更易于管理。但我明白你的意思,也许在同一个程序集中运行会更“正确”。非常感谢你的链接。我已经试过了,但它仍然需要启用复选框。遗憾的是,我目前还没有访问Windows计算机。您知道子流程是否正在启动,然后失败,或者根本就没有启动?它是一个控制台应用程序,还是其他什么?它是一个C#控制台应用程序。我编辑了我的问题并添加了记录的错误消息。您将如何删除应用程序的输出?您在哪里考虑与Weeble相同的解决方案?谢谢。是的,这基本上是我的想法。如果它只是一个控制台应用程序,则不需要进行桌面交互。但是,如果您使用的是Windows应用程序,它将不起作用…会话0隔离非常有意义,而且不知何故,它使我对我的服务的安全性影响不那么担心。但是正如你正确提到的,最好不要考虑互动性。创建进程时,我已尝试将属性“UseShellExecute”设置为true,“CreateNoWindow”设置为false,但该服务仍需要桌面交互。您键入的正确吗?CreateNoWindow应该是true,我认为UseShellExecute可能应该是false(尽管UseShellExecute可能不重要)。很抱歉这个输入错误!CreateNoWindow确实设置为true。