Windows服务为什么没有GUI?


22

我在Windows早期版本(例如XP和NT)中使用了此功能。我能够从Windows服务运行GUI。但是在更高版本中是不可能的。

删除此功能的原因是什么?Windows服务为什么没有GUI?

Answers:


47

主要是安全原因。

据我了解,当Windows服务创建GUI控件(如MessageBox)时,通常只能在该服务运行的会话中看到它们,即会话0,该会话过去也曾经是本地登录的第一个用户或使用mstsc / admin。因此,该用户将看到这些控件并可以与服务进行交互。

但是出于安全原因,现在保留了会话0,并且将为第一个登录用户提供新的会话,因此看不到GUI控件。

由于这破坏了很多服务,因此为了兼容性,有一个过程(请参阅此MSDN博客)尝试检测是否正在显示任何消息,并弹出带有警告的窗口“此计算机上正在运行的程序正在尝试显示消息”。 ',并允许您查看或忽略该消息。

Microsoft有与此主题有关的白皮书,您可以从此处下载

我还怀疑另一个次要原因是因为该功能被滥用/误解并导致了不良设计。例如,我曾经有一台带有第三方服务的旧服务器,该服务器使用消息框显示某些通知/错误,而不是写入事件日志。但是我从来没有在本地登录,也很少以管理员模式登录,因此我看不到消息。


1
我感觉它与UAC有关-安全意味着UAC提示符无法与交互式用户共享工作站会话,或者黑客可以冒充自己伪装成UAC提示符。
gbjbaanb 2012年

23

交互式服务曾经是可能的,但是服务模型是独立于任何用户运行的流程的模型。它们设计为无人值守运行,因此不需要GUI。

自Windows Vista以来,交互式服务一直不可用,因此不应再使用。

如果您需要与服务交互,则我链接到的页面建议创建一个单独的GUI应用程序,该应用程序通过某种类型的进程间通信(IPC)与服务进行通信,例如命名管道。


您的想法已过时:从Windows Vista开始,服务无法直接与用户进行交互。因此,标题为“使用交互式服务”的部分中提到的技术不应在新代码中使用。
nemke 2015年

10

因为服务应该在后台运行而不与用户交互;实际上,它们可以在没有用户登录的情况下运行。


那为什么早期版本中有这个功能呢?考虑到您的回答,Windows服务和桌面应用程序之间将没有通信。因此,此答案可能不合适。
阿伦(Arun)2012年

3
@Arun-基于该逻辑,那么将永远不会修复损坏的事物。迈克尔的答案是正确的-服务不应该包含GUI。仅仅因为Windows的早期版本具有它们(带有guis的服务)并不意味着它们应该具有它们。

8
@Arun并非如此,桌面应用程序和服务之间没有通信,只是该服务本身没有GUI。而是,桌面应用程序具有GUI并与服务器通信。
Paul Hiemstra

因此,Windows服务可以具有GUI,但它们不应该具有GUI吗?
阿伦(Arun)2012年

1
@Arun,服务本身没有GUI,但通常由单独的前端应用程序控制,这些前端应用程序可以通过以某种方式与服务进行通信(通过命名管道,套接字等)来控制服务
GrandmasterB,2012年

0

是的,这是有可能的,并且有效。登录后,您将看到应用程序的界面。对于没有可用服务但仍需要在服务器上运行的较旧应用程序,它非常有用。虽然这不是最稳定的解决方案。它以用户身份运行,可以单击它或将其注销。那不是很好。

现在,每个人都开发本机服务并添加应用程序或日志来管理服务。这是一个很好的设计模式,现在大多数时候都在使用。

因此,将其更多地视为可能的遗产。


-1

这些服务主要用于后台的无人值守操作。名称服务本身意味着充当某些客户端应用程序或使用该服务的其他服务的服务器。因此,MS可能现在想要坚持基础知识,并希望在服务和Apps之间划清界限,因此App会保持使用繁忙,让服务静默地达到其目的。那里有指甲刀,为什么要去厨房用刀剪指甲呢?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.