Jak odinstalować usługę windows i usunąć jej Pliki bez ponownego uruchamiania

Mój obecny projekt polega na wdrożeniu ulepszonego .plik exe uruchamiany jako usługa systemu Windows. W celu nadpisania istniejących .exe z nową wersją, obecnie muszę:

  1. Zatrzymaj usługę
  2. Odinstaluj usługę
  3. Uruchom ponownie system (tak, aby Windows zwolnił go z pliku)
  4. / Align = "left" / exe
  5. Reinstall the service
  6. Uruchom ulepszoną usługę.

Chciałbym uniknąć restartu, tak, że może to być w pełni scripted / automated upgrade.

Czy Jest jakiś sposób, aby uniknąć ponownego uruchamiania? Może Narzędzie wiersza poleceń, które zmusi Windows do rezygnacji z tego, że jest śmiertelny chwyt na Starym .exe?

Author: Nate Sauber, 2008-11-18

9 answers

sc delete "service name"

Usunie usługę. Uważam, że narzędzie sc jest znacznie łatwiejsze do zlokalizowania niż grzebanie w poszukiwaniu installutil. Pamiętaj, aby zatrzymać usługę, jeśli jeszcze tego nie zrobiłeś.

 77
Author: StingyJack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-27 12:36:23

Czy nie można zatrzymać usługi przed aktualizacją (i ponownie uruchomić po aktualizacji) za pomocą poniższych poleceń?

net stop <service name>
net start <service name>

Za każdym razem, gdy testuję / wdrażam usługę, mogę przesyłać pliki bez ponownej instalacji, dopóki usługa jest zatrzymana. Nie jestem pewien, czy twój problem jest inny.

 14
Author: Jonathan S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-18 18:10:36

Miałem taki sam problem jak ty. Mam usługę systemową, którą chcę odinstalować, a następnie ponownie zainstalować w ramach aktualizacji. Na niektórych systemach nie działałoby to bez ponownego uruchomienia. Problem polegał na tym, że wywołanie DeleteService() zwróci ok, ale następne wywołanie CreateService() powie mi, że usługa nadal istnieje, ale oznaczona do usunięcia (kod błędu 1072). Rejestru by to odzwierciedlało, ponieważ podklucz nadal tam był (pod HKLM \ System \ CurrentControlSet\Services), ale "DeleteFlag" został ustawiony na 1. Od tego momentu tylko ponowne uruchomienie może naprawić sytuację.

Niektóre rzeczy, które nie działają:

  • Using "SC delete": it has the same problems as I. the call would return ok, but the service was not really gone and still in the registry with DeleteFlag = 1.
  • usunięcie klucza w rejestrze. Menedżer usług wydaje się przechowywać bazę danych w pamięci, a rejestr jest tylko jego kopią dla następny but.
  • dodawanie pętli wait, waiting for .pliki exe mają być gotowe do nadpisania, zabicia procesu itp.
  • zamykanie uchwytów do serwisu. Które??

Ale oto co zadziałało:

Zauważyłem w kilku artykułach tutaj na stackoverflow, że net.exe ma również funkcje start/stop (wiedziałem tylko o sc.narzędzie exe). I o dziwo," net stop svcname "plus" SC delete svcname " działało! Więc net.exe musi robić coś, czego ja nie robię.

Ale netto.exe nie zawiera importu do ControlService (), więc jak to zatrzymać usługę? Znalazłem tę sieć.exe spawns net1.exe, ale net1.exe również nie importuje ControlService (). Używałem Wielkiego narzędzia API Monitor ( http://www.rohitab.com/apimonitor ), aby zobaczyć, co net1.exe robi, ale nigdy nie nazywa niczego, co wyglądało obiecująco.

Ale potem zobaczyłem, że importuje NetServiceControl() z NETAPI32.DLL (który miał co najmniej "serwis" w nazwie!). MSDN mówi, że ta funkcja jest przestarzała. Niemniej jednak, znalazłem prototyp w LMSvc.h i jakiś opis parametrów tutaj: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html . Po wczytaniu NETAPI32.DLL I use NetServiceControl(NULL, service_name, 3, 0, 0) (3 jest dla SERVICE_CTRL_UNINSTALL, który jest używany do zatrzymania) usługa zostanie zatrzymana później. Można go potem usunąć i ponownie zainstalować bez DeleteFlag lub restartu!

Więc nigdy nie było problemu z usunięciem, ale z zatrzymaniem obsługa prawidłowo. I NetServiceControl() robi sztuczkę. Przepraszam za długi post, ale pomyślałem, że może pomóc komuś z podobnymi problemami. (Tak dla odniesienia, używam Win7 SP1 x64.)

 13
Author: cxxl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-09 16:15:26

Jeśli w. Net (nie jestem pewien czy to działa dla wszystkich usług windows)

  • Zatrzymaj usługę (może dlatego masz problem.)
  • InstallUtil-u [nazwa pliku wykonywalnego]
  • Installutil-i [nazwa pliku wykonywalnego]
  • Uruchom ponownie usługę...

O ile nie zmieniam publicznego interfejsu usługi, często wdrażam uaktualnione wersje moich usług bez nawet unistalowania/ponownej instalacji... Wszystko, co robię, to zatrzymanie usługi, Wymiana plików i ponowne uruchomienie znowu nabożeństwo...

 3
Author: Charles Bretana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-18 18:28:30

Jak zauważyli StingyJack i mcbala, a w odniesieniu do komentarzy Mike 'a L, moje doświadczenie jest takie, że na komputerze z systemem Windows 2000, podczas odinstalowywania / ponownej instalacji usług. Net," installutil / u "wymaga restartu, nawet gdy usługa została wcześniej zatrzymana. z drugiej strony" sc /delete " nie wymaga restartu-usuwa usługę od razu (o ile jest zatrzymana).

Często zastanawiałem się, właściwie, czy jest dobry powód " installutil / u" wymaga ponownego uruchomienia... Czy "sc / delete" rzeczywiście robi coś źle / zostawia coś wiszącego?

 3
Author: Tao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-11 17:31:37

Jonathan i Charles mają rację... musisz najpierw zatrzymać usługę, a następnie odinstalować / ponownie zainstalować. Połączenie ich dwóch odpowiedzi tworzy idealny plik wsadowy lub skrypt PowerShell.

Wspomnę o ostrzeżeniu wyuczonym w trudny sposób-Windows 2000 Server (prawdopodobnie również system operacyjny klienta) będzie wymagał ponownego uruchomienia przed ponowną instalacją bez względu na wszystko. Musi być klucz rejestru, który nie jest w pełni wyczyszczony, dopóki Pole nie zostanie ponownie uruchomione. Windows Server 2003, Windows XP i nowsze OS wersje nie cierpią tego bólu.

 2
Author: Mike L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-18 18:41:19

(Więc Windows wypuszcza to na plik)

Zamiast tego wykonaj Ctrl + Alt + Del zaraz po zatrzymaniu usługi i zabij .exe serwisu. Następnie możesz odinstalować usługę bez ponownego uruchamiania. Zdarzyło mi się to w przeszłości i rozwiązuje część, którą musisz zrestartować.

 2
Author: Patrick Desjardins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-19 13:25:55

Jeśli konieczne jest ręczne usunięcie usługi:

  1. Uruchom Regedit lub regedt32.
  2. znajdź wpis klucza rejestru dla swojej usługi pod następującym kluczem: HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet / Services
  3. Usuń klucz rejestru

Musisz się zrestartować, zanim lista zostanie zaktualizowana w usługach

 2
Author: chrishawn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-22 15:46:37

Używam InstallUtil.exe spakowane z. NET Framework.

Użycie do deinstalacji to: InstallUtil '\ path \ to \ assembly \ with \ the \ installer \ classes ' / u więc na przykład: installutil MyService.HostService.exe /u

Przełącznik /u oznacza uninstall, bez niego util wykonuje normalną instalację usługi. Narzędzie zatrzymuje usługę, jeśli jest uruchomiona i nigdy nie miałem problemów z blokadą systemu Windows w plikach usługi. Możesz przeczytać o innych opcjach InstallUtil na MSDN .

P. S.: jeśli nie masz installutil ' a w zmiennej path użyj pełnej ścieżki w ten sposób: C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "C:\MyServiceFolder\MyService.HostService.exe" /u lub jeśli potrzebujesz wersji 64bit można ją znaleźć w 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\'.Numer wersji w ścieżce różni się w zależności od wersji.NET.

 0
Author: MSkuta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-17 06:48:29