如果文件不再存在,如何卸载 Windows 服务?

Posted

技术标签:

【中文标题】如果文件不再存在,如何卸载 Windows 服务?【英文标题】:How do I uninstall a Windows service if the files do not exist anymore? 【发布时间】:2010-09-16 21:46:15 【问题描述】:

如果服务文件不再存在,我该如何卸载 .NET Windows 服务?

我使用 InstallUtil 安装了一个 .NET Windows 服务。我已经删除了文件但忘记运行了

 InstallUtil /u

首先。所以服务仍然在服务 MMC 中列出。

我必须进入注册表吗?还是有更好的办法?

【问题讨论】:

Delserv 你是不是也先停止了服务? (--> net stop yourservice) 一个密切相关的线程here。 这个网站帮助我,我希望能帮助你解决这个问题howtogeek.com/howto/windows-vista/… 您可以使用NSSM。只需输入“删除” 【参考方案1】:

您至少有三个选项。我已经按照使用偏好的顺序介绍了它们。

方法 1 - 您可以使用资源工具包中包含的 SC tool (Sc.exe)。 (包含在 Windows 7/8 中)

打开命令提示符并输入

sc delete <service-name>

工具帮助sn-p如下:

DESCRIPTION:
        SC is a command line program used for communicating with the
        NT Service Controller and services.

delete----------Deletes a service (from the registry).

方法 2 - 使用 delserv

Download 并使用 delserv 命令行实用程序。这是为 Windows 2000 开发的遗留工具。在当前的 Window XP 机器中,这已被方法 1 中描述的 sc 取代。

方法 3 - 手动删除注册表项(注意这在 Windows 7/8 中适得其反)

Windows 服务在以下注册表项下注册。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

在引用键下搜索服务名称的子键并将其删除。 (并且您可能需要重新启动才能从服务列表中完全删除该服务)

【讨论】:

方法 3 在 Windows 7 上似乎适得其反。 在方法 1 中,您可能会遇到“指定的服务不存在作为已安装服务”的错误,尽管您在 MMC 中看到了该服务!!!这是因为您看到的名称是 DisplayName。您可以在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 树中查找实际的服务名称,并将 that 作为服务名称传递。 方法 3 在 Windows 7 上也适得其反。服务现在在那里,描述为 &lt;Failed to Read Description. Error Code: 2&gt; 请注意,如果您将 powershell 与 sc 一起使用 - 它会使用它的 set-content cmdlet 覆盖应用程序,如果您运行 sc delete blah,它会静默失败 注意:执行方法 3 后必须重新启动计算机!然后查看服务列表;它现在可能已经消失了。如果它仍在列表中,则只需执行方法 1 即可将其从该列表中删除。【参考方案2】:

在命令提示符下,使用 Windows“sc.exe”实用程序。你会运行这样的东西:

sc delete <service-name>

【讨论】:

如果服务名中有空格,用双引号括起来。 为什么我得到 [SC] OpenService Failed 5: Access is Denied。 @AdrianEnriquez,以管理员身份运行 cmd.exe 为我解决了这个问题。 在 windows 8 中使用该命令后,该服务在 MMC 列表中显示为禁用状态。重新启动将从列表中删除该服务。 有没有办法提升这个权限?输入上述命令后,我仍然得到“访问被拒绝”【参考方案3】:

在 Windows 8 中使用“sc delete”的注意事项:

1) 使用提升的权限打开 CMD 窗口。 [Windows Key-X 调出带有选项的菜单;选择“命令提示符(管理员)”。] 2) 使用服务列表中的括号名称[例如,我使用“sc delete gupdate”,而在服务中它显示为“Google Update (gupdate)”]

【讨论】:

【参考方案4】:

有些人提到sc delete 作为答案。我就是这样做的,但是我花了一段时间才找到&lt;service-name&gt; 参数。

命令sc query type= service(注意,它的格式非常特殊,“服务”之前的空格是必需的)将输出已安装的Windows服务列表,并附上它们的限定名称以与sc delete &lt;service-name&gt;命令一起使用。

列表很长,因此您可以考虑将输出传输到文本文件(即&gt;&gt; C:\test.txt),然后搜索。

SERVICE_NAME 是与sc delete &lt;service-name&gt; 命令一起使用的那个。

【讨论】:

查看我对已接受答案的评论。通过查看服务面板中服务的属性表,可以快速确定服务名称。 这完全没有必要:如果它们出现在服务列表中,您只需打开要从服务列表中删除的服务的属性,in 服务列表,它会显示服务名称。属性中列出的“服务名称”也是相同的服务名称。 :) 是的,我知道你可以通过其他方式得到这个名字。我添加了这个是因为我无法确定在命令中使用哪些名称。我已经看到服务属性中列出的名称,但当时我不知道该名称是要在命令中使用的名称。使用命令行是我转储所有已安装服务的好方法,包括用于删除的 。我有几个服务需要这个,所以我更容易将整个列表转储到文件中,这样我就可以找到它们,而无需在服务管理单元中查找。 你可以运行sc query,因为它默认为type= service【参考方案5】:

通过注册表删除 Windows 服务

如果您知道正确的路径,从注册表中删除服务非常容易。我是这样做的:

    运行 RegeditRegedt32

    转到注册表项“HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services”

    查找您要删除的服务并将其删除。您可以查看密钥以了解服务正在使用哪些文件并删除它们(如有必要)。

通过命令行窗口删除 Windows 服务

或者,您也可以使用命令提示符并使用以下命令删除服务:

sc删除

您也可以使用以下命令创建服务

sc create "MorganTechService" binpath="C:\Program Files\MorganTechSPace\myservice.exe"

注意:您可能需要重新启动系统才能在服务管理器中更新列表。

【讨论】:

【参考方案6】:

如果你想使用工具,你可以使用Process Hacker

创建服务的表单:

在服务上删除它的上下文菜单:

我发现 Process Hacker 是一个比 Windows 自己的 Taskmgr.exe 更方便管理 Windows 进程和服务的工具。尤其是在 Windows XP 上,您根本无法从任务管理器访问服务。

【讨论】:

它给出:指定的服务被标记为删除。【参考方案7】:

我需要重新安装我的 tomcat 服务,这意味着首先删除它。这对我有用:

Start a command prompt window using run as administrator

sc query type= service >t.txt

(编辑t.txt文件,在列表中搜索找到tomcat服务,它叫Tomcat7)

sc delete Tomcat7

但是,第一次查询命令不起作用,因为 tomcat 服务没有运行。它似乎只列出正在运行的服务。我不得不启动服务并再次运行查询命令。

【讨论】:

如果要查看停止的服务,请使用state 参数。【参考方案8】:

如果原来的Service .InstallLog 和.InstallState 文件还在文件夹中,您可以尝试重新安装可执行文件以替换文件,然后使用InstallUtil /u,然后卸载程序。这有点令人费解,但对我来说在特定情况下有效。

【讨论】:

【参考方案9】:

您可以尝试运行Autoruns,这样您就不必手动编辑注册表。当您没有所需的权限时,这尤其有用。

【讨论】:

【参考方案10】:

第一步:移动到您的服务所在的目录

命令:cd c:\xxx\yyy\service

第二步:输入以下命令

命令:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe service.exe \u

这里的 service.exe 是您的服务 exe,\u 将卸载该服务。 您将看到“卸载已完成”消息。

如果您想安装服务,请在上面的命令中删除 \u,这将安装您的服务

【讨论】:

OP明确表示原文件已被删除。【参考方案11】:

我们发现,即使您运行sc_delete,注册表中仍可能为您的服务保留一个条目,因此重新安装服务会导致一组损坏的注册表条目(它们不匹配)。我们所做的是regedit 并手动删除这个剩余条目。

注意:在 sc_delete 之后 ShipmunkService 仍然出现!

然后您可以重新安装,您的服务将正常运行。祝大家好运,愿原力与你们同在。

【讨论】:

【参考方案12】:

你可以通过命令提示符卸载你的windows服务,也只需编写这条命令

cd\                                                                   

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319(or version in which you developed your service)                                           

installutil c:\\xxx.exe(physical path of your service) -d

【讨论】:

【参考方案13】:

-Windows+r打开cmd。

-sc YourSeviceName此代码删除您的服务。

-Uninstal "YourService Path"此代码卸载您的服务。

【讨论】:

【参考方案14】:

最简单的方法是使用Sys Internals Autoruns

以管理员模式启动它,然后您可以通过删除键删除过时的服务

【讨论】:

【参考方案15】:

很多很棒的答案,这确实对我有帮助,但是缺少一件事。提到了通过 cmd 使用 sc query type= service 查找服务,但问题是我正在寻找的服务没有运行,并且此命令仅显示正在运行的服务(这可能是当时不存在的新功能OP的答案)。

您必须将服务的状态传递给类似 sc query state= allsc query state= inactive 的命令 无需传递 type= 服务,因为这是默认设置

并且,如上所述,将其推送到文本文件中,以便更轻松地搜索 sc query state= inactive &gt; C:\servicesStopped.txt

来源:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/sc-query

【讨论】:

以上是关于如果文件不再存在,如何卸载 Windows 服务?的主要内容,如果未能解决你的问题,请参考以下文章

Windows如何卸载干净mysql

Windows如何卸载干净mysql

如何手动添加和删除Windows服务

如何强制卸载windows服务

如何在不重新启动的情况下卸载 Windows 服务并删除其文件

如何卸载mysql干净