【问题标题】:how to remove/kill/delete windows service completly from OS?如何从操作系统中完全删除/杀死/删除 Windows 服务?
【发布时间】:2012-07-13 12:23:28
【问题描述】:

您好,我准备了一个 Windows 服务,它通过批处理文件(.bat 文件)在服务器上设置。我也可以在运行 Uninstall.bat 后将其完全从系统中删除。Services 上没有 myservice。每件事看起来都很好。

点击Setup.exe后出现错误提示:Error 1001 The specified service already exists:

如何从我的操作系统中完全删除旧的 Windows 服务。或者如何解决这个设置问题。我的uninstall.bat exe 运行良好。

【问题讨论】:

标签: c# .net windows-services setup-project


【解决方案1】:

我根据描述的猜测是服务(或者更确切地说是注册表项)确实存在。如果不手动干预,您将无法解决此问题。似乎发生的情况是您确实删除了该服务,但似乎没有停止它(或无法停止)。

当服务从 SCM 数据库中删除时仍在运行时,服务密钥将在内部标记为删除,并且密钥中将有一个附加值告诉系统删除开机键。这个想法是,如果系统正常关闭,要删除的服务的内部链接列表将用于删除服务密钥,这将在系统重新启动之前完成。但是,如果系统崩溃,则密钥将在启动时和 SCM 开始启动服务之前被删除。

内部链表很可能是给您带来麻烦的原因。因为当您通过 SCM API 时,就完成了。解决此问题的一种方法(我过去曾这样做过)是在战略性良好的时间点重命名注册表中的密钥,并将其设置为在启动时将其删除,而不是使用 SCM API。


旁注:在 MSI 中,您应该始终使用 ServiceInstall/ServiceControlRegistry 表,而不是使用代码(无论是批处理文件还是您的自定义操作)。这些动作已经存在,只需要排序即可。

【讨论】:

  • @programmerist:我提供了一种我自己使用的解决方法。你还想要什么?我不能提供该代码,因为它不是我的(它属于我工作的公司)。
【解决方案2】:

确实是 serverfault.com 的问题,但要完全删除它,请删除其在 HKLM\System\CurrentControlSet\Services 下的注册表项。

理想情况下,所有服务操作都应通过调用服务控制管理器 (SCM) 来完成。这可以通过 SC.EXE 手动完成。但是,听起来您的应用已尝试过此操作,因此请删除该密钥并重新启动 Windows。

【讨论】:

  • 我查看了“HKLM\System\CurrentControlSet\Services”。但我找不到我的服务。
  • 这很奇怪。注册表的这个区域是 SCM 的“数据库”。服务具有显示名称和短名称(例如:Task Scheduler = schedule);我不知道你会如何在安装时指定这些。你两个都找了吗?你试过重启吗?
【解决方案3】:

您可以使用 MSIZAP。我它将清除有关损坏的 msi 的所有信息: http://nerdoftherings.net/wp/?p=66

【讨论】:

  • 我自己用过几次都成功了。
【解决方案4】:

方法一: 找到 Setup.exe 已将 msi 文件下载到的目录。并执行..

msiexec /uninstall [path to msi or product code]

方法二(使用单片机):

sc <server> delete [service name]

试一试,告诉我们会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2014-01-09
    • 2023-04-01
    • 2018-05-09
    相关资源
    最近更新 更多