错误1001:指定的服务已存在。 无法删除现有的服务

我有一个服务。 我刚刚安装了它。 我需要对服务进行更新。 我去了添加/删除程序,并寻找我的服务,并没有安装在那里。 我看着services.msc,它在那里,停下来。 我能够开始并停止它。 我以pipe理员的身份运行了一个命令提示符,运行sc delete [服务名称],并收到“指定的服务不作为已安装的服务存在”。 我在命令提示符下执行了一个sc查询,并且不返回。 我右键单击安装程序,单击卸载并收到“此操作仅适用于当前安装的产品”。 我也尝试修复,并得到相同的消息。

我重新启动了机器几次,没有运气得到这个服务卸载。 我正在使用Visual Studio安装的基本安装项目模板。 我试过改变程序的名字,并增加版本号。

如何卸载显然存在的服务,并防止将来发生这种情况?

Solutions Collecting From Web of "错误1001:指定的服务已存在。 无法删除现有的服务"

如果您具有包含服务安装程序的.exe文件,请在\Windows\Microsoft.Net\Framework\v4.0.30319找到InstallUtil.exe /u <process.exe> InstallUtil.exe

在安装项目中,将您的服务包含在所有的自定义操作中,也包括卸载

(右键单击项目,自定义操作)

心连心

马里奥

该服务没有在“添加/删除程序”中列出是完全正常的,该列表用于软件包而不是服务。 (一个包或程序可能包含多个服务,但通常不会安装任何服务。)

显然,服务是手动安装的,而不是作为产品的一部分,即使这个服务器通常会安装一个你已经安装的产品。

使用sc delete是正确的。 你需要用双引号(除非只是一个单词)包含服务的(简称)名称,而没有别的。

如果没有,请访问您的注册表中的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services ,包括32位和64位(分别为regedt32.exeregedit.exe )。 你甚至可以直接删除那里的服务,但你应该从可逆的变化开始,以诊断你的服务是如何命名的,为什么sc没有看到它的名字,只有在其他所有事情都失败后,直接使用注册表访问,你的注册表(谷歌这个过程中指定您的操作系统)。

**如果需要使用设置完成,请按照下列步骤操作:

这可以通过显式实现现有的服务删除(卸载),然后允许安装更新的版本来处理。 为此,我们需要更新ProjectInstaller.Designer.cs,如下所示:

考虑在InitializeComponent()的开始处添加以下行,这会在当前的安装程序尝试再次安装服务之前触发一个用于卸载现有服务的事件。 这里我们卸载服务,如果它已经存在。

添加以下命名空间:

 using System.Collections.Generic; using System.ServiceProcess; 

如前所述添加以下代码行:

 this.BeforeInstall += new System.Configuration.Install.InstallEventHandler(ProjectInstaller_BeforeInstall); 

例:

 private void InitializeComponent() { this.BeforeInstall += new System.Configuration.Install.InstallEventHandler(ProjectInstaller_BeforeInstall); this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller(); // // serviceProcessInstaller1 // this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; this.serviceProcessInstaller1.Password = null; this.serviceProcessInstaller1.Username = null; // // serviceInstaller1 // this.serviceInstaller1.Description = "This is my service name description"; this.serviceInstaller1.ServiceName = "MyServiceName"; this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic; // // ProjectInstaller // this.Installers.AddRange(new System.Configuration.Install.Installer[]{ this.serviceProcessInstaller1, this.serviceInstaller1 } ); } 

以下代码调用的代码将会卸载服务(如果存在)。

 void ProjectInstaller_BeforeInstall(object sender, System.Configuration.Install.InstallEventArgs e) { List<ServiceController> services = new List<ServiceController>(ServiceController.GetServices()); foreach (ServiceController s in services) { if (s.ServiceName == this.serviceInstaller1.ServiceName) { ServiceInstaller ServiceInstallerObj = new ServiceInstaller(); ServiceInstallerObj.Context = new System.Configuration.Install.InstallContext(); ServiceInstallerObj.Context = Context; ServiceInstallerObj.ServiceName = "MyServiceName"; ServiceInstallerObj.Uninstall(null); break; } } } 

PS:随着上述变化,请考虑更新设置版本,产品代码(和可选的升级代码),以便更好的实践,更好的版本管理,跟踪和维护

今天同样发生在我身上。 唯一的解决办法是从Windows添加/删除工具修复安装文件。 修复安装文件后,卸载并重新安装。

你有没有尝试在Windows注册表中查找与该服务有关的垃圾?

你应该看看这个文件夹:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \

以防万一谁遇到这个问题:

我的工作是更新我的安装程序的名称,版本和ProductCode。 无论如何,一定要遵循版本控制的良好做法。