Jak rozwiązać błąd „Określona usługa została oznaczona do usunięcia”


584

Próbuję usunąć usługę systemu Windows sc delete <service name>i napotkałem następujący błąd:

[SC] DeleteService FAILED 1072:

Określona usługa została oznaczona do usunięcia.

Co już zrobiłem:

Problem nadal występuje.

Jaki jest następny krok?


4
Ponowne uruchomienie powinno normalnie wyczyścić każdy stan przeciągnięcia.
Damien_The_Unbeliever,

14
Wiem. Ale myślałem o mniej radykalnym rozwiązaniu. Ponowne uruchamianie trzydzieści razy dziennie nie będzie w moim przypadku akceptowalnym rozwiązaniem.
Arseni Mourzenko

54
„dlaczego regularnie usuwasz usługi?” : Piszę usługę Windows. Za każdym razem, gdy jest kompilowany, należy go ponownie uruchomić. „Jednak hakowanie w rejestrze 30 razy dziennie jest dopuszczalne?” : całkowicie. Usunięcie klucza z rejestru nie zmusza mnie do zapisania wszystkiego, zamknięcia każdej otwartej aplikacji, odczekania minuty, a następnie ponownego otwarcia wszystkiego.
Arseni Mourzenko,

46
Napisałem usługi Windows. O ile nie zmienisz rzeczywistego kodu, który dokonuje rejestracji, nie ma potrzeby odinstalowywania i ponownego instalowania go za każdym razem, gdy kompilujesz. Tak długo, jak ścieżka jest taka sama, starsze informacje rejestracyjne będą nadal aktualne.
Damien_The_Unbeliever,

4
@NickTurner - link do dowolnego zgłoszenia błędu? Jakikolwiek błąd, którego dotyczysz, nie spotkałem. I nie jestem pewien, w jaki sposób zaangażowany jest MSI, ponieważ prawdopodobnie mówimy o budowaniu i uruchamianiu usług na maszynie
deweloperskiej

Odpowiedzi:


1243

Może istnieć kilka przyczyn, które powodują, że usługa utknęła w „oznaczonym do usunięcia”.

  1. Eksplorator procesów SysInternals jest otwarty . Zamknięcie powinno doprowadzić do automatycznego usunięcia usługi.

  2. Menedżer zadań jest otwarty .

  3. Microsoft Management Console (MMC) jest otwarty . Aby upewnić się, że wszystkie instancje są zamknięte, uruchom taskkill /F /IM mmc.exe.

  4. Konsola usług jest otwarta . Jest to to samo, co w poprzednim punkcie, ponieważ konsola usług jest hostowana przez MMC.

  5. Przeglądarka zdarzeń jest otwarta . Znów jest to to samo co trzeci punkt.

  6. Klucz HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ {nazwa usługi} istnieje .

  7. Ktoś inny jest zalogowany na serwerze i ma otwartą jedną z wyżej wymienionych aplikacji.

  8. Instancja programu Visual Studio używana do debugowania usługi jest otwarta.


9
Menedżer zadań wydaje się robić to samo. I jak wspomniano poniżej pozostawienie otwartej konsoli usług może to również powodować.
CodingBarfield

4
... a zamknięcie wszystkich tych elementów nadal nie pomaga i nadal widzisz usługę jako „oznaczoną do usunięcia”, zrób proste wylogowanie zamiast pełnego restartu. pomogło mi to kilka razy.
Nedko

2
Jeden wspólny przepływ pracy: twoi nikczemni koledzy są również zalogowani na zdalnym serwerze i wszyscy mają coś otwartego ...
Chris O

72
Zamknięcie konsoli usług rozwiązało dla mnie ten problem! Mój proces był następujący: W wierszu polecenia natywnych narzędzi VS2012 x64 -> przejdź do katalogu z usługą możliwą do wykonania -> installutil / u nazwa_usługi.exe (aby odinstalować przestarzałą usługę) -> skopiuj do nowej wbudowanej usługi exe - - > installutil servicename.exe (aby zainstalować zaktualizowaną usługę) . Zazwyczaj mogę odinstalować i ponownie zainstalować bez żadnych problemów. Aż losowo nie mogę. Zamknięcie konsoli usług rozwiązało to. Dzięki za wskazówkę!
thehelix

17
Proces Explorer jest tutaj moim zdaniem duży. Sugeruję pogrubienie go i / lub przeniesienie go na początek listy.
Coxy,

222

Może to być również spowodowane pozostawieniem otwartej konsoli usług. System Windows nie usunie usługi, dopóki nie zostanie ona zamknięta.


3
Jak wskazałem w swoim pytaniu, „Microsoft Management Console jest zamknięty” podczas testów.
Arseni Mourzenko

25
W moim przypadku problemem była konsola usług. Gdy tylko go zamknąłem i otworzyłem ponownie, usunięte usługi zniknęły.
Farrukh Najmi

3
Trudno uwierzyć, że tak było w przypadku otwartego okna ... Dziękuję!
Karol Tyl

Działa to również dla mnie, chociaż dziwnie było wiele przypadków, w których naciśnięcie F5 odświeży listę z usuniętą usługą.
Steve Smith

1
Uratowałeś mi dzień
Pranoy Sarkar

48

Miałem ten sam problem, w końcu postanowiłem zabić proces obsługi.

w tym celu spróbuj wykonać następujące czynności:

  • uzyskać identyfikator procesu usługi za pomocą

    sc queryex <service name>

  • zabić proces za pomocą

    taskkill /F /PID <Service PID>


2
mój PID wynosi 0, więc lepiej nie zabijaj tego!
okradać

możesz odinstalować usługę, wykonaj poniższe czynności 1- uruchom cmd 2- zmień kierunek pliku .exe swojej usługi zlokalizuj 3- uruchom komendę installutil / u <twoja_pliku.exe>
Ali Sadri

+1 dla sc queryex Będę mógł go użyć, aby uzyskać PID, jeśli chcę dołączyć debugger
Paul McCarthy

44

W moim przypadku zadziałało po zamknięciu Services. Sprawdź, czy Services.mscjest otwarty, jeśli tak, zamknij go i sprawdź, czy proces obsługi znajduje się w Task Manager.


13

Oznacza to, że usługa jest nadal wymieniona jako wyłączona w services.msc. Wystarczy zamknąć services.msc i ponownie otworzyć jako administrator ... Usługa nie będzie na liście. Teraz zainstaluj usługę za pomocą polecenia,

installutil „ścieżka usługi”


11

Usunięcie kluczy rejestru jak sugerowano powyżej spowodowało, że moja usługa utknęła w stanie zatrzymania. Dla mnie zadziałała następująca procedura:

otwórz menedżera zadań> wybierz kartę usług> wybierz usługę> kliknij prawym przyciskiem myszy i wybierz „przejdź do procesu”> kliknij prawym przyciskiem myszy proces i wybierz opcję Zakończ proces

Po tym usługi powinny zniknąć


7

Odkryłem jeszcze jedną rzecz do sprawdzenia - zajrzyj do Menedżera zadań - jeśli inni użytkownicy są podłączeni do tego pola, nawet jeśli są „rozłączeni”, musisz je faktycznie wylogować, aby usługa mogła w końcu usunąć.


4
Niepotrzebne. Musisz tylko upewnić się, że wszyscy wychodzą z konsoli Microsoft Management Console (MMC) i panelu sterowania usług.
Markiz Lorne

6

Wydaje się, że w wersjach systemu Windows późniejszych niż Windows 7 (niezweryfikowany, ale z najnowszego doświadczenia z Windows Server 2012 R2) Menedżer kontroli usług (SCM) jest bardziej rygorystyczny.

Podczas gdy w Windows 7 po prostu spawnuje inny proces, teraz sprawdza, czy proces usługi jest nadal w pobliżu i może zwrócić ERROR_SERVICE_MARKED_FOR_DELETE (1072) dla każdego kolejnego wywołania CreateService / DeleteService, nawet jeśli usługa wydaje się być zatrzymana.

Mówię tutaj o kodzie API systemu Windows, ale chcę jasno opisać, co się dzieje, więc ta sekwencja może prowadzić do wspomnianego błędu:

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

Powód, dla którego proces serwisowy jest nadal dostępny po tym, jak już zgłosił swój stan SERVICE_STOPPED, nie jest zaskakujący. Jest to zwykły proces, którego główny wątek „utknął” w wywołaniu StartServiceCtrlDispatcherinterfejsu API, więc najpierw reaguje na akcję zatrzymania sterowania, a następnie musi wykonać pozostałą sekwencję kodu.

To trochę niefortunne, że SCM / OS nie radzi sobie z tym poprawnie. Programowe rozwiązanie jest dość proste i dokładne: uzyskaj uchwyt procesu wykonywalnego usługi przed zatrzymaniem usługi, a następnie poczekaj, aż ten uchwyt zostanie zasygnalizowany.

Jeśli podchodzisz do problemu z punktu widzenia administracji systemu, rozwiązaniem jest również poczekanie, aż proces serwisowy całkowicie zniknie.


6

Właśnie to działało dla mnie: - Dotknąłem tego samego problemu: moja usługa utknęła w „oznaczonym do usunięcia”. - Otworzyłem services.msc Moja usługa pojawiła się jako uruchomiona, chociaż została już odinstalowana. - Kliknąłem Stop Otrzymałem komunikat o błędzie, informujący, że usługa nie jest w stanie odbierać komunikatów sterujących. Niemniej jednak usługa została zatrzymana. - Zamknięte usługi. Msc. - Ponownie otwarte services.msc. - Usługa zniknęła (nie wyświetla się już na liście usług).

(Środowisko to Windows 7.)


2
Tutaj Windows 2008 musiałem po prostu zamknąć panel usług
Mathijs Segers

5

W moim przypadku wykonuję taskkill /f /im dongleserver.exe, gdzie dongleserver.exejest plik exe mojego programu.

Wtedy będę mógł ponownie zainstalować mój program.


4

W moim przypadku było to spowodowane nieobsługiwanym wyjątkiem podczas tworzenia źródła eventLog. Użyj try catch, aby wskazać przyczynę.


4

Zamknięcie każdego aktualnie otwartego okna, a następnie uruchomienie następującego polecenia rozwiązało problem:

taskkill /F /IM mmc.exe

3

Zamknięcie konsoli usług zgodnie z sugestią kilku odpowiedzi tutaj pozwoliło mi usunąć usługę. W moim scenariuszu była to tylko krótkoterminowa poprawka, ponieważ wszystkie kolejne instalacje i usunięcie usługi wymagałyby ode mnie podjęcia dodatkowych kroków. Przeglądając mój plik web.config, odkryłem, że wystąpił błąd, który raz naprawiony, pozwolił mi łatwo usunąć usługę bez dodatkowego zamykania kroku konsoli usług.


1

To działa dla mnie.

  • Otwórz Menedżera zadań
  • Wybierz zakładkę usługi
  • Wybierz usługę z problemem
  • Kliknij prawym przyciskiem myszy i wybierz „Przejdź do szczegółów”
  • Kliknij usługę prawym przyciskiem myszy i wybierz „Zakończ drzewo procesów”

Drzewo zakończenia procesu zakończy proces i wszystkie procesy utworzone przez proces.

Następnie możesz ponownie zainstalować usługę.


1

W moim przypadku nazwa usługi brzmiała „Monitor”, która jest również używana przez usługę systemu Windows o nazwie „Monitor”, kiedy próbowałem zaktualizować swoje usługi, próbowałem je odinstalować, instalator próbował usunąć usługę systemu Windows „Monitor”, którą on nie mógł, a instalacja zawsze była wycofywana.

Ostatecznie zmieniłem nazwę mojej usługi na coś innego


0

Jeśli kroki dostarczone przez @MainMa nie zadziałały, wykonaj następujące czynności

Krok 1 Spróbuj zabić proces z menedżera zadań systemu Windows lub za pomocą taskkill / F / PID. Możesz znaleźć pid procesu za pomocą polecenia „sc queryex”. Spróbuj wykonać następny krok, jeśli nadal nie możesz odinstalować.

Krok 2 Jeśli powyżej

Uruchom Autoruns dla Windows Wyszukaj usługę według nazwy i usuń wyniki.


0

Głównym powodem błędu jest to, że proces nie został zatrzymany. aby go rozwiązać, uruchom menedżera zadań i przejdź do usług i sprawdź, czy nadal widzisz swoją usługę, niż przejdź do procesu tej usługi i zakończ proces. Następnie problem zostanie rozwiązany całkowicie.


0

Miałem ten problem, gdy korzystałem z weryfikatora aplikacji do weryfikacji mojej usługi win. Nawet po zamknięciu aplikacji Ver moja usługa została zablokowana przed usunięciem. Tylko usunięcie usługi z App Ver rozwiązało problem i usługa została natychmiast usunięta. Wygląda na to, że jakiś proces nadal korzysta z Twojej usługi po próbie jej usunięcia.


0

kroki do naśladowania:

krok 1 dostałem lokalizację C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

krok 2 uruchom polecenie: installutil / u pełna ścieżka / nazwa_usługi.exe

krok 3 zamknij panel usług i otwórz go ponownie

krok 4 uruchom polecenie: installutil full-path / servicename.exe


1
uwaga dodatkowa: installutil działa TYLKO jako administrator, więc otwórz powłokę jako administrator.
ingconti

0

Najprawdopodobniej usunięcie usługi kończy się niepowodzeniem, ponieważ

protected override void OnStop()

zgłaszaj błąd podczas zatrzymywania usługi. zawijanie rzeczy w ramach catch catch zapobiegnie błędowi oznaczenia do usunięcia

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

}


0

Czasami może się to zdarzyć podczas usuwania usługi za pomocą skryptu sesji zdalnej PowerShell, szczególnie gdy próbujesz usunąć usługę kilka razy. W takim przypadku spróbuj odtworzyć sesję przed usunięciem:

Remove-PSSession -Session $session
$newSession = New-PSSession -ComputerName $Name  -Credential $creds -ErrorAction Stop
Enter-PSSession $newSession
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.