如何将Windows图形用户界面应用程序作为服务运行?

40

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

这是否可能?

编辑:进一步说明......我没有源代码,这不是我的应用程序。


进一步的细化在这里... 我没有源代码,这不是我的应用程序。 - JeffV
4
这是系统管理员每天都需要解决的问题类型,因此请向系统管理员询问。由于您没有源代码,这不是一个编程问题。 - Ian Ringrose
11个回答

19

Windows服务不能拥有GUI界面,因此您需要摆脱GUI界面或将应用程序分成两个部分 - 一个没有UI的服务和一个“控制器”应用程序。如果您有源代码,则将非GUI代码转换为服务很容易-Visual Studio有一个“Windows Service”项目类型,可以为您处理包装,并有一个简单的演示向导,向您展示如何创建一个部署项目来处理安装。

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

如果UI相当简单,则可以使用配置文件作为输入和日志文件或Windows事件日志作为输出。


这就是为什么这是一个棘手的问题。我有一个现有的GUI应用程序(没有源代码),我需要将其作为服务运行。 - JeffV
2
这是错误的。Windows服务可以有GUI界面。打印机服务就是能够显示窗口的例子。 - labilbe
3
Windows服务可以生成具有GUI的进程,打印机服务可能正在执行此操作。这与服务进程本身具有GUI是不同的。Windows操作系统的某些部分有时也可以执行其他不允许的操作。 - McKenzieG1
我在MSDN上读到的内容准确吗?自Vista以后就没有交互式服务了吗?还是像Skeet在另一个话题中所说的那样,历史再次发生了变化?总之:“自Windows Vista以来,服务不能直接与用户交互。因此,在新代码中不应使用“使用交互式服务”一节中提到的技术。” - Stein Åsmul
1
微软正在试图将设备驱动程序排除在GUI之外。如果在服务->属性下选择“登录->允许服务与桌面交互”,设备驱动程序仍然可以运行GUI。您会得到一个弹出窗口,您可以在奇怪的0会话桌面上查看和交互。微软正在试图扼杀这种行为。他们会成功吗?可能会。他们完全消灭了它吗?今天还没有。 - trindflo

7

有没有人使用过像这样的第三方产品:Always Up

似乎能够满足我的需求。我需要它能够在登录/注销循环中持续运行,以及无视它是GUI应用程序并仍然运行。

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


我曾尝试使用AlwaysUp,但对于命令行应用程序来说效果并不太好 - 我一直收到关于“计算机上运行的程序正在尝试显示消息”的通知。现在我改用winsw了。 - VitalyB

5
你可以使用 srvany 来封装它,但你可能需要分配一个实际的用户账户(而不是 LocalService 或其他类似的账户)。

4
我对 winsw 有良好的使用经验。我能够很容易地将我的批处理文件转换为服务。
我也用它来为 nginx 创建服务,根据 这个答案

2

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


1

您可以使用ServiceMill来实现此操作。 基本上,您需要在服务器上安装ServiceMill Server。 然后,在可执行文件上单击右键并选择“安装为ServiceMill服务”。 接下来,您需要配置一些内容(用户/密码,是否要与桌面交互或者您更喜欢隐藏UI...并将启动模式设置为自动)。

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


0

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


0

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

大部分变化与正确地将代码钩入服务管理器有关。完成后,您将知道任何出现的问题都是由于您的编程而不是其他任何程序引起的。


0
如果您创建了一个服务,该服务配置为与桌面交互,并将其配置为以某个用户身份运行并自动启动。从服务中CreateProcess到另一个应用程序。我猜这很容易尝试使用C#(如果我记得正确,C/C++需要大量代码才能成为服务)。那会起作用吗?
但是!
我的第一个想法是在服务器级虚拟主机(如Virtual Server、HyperV、VMWare)中创建一个虚拟计算机。这些虚拟机将作为服务运行(或者Hyper V做什么)。虚拟机将始终运行-无论登录和退出如何。
使此虚拟计算机自动登录到Windows(TweakUI可以设置此项),然后只需使用启动文件夹中的快捷方式启动GUI应用程序。您甚至可以远程桌面连接到它,使用程序的GUI(我敢打赌Always Up做不到这一点)。

-1
首先,我必须问一下为什么您的服务需要用户界面。很可能它不需要,但您可能需要一个客户端从该服务获取数据。服务通常没有GUI的原因是它们可能没有窗口环境来运行。服务可以在没有用户登录到计算机的情况下启动和运行。在这种情况下,服务GUI将无法在桌面上运行。
话虽如此,您可以设置服务属性以作为Mark建议的用户运行。您还可以在服务属性中指定“允许服务与桌面交互”。只有在知道用户已登录时才这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接