部署:如何访问 Windows 服务名称以便(卸载)安装程序可以卸载它?

Posted

技术标签:

【中文标题】部署:如何访问 Windows 服务名称以便(卸载)安装程序可以卸载它?【英文标题】:Deployment: How to access a windows service name so the (un)installer can uninstall it? 【发布时间】:2012-06-25 21:18:57 【问题描述】:

安装 Windows 服务后,应用程序使用自定义操作根据用户在安装对话框文本框中输入的内容设置该服务的 ServiceName 和 DisplayName。

在测试此应用程序时,它可以正常安装,但是当我尝试卸载服务时,我收到错误 1001。服务不存在。

这最终不是真的,因为我可以运行它。所以我现在的想法是我需要以某种方式访问​​服务的自定义名称并将其提供给卸载程序。我原以为这都是基于 GUID 的,并且名称在很大程度上与 re:uninstall 无关,但似乎并非如此。

那么我该如何解决这个问题呢?

【问题讨论】:

【参考方案1】:

我假设您正在使用Installer 派生类和ServiceInstaller 实例。

我在一个项目中做类似的事情。服务名称存储在一个文本文件中(这只是一个选项,但对我来说它是为了自动部署目的)。您可以将其存储在任何地方(注册表等)。

因此,您应该将在安装阶段配置的自定义服务名称保存在某个地方。

所以,我有我的Installer 课程:

[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer

在它的构造函数中,我这样做:

_process = new ServiceProcessInstaller  Account = ServiceAccount.LocalSystem ;
_service = new ServiceInstaller  ServiceName = ServiceNameReader.GetServiceName(), StartType = ServiceStartMode.Automatic ;
Installers.Add(_process);
Installers.Add(_service);

注意ServiceNameReader.GetServiceName() 函数。此自定义函数从文件中获取服务名称。 Installer 类也在卸载期间被实例化和调用。所以如果你这样做,从某个地方动态加载实际的服务名称,你将能够成功卸载它。

【讨论】:

以上是关于部署:如何访问 Windows 服务名称以便(卸载)安装程序可以卸载它?的主要内容,如果未能解决你的问题,请参考以下文章

如何卸载windows的服务?卸载服务

如何访问Tableau自带的PostgreSQL数据库(以便查看元数据)(windows版本)

无法卸载 Windows 服务:“...无法删除,因为它与日志名称相同。”

我应该如何在 java 上部署 XMPP 服务器 GCM 以便 GCM 可以访问它并发送消息?

如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?

如何在没有root访问权限的情况下部署NodeJS应用程序,以便在服务器重新启动后保持在线状态?