Comment désinstaller un service windows et supprimer ses fichiers sans redémarrer

mon projet actuel consiste à déployer une version améliorée .le fichier exe qui s'exécute comme un service Windows. Afin de remplacer l'existant .exe avec la nouvelle version, j'ai besoin de:

  1. Arrêter le service
  2. Désinstaller le service
  3. redémarrez le système (ainsi Windows libère qu'il est en attente sur le fichier)
  4. déployer le nouveau .exe
  5. Réinstaller le service
  6. démarrer le service amélioré.

j'aimerais évitez le redémarrage, de sorte qu'il puisse s'agir d'une mise à niveau entièrement scriptée/automatisée.

Est-il possible d'éviter le redémarrage? Peut-être un outil en ligne de commande qui forcera Windows à abandonner son emprise sur la mort .exe?

44
demandé sur Nate Sauber 2008-11-18 21:06:43

9 réponses

sc delete "service name"

supprimera un service. Je trouve que l' utilitaire sc est beaucoup plus facile à localiser que de creuser pour installutil. N'oubliez pas d'arrêter le service si vous ne l'avez pas déjà.

77
répondu StingyJack 2014-03-27 12:36:23

ne pouvez-vous pas arrêter le service avant la mise à jour (et le redémarrer après la mise à jour) en utilisant les commandes ci-dessous?

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

chaque fois que je teste/déploie un service, je peux télécharger des fichiers sans les réinstaller tant que le service est arrêté. Je ne suis pas sûr que votre problème soit différent.

14
répondu Jonathan S. 2008-11-18 18:10:36

j'avais en quelque sorte le même problème que vous. J'ai un service système que je veux désinstaller et ensuite réinstaller dans le cadre d'une mise à jour. Sur certains systèmes, cela ne fonctionnerait pas sans redémarrage. Le problème était qu'un appel à DeleteService() retournerait ok, mais L'appel suivant à CreateService() me dirait que le service était toujours là, mais marqué pour suppression (code d'erreur 1072). Le registre refléterait cela, puisque la sous-clé était toujours là (sous HKLM\System\CurrentControlSet\Services), mais "DeleteFlag" a été mis à 1. A partir de là, seul un redémarrage pourrait corriger la situation.

Certaines choses qui ne fonctionnent pas:

  • en utilisant "sc delete": il avait les mêmes problèmes que I. l'appel retournerait ok, mais le service n'était pas vraiment parti et toujours dans le registre avec DeleteFlag = 1.
  • suppression de la clé dans le registre. Le Gestionnaire de Service semble garder une base de données en mémoire et le registre est juste copie pour le prochain démarrage.
  • ajouter des boucles d'attente, en attente .fichiers exe pour être prêt à être réécrit, tuer le processus, etc.
  • fermeture des poignées au service. Lesquels??

Mais voici ce qui a fonctionné:

j'ai remarqué dans certains articles ici sur stackoverflow que net.exe possède aussi des fonctions start/stop (Je ne connaissais que sc.exe utilitaire). Et étrangement, un "net stop svcname" plus un "sc delete svcname" a fonctionné! So net.EXE doit faire quelque chose que je ne fais pas.

mais net.exe ne contient pas D'importation vers ControlService(), alors comment arrête-t-il le service? J'ai trouvé que net.exe fraie net1.exe, mais net1.exe n'importe pas ControlService (). J'ai utilisé le grand utilitaire API Monitor (http://www.rohitab.com/apimonitor) pour voir ce que net1.l'exe va bien, mais il n'a jamais appelé quelque chose qui semble prometteur.

mais ensuite j'ai vu qu'il importe NetServiceControl() de NETAPI32.DLL (qui avait au moins "Service" dans son nom!). MSDN dit que cette fonction est obsolète. Néanmoins, j'ai trouvé le prototype en LMSvc.h et certains paramètre description ici: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html . Lorsque vous chargez NETAPI32.DLL et l'utiliser NetServiceControl(NULL, service_name, 3, 0, 0) (3 est pour SERVICE_CTRL_UNINSTALL, qui est utilisé pour arrêter) le service est arrêté après. Et il peut être supprimé et réinstallé après sans retard ou redémarrez!

donc ce n'était pas un problème de suppression, mais d'arrêt du service correctement. Et NetServiceControl () fait l'affaire. Désolé pour le long post, mais je pensais que cela pourrait aider quelqu'un avec des problèmes similaires. (Juste pour référence, J'utilise Win7 SP1 x64.)

13
répondu cxxl 2012-07-09 16:15:26

Si dans .net ( je ne suis pas sûr si cela fonctionne pour tous les services windows)

  • arrêter le service (C'est peut-être la raison pour laquelle vous avez un problème.)
  • InstallUtil-u [nom de l'exécutable]
  • Installutil -je [nom de l'exécutable]
  • redémarrez le service...

à moins de changer l'interface publique du service, je déploie souvent des versions améliorées de mes services sans même les désactiver ou les réinstaller... Tout ce que je fais c'est arrêter le service, remplacer les fichiers et redémarrer le service à nouveau...

3
répondu Charles Bretana 2008-11-18 18:28:30

tel que noté par StingyJack et mcbala, et en référence aux commentaires faits par Mike L, mon expérience est que sur une machine Windows 2000, lors de la désinstallation / réinstallation des services .Net, "installutil / u" nécessitent un redémarrage, même lorsque le service a été précédemment arrêté. "sc /supprimer", d'autre part, ne nécessite pas de redémarrage, il supprime le service immédiatement (tant qu'il est à l'arrêt).

je me suis souvent demandé, en fait, s'il y avait une bonne raison "installutil /u" nécessite un redémarrage... Est-ce que" sc /delete " fait quelque chose de mal / laisse quelque chose en suspens?

3
répondu Tao 2009-03-11 17:31:37

Jonathan et Charles ont tous deux raison... vous devez d'abord arrêter le service, puis désinstaller/réinstaller. La combinaison de leurs deux réponses rend le fichier batch parfait ou le script PowerShell.

je vais faire mention d'une mise en garde apprise à la dure -- Windows 2000 Server (peut-être aussi le système d'exploitation client) nécessitera un redémarrage avant la réinstallation quoi qu'il arrive. Il doit y avoir une clé de Registre qui n'est pas complètement effacée jusqu'à ce que la boîte soit redémarrée. Windows Server 2003, Windows XP et les versions ultérieures de L'OS ne souffrent pas de cette douleur.

2
répondu Mike L 2008-11-18 18:41:19

(donc Windows libère il est tenu sur le fichier)

à la place, faites Ctrl+Alt + Del juste après L'arrêt du service et tuez le .exe du service. Ensuite, vous pouvez désinstaller le service sans redémarrer. Cela m'est arrivé dans le passé et résout la partie que vous devez redémarrer.

2
répondu Patrick Desjardins 2008-11-19 13:25:55

S'il est nécessaire de supprimer manuellement un service:

  1. Exécuter Regedit ou regedt32.
  2. Trouver la clé de registre d'entrée pour votre service sous la clé suivante: HKEY_LOCAL_MACHINE / SYSTEM/CurrentControlSet / Services
  3. supprimer la touche de Registre

vous devrez redémarrer avant que la liste ne soit mise à jour dans les services

2
répondu chrishawn 2010-09-22 15:46:37

j'utilise L'InstallUtil.exe bourré de .net Framework.

L'utilisation de désinstaller est: InstallUtil '\chemin\vers\assembly\avec\\installer\classes' /u donc par exemple: installutil MyService.HostService.exe /u

/u switch signifie uninstall, sans lui l'util effectue l'installation normale du service. L'utilitaire arrête le service s'il est en cours d'exécution et je n'ai jamais eu de problèmes avec Windows gardant le verrou sur les fichiers de service. Vous pouvez lire d'autres options D'InstallUtil on MSDN.

P.S.: si vous n'avez pas installutil dans votre variable path, utilisez full path comme ceci:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "C:\MyServiceFolder\MyService.HostService.exe" /u ou si vous avez besoin de la version 64bit il peut être trouvé dans 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\'.Le numéro de version dans le chemin varie selon la version .NET.

0
répondu MSkuta 2014-04-17 06:48:29