2011-05-27 16 views
6

Tengo un script cmd que ejecutará un conjunto de parches, y está diseñado para abortarse si se requiere reiniciar para evitar problemas de parches. También me gustaría extender el script para abortar si se programa un reinicio (por ejemplo, a través del comando "shutdown") para evitar reiniciar el parche central si es posible. Por desgracia no he logrado encontrar una manera de detectar esto aparte de intentar programar otra parada, lo que se traduce en:.Detectando un apagado programado

Un apagado del sistema ya ha sido programada (1190)

Mientras En teoría, podría usar esto. No creo que sea una buena práctica asustar a los usuarios que inicien sesión cada vez que necesite verificar el reinicio programado. Lo que realmente necesito es una forma de CONSULAR el estado modificado por el comando "shutdown".

¿Esto es posible? Estaré contento con cualquier solución que no implique que una aplicación se ejecute permanentemente en el sistema para detectar los eventos de apagado (que no creo que se envíen hasta que se active el apagado)

Respuesta

0

Supongo que podría usar el Task Scheduler API para enumerar las tareas programadas y ver si alguno de ellos invoca shutdown.exe. Pero yo "No estoy seguro de que es robusto. Probablemente hay múltiples maneras de programar un apagado.

+0

Sí, lamentablemente hay algunas maneras y hasta ahora no he descubierto cómo lo programa el comando "shutdown/r/t 60". No parece ser una tarea programada, es probable que sea un nivel mucho más bajo que hace que sea difícil de detectar sin una API explícita :( – Ificator

0

Tal vez se puede tratar de iniciar un apagado llamando ExitWindowsEx con un período de gracia grande y comprobar si el código de retorno ERROR_SHUTDOWN_IS_SCHEDULED y llamada AbortSystemShutdown inmediatamente si ExitWindosEx volver éxito (lo que indica que ha programado con éxito una parada)

+0

Gracias por la sugerencia. Lo estoy tratando como último recurso, aunque realmente no lo hago quiero confundir a cualquier usuario en la máquina con notificaciones periódicas de "la máquina se reinicia", "es broma". – Ificator

1

tengo el mismo problema, he buscado por todas partes, pero no encontró nada útil.

Finalmente acabo de empezar jugar un poco con diferentes cosas que podría pensar en. Puedo pensar en dos soluciones para nuestro problema

El visualizador de eventos puede indicarle que se programó un apagado, pero no CUÁNDO fue programado.

Una idea es consultar el visor de eventos para el cierre del sistema más reciente, el cierre programado más reciente y la cancelación más reciente de un apagado programado. Si el cierre programado es más reciente que la cancelación o el cierre más recientes, entonces hay uno en progreso. Los identificadores de sucesos son: 1074 para un apagado programado comenzado, 1075 para un apagado programado cancelado, en virtud de Registros de Windows/Sistema 12 para sistema de puesta en marcha 13 de apagado del sistema (todo bajo Registros de Windows/System)

Era demasiado vago para hacer esto en un archivo por lotes, sé que es posible.

Así que esto es lo que terminé haciendo: En lugar de programar un cierre, intente abortarlo. Si no se está encendiendo el apagado, arrojará un error (No se pudo abortar el apagado del sistema porque no estaba en curso el cierre. (1116)). Creo que es mucho mejor que enloquecer a un usuario al programar un cierre.

Aquí hay una copia del código que escribí para un script de apagado automático simple, que alterna entre cancelar e iniciar un apagado programado.

@echo off 
shutdown /a 
if errorlevel 1 call:shutdown 
goto end 

:shutdown 
    set /p choice=Shutdown in how many minutes? 
    set /a mod=60 
    set /a mod*=%choice% 
    shutdown /s /t %mod% 

:end 

EDITAR - Estoy volviendo a visitar esta respuesta ya que tengo más información que añadir.

La solución anterior detectará si se ha programado un apagado a través del comando shutdown.exe utilizando el argumento/t.

Si necesita determinar si Windows ha programado un cierre (como lo hace automáticamente después de algunas Actualizaciones de Windows), entonces hay una entrada de registro establecida que puede consultar. Lo siguiente se encuentra en PowerShell, pero puede escribir un archivo por lotes para hacer lo mismo.
Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending'

Nota: esto no volverá cierto si un reinicio programado en el uso de Shutdown.exe, un viaje de solo devolver verdadero si Windows dice que su computadora necesita ser reiniciado.

0

Otra forma de hacerlo, si su secuencia de comandos es establecer el cierre, es guardar las variables% date% y% time% en entornos globales utilizando el comando setx. Luego puede verificar estas variables la próxima vez que se llame al script.

Cuestiones relacionadas