L'arrêt/Démarrage à distance un service Windows et l'attente pour ouvrir/fermer
Le haut de répondre à cette question me dit comment arrêter/démarrer un service distant. Grand.
Maintenant, tout ce que je besoin est d'attendre pour le stop/start pour valider. Donc, ce que je suis à la recherche d'une commande dos pour:
- Démarrer un service, doit revenir que le service est démarré (ou après un délai d'attente, d'élever son niveau d'erreur)
- Arrêter un service, de retour seulement après avoir arrêté le service
- J'aimerais savoir moi-même. Je ne crois pas que cela soit possible avec la commande SC, qui est asynchrone par la nature. Vous pouvez avoir à lier qui commande ping de l'état de service de l'évolution à partir de l'ARRÊT d'arrêter et de COMMENCER à COMMENCÉ.
Vous devez vous connecter pour publier un commentaire.
J'ai créé un ensemble de scripts qui utilisent sc.exe pour faire juste cela. Ils sont joints ci-dessous. Pour exécuter ces scripts, vous devez être un utilisateur avec les droits d'administration sur la machine cible et en cours d'exécution à partir d'un ordinateur qui est un membre du même domaine. Il est possible de le configurer afin d'être en mesure d'exécuter à partir de l'extérieur du domaine (comme à partir d'un VPN), mais il y a beaucoup de couches de sécurité au travail par la participation de pare-feu, DCOM et les informations d'identification de sécurité.
Un de ces jours, je vais trouver le PowerShell équivalent, qui devrait être beaucoup plus facile.
safeServiceStart.chauve-souris
safeServiceStop.chauve-souris
safeServiceRestart.chauve-souris
find
à partir de cygwin, c'vais aller de ce script.-n <seconds>
une commande ping pour longtemps, et pas seulement jusqu'à ce qu'il obtient une réponse. Que faire si le serveur n'est pas venu au sein de votren seconds
, ou si elle est déjà en place, pourquoi attendre?timeout
de commande qui sert à cette fin. La différence est que ce script continuera réessayer jusqu'à ce qu'il voit à la fois l'ordinateur cible est en ligne ET que le service est arrêté. Bien sûr,net stop service
de travail pour la plupart des gens qui veulent arrêter un service, mais ce script est pour quand vous vraiment envie que ça cesse, assurez-vous qu'il est arrêté, et attendre qu'il cesse jusqu'à ce qu'il est vraiment arrêté.net stop service
va envoyer la commande d'arrêt, mais si le service ne peut pas arrêter, ou prend un certain temps, les fichiers peuvent encore être utilisés lorsque le script continue.safeServiceStop.bat 192.168.1.10 ServiceB -t 60
va exécuter le script pendant 60 secondes seulement. Actuellement, si certains ServiceA dépend ServiceB, le fichier de script s'exécute indéfinimentQu'en powershell et WaitForStatus? Par exemple, le script ci-dessous serait le redémarrage de SQL Server sur un ordinateur distant:
Je n'ai jamais réellement vu quelque chose qui ne ce particulier, mais il serait assez facile de frapper un tel utilitaire C\C#\VB ou en toute autre langue qui offre un accès facile à l'API du Service. Voici un exemple de quelque chose en C#.
La WaitForStatus est juste une boucle d'interrogation et pourrait être facilement remplacé dans toute autre langue. Le reste est juste OpenService et ControlService.
Eric Falsken la solution fonctionne parfaitement. +1.
Mais je tiens à ajouter que le délai d'attente de commande serait parfois d'échouer avec l'erreur:
"La redirection d'entrée n'est pas prise en charge, de quitter immédiatement le processus"
Pour corriger cela, j'ai dû remplacer le délai de commande:
avec les éléments suivants:
Modifier sur 10/20/2011 - mis à jour mon code. Je l'ai posté avant d'avoir le débogage.
Un grand merci à Eric Falsken. Quelle bonne solution. J'ai modifié le code de Eric (BTW regarder pour un couple d'erreurs typographiques si vous avez l'intention de l'utiliser). J'ai ajouté de la journalisation et de quelques autres de vérification des erreurs pour certaines conditions Eric n'a pas de compte pour. Depuis que je suis le plus intéressé à un redémarrage du service (et pas seulement de l'arrêt et/ou de départ), j'ai seulement construit à Eric de redémarrage du code. De toute façon, je poste ma version, j'espère que vous aimez!
Qu'en PowerShell et Redémarrez-le Service commandlet? 🙂
Get-Service W3SVC -computer myserver | Set-Service -Status Stopped; Get-Service W3SVC -computer myserver | Set-Service -Status Running
.Eric Falsken scripts sont fantastiques pour ce but. Mais notez qu'ils utilisent le délai d'attente de commande qui n'est disponible que dans Vista/Server 2003 et plus récent. Pour une machine XP, vous pouvez utiliser sleep.exe à partir du Kit de Ressources NT à la place. (Ce doit être une commment à Eric de réponse, mais pas assez de rep pour le faire).
J'ai amélioré le script de Eric Falsken et révisé par Gerorge Perkins.
Changements:
éparses optimisations.
NET START et NET STOP ne devrait pas revenir jusqu'à ce que le service a indiqué que le service est démarré ou arrêté avec succès.Je ne crois pas que vous pouvez le faire avec une quinte de commande dos. Vous pouvez vérifier Projet De Code ou d'autres sites semblables à voir si il y a une solution personnalisée pour cela déjà.
Si non, vous pourriez écrire un secondaire service Windows qui fait cela pour vous, en exposant les fonctionnalités de démarrage/arrêt par l'intermédiaire d'un WCF point de terminaison. Pour accéder à ce service secondaire à distance, vous pouvez écrire une simple application console qui se connecte à ce service pour démarrer/arrêter le service Windows en question. Puisque c'est une application console, il serait imiter le comportement souhaité de travail à partir de la ligne de commande et ne pas retourner jusqu'à complet (ou une erreur s'est produite). Ce n'est pas la simple, la solution la plus simple que vous cherchez, mais je vais le jeter là-bas pour examen.