如何将Windows GUI应用程序作为服务运行?
我有一个现有的GUI应用程序,应该已将其实现为服务。基本上,我需要能够远程登录和注销Windows 2003服务器,并且仍然保持该程序运行。
这有可能吗?
编辑:在这里进一步完善...我没有源,这不是我的应用程序。
解决方案
回答
我们可以将其包装为srvany,尽管我们可能需要为其分配一个实际的用户帐户(而不是LocalService等)
回答
你有资料吗?在许多情况下,独立应用程序和服务之间的差异很小。
大多数更改与将代码正确地挂接到服务管理器有关。完成后,我们将知道发生的任何问题都是编程而不是其他任何程序的结果。
回答
Windows服务不能具有GUI,因此我们将需要摆脱GUI或者将应用程序分为两部分:无UI服务和"控制器"应用程序。如果我们有源代码,则很容易将非GUI代码转换为服务Visual Studio具有一个" Windows Service"项目类型,该项目类型将为我们进行包装,并且有一个简单的演练向我们展示了如何创建负责安装的部署项目。
如果选择第二种方法,并且需要将一些原始GUI代码放入控制器中,则控制器和服务可以通过WCF,.NET Remoting或者纯套接字连接与我们定义的协议进行通信。如果使用Remoting,请确保使用"块"接口,该接口以尽可能少的方法调用来传输数据,每个调用都有相当大的开销。
如果用户界面非常简单,则可以使用配置文件作为输入和日志文件,或者使用Windows事件日志作为输出。
回答
首先,我必须问为什么服务需要用户界面。很有可能不是,但是我们可能需要一个从此服务获取数据的客户端。服务通常不具有GUI的原因是它们可能没有要运行的窗口环境。服务可以在没有用户登录到计算机的情况下启动和运行。在这种情况下,将没有用于运行服务GUI的桌面。
话虽如此,我们可以按照Mark的建议将服务上的属性设置为以用户身份运行。我们还可以在服务的属性中指定"允许服务与桌面交互"。仅当我们知道用户将登录时,才执行此操作。
回答
服务不应该具有GUI,因为它应该在不需要用户任何干预的情况下运行,并且与查找正确的用户桌面并与其进行通信存在各种问题。
由于大概是要求这样做的原因是为了能够远程监视应用程序,所以执行此操作的方法将是拥有两个应用程序。服务端(基本上作为控制台应用程序编写)和客户端/监视GUI端。该服务将使用一些远程连接(当我这样做时,我使用命名管道)与客户端/监视应用程序进行通信。任何一个都应该能够在没有另一个的情况下运行,并且肯定该服务应该能够在没有客户端的情况下运行。
回答
有没有人使用过第三方产品,例如:Always Up?
似乎可以满足我的需求。它是保持我需要的登录/注销周期持续运行的功能。并且可以忽略它是GUI应用程序并以任何方式运行它的功能。
他们必须手动链接到exe并调用WinMain或者其他命令。
回答
如果创建服务会发生什么。该服务配置为与桌面交互。配置它以运行某个用户并自动启动。从另一个应用程序上的服务CreateProcess。我想这是尝试使用C的快速方法(如果我记得的话,C / C ++是很多代码甚至可以用作服务)。那行得通吗?
但!
我首先想到的是在服务器级虚拟主机(如虚拟服务器,HyperV,VMWare)中创建虚拟计算机。这些虚拟机将作为服务运行(或者Hyper V所做的任何事情)。无论登录和注销,虚拟机将始终处于运行状态。
使此虚拟机自动登录到Windows(TweakUI可以进行设置),然后使用"启动"文件夹的快捷方式启动GUI应用程序。我们甚至可以使用程序的GUI将远程桌面插入其中(我敢打赌Always Up不能这样做)。