So beheben Sie den Fehler "Der angegebene Dienst wurde zum Löschen markiert"

585

Ich versuche, einen Windows-Dienst mit zu entfernen sc delete <service name>, und stelle den folgenden Fehler fest:

[SC] DeleteService FAILED 1072:

Der angegebene Dienst wurde zum Löschen markiert.

Was ich schon gemacht habe:

Das Problem besteht weiterhin.

Was ist der nächste Schritt?

Arseni Mourzenko
quelle
4
Ein Neustart sollte normalerweise den verbleibenden Status beseitigen.
Damien_The_Unbeliever
14
Ich kenne. Aber ich dachte über eine weniger radikale Lösung nach. Ein dreißigmaliger Neustart pro Tag ist in meinem Fall keine akzeptable Lösung.
Arseni Mourzenko
54
"Warum löschen Sie Dienste so regelmäßig?" : Ich schreibe einen Windows-Dienst. Jedes Mal, wenn es kompiliert wird, sollte es neu gestartet werden. "Dennoch ist es akzeptabel, 30 Mal pro Tag in der Registrierung herumzuhacken?" : total. Das Entfernen eines Schlüssels aus der Registrierung zwingt mich nicht, alles zu speichern, jede geöffnete App zu schließen, eine Minute zu warten und dann alles erneut zu öffnen.
Arseni Mourzenko
46
Ich habe Windows-Dienste geschrieben. Sofern Sie nicht den tatsächlichen Code ändern, der die Registrierung durchführt, müssen Sie ihn nicht jedes Mal deinstallieren und neu installieren, wenn Sie einen Build ausführen. Solange der Pfad derselbe ist, sind die älteren Registrierungsinformationen weiterhin gültig.
Damien_The_Unbeliever
4
@NickTurner - Link zu einem Fehlerbericht? Welchen Fehler Sie auch immer nennen, ich bin nicht darauf gestoßen. Und ich bin mir nicht sicher, wie ein MSI involviert ist, da wir vermutlich über das
Erstellen

Antworten:

1244

Es kann verschiedene Ursachen geben, die dazu führen, dass der Dienst in "Zum Löschen markiert" steckt.

  1. Der Prozess-Explorer von SysInternals wird geöffnet . Das Schließen sollte zum automatischen Entfernen des Dienstes führen.

  2. Der Task-Manager wird geöffnet .

  3. Microsoft Management Console (MMC) wird geöffnet . Führen Sie aus, um sicherzustellen, dass alle Instanzen geschlossen sind taskkill /F /IM mmc.exe.

  4. Die Dienstekonsole wird geöffnet . Dies ist derselbe wie im vorherigen Punkt, da die Services-Konsole von MMC gehostet wird.

  5. Die Ereignisanzeige wird geöffnet . Dies ist wiederum der gleiche wie der dritte Punkt.

  6. Der Schlüssel HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {Dienstname} ist vorhanden .

  7. Jemand anderes ist am Server angemeldet und hat eine der zuvor genannten Anwendungen geöffnet.

  8. Eine zum Debuggen des Dienstes verwendete Instanz von Visual Studio ist geöffnet.

Arseni Mourzenko
quelle
9
Der Task-Manager scheint dasselbe zu tun. Und wie unten erwähnt, kann dies auch dazu führen, dass die Services-Konsole geöffnet bleibt.
CodingBarfield
4
... und wenn das Schließen all dieser Funktionen immer noch nicht hilft und Sie den Dienst weiterhin als "zum Löschen markiert" sehen, melden Sie sich einfach ab, anstatt ihn vollständig neu zu starten. es hat mir ein paar mal geholfen.
Nedko
2
Ein häufiger Workflow: Ihre schändlichen Kollegen sind ebenfalls am Remote-Server angemeldet, und alle haben etwas offen ...
Chris O
72
Das Schließen der Servicekonsole hat dieses Problem für mich gelöst! Mein Prozess war der folgende: In der Eingabeaufforderung für VS2012 x64 Native Tools -> Navigieren Sie zu Verzeichnis mit dem Dienst exectuable -> installutil / u servicename.exe (um den veralteten Dienst zu deinstallieren) -> Kopieren Sie über die neu erstellte Dienst-Exe - > installutil servicename.exe (um den aktualisierten Dienst zu installieren) . Ich kann im Allgemeinen sofort ohne Probleme deinstallieren und neu installieren. Bis ich zufällig nicht kann. Das Schließen der Dienstekonsole hat das Problem behoben. Danke für den Tipp!
Thehelix
17
Meiner Meinung nach ist der Prozess-Explorer hier der große. Ich schlage vor, es fett zu schreiben und / oder an den Anfang der Liste zu verschieben.
Coxy
223

Dies kann auch dadurch verursacht werden, dass die Services-Konsole geöffnet bleibt. Windows löscht den Dienst erst, wenn er geschlossen ist.

Zwangsfx
quelle
3
Wie ich in meiner Frage angegeben habe, ist "Microsoft Management Console geschlossen" während der Tests.
Arseni Mourzenko
25
In meinem Fall war die Services-Konsole das Problem. Sobald ich es schloss und wieder öffnete, verschwanden die gelöschten Dienste.
Farrukh Najmi
3
Kaum zu glauben, dass es der Fall war, das Fenster offen zu halten ... Danke!
Karol Tyl
Dies funktionierte auch für mich, obwohl es seltsamerweise viele Fälle gab, in denen durch einfaches Drücken von F5 die Liste mit entferntem Dienst aktualisiert wurde.
Steve Smith
1
Du hast meinen Tag gerettet
Pranoy Sarkar
50

Ich hatte das gleiche Problem, schließlich entscheide ich mich, den Serviceprozess zu beenden.

Versuchen Sie dazu die folgenden Schritte:

  • Prozess-ID des Dienstes mit abrufen

    sc queryex <service name>

  • Kill-Prozess mit

    taskkill /F /PID <Service PID>

Ali Sadri
quelle
2
Meine PID ist 0, also sollte ich das besser nicht töten!
Rob
Sie können Service deinstallieren es unter Schritte tun 1- run cmd 2- Richtung ändern , um Exe - Datei Ihres Dienstes feststellen , dass 3- Befehl ausführen installutil / u <yourfilename.exe>
Ali Sadri
+1 für sc queryex Ich kann das verwenden, um die PID zu erhalten, wenn ich den Debugger anhängen möchte
Paul McCarthy
44

In meinem Fall hat es nach dem Schließen der funktioniert Services. Überprüfen Sie, ob das Services.mscgeöffnet ist, wenn ja, schließen Sie es und überprüfen Sie, ob ein Serviceprozess in gefunden wurde Task Manager.

Sumit Agrawal
quelle
13

Das bedeutet, dass der Dienst in services.msc weiterhin als deaktiviert aufgeführt ist. Schließen Sie einfach die Datei services.msc und öffnen Sie sie erneut als Administrator ... Der Dienst wird nicht aufgelistet. Installieren Sie nun den Dienst mit dem Befehl:

installutil "Pfad des Dienstes"

Amey P Naik
quelle
11

Durch das Löschen von Registrierungsschlüsseln wie oben vorgeschlagen blieb mein Dienst im Stoppzustand hängen. Das folgende Verfahren hat bei mir funktioniert:

Öffnen Sie den Task-Manager> wählen Sie die Registerkarte Dienste> wählen Sie den Dienst aus> klicken Sie mit der rechten Maustaste und wählen Sie "Zum Prozess gehen"> klicken Sie mit der rechten Maustaste auf den Prozess und wählen Sie Prozess beenden

Der Service sollte danach weg sein

mathart63
quelle
7

Sie haben eine weitere Sache entdeckt, die Sie überprüfen müssen - schauen Sie im Task-Manager nach -, ob andere Benutzer mit diesem Feld verbunden sind, auch wenn sie nicht verbunden sind. Sie müssen sie tatsächlich abmelden, damit der Dienst endgültig gelöscht wird.

Kathy Gryta
quelle
4
Nicht notwendig. Sie müssen nur sicherstellen, dass alle Benutzer das Kontrollfeld Microsoft Management Console (MMC) und Services verlassen.
Marquis von Lorne
6

Es scheint, dass unter Windows-Versionen später als Windows 7 (nicht überprüft, aber aufgrund der neuesten Erfahrungen mit Windows Server 2012 R2) der Service Control Manager (SCM) strenger ist.

Während unter Windows 7 nur ein anderer Prozess erzeugt wird, wird jetzt geprüft, ob der Dienstprozess noch vorhanden ist, und möglicherweise ERROR_SERVICE_MARKED_FOR_DELETE (1072) für jeden nachfolgenden Aufruf von CreateService / DeleteService zurückgegeben, selbst wenn der Dienst anscheinend gestoppt wird.

Ich spreche hier von Windows-API-Code, möchte aber klar umreißen, was passiert, sodass diese Sequenz zu dem genannten Fehler führen kann:

SC_HANDLE hScm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS);

SC_HANDLE hSvc = OpenService(hScm, L"Stub service", SERVICE_STOP | SERVICE_QUERY_STATUS | DELETE);

SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... wait for service to report its SERVICE_STOPPED state

DeleteService(hSvc);
CloseServiceHandle(hSvc);
hSvc = nullptr;

// any further calls to CreateService/DeleteService will fail
// if service process is still around

Der Grund, warum ein Serviceprozess noch besteht, nachdem er bereits seinen Status SERVICE_STOPPED gemeldet hat, ist nicht überraschend. Es handelt sich um einen regulären Prozess, dessen Hauptthread beim Aufruf der StartServiceCtrlDispatcherAPI "hängen bleibt". Er reagiert also zuerst auf eine Aktion zur Steuerung des Stopps, muss dann aber die verbleibende Codesequenz ausführen.

Es ist bedauerlich, dass das SCM / OS dies für uns nicht richtig handhabt. Eine programmatische Lösung ist ein bisschen einfach und genau: Rufen Sie das Prozesshandle der ausführbaren Dienstdatei ab, bevor Sie den Dienst beenden, und warten Sie, bis dieses Handle signalisiert wird.

Wenn Sie sich dem Problem aus Sicht der Systemadministration nähern, besteht die Lösung auch darin, darauf zu warten, dass der Serviceprozess vollständig verschwindet.

klaus triendl
quelle
6

Dies hat bei mir funktioniert: - Ich habe das gleiche Problem festgestellt: Mein Dienst steckte in "Zum Löschen markiert" fest. - Ich habe services.msc geöffnet. Mein Dienst wurde als ausgeführt angezeigt, obwohl er bereits deinstalliert war. - Ich habe auf Stop Received eine Fehlermeldung geklickt, die besagt, dass der Dienst nicht in der Lage ist, Kontrollnachrichten zu empfangen. Trotzdem wurde der Dienst eingestellt. - Geschlossene services.msc. - Wiedereröffnete services.msc. - Der Dienst war weg (wird nicht mehr in der Liste der Dienste angezeigt).

(Die Umgebung war Windows 7.)

balintn
quelle
2
Windows 2008 hier musste ich nur das Service-Panel schließen
Mathijs Segers
5

In meinem Fall führe ich aus taskkill /f /im dongleserver.exe, wodongleserver.exe sich die exe-Datei meines Programms befindet.

Dann kann ich mein Programm bereits neu installieren.

Sian Chiew Siehe
quelle
4

In meinem Fall wurde dies durch eine nicht behandelte Ausnahme beim Erstellen der eventLog-Quelle verursacht. Verwenden Sie try catch, um die Ursache zu ermitteln.

Arijus Gilbrantas
quelle
4

Das Schließen jedes aktuell geöffneten Fensters und das Ausführen des folgenden Befehls lösten das Problem für mich:

taskkill /F /IM mmc.exe
Tshilidzi Mudau
quelle
3

Durch das Schließen der Dienstekonsole, wie in einigen der Antworten hier vorgeschlagen, konnte ich den Dienst entfernen. In meinem Szenario war dies nur eine kurzfristige Lösung, da ich bei allen nachfolgenden Neuinstallationen und beim Entfernen des Dienstes diese zusätzlichen Schritte ausführen müsste. Beim Überprüfen meiner Datei web.config wurde festgestellt, dass ein Fehler aufgetreten ist, der es mir nach der Behebung ermöglichte, den Dienst problemlos zu entfernen, ohne den Schritt der Dienstekonsole zusätzlich schließen zu müssen.

GatesReign
quelle
1

Das funktioniert bei mir.

  • Öffnen Sie den Task-Manager
  • Wählen Sie die Registerkarte Dienste
  • Wählen Sie den Dienst mit dem Problem aus
  • Klicken Sie mit der rechten Maustaste und wählen Sie "Zu Details gehen".
  • Klicken Sie mit der rechten Maustaste auf den Dienst und wählen Sie "Prozessbaum beenden".

Prozessbaum beenden beendet den Prozess und alle vom Prozess erstellten Prozesse.

Anschließend können Sie den Dienst neu installieren.

OIbuoye
quelle
1

In meinem Fall war der Dienstname "Monitor", der auch von einem Windows-Dienst namens "Monitor" verwendet wird. Als ich versuchte, meine Dienste zu aktualisieren, habe ich versucht, sie zu deinstallieren. Das Installationsprogramm hat versucht, den Windows-Dienst "Monitor" zu entfernen, den es enthält konnte nicht, und die Installation wurde immer zurückgesetzt.

Am Ende habe ich meinen Dienst in etwas anderes umbenannt

Yaman
quelle
0

Wenn die von @MainMa bereitgestellten Schritte nicht funktionierten, befolgen Sie die folgenden Schritte

Schritt 1 Versuchen Sie, den Prozess über den Windows Task-Manager abzubrechen oder Taskkill / F / PID zu verwenden. Sie können die PID des Prozesses mit dem Befehl 'sc queryex' finden. Versuchen Sie den nächsten Schritt, wenn Sie immer noch nicht deinstallieren können.

Schritt 2 Wenn oben

Führen Sie Autoruns for Windows Search nach Dienst nach Namen aus und löschen Sie die Ergebnisse.

Charith
quelle
0

Der Hauptgrund für den Fehler ist, dass der Prozess nicht gestoppt wird. Um das Problem zu beheben, starten Sie den Task-Manager, gehen Sie zu den Diensten und prüfen Sie, ob Sie Ihren Dienst noch sehen können. Gehen Sie dann zum Prozess dieses Dienstes und beenden Sie den Prozess. Dann wird das Problem vollständig gelöst.

Gaurav Tyagi
quelle
0

Ich hatte dieses Problem, als ich Application Verifier verwendete, um meinen Win-Service zu überprüfen. Selbst nachdem ich App Ver geschlossen hatte, wurde mein Dienst für das Löschen gesperrt. Nur das Entfernen des Dienstes aus App Ver hat das Problem behoben und der Dienst wurde sofort gelöscht. Es sieht so aus, als ob ein Prozess Ihren Dienst noch verwendet, nachdem Sie versucht haben, einen zu löschen.

vadzvnik
quelle
0

Schritte zum folgen:

Schritt 1 gehen Sie zum Speicherort C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

Schritt-2- Befehl ausführen: installutil / u full-path / servicename.exe

Schritt 3 Schließen Sie das Service-Panel und öffnen Sie es erneut

Schritt-4- Befehl ausführen: installutil full-path / servicename.exe

Divyang Shah
quelle
1
eine Randnotiz: installutil funktioniert NUR als Administrator, also öffnen Sie eine Shell als Administrator.
Ingconti
0

Das Löschen des Dienstes schlägt höchstwahrscheinlich fehl, weil

protected override void OnStop()

Fehler beim Beenden eines Dienstes auslösen. Das Umschließen von Dingen in einen Try-Catch verhindert das Markieren eines Löschfehlers

protected override void OnStop()
{
            try
            {
                //things to do
            }
            catch (Exception)
            {
            }

}}

e03050
quelle
0

Manchmal kann dies beim Löschen von Diensten über das PowerShell-Remotesitzungsskript passieren, insbesondere wenn Sie mehrmals versuchen, Dienste zu löschen. Versuchen Sie in diesem Fall, eine Sitzung vor dem Löschen neu zu erstellen:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
Alex Podles
quelle