如何在服务上运行Windows GUI应用程序?

时间:2008-09-10 00:37:53

标签: windows user-interface windows-services legacy

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

这甚至可能吗?

编辑:这里进一步细化......我没有来源,这不是我的申请。

11 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:6)

是否有人使用过第三方产品:Always Up

似乎做我需要的。它能够持续运行我需要的登录/注销周期。并且能够忽略它是一个GUI应用程序并运行它。

他们必须手动链接到exe并调用WinMain或其他东西。

答案 2 :(得分:4)

您可以将其打包到srvany,但您可能需要为其分配一个实际的用户帐户(而不是LocalService或其他类似帐户)

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

我已经将它用于nginx,每this answer

答案 5 :(得分:0)

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

大多数更改都与将代码正确挂钩到服务管理器有关。完成后,您将知道发生的任何问题都是您编程的结果,而不是任何其他程序。

答案 6 :(得分:0)

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

话虽如此,您可以按照Mark的建议设置服务的属性以用户身份运行。您还可以在服务的属性中指定“允许服务与桌面交互”。只有在您知道用户将会登录时才执行此操作。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

BUT!

我的第一个想法是在服务器级虚拟主机(如Virtual Server,HyperV,VMWare)中创建虚拟计算机。这些虚拟机将作为服务运行(或Hyper V所做的任何事情)。无论登录和退出,虚拟机都将始终运行。

让这个虚拟计算机自动登录到Windows(TweakUI可以设置它),然后使用Startup文件夹的快捷方式启动GUI应用程序。您甚至可以使用程序的GUI远程桌面(我打赌Always Up无法做到这一点)。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

FireDaemonPro将大多数GUI应用程序转变为服务;它不是免费的,但可能值得一试。