Determine se um desligamento está pendente

6

O Windows tem o comando shutdown /t para desligar ou reiniciar o computador após um certo atraso. Um desligamento pendente pode ser cancelado com shutdown /a .

Mas como posso determinar se e quando um desligamento está atualmente pendente ou agendado, sem abortá-lo?

    
por ygoe 19.01.2016 / 11:39

2 respostas

7

Como posso determinar se e quando um desligamento está atualmente pendente ou agendado, sem abortá-lo?

Eu não acho que é possível determinar quando o desligamento acontecerá.

Você pode determinar se um desligamento estiver agendado usando o seguinte algoritmo:

  1. Execute um encerramento de "teste" usando shutdown /t xxx com um valor grande para o tempo .

    • Para o Windows 7 ou posterior, o tempo máximo permitido foi aumentado de 600 segundos para 315,360,000 segundos (10 anos)
  2. Se já houver um desligamento pendente, então shutdown /t xxx falhará com errorlevel 1190 :

    A system shutdown has already been scheduled.(1190)

  3. Se você não receber o erro acima, saberá que não houve nenhum encerramento anterior agendado, portanto, será necessário excluir o desligamento de "teste" usando shutdown /a .

O acima pode ser feito em um arquivo em lotes:

@echo off
rem perform a "test" shutdown with a large time
shutdown /t 999999
rem if there is already a shutdown pending then %ERRORLEVEL% will be 1190
if %ERRORLEVEL% equ 1190 (
  echo A shutdown is pending
  ) else (
  rem cancel the "test" shutdown
  shutdown /a
  echo No shutdown is pending
  )

Nota:

  • Eu não testei o arquivo de lote acima porque não desejo desligar meu PC neste momento.

Leitura Adicional

por 19.01.2016 / 13:24
0

Uma maneira mais complicada de descobrir se um desligamento está ou não programado é depurar winlogon.exe e verificar o status da ShutdownInProgress bandeira . Você precisará de ferramentas de depuração para o Windows .

Eu não tentei, mas este MSDN post no blog explica o que acontece nos bastidores quando o Windows é desligado e como depurar winlogon.exe (que é um processo do kernel). O comando debugger para obter o status do flag parece ser:

dd winlogon!ShutdownInProgress l 1
01062b3c  00000000

Se você souber depurar processos do kernel no Windows, poderá experimentá-lo. Este guia do iniciante para depurar com CDB e NTSD pode ajudar.

    
por 19.01.2016 / 16:03