代码之家  ›  专栏  ›  技术社区  ›  Manu JCasso

如何强制卸载Windows服务

  •  155
  • Manu JCasso  · 技术社区  · 17 年前

    我使用InstallUtil.exe安装了一个Windows服务。

    更新代码后,我再次使用installUtil.exe安装服务,但不先卸载原始版本。

    当我现在尝试卸载服务时,installUtil.exe成功完成卸载,但服务仍然出现。

    如果我试图更改它的属性,我会收到消息“服务被标记为删除”。

    如何强制删除(最好不重新启动服务器)?

    18 回复  |  直到 8 年前
        1
  •  423
  •   the_mandrill    16 年前

    在过去,有一件事让我感到困惑,那就是如果运行服务查看器,那么它会阻止服务被完全删除,因此请提前关闭它

        2
  •  131
  •   dragon788    9 年前

    您不必重新启动计算机。以提升模式启动Cmd或PowerShell。

    sc.exe queryex <SERVICE_NAME>
    

    然后你会得到一些信息。将显示一个PID编号。

    taskkill /pid <SERVICE_PID> /f
    

    其中/f是强制停止。

    现在您可以安装或启动服务。

        3
  •  81
  •   user186749    16 年前

    好吧,如果卸载不可能删除,那么可以使用sc.exe强制删除任何Windows服务。

    sc delete <Service_Name>
    

    阅读更多关于“MS Techno博客”的内容 Deleting Services Forcefully from Services MMC

        4
  •  36
  •   Martin    15 年前

    我知道这不会有帮助,但将来可能会有帮助。

    我刚刚遇到了同样的问题,关闭并重新打开服务管理器,从注册表中删除了这两个条目,并完成了服务的卸载。

    在此之前,刷新服务管理器没有帮助。

        5
  •  9
  •   Aaron Weiker    17 年前
    sc delete sericeName
    

    在执行此操作之前,请确保服务已停止。我经常看到这部作品。有时我会看到Windows卡在某个东西上,它坚持重新启动。

        6
  •  4
  •   seanyboy    17 年前

    很遗憾,您需要重新启动服务器。 这将删除“已删除”服务。

        7
  •  4
  •   incomplete    13 年前

    关闭“命令和服务”窗口(如果已打开),然后右键单击并选择“以管理员身份运行”,再次启动命令。如果 sc delete sericeName 不工作或任何事情都不工作。

    http://weblogs.asp.net/avnerk/archive/2007/09/05/windows-services-services-msc-and-the-quot-this-service-is-marked-for-deletion-quot-error.aspx

        8
  •  3
  •   Community Mohan Dere    9 年前

    以防万一这个答案对某人有帮助 here 你可能会省去很多跑步的麻烦。 Sysinternals Autoruns 作为管理员。 只需转到“服务”选项卡并删除您的服务。

    它在一台我没有任何权限编辑注册表的机器上为我提供了帮助。

        9
  •  2
  •   Dmitry    14 年前

    在不重新启动机器的情况下,以下功能将工作:

    1. 在注册表\hkey_local_machine中搜索<您的服务名称>(项和值)
    2. 将“Legacy”值设置为0
        10
  •  1
  •   faulty    17 年前

    在调用uninstall之前是否尝试停止服务?我随机地遇到了这个问题。有时我可以不重启就把它取下来。我猜是因为服务还在运行

        11
  •  1
  •   marco    12 年前

    我迟到了,但想增加一个备选方案,这可能看起来很奇怪,但我没有看到另一种方式:

    当我每天晚上在一个CI进程中安装Windows服务时,我需要一些可以一直工作并且完全自动化的东西。出于某种原因,卸载服务后,服务总是被标记为长时间删除(5分钟或更长时间)。因此,我扩展了重新安装批处理脚本以确保服务确实被删除(简化版本):

    REM Stop the service first
    net stop My-Socket-Server
    
    REM Same as installutil.exe, just implemented in the service
    My.Socket.Server.exe /u
    
    :loop1
        REM Easy way to wait for 5 seconds
        ping 192.0.2.2 -n 1 -w 5000 > nul
        sc delete My-Socket-Server
        echo %date% %time%: Trying to delete service.
        if errorlevel 1072 goto :loop1
    
    REM Just for output purposes, typically I get that the service does not exist
    sc query My-Socket-Server
    
    REM Installing the new service, same as installutil.exe but in code
    My.Socket.Server.exe /i
    
    REM Start the new service
    net start My-Socket-Server
    

    我可以看到,服务被标记为删除大约5分钟!!)直到最后通过。最后,我不再需要人工干预了。我将在将来扩展脚本,以便在特定时间后发生某些事情(例如,30分钟后发出通知)。

        12
  •  0
  •   Jer    16 年前

    刷新服务列表总是为我做的。如果“服务”窗口处于打开状态,则由于某种原因,它将保留一些现有的内存。我要重新安装!

        13
  •  0
  •   Unsliced    13 年前

    还要确保没有可执行文件的实例仍然处于活动状态(可能是因为任何原因而独立于服务运行的实例)。

    我正在打开和关闭mmc,并寻找要杀死的pids——但是当在ProcessExplorer中查找时,有两个现存的进程正在从一个被遗忘的预定批处理运行。杀了他们工作完成了。

        14
  •  0
  •   Gabor Balazs    13 年前

    在这个主题中有很多论坛问题。

    我在Windows API中找到了答案。卸载服务后不需要重新启动计算机。你必须打电话给:

    BOOL WINAPI CloseServiceHandle(
      SC_HANDLE hSCObject
    );
    

    关闭服务的句柄。在Windows7上,它解决了我的问题。 我愿意:

    • 停止服务
    • 闭合手柄
    • 卸载服务
    • 等待3秒
    • 将新的exe复制到目录
    • 安装服务
    • 启动服务
    • 闭合手柄
        15
  •  0
  •   Fernando Gonzalez Sanchez    9 年前

    您可以手动删除服务的注册表项,位于 HKLM\SYSTEM\CurrentControlSet\Services ,之后,您将无法在服务控制管理器中看到服务(需要刷新或重新打开才能看到更改),您可以像往常一样重新安装服务。

        16
  •  0
  •   dragon788    9 年前

    当topshelf出错或某个服务由于其他原因而失败时,我将从几个地方为我们的octopus deploy实例使用下面的PowerShell拼凑在一起。

    $ServiceName = 'MyNaughtyService'
    $ServiceName | Stop-Service -ErrorAction SilentlyContinue
    # We tried nicely, now KILL!!!
    $ServiceNamePID = Get-Service | Where { $_.Name -eq $ServiceName} # If it was hung($_.Status -eq 'StopPending' -or $_.Status -eq 'Stopping') -and
    $ServicePID = (Get-WmiObject Win32_Service | Where {$_.Name -eq $ServiceNamePID.Name}).ProcessID
    Stop-Process $ServicePID -Force
    
        17
  •  0
  •   expirat001    9 年前

    这对我有用

    $a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
    $a.Delete()
    
        18
  •  0
  •   Oguzhan Kircali    8 年前

    如果您不能在中停止服务 服务 ,您可以在 任务管理器 . 之后,您可以删除服务。

    推荐文章