首页 > 解决方案 > 如何检查当前可执行文件是否已经绑定了 Windows 服务

问题描述

我有一个用户可以下载的 C# 控制台应用程序。当他们运行和设置程序时,它会安装一个 Windows 服务,然后处理运行程序。我希望用户能够多次下载此应用程序,并为每个下载的程序创建一个 Windows 服务。我可以通过确保程序为服务提供一个唯一的名称来允许这一点(否则会抛出一个异常,说明服务已经存在)。

但是,我不希望用户能够多次运行下载的可执行文件的同一个实例并一遍又一遍地安装服务。每个下载的可执行文件只有一个服务(即每个 bin 目录一个,即使可执行文件相同)。

在尝试安装服务之前,我想检查正在运行的特定可执行文件是否已经绑定了 Windows 服务,在这种情况下,我不会继续安装另一个服务。请注意,它必须比只检查可执行文件名称更彻底,因为用户下载的所有程序都将具有相同的名称。由于每个可执行文件将位于不同的 bin 目录中,是否可以检查目录路径?

另一种选择是检查 Windows 服务的名称。问题是知道要检查什么名称。如果我将服务名称硬编码为“MyService”之类的名称,则根本无法创建多个服务。如果我通过执行类似的操作使服务名称唯一"MyService" + Guid.NewGuid(),那么每次运行相同的可执行文件时该名称都是唯一的,因此我将无法以这种方式检查它。我能想到的使每个 bin 目录的服务名称唯一的唯一方法是在名称中包含有关 bin 目录的内容,例如 base64 编码目录路径。但是,如果移动 bin 文件夹,这可能会导致问题。

标签: c#windows-services

解决方案


一个简单的解决方案是使用互斥体。类似于如何防止 .exe 的多个实例

https://stackoverflow.com/a/819808/290187

当然,这需要服务正在运行。您可以通过 C# 查询已安装的服务:

ServiceController[] services = ServiceController.GetServices();

或者您可以随时运行“regsvr32”并解析/查看输出。

或者你在你的服务中嵌入一个命名管道 WCF 服务:

WCF 命名管道最小示例

很多选择


推荐阅读