11
votes

Détecter un arrêt planifié

J'ai un script cmd qui exécutera un ensemble de patchs, et il est conçu pour abandonner si un redémarrage est nécessaire pour éviter les problèmes de correction. J'aimerais également étendre le script à abandonner si un redémarrage est planifié (par exemple via la commande "Shutdown") afin d'éviter de redémarrer le patch de midi si possible. Malheureusement, je n'ai pas réussi à trouver un moyen de détecter cela à l'écart de la tentative de planification d'un autre arrêt, ce qui entraîne:

Un arrêt du système a déjà été planifié. (1190)

Bien que je puisse utiliser théoriquement cela, je ne pense pas que ce serait une bonne pratique de faire peur à des utilisateurs à chaque fois que je devais vérifier un redémarrage programmé. Ce dont j'ai vraiment besoin est un moyen d'interroger l'état modifié par la commande "Shutdown".

est-ce possible? Je serai heureux avec vraiment une solution qui ne me concerne pas d'une application fonctionnant de manière permanente sur le système pour attraper les événements d'arrêt (que je ne pense pas même être envoyé jusqu'à ce que l'arrêt soit réellement déclenché)


0 commentaires

5 Réponses :


0
votes

Je suppose que vous pouvez utiliser le planificateur de tâches API pour énumérer les tâches planifiées et voir si l'un d'entre eux invoquent shutdown.exe. Mais je ne suis pas sûr que cela soit robuste. Il y a probablement plusieurs façons de planifier une fermeture.


1 commentaires

Oui, malheureusement, il y a quelques façons et jusqu'à présent, je n'ai pas compris la manière dont la commande "arrêté / r / t 60" planifie. Il ne semble pas être une tâche planifiée - c'est probablement quelque chose de niveau beaucoup plus bas qui rend difficile la détection sans une API explicite :(



0
votes

Peut-être que vous pouvez essayer d'initier un arrêt en appelant EXITWINDOWSEX avec une grande période de grâce et vérifiez le code de retour error_shutdown_is_schedulled et appelez AbortSystemshutdown immédiatement si EXITWINDOSEX Retour Succès (indiquant que vous avez régulièrement planifié un arrêt)


1 commentaires

Merci pour la suggestion. Je traite que, en tant que dernier recours, car je ne veux vraiment pas confondre aucun utilisateur sur la machine avec une "machine de redémarrage périodique", "juste rigoler" des notifications.



4
votes

J'ai le même problème, j'ai cherché partout, mais n'a rien trouvé d'utile.

Finalement, je viens de commencer à jouer avec différentes choses que je pouvais penser. Je peux penser à deux solutions de contournement pour notre problème. P>

Le spectateur d'événement peut vous dire qu'un arrêt a été planifié, mais pas quand il a été programmé. P>

Une idée est d'interroger le Vieweur d'événements Pour l'arrêt du système le plus récent, l'arrêt planifié le plus récent et la dernière annulation d'un arrêt planifié. Si l'arrêt prévu est plus récent que l'annulation ou l'arrêt la plus récents, il y en a un en cours. Les ID d'événement sont: 1074 pour un arrêt programmé commencé, 1075 pour une fermeture programmée annulée, sous Logs / Système Windows 12 pour le démarrage du système 13 pour l'arrêt du système (Tous sous les journaux / Système sous Windows) P>

J'étais trop paresseux pour le faire dans un fichier de commandes, je sais que c'est possible cependant. P>

C'est ce que j'ai fini par faire: Plutôt que de planifier un arrêt, essayez juste de l'abandonner. Si aucun arrêt n'est en cours, il lancera une erreur (impossible d'abandonner l'arrêt du système car aucun arrêt n'a été en cours. (1116)). Beaucoup mieux, je pense que de paniquer un utilisateur en planifiant un arrêt. P>

Voici une copie du code que j'ai écrit pour un simple script d'arrêt automatique, il bascule entre l'annulation et le démarrage d'un arrêt programmé. P >

Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending'


0 commentaires

0
votes

Une autre façon de le faire, si votre script définit l'arrêt, consiste à enregistrer la date de%% et% de variables de% en% dans des environnements globaux à l'aide de la commande SETX. Ensuite, vous pouvez vérifier ces variables la prochaine fois que le script est appelé.


0 commentaires

1
votes

Vous pouvez utiliser:

fermeture / a "pour avorter les planifiées"

Puis utilisez l'arrêt à nouveau pour créer un autre planning.


0 commentaires