46 votes

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

Mon projet actuel consiste à déployer une mise à niveau .fichier exe qui fonctionne comme un Service Windows. Afin de remplacer l'existant .exe avec la nouvelle version, j'ai besoin de: (1) d'arrêter le service (2) désinstaller le service (3) redémarrer le système (donc les versions de Windows c'est de tenir sur le fichier) (4) le déploiement de la nouvelle .exe (5) réinstaller le service (6) démarrer la mise à niveau du service. Je voudrais éviter le redémarrage de l'ordinateur, de sorte que cela peut être un script/de mise à niveau automatique.

Est-il un moyen d'éviter le redémarrage? Peut-être un outil de ligne de commande qui va forcer Windows à donner, c'est prise de la mort sur l'ancien .exe?

78voto

StingyJack Points 10956
 sc delete "service name"
 

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

15voto

cxxl Points 1376

J'avais en quelque sorte le même problème que vous. J'ai un système de service que je veux le désinstaller et le réinstaller par la suite dans le cadre d'une mise à jour. Sur certains systèmes, cela ne pourrait pas fonctionner sans un redémarrage. Le problème était qu'un appel à DeleteService() serait de retour ok, mais l'appel suivant à CreateService() me dire le service était toujours là, mais marqués pour suppression (code d'erreur 1072). Le registre permettrait de refléter le fait que, depuis la sous-clé était toujours là (dans HKLM\System\CurrentControlSet\Services), mais "DeleteFlag" a été fixé à 1. À partir de ce moment, seul un redémarrage pourrait remédier à la situation.

Certaines choses qui ne fonctionnent pas:

  • À l'aide de "sc delete": il avait les mêmes problèmes I. de L'appel serait de retour ok, mais le service n'était pas vraiment disparu et toujours dans le registre avec DeleteFlag = 1.
  • La suppression de la clé dans le registre. Le Gestionnaire de Service semble garder une base de données dans la mémoire et le registre est juste une copie de celui-ci pour le prochain démarrage.
  • L'ajout d'attendre des boucles, en attendant .les fichiers exe être prêt à être écrasé, tuant le processus, etc.
  • Poignées de fermeture du service. Lesquels??

Mais voici ce qui a fonctionné:

J'ai remarqué dans certains articles ici sur stackoverflow que net.exe a start/stop fonctions (je ne connaissais que de sc.exe de l'utilité). Et, assez étrangement, un "net stop svcname" plus un "sc delete svcname" travaillé! Donc net.exe doit faire quelque chose que je ne fais pas.

Mais net.exe ne contient pas une importation ControlService(), alors, comment est-il arrêter le service? J'ai trouvé que net.exe engendre net1.exe mais net1.exe ne pas importer la ControlService() ainsi. J'ai utilisé le grand API Monitor utility ( http://www.rohitab.com/apimonitor pour voir à ce que net1.exe le fait, mais il ne s'est jamais appelé tout ce qui avait l'air prometteur.

Mais ensuite j'ai vu qu'il importe NetServiceControl() à partir de NETAPI32.DLL (qui avait au moins le "Service" dans son nom!). MSDN dit que cette fonction est obsolète. Néanmoins, j'ai trouvé le prototype de l'LMSvc.h et certains paramètre description ici: http://cyberkinetica.homeunix.net/os2tk45/srvfpgr/369_L2_NetServiceControlorN.html . Lorsque vous chargez NETAPI32.DLL et 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é par la suite. Et il peut être supprimé et réinstallé par la suite sans DeleteFlag ou reboot!

Donc, il n'a jamais été un problème de la suppression, mais de l'arrêt du service correctement. Et NetServiceControl() fait le tour. Désolé pour le long post, mais j'ai pensé qu'il pourrait aider quelqu'un avec des problèmes similaires. (Juste pour la référence, j'utilise Win7 SP1 x64.)

14voto

Jonathan S. Points 3090

Ne pouvez-vous pas arrêter le service avant la mise à jour (et le redémarrer après la mise à jour) à l'aide des 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 réinstaller tant que le service est arrêté. Je ne sais pas si le problème que vous rencontrez est différent.

3voto

Charles Bretana Points 59899

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

  • Arrêter le service (Ce qui peut être la raison pour laquelle vous êtes confronté à un problème.)
  • InstallUtil -u [nom de l'exécutable]
  • Installutil -je [nom de l'exécutable]
  • Redémarrez le service...

Sauf si je suis de modifier le service public de l'interface, j'ai souvent déployer des versions de mise à niveau de mes services, sans même unistalling/réinstallation... Tout ce que je fais, c'est d'arrêter le service, remplacer les fichiers et redémarrez le service de nouveau...

3voto

Tao Points 5475

Comme l'a noté StingyJack et mcbala, et en référence aux observations formulées par Mike L, mon expérience est que sur un ordinateur Windows 2000, lors de la désinstallation / réinstallation .Net services", installutil /u" ne nécessitent un redémarrage, même lorsque le service a été arrêté précédemment. "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, si il y a une bonne raison "installutil /u" nécessite un redémarrage... Est "sc /supprimer" en train de faire quelque chose de mal / laissez un petit quelque chose en suspens?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X