769 Stimmen

Wie löst man den Fehler "Der angegebene Dienst wurde zur Löschung markiert"?

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

[SC] DeleteService FEHLGESCHLAGEN 1072:

Der angegebene Dienst wurde zum Löschen markiert.

Was ich bisher gemacht habe:

Das Problem besteht weiterhin.

Was ist der nächste Schritt?

18voto

Amey P Naik Punkte 662

Das bedeutet, dass der Dienst immer noch als deaktiviert in services.msc aufgeführt ist. Schließen Sie einfach den services.msc und öffnen Sie ihn erneut als Administrator... Der Dienst wird nicht mehr aufgeführt sein. Installieren Sie jetzt den Dienst mithilfe des Befehls,

installutil "Pfad des Dienstes"

11voto

mathart63 Punkte 111

Das Löschen von Registrierungsschlüsseln, wie oben vorgeschlagen, hat meinen Dienst im Stoppen-Zustand stecken lassen. Das folgende Verfahren hat bei mir funktioniert:

Task-Manager öffnen > Registerkarte "Dienste" auswählen > den Dienst auswählen > mit der rechten Maustaste klicken und "Zum Prozess wechseln" auswählen > mit der rechten Maustaste auf den Prozess klicken und "Prozess beenden" auswählen

Der Dienst sollte danach verschwunden sein

10voto

Tshilidzi Mudau Punkte 6382

Jedes Fenster schließen, das gerade geöffnet war, gefolgt von der Ausführung des folgenden Befehls hat das Problem für mich gelöst:

taskkill /F /IM mmc.exe

9voto

Kathy Gryta Punkte 109

Ich habe noch eine weitere Sache entdeckt, die du überprüfen solltest - schau im Task-Manager nach - falls andere Benutzer mit diesem Benutzer verbunden sind, auch wenn sie 'getrennt' sind, musst du sie tatsächlich abmelden, um den Dienst endgültig zu löschen.

7voto

klaus triendl Punkte 1145

Es scheint, dass auf Windows-Versionen nach Windows 7 (nicht überprüft, aber durch Erfahrung zuletzt mit Windows Server 2012 R2), der Service-Control-Manager (SCM) strenger ist.

Während es auf Windows 7 einfach einen anderen Prozess erstellt, überprüft es jetzt, ob der Service-Prozess noch vorhanden ist und kann ERROR_SERVICE_MARKED_FOR_DELETE (1072) für jeden nachfolgenden Aufruf von CreateService/DeleteService zurückgeben, auch wenn der Service angeblich angehalten ist.

Ich spreche hier von Windows API-Code, aber ich möchte klar darstellen, was passiert, daher kann diese Abfolge zu dem genannten Fehler führen:

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

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

SERVICE_STATUS ss;
ControlService(hSvc, SERVICE_CONTROL_STOP, &ss);
// ... warte darauf, dass der Service seinen SERVICE_STOPPED-Status meldet

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

// alle weiteren Aufrufe von CreateService/DeleteService schlagen fehl
// wenn der Service-Prozess immer noch existiert

Der Grund, warum ein Service-Prozess nachdem er bereits seinen SERVICE_STOPPED-Status gemeldet hat, immer noch vorhanden ist, ist nicht überraschend. Es ist ein regulärer Prozess, dessen Hauptthread in seinem Aufruf der StartServiceCtrlDispatcher API 'feststeckt', also zuerst auf eine Stop-Steueraktion reagiert, dann jedoch seine verbleibende Code-Sequenz ausführen muss.

Es ist irgendwie bedauerlich, dass der SCM/OS dies nicht ordnungsgemäß für uns behandelt. Eine programmatische Lösung ist ziemlich einfach und genau: den Prozessgriff des Service-Exekutables erhalten, bevor der Service angehalten wird, und dann auf das Signal dieses Griffs warten.

Wenn man das Problem aus der Perspektive der Systemverwaltung angeht, ist die Lösung auch darauf zu warten, dass der Service-Prozess vollständig verschwindet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X