我如何运行Windows GUI应用程序作为服务?

我有一个现有的GUI应用程序,应该已经实现为一项服务。 基本上,我需要能够远程login和退出Windows 2003服务器,并仍然保持这个程序运行。

这甚至有可能吗?

编辑:进一步细化在这里…我没有来源,这不是我的应用程序。

Solutions Collecting From Web of "我如何运行Windows GUI应用程序作为服务?"

Windows服务不能有GUI,因此您将需要摆脱GUI或将应用程序分成两部分 – 一个没有UI的服务和一个“控制器”应用程序。 如果您有源代码,将非GUI代码转换为服务非常简单 – Visual Studio有一个“Windows服务”项目类型,可以为您打包,并且有一个简单的演练,向您展示如何创建一个将负责安装的部署项目。

如果您选择第二条路线,并且需要将一些原始的GUI代码放入控制器中,则控制器和服务可以通过WCF,.NET Remoting或纯套接字连接与您自己定义的协议进行通信。 如果您使用远程处理,一定要使用“chunky”接口,尽可能少的方法调用传输数据 – 每个调用都有相当的开销。

如果用户界面非常简单,则可以使用输入和日志文件的配置文件或Windows事件日志输出。

有没有人使用过第三方产品: Always Up ?

似乎做我需要的。 这是能够通过我需要的登录/注销周期继续运行。 而且能够忽略它是一个GUI应用程序,并无论如何运行它。

他们必须手动链接到exe文件,并调用WinMain什么的。

你可以把它包装成srvany ,虽然你可能需要分配一个实际的用户帐户(而不是本地服务或一些这样的)

你真的需要它作为一个服务运行,或者你只是需要它保持运行,当你没有连接? 如果是后者,则可以断开而不是注销,应用程序将继续运行。 选择关机后,该选项应该在下拉列表中,或者您可以调用tsdiscon.exe。

你有源吗? 在许多情况下,独立应用程序和服务之间的差异很小。

大部分更改都与正确地将代码挂接到服务管理器相关。 一旦完成,你就会知道发生的任何问题都是你编程的结果,而不是任何其他程序。

首先,我不得不问为什么你的服务需要一个用户界面。 最有可能的不是,但你可能需要一个从这个服务获取数据的客户端。 服务通常不具有GUI的原因是它们可能没有运行的窗口环境。服务可以在没有用户登录到机器的情况下启动和运行。 在这种情况下,服务GUI将不会运行在桌面上。

话虽如此,你可以设置服务的属性作为用户运行,如马克建议。 您也可以在服务的属性中指定“允许服务与桌面交互”。 只有在知道用户将被登录的情况下才能执行此操作。

一个服务不应该有一个GUI,因为它应该运行,而不需要任何用户的干预,并且存在与正确的用户桌面查找和通信有关的各种问题。

因为,大概问这个问题的原因是能够远程监视应用程序,那么这样做的方法是有两个应用程序。 服务端(基本上写成一个控制台应用程序)和客户端/监视GUI端。 该服务将使用一些远程连接(当我这样做,我使用命名管道)与客户端/监控应用程序进行通信。 或者应该能够运行没有其他的,当然,服务应该能够运行在客户端外。

如果你创建一个服务会发生什么。 该服务被配置为与桌面进行交互。 将其配置为运行某个用户并自动启动。 从另一个应用程序的服务CreateProcess。 我猜这是很快尝试使用C#(C / C ++是很多的代码甚至是服务,如果我记得)。 那会工作吗?

但!

我首先想到的是在服务器级虚拟主机(如Virtual server,HyperV,VMWare)中创建一个虚拟计算机。 那些虚拟机将作为服务运行(或任何Hyper V)。 虚拟机将始终运行 – 无论登录和注销。

使这个虚拟的电脑自动登录到Windows(TweakUI可以设置),然后启动GUI应用程序使用启动文件夹的快捷方式。 你甚至可以使用程序的GUI远程桌面进入它(我打赌总是不能这样做)。

您可以使用ServiceMill来实现此操作。 基本上你在你的服务器上安装了ServiceMill服务器。 然后点击您的可执行文件上的右键并“作为ServiceMill服务安装”。 接下来你配置一些东西(用户/密码,如果你想与桌面交互,或者如果你想隐藏用户界面,并设置启动模式为自动)。

另一个来自Active + Software的工具可以是一个解决方案, ServiceMill Exe Builder允许您从命令行创建服务,如果您使用的是持续集成服务器,或者您计划将组件作为服务分发而无需考虑服务整合(加上它是免版税的)。

我用winsw有很好的经验。 我能够很容易地将我的批处理文件转换为使用它的服务。

根据这个答案 ,我也将它用于nginx。

FireDaemonPro将大部分GUI应用程序转换成服务; 它不是免费的,但它可能是值得的。