Comment faire pour désinstaller un service windows et supprimer ses fichiers sans avoir à 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:
- Arrêter le service
- Désinstaller le service
- Redémarrer le système (donc les versions de Windows c'est de tenir sur le fichier)
- Déployer la nouvelle .exe
- Réinstaller le service
- 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?
- Merci à tous pour votre aide! J'ai trouvé la source de mon problème était une poignée de sur les .exe par WMI. Voir ma nouvelle question: " stackoverflow.com/questions/302315/...
- Pour info, si vous avez le gestionnaire des Services de l'ouvrir, vous devez fermer avant de le ré-installer le service, sinon vous obtiendrez un service est déjà marqué pour suppression d'erreur".
- Dans mon expérience "[SC] CreateService a ÉCHOUÉ 1072: Le service spécifié a été marqué pour suppression" dépend du fait que le service de la désinstallation n'a pas été arrêté en premier. J'ai essayé de reproduire l'erreur d'avoir simplement l'outil d'administration Services de l'ouvrir et ne pouvait pas.
InformationsquelleAutor Nate Sauber | 2008-11-18
Vous devez vous connecter pour publier un commentaire.
va supprimer un service. Je trouve que le utilitaire sc est beaucoup plus facile à localiser que de creuser autour pour installutil. N'oubliez pas d'arrêter le service si vous ne l'avez pas déjà.
sc delete
ne pas arrêter l'exécution d'un service lors de la désinstallation, mais plutôt la marque pour la suppression, qui est ce que sa documentation est également décrit.N'êtes-vous pas en mesure d'arrêter le service avant la mise à jour (et de redémarrage après la mise à jour) en utilisant les commandes ci-dessous?
Chaque fois que je suis en essais/déploiement d'un service que je suis capable de télécharger des fichiers sans avoir à réinstaller tant que le service est arrêté. Je ne suis pas sûr si le problème que vous rencontrez est différent.
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:
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 l'utilisation
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!De sorte qu'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.)
Si dans .net ( je ne suis pas sûr si cela fonctionne pour tous les services windows)
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...
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?
À la fois Jonathan et Charles sont à droite... vous avez pour arrêter le service d'abord, puis de désinstaller/réinstaller. Combinant leurs deux réponses est le parfait lot de fichier ou un script PowerShell.
Je vais faire mention d'une attention appris à la dure, Windows 2000 Serveur (peut-être le système d'exploitation client ainsi) aura besoin d'un redémarrage avant de le réinstaller n'importe quoi. Il doit y avoir une clé de registre qui n'est pas complètement effacé jusqu'à ce que la boîte est redémarré. Windows Server 2003, Windows XP et versions de système d'exploitation ne souffre pas que de la douleur.
Au lieu de cela, faire Ctrl+Alt+Suppr à droite après l'Arrêt du service, et de tuer l' .exe du service. Que, vous pouvez désinstaller le service sans avoir à redémarrer. Ce qui m'est arrivé dans le passé et elle n'en résout la partie que vous avez besoin de redémarrer.
Il sera nécessaire de supprimer manuellement un service:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services
Vous devrez redémarrer avant la liste est mise à jour dans les services
Je suis en utilisant le InstallUtil.exe emballé avec .NET Framework.
L'utilisation de désinstaller est: InstallUtil '\chemin\vers\assembly\par\la\installer\classes' /u ainsi, par exemple:
installutil MyService.HostService.exe /u
La
/u
switch est pour désinstaller, sans elle, l'util effectue l'installation normale du service. L'utilitaire s'arrête au service si elle est en cours d'exécution et je n'ai jamais eu de problèmes avec Windows maintien de verrouillage sur le service de fichiers. Vous pouvez lire sur les autres options de InstallUtil sur MSDN.P. S.:si vous n'avez pas installutil dans votre variable path utilisation du chemin d'accès complet 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 64 bits, il peut être trouvé dans " C:\Windows\Microsoft.NET\Framework64\v4.0.30319\' .Le numéro de version dans le chemin d'accès varie en fonction .Version NET.