如何从另一个桌面应用程序控制 Windows 服务

Posted

技术标签:

【中文标题】如何从另一个桌面应用程序控制 Windows 服务【英文标题】:How to control of windows service from a another desktop apps 【发布时间】:2011-04-06 06:08:01 【问题描述】:

假设我有一个 Windows 服务,它可以做一些工作并由 c# 开发。现在我想用 c# 开发另一个 win 应用程序,它可以控制我的 win 服务并与之交互。假设我想从我的 win 应用程序启动/停止我的 win 服务,或者我想从我的 win 应用程序运行我的 win 服务的特定方法。如何开发这种可以与我的 win 服务交互的 win 应用程序。请详细讨论。

谢谢

【问题讨论】:

【参考方案1】:

您可能会发现following article 很有用。

【讨论】:

【参考方案2】:

关于启动和停止参见 ServiceController 类

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx

你也可以在启动时传递参数。

【讨论】:

【参考方案3】:

为了控制使用另一个声明的 ServiceController 类。

让你的服务做一些由你的应用控制的特殊事情,你必须建立一种通信。我建议您的服务在某个端口上侦听 http 请求,这可以相当容易地处理,因此您的服务可能由任何类型的应用程序控制,甚至是 javascript ajax。如果不需要,请添加一些安全性,例如授权。

【讨论】:

【参考方案4】:

对于 Windows 服务和 Windows 应用程序之间的通信,我使用Windows Communication Foundation (WCF)。在我的 Windows 服务中,我托管了一个“侦听”传入请求的 WCF 服务。我的 Windows 应用程序创建了一个 WCF 客户端,该客户端与 Windows 服务中托管的 WCF 服务进行通信。从编程的角度来看,WCF 客户端调用 WCF 服务上的方法。所有幕后的复杂性都被隐藏起来了,所以从程序员的角度来看,您似乎只是在进行一个函数调用。

要启动和停止服务,我使用ServiceController 类。请注意,此类具有一定的安全要求。具有有限系统权限的用户将无法直接使用此类。

【讨论】:

【参考方案5】:

您需要注意安全性。

使用 ServiceController 类为您提供了一些控制服务的有限能力(启动/停止/暂停/恢复和发送简单命令),并且具有安全的优势。通常只有管理员(可能还有高级用户)才能控制服务although you can configure permissions。

如果您需要更灵活的东西,则需要某种形式的进程间通信来与服务进行通信 - 如 Matt Davis 的回答中所述,WCF 在 .NET 世界中是一个不错的选择。

但是在这种情况下,您需要实现自己的安全性,假设您不想让任何人与您的服务进行交互。

【讨论】:

以上是关于如何从另一个桌面应用程序控制 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何开启Windows远程桌面服务

如何开启Windows远程桌面服务

如何修改windows server 2003远程桌面最大连接数

Windows服务已经打包好了。为啥安装后,在电脑控制面板-服务里没有看到

桌面应用程序和 Windows 服务之间通信的最佳方式

远程协助与远程桌面有啥不同?