Jak wymusić odinstalowanie usługi Windows

173

Zainstalowałem usługę Windows przy użyciu installUtil.exe.

Po aktualizacji kodu ponownie użyłem installUtil.exe, aby zainstalować usługę bez wcześniejszego odinstalowania oryginalnej wersji.

Kiedy teraz próbuję odinstalować usługę, program installUtil.exe pomyślnie zakończy odinstalowywanie, ale usługa nadal jest wyświetlana.

Jeśli próbuję zmienić jego właściwości, otrzymuję komunikat „usługa jest oznaczona do usunięcia”.

Jak mogę wymusić usunięcie (najlepiej bez ponownego uruchamiania serwera)?

Manu
źródło
Jeśli usługa się zawiesiła, a usuwanie nie działa, zobacz Jak wymusić odinstalowanie usługi systemu Windows
Wernfried Domscheit

Odpowiedzi:

469

Jedną rzeczą, która mnie złapała w przeszłości, jest to, że jeśli masz uruchomioną przeglądarkę usług, zapobiega to całkowitemu usunięciu usług, więc zamknij to wcześniej

the_mandrill
źródło
70
Aż trudno mi uwierzyć, że otwarcie przeglądarki przerywa usuwanie usługi - jakie to głupie!
Draemon
1
To jest takie głupie ze strony Microsoftu, ale rzeczywiście działa. Z jakiegoś niewyjaśnionego powodu otwarcie przeglądarki usług czasami uniemożliwia ich prawidłowe usunięcie.
ivantod
1
Myślę, że ta odpowiedź będzie miała setki podobnych komentarzy. Właśnie straciłem 30 minut z tym głupim problemem ...
PierrOz
2
Wygląda na to, że eksplorator procesów SysInternals blokuje również usługi (a może także menedżera zadań), więc upewnij się, że również je zamknąłeś!
danio
3
upewnij się również, że używasz polecenia cmd. PowerShell nie pokazuje żadnego błędu, ale też nie usuwa.
Bruno Faria,
145

Nie musisz ponownie uruchamiać komputera. Uruchom cmd lub PowerShell w trybie podwyższonym.

sc.exe queryex <SERVICE_NAME>

Wtedy zdobędziesz trochę informacji. Pojawi się numer PID.

taskkill /pid <SERVICE_PID> /f

Gdzie / f ma wymusić zatrzymanie.

Teraz możesz zainstalować lub uruchomić swoją usługę.

johan
źródło
2
Działał billiicznie, gdy wszystko inne niż ponowne uruchomienie zawiodło - bardzo zadowolony!
DaveF,
36
To nie zadziałało - pid dla mojej usługi zwrócił 0 i nie pozwolił mi usunąć krytycznego procesu systemowego.
plazma 147
4
A + super. Użyj sc delete, a następnie powyższego.
Strefa 12
7
nie działał, ponieważ PID wynosił 0, to rozwiązało mój problem - (SC) DeleteService FAILED 1072
Web-E
3
Absolutnie pomocne! W moim przypadku nic poza ponownym uruchomieniem nie zadziałało. Nawet nie usuwając katalogu usług w rejestrze! Jeden haczyka jednak: Jeśli pracujesz w użyciu PowerShell: sc.exe queryex <SERVICENAME>. Ponieważ scjest to również alias dla Set-Content, CICHO zawiedzie, gdy go użyjesz.
Ifedi Okonkwo
97

cóż, możesz użyć programu SC.EXE do wymuszenia usunięcia dowolnej usługi systemu Windows, jeśli odinstalowanie nie spowoduje usunięcia przez przypadek.

sc delete <Service_Name>

Przeczytaj więcej na temat „MS Techno Blogging” wymuszonego usuwania usług z usług MMC


źródło
5
Dzięki za to. Zwróć uwagę, że jeśli „Nazwa usługi” nie jest taka sama jak „Nazwa wyświetlana”, możesz uzyskać nazwę usługi we właściwościach usługi.
GuiSim
8
sc deletezgłosi również „usługa jest zaznaczona do usunięcia”, jeśli dla usługi jest otwarty uchwyt.
Matt
@GuiSim dzięki za to, podejrzewam, że wielu będzie umieszczać wyświetlaną nazwę tak jak ja!
nik0lai
Próbowałem, ale otrzymałem ten komunikat: [SC] DeleteService FAILED 1072: Określona usługa została oznaczona do usunięcia.
Andrew W. Phillips
37

Wiem, że to nie pomoże, ale może komuś pomóc w przyszłości.

Właśnie miałem ten sam problem, zamykając i ponownie otwierając menedżera usług, usunąłem zarówno wpis z rejestru, jak i zakończyłem odinstalowywanie usługi.

Wcześniej odświeżenie menedżera usług nie pomogło.

Kennifer
źródło
1
Dzięki za rozmowę. Moje doświadczenie było dokładnie takie, jak opisałeś.
pk.
10
sc delete sericeName

Po prostu upewnij się, że usługa została zatrzymana, zanim to zrobisz. Widziałem tę pracę przez większość czasu. Są chwile, w których widziałem, jak okna utknęły na czymś i nalegają na ponowne uruchomienie.

Aaron Weiker
źródło
Tylko dodatek ... Musiałem uruchomić mój znak zachęty DOS / .NET jako administrator, aby uzyskać dostęp do uruchomienia polecenia sc delete ... na wypadek, gdyby ktoś inny napotkał ten problem.
Dav.id
Uruchom „NET STOP <nazwa usługi>” przed SC DELETE, aby upewnić się, że usługa została zatrzymana przed usunięciem
Adi
To też było moje doświadczenie, ostatecznie musiałem zrestartować komputer, aby usunąć upartą usługę, która została tylko częściowo odinstalowana (nadal pojawiała się w przystawce z kodem 2). Ponowne uruchomienie było tym, co ostatecznie sprawiło, że zniknęło.
delliottg
4

Niestety musisz zrestartować serwer. Powinno to usunąć „usuniętą” usługę.

seanyboy
źródło
12
Nie. Nie musisz restartować. Zobacz moje rozwiązanie :)
johan
2
Rozwiązanie user186749 podoba mi się jeszcze bardziej. Ładnie i czysto.
McKay,
3

Na wszelki wypadek, gdyby ta odpowiedź komuś pomogła : jak stwierdzono tutaj , możesz zaoszczędzić sobie wielu problemów z uruchamianiem Sysinternals Autoruns jako administrator. Po prostu przejdź do zakładki „Usługi” i usuń usługę.

Udało mi się to na komputerze, na którym nie miałem żadnych uprawnień do edycji rejestru.

Dębnik
źródło
3

Możesz ręcznie usunąć klucz rejestru dla swojej usługi, znajdujący się pod adresem HKLM\SYSTEM\CurrentControlSet\Services, po czym usługa nie będzie widoczna w menedżerze kontroli usług (musisz odświeżyć lub ponownie otworzyć, aby zobaczyć zmianę) i możesz ponownie zainstalować usługę w zwykły sposób.

Fernando Gonzalez Sanchez
źródło
W systemie Windows 2012 R2 powoduje, że przystawka Usługi MMC (Services.MSC) wyświetla komunikat „ Nie można odczytać opisu. Kod błędu: 2 ”. Pomimo upewnienia się, że wszystkie inne MMC zostały zamknięte, a inni użytkownicy nie zalogowani.
Sygnał
Widzę, testowałem tylko w Windows 8 i Windows 10 (i zadziałało).
Fernando Gonzalez Sanchez
TO w końcu rozwiązało mój problem. Zapomniałem dodać instalatora usługi w projekcie i nie mogłem usunąć usługi po instalacji. Zalecam wyeksportowanie drzewa rejestru usług przed usunięciem czegokolwiek z niego. Wielkie dzięki!
user3772108
2

Następujące czynności będą działać bez ponownego uruchamiania maszyny:

  1. Przeszukaj Rejestr \ HKEY_LOCAL_MACHINE pod kątem <Nazwa Twojej usługi> (zarówno klucze, jak i wartości)
  2. Ustaw wartość „Legacy” na 0
Dmitry
źródło
1

Czy próbowałeś zatrzymać usługę przed wywołaniem dezinstalacji? Miałem ten problem losowo. Czasami mogłem go usunąć bez ponownego uruchamiania. Domyślam się, że ma to związek z tym, że usługa nadal działa

wadliwy
źródło
1

Spóźniłem się, ale chciałbym dodać alternatywę, która może wyglądać dziwnie, ale nie widziałem innego sposobu:

Ponieważ każdej nocy instaluję usługi Windows w procesie CI, potrzebowałem czegoś, co działa przez cały czas i jest całkowicie zautomatyzowane. Z jakiegoś powodu usługi były zawsze oznaczane do usunięcia przez długi czas (5 minut lub dłużej) po ich odinstalowaniu. Dlatego rozszerzyłem skrypt wsadowy ponownej instalacji, aby upewnić się, że usługa jest naprawdę usunięta (wersja uproszczona):

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

Widzę, że usługa jest oznaczona do usunięcia przez około 5 minut (!), Aż w końcu przejdzie. Wreszcie, nie potrzebuję już żadnych ręcznych interwencji. W przyszłości wydłużę skrypt tak, aby coś się działo po pewnym czasie (np. Powiadomienie po 30 minutach).

marco
źródło
1

To zadziałało dla mnie

$a = Get-WmiObject Win32_Service | Where-Object {$_.Name -eq 'psexesvc'}
$a.Delete()
expirat001
źródło
Jeśli wynik tego działania jest wyświetlany ReturnValue : 16, polecenie zakończyło się niepowodzeniem z komunikatem „ Ta usługa jest usuwana z systemu ”. Pełna lista wartości ReturnValues ​​firmy Microsoft tutaj
Signal15
1

Jeśli nie możesz zatrzymać usługi w usługach , możesz zatrzymać exe usługi systemu Windows w Menedżerze zadań . Następnie możesz usunąć usługę.

Oguzhan KIRCALI
źródło
0

Odświeżenie listy usług zawsze robiło to za mnie. Jeśli okno usług jest otwarte, z jakiegoś powodu będzie przechowywać jego pamięć. F5 i ponownie instaluję ponownie!

Jer
źródło
0

Upewnij się również, że nie ma nadal aktywnych wystąpień pliku wykonywalnego (być może takiego, który mógł z jakiegoś powodu działać niezależnie od usługi).

Otwierałem i zamykałem MMC i szukałem PID-ów do zabicia - ale kiedy szukałem w eksploratorze procesów, było kilka istniejących procesów uruchomionych z zapomnianej zaplanowanej partii. Zabiłem ich. Zadanie wykonane.

Niepodcięte
źródło
0

Na forum jest mnóstwo pytań na ten temat.

Znalazłem odpowiedź w Windows API. Po odinstalowaniu usługi nie musisz ponownie uruchamiać komputera. Musisz zadzwonić:

BOOL WINAPI CloseServiceHandle(
  SC_HANDLE hSCObject
);

To zamyka uchwyt usługi. W systemie Windows 7 rozwiązało to mój problem. Ja robię:

  • zatrzymaj usługę
  • zamknąć uchwyt
  • odinstaluj usługę
  • poczekaj 3 sek
  • skopiuj nowy exe do katalogu
  • zainstaluj usługę
  • uruchomić usługę
  • zamknąć uchwyt
Gabor Balazs
źródło
2
Gdzie dostaniesz uchwyt do zamknięcia, jeśli nie jesteś w programie, który ma otwarty uchwyt?
Matt
0

Używam następującego programu PowerShell połączonego razem z kilku miejsc dla naszych wystąpień Octopus Deploy, gdy TopShelf się psuje lub usługa nie działa z innego powodu.

$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
dragon788
źródło
0

Warto również zauważyć, że to:

sc delete "ServiceName"

nie działa w PowerShell, sc jest aliasem dla polecenia cmdlet Set-Content w PowerShell. Musisz zrobić:

sc.exe delete "ServiceName"
Richard
źródło