【问题标题】:Error 1001: The Specified Service Already Exists. Cannot remove existing service错误 1001:指定的服务已经存在。无法移除现有服务
【发布时间】:2012-04-11 08:11:36
【问题描述】:

我有一个服务。我前一段时间安装了它。我需要对服务进行更新。我去了添加/删除程序并寻找我的服务,但它没有安装在那里。我查看了 services.msc,它就在那里,停止了。我能够启动和停止它。我以管理员身份运行命令提示符并运行 sc delete [服务名称],并收到“指定的服务不作为已安装的服务存在”。我在命令提示符下做了一个 sc 查询,没有返回。我右键单击安装程序,单击卸载并收到“此操作仅对当前安装的产品有效。”我也尝试了修复,得到了同样的信息。

我已经重新启动了几次机器,但没有成功卸载此服务。我正在使用随 Visual Studio 安装的基本安装项目模板。我已经尝试更改程序的名称,并增加版本号。

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

【问题讨论】:

  • 为了清楚起见,有一个服务名称和一个服务显示名称。有时人们会忘记 services.msc 中的“名称”列是服务的显示名称。您可以通过右键单击您的服务并转到属性来获取服务名称。
  • @Tung 我查了一下,它们都是一样的。
  • 迁移到superuser.com ?这不是一个真正的编程问题。

标签: c# windows visual-studio-2008 windows-services


【解决方案1】:

** 如果只需要使用设置完成,请按照:

这可以通过显式实现现有服务删除(卸载)然后允许安装较新版本来处理。 为此,我们需要更新 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:除了上述更改,还请考虑更新设置版本、产品代码(和可选的升级代码)以获得良好实践、更好的版本管理、跟踪和维护

【讨论】:

  • 这是一个很好的答案,但我发现你可以在不手动编辑 ProjectInstaller.Designer.cs 的情况下获得相同的行为(这是一个自动生成的源文件,编辑很危险,因为 VS 可以重新生成它,所以你可以结束丢失你的更改)。您可以在事件详细信息面板中的 serviceProcessInstaller 的属性选项卡中绑定到 BeforeInstall 事件。
  • @andreapier:感谢您的 cmets。是的,这是真的。这可以通过属性选项卡来实现。在这里,我只是认为更容易理解内部结构。感谢您的反馈。继续努力。
  • 请注意,如果您这样做,它会将其应用于您的 new 安装 exe,当您尝试安装新的安装 exe 时,卸载代码将从 old setup exe(据我所知),因此您可能需要手动删除现有安装并重新安装此代码才能正常工作!
【解决方案2】:

如果您有包含服务安装程序的 .exe,请使用 InstallUtil.exe /u &lt;process.exe&gt; InstallUtil.exe 位于\Windows\Microsoft.Net\Framework\v4.0.30319

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

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

马里奥

【讨论】:

    【解决方案3】:

    添加/删除程序中未列出该服务是完全正常的,该列表是针对软件包而不是服务的。 (一个包或程序可能包含多个服务,但通常不安装。)

    显然,该服务是手动安装的,而不是作为产品的一部分,即使这个服务通常会与您拥有其安装包的产品一起安装。

    使用sc delete 是正确的。您需要将服务的(短)名称包含在双引号中(除非它只是一个单词),但没有其他内容。

    如果失败,请访问注册表中的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,32 位和 64 位(分别为 regedt32.exeregedit.exe)。您甚至可以直接删除那里的服务,但显然您应该从可逆更改开始,以诊断您的服务是如何准确命名的,以及为什么sc 没有看到它的名称,并且只在其他所有操作都失败后使用直接注册表访问备份您的注册表(谷歌此过程指定您的操作系统)。

    【讨论】:

      【解决方案4】:

      今天我也发生了同样的事情。唯一的解决方案是从 Windows 添加/删除工具修复安装文件。修复安装文件后卸载并重新安装。

      【讨论】:

        【解决方案5】:

        您是否尝试在 Windows 注册表中查找与该服务相关的垃圾?

        您应该查看此文件夹:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \

        【讨论】:

        • 很遗憾,我无权访问注册表。无论如何,我并不总是觉得去那里很舒服,所以我希望有一些我可以不去那里做的事情。我请求访问注册表,但有很多与之相关的繁文缛节。
        • 我试图删除与我的服务关联的文件夹,但该服务仍然显示,然后我不得不重新启动我的计算机。
        • 在使用安装程序时手动编辑注册表没有帮助。
        【解决方案6】:

        以防万一其他人遇到此问题:

        对我有用的是更新我的安装程序的名称、版本和产品代码。无论如何都应该遵循良好的版本控制实践。

        【讨论】:

        • 这与服务完全无关。
        猜你喜欢
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        相关资源
        最近更新 更多