So erzwingen Sie die Deinstallation des Windows-Dienstes


173

Ich habe einen Windows-Dienst mit installUtil.exe installiert.

Nach dem Aktualisieren des Codes habe ich installUtil.exe erneut verwendet, um den Dienst zu installieren, ohne zuerst die Originalversion zu deinstallieren.

Wenn ich jetzt versuche, den Dienst zu deinstallieren, schließt installUtil.exe die Deinstallation erfolgreich ab, aber der Dienst wird weiterhin angezeigt.

Wenn ich versuche, seine Eigenschaften zu ändern, erhalte ich die Meldung "Dienst ist zum Löschen markiert".

Wie kann ich das Löschen erzwingen (vorzugsweise ohne den Server neu zu starten)?


Wenn der Dienst hängt und das Löschen nicht funktioniert, lesen Sie So erzwingen Sie die Deinstallation des Windows-Dienstes
Wernfried Domscheit

Antworten:


469

Eine Sache, die mich in der Vergangenheit aufgefallen ist, ist, dass wenn der Service Viewer ausgeführt wird, dadurch verhindert wird, dass die Services vollständig gelöscht werden. Schließen Sie dies also vorher


70
Ich kann kaum glauben, dass das Öffnen des Viewers die Entfernung des Dienstes unterbricht - wie dumm!
Draemon

1
Das ist so dumm von Microsoft, aber es funktioniert in der Tat. Aus unerklärlichen Gründen verhindert das Öffnen des Service-Viewers, dass diese manchmal ordnungsgemäß gelöscht werden.
ivantod

1
Ich denke, dass diese Antwort Hunderte ähnlicher Kommentare enthalten wird. Ich habe gerade 30 Minuten mit diesem dummen Problem verloren ...
PierrOz

2
Es scheint, dass der SysInternals-Prozess-Explorer auch die Dienste (und möglicherweise auch den Task-Manager) sperrt. Schließen Sie diese also auch!
Danio

3
Stellen Sie außerdem sicher, dass Sie die Eingabeaufforderung cmd verwenden. PowerShell zeigt keinen Fehler an, löscht ihn jedoch auch nicht.
Bruno Faria

144

Sie müssen Ihren Computer nicht neu starten. Starten Sie cmd oder PowerShell im erhöhten Modus.

sc.exe queryex <SERVICE_NAME>

Dann bekommst du ein paar Infos. Eine PID-Nummer wird angezeigt.

taskkill /pid <SERVICE_PID> /f

Wo / f soll Stopp stoppen.

Jetzt können Sie Ihren Dienst installieren oder starten.


2
Arbeitete billig, wo alles andere als ein Neustart fehlschlug - sehr zufrieden!
DaveF

36
Dies hat bei mir nicht funktioniert - die PID für meinen Dienst hat 0 zurückgegeben und ich konnte keinen kritischen Systemprozess löschen.
Plasma147

4
A + super. Verwenden Sie sc delete dann die oben genannten.
Zone12

7
funktionierte nicht als PID kam als 0, dies löste mein Problem - (SC) DeleteService FAILED 1072
Web-E

3
Absolut hilfreich! In meinem Fall hat nichts weniger als ein Neustart funktioniert. Nicht einmal das Dienstverzeichnis in der Registrierung löschen! Ein Problem: Wenn Sie in PowerShell arbeiten, verwenden Sie : sc.exe queryex <SERVICENAME>. Da sces auch ein Alias ​​für ist Set-Content, wird es lautlos fehlschlagen, wenn Sie das verwenden.
Ifedi Okonkwo

97

Nun, Sie können SC.EXE verwenden, um Windows-Dienste zwangsweise zu löschen, wenn die Deinstallation nicht zufällig entfernt wird.

sc delete <Service_Name>

Lesen Sie mehr über "MS Techno Blogging" Löschen von Diensten mit Gewalt aus Services MMC


5
Danke dafür. Beachten Sie, dass Sie den "Dienstnamen" in den Eigenschaften des Dienstes abrufen können, wenn der "Dienstname" nicht mit dem "Anzeigenamen" übereinstimmt.
GuiSim

8
sc deletemeldet auch "Dienst ist zum Löschen markiert", wenn für den Dienst ein Handle geöffnet ist.
Matt

@GuiSim danke dafür, ich vermute, dass viele den Anzeigenamen so setzen werden, wie ich es war!
Nik0lai

Versuchte das, bekam aber folgende Meldung: [SC] DeleteService FAILED 1072: Der angegebene Dienst wurde zum Löschen markiert.
Andrew W. Phillips

37

Ich weiß, dass dies nicht helfen wird, aber es könnte in Zukunft jemandem helfen.

Ich hatte gerade das gleiche Problem: Beim Schließen und erneuten Öffnen des Dienstmanagers wurde sowohl der Eintrag aus der Registrierung entfernt als auch die Deinstallation des Dienstes abgeschlossen.

Zuvor hatte das Aktualisieren des Servicemanagers nicht geholfen.


1
Vielen Dank für Ihre Unterstützung. Meine Erfahrung war genau so, wie Sie es beschrieben haben.
pk.

10
sc delete sericeName

Stellen Sie einfach sicher, dass der Dienst beendet ist, bevor Sie dies tun. Ich habe diese Arbeit meistens gesehen. Es gibt Zeiten, in denen ich gesehen habe, dass Windows an etwas hängen bleibt und es auf einem Neustart besteht.


Nur eine Ergänzung. Ich musste meine Dos-Eingabeaufforderung / .NET-Eingabeaufforderung als Administrator ausführen, um Zugriff auf die Ausführung des Befehls sc delete zu erhalten. Nur für den Fall, dass jemand anderes auf dieses Problem stößt.
Dav.id

Führen Sie "NET STOP <ServiceName>" vor SC DELETE aus, um sicherzustellen, dass der Dienst vor dem Löschen gestoppt wurde
Adi

Dies war auch meine Erfahrung, ich musste schließlich neu starten, um einen hartnäckigen Dienst zu entfernen, der nur teilweise deinstalliert wurde (er wurde immer noch im Snap-In mit einem Code 2 angezeigt). Ein Neustart war das, was es schließlich verschwinden ließ.
delliottg


4

Leider müssen Sie den Server neu starten. Das sollte den "gelöschten" Dienst entfernen.


12
Nein, Sie müssen nicht neu starten. Siehe meine Lösung :)
Johan

2
Die Lösung von user186749 gefällt mir sogar noch besser. Schön und sauber.
McKay

3

Nur für den Fall, dass diese Antwort jemandem hilft: Wie hier zu finden , können Sie sich viel Mühe ersparen, Sysinternals Autoruns als Administrator auszuführen . Gehen Sie einfach zur Registerkarte "Dienste" und löschen Sie Ihren Dienst.

Es hat den Trick für mich auf einem Computer gemacht, auf dem ich keine Berechtigung zum Bearbeiten der Registrierung hatte.


3

Sie können den Registrierungsschlüssel für Ihren Dienst, der sich unter befindet HKLM\SYSTEM\CurrentControlSet\Services, manuell löschen. Danach wird der Dienst im Dienststeuerungs-Manager nicht mehr angezeigt (muss aktualisiert oder erneut geöffnet werden, um die Änderung anzuzeigen), und Sie können den Dienst wie gewohnt neu installieren.


Unter Windows 2012 R2 wird im Dienst-MMC-Snap-In (Services.MSC) " Beschreibung konnte nicht gelesen werden. Fehlercode: 2 " angezeigt . Trotz der Sicherstellung, dass alle anderen MMCs geschlossen und keine anderen Benutzer angemeldet waren.
Signal15

Ich sehe, nur in Windows 8 & Windows 10 getestet (und es hat funktioniert).
Fernando Gonzalez Sanchez

DAS hat endlich mein Problem gelöst. Ich habe vergessen, dem Projekt ein Dienstinstallationsprogramm hinzuzufügen, und konnte meinen Dienst nach der Installation nicht entfernen. Ich empfehle, den Service-Reg-Baum zu exportieren, bevor Sie etwas darin löschen. Vielen Dank!
user3772108

2

Folgendes funktioniert ohne Neustart des Computers:

  1. Durchsuchen Sie die Registrierung \ HKEY_LOCAL_MACHINE nach <Ihr Dienstname> (sowohl Schlüssel als auch Werte).
  2. Setzen Sie den Wert "Legacy" auf 0

1

Haben Sie versucht, den Dienst zu beenden, bevor Sie Deinstallation aufrufen? Ich hatte dieses Problem zufällig. Irgendwann konnte ich es entfernen, ohne neu zu starten. Ich vermute, dass es mit dem noch laufenden Dienst zu tun hat


1

Ich bin spät dran, möchte aber eine Alternative hinzufügen, die vielleicht seltsam aussieht, aber ich habe keinen anderen Weg gesehen:

Da ich meine Windows-Dienste jede Nacht in einem CI-Prozess installiere, brauchte ich etwas, das ständig funktioniert und vollständig automatisiert ist. Aus irgendeinem Grund wurden die Dienste nach der Deinstallation immer für eine lange Zeit (5 Minuten oder länger) zum Löschen markiert. Daher habe ich das Batch-Skript für die Neuinstallation erweitert, um sicherzustellen, dass der Dienst wirklich gelöscht wird (vereinfachte Version):

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

Was ich sehen kann, ist, dass der Dienst für ca. 5 Minuten (!) Zum Löschen markiert ist, bis er schließlich ausgeführt wird. Schließlich brauche ich keine manuellen Eingriffe mehr. Ich werde das Skript in Zukunft so erweitern, dass nach einer bestimmten Zeit etwas passiert (z. B. Benachrichtigung nach 30 Minuten).


1

Das hat bei mir funktioniert

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()

Wenn Ihre Ausgabe davon angezeigt wird ReturnValue : 16, ist der Befehl mit " Dieser Dienst wird vom System entfernt " fehlgeschlagen . Vollständige Liste der ReturnValues ​​von Microsoft hier
Signal15

1

Wenn Sie den Dienst nicht in stoppen Diensten , können Sie Ihren Windows - Dienst exe in beenden Task - Manager . Danach können Sie den Dienst entfernen.


0

Das Aktualisieren der Serviceliste hat es immer für mich getan. Wenn das Dienstfenster geöffnet ist, enthält es aus irgendeinem Grund einen Speicher. F5 und ich installiere wieder!


0

Stellen Sie außerdem sicher, dass keine Instanzen der ausführbaren Datei noch aktiv sind (möglicherweise eine, die aus irgendeinem Grund unabhängig vom Dienst ausgeführt wurde).

Ich habe MMC geöffnet und geschlossen und nach den zu tötenden PIDs gesucht - aber als ich im Prozess-Explorer nachgesehen habe, gab es einige vorhandene Prozesse, die von einem vergessenen geplanten Stapel ausgeführt wurden. Hat sie getötet. Job erledigt.


0

Zu diesem Thema gibt es viele Forumfragen.

Ich habe die Antwort in Windows API gefunden. Sie müssen den Computer nach der Deinstallation des Dienstes nicht neu starten. Sie müssen anrufen:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

Das schließt den Griff des Dienstes. Unter Windows 7 hat es mein Problem gelöst. Ich mache:

  • Dienst anhalten
  • Griff schließen
  • Dienst deinstallieren
  • 3 Sek. warten
  • Kopieren Sie die neue Exe in das Verzeichnis
  • Installieren Sie den Dienst
  • Dienst starten
  • Griff schließen

2
Woher soll das Handle geschlossen werden, wenn Sie nicht in dem Programm sind, das das offene Handle hat?
Matt

0

Ich verwende die folgende PowerShell, die an einigen Stellen für unsere Octopus Deploy-Instanzen zusammengeschustert wurde, wenn TopShelf Fehler macht oder ein Dienst aus einem anderen Grund ausfällt.

$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

0

Es ist auch erwähnenswert, dass dies:

sc delete "ServiceName"

funktioniert nicht in PowerShell, sc ist ein Alias ​​für das Cmdlet Set-Content in PowerShell. Sie müssen tun:

sc.exe delete "ServiceName"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.