36

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

这甚至可能吗?

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

4

11 回答 11

19

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

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

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

于 2008-09-10T02:42:24.330 回答
7

有没有人使用过第三方产品,例如:Always Up

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

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

于 2008-09-10T11:31:58.957 回答
5

您可以将其包装成srvany,尽管您可能需要为其分配一个实际的用户帐户(而不是 LocalService 或类似的)

于 2008-09-10T00:40:58.647 回答
2

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

于 2011-02-28T21:04:22.467 回答
2

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

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

于 2016-02-04T13:41:55.763 回答
0

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

但!

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

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

于 2008-09-11T20:23:03.727 回答
0

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

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

于 2008-09-10T01:34:39.440 回答
0

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

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

于 2012-05-01T14:22:12.213 回答
0

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

于 2016-11-27T02:16:22.467 回答
-1

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

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

于 2008-09-10T02:54:46.250 回答
-1

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

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

于 2008-09-10T04:28:02.923 回答