detectando se um comando de desligamento do Windows foi emitido

5

É possível detectar se o comando de desligamento foi emitido (através do menu iniciar pelo usuário ou qualquer outro programa em execução no computador ou com acesso remoto ao computador) e, em seguida, cancelá-lo?
Alternativamente, é possível ajustar o registro para forçar o Windows a exibir um temporizador de desligamento sempre que o comando de desligamento é emitido, para que possamos obter alguns para obtê-lo desativado?

    
por user13267 02.05.2013 / 06:28

3 respostas

4

Sim e (principalmente) não.

Você pode detectar um evento de desligamento. Quando o Windows está prestes a desligar, ele envia um WM_QueryEndSession para todos os aplicativos abertos. Para detectar isso, você teria que ter um script ou programa em execução em segundo plano para detectar e manipular o evento. No entanto, não parece haver nenhuma maneira de cancelar o encerramento, a menos que o desligamento tenha sido iniciado a partir da máquina local e do usuário .

O script / aplicativo pode, então, pegar o desligamento e perguntar se você quer sair do script / aplicativo, no qual você pode cancelar. Isso impedirá que a máquina seja desligada, mas não impedirá que outros aplicativos e serviços possivelmente sejam encerrados.

Você nem precisa de um script para isso, basta abrir o bloco de notas e digitar algum texto. Como você tem dados não salvos no Bloco de Notas, o Windows aguardará e perguntará se deseja continuar com o desligamento, dando a você a oportunidade de cancelar. Novamente, isso só funcionará se você iniciar o desligamento localmente.

Existe um evento Win32_ComputerShutdownEvent do WMI, que ocorre quando um computador é desligado através de um comando remoto . No entanto, só pode receber este evento. Quando o evento é recebido, o computador local terminará o script quando o evento for entregue.

    
por 02.05.2013 / 07:11
1

Isto é para o Windows 7 (no ambiente corporativo): Se um administrador acionou um desligamento remoto (shutdown / m PCName), o Windows 7 deve exibir um aviso dizendo que o PC está recebendo instruções para desligar / reiniciar e fornecer a contagem regressiva.

O usuário sentado no PC PODE cancelá-lo, assumindo que o usuário também tenha o direito de administrador na máquina executando:

shutdown /a

para interromper qualquer desligamento existente em andamento.

Mas é claro que este ponto é discutível se o administrador colocar um temporizador por 1 segundo, ou desligamento imediato.

Windows 8 - Você recebe uma notificação na bandeja do sistema (quando o desligamento é emitido) que o Windows está prestes a ser desligado em xxx minutos, e o desligamento acontecerá em xxx hora / data. E eu acredito que em 1 minuto para o desligamento, o Windows 8 irá exibir uma notificação em tela cheia de que você será desligado em 60 segundos, e você realmente tem que clicar perto para confirmar a mensagem.

Windows XP - Acredito que ele também exibirá o cronômetro, mas não posso confirmar, já que não tenho máquina WinXP para testar.

Mais uma vez, você pode cancelar todos os desligamentos 'programados' pelo comando acima, mas se você ficar sem tempo, não há muito o que fazer.

    
por 02.05.2013 / 07:09
1

Espero encontrar uma maneira de fazer isso também, a fim de garantir que o postgreSQL tenha tempo suficiente para desligar corretamente antes de terminar, mas não está super esperançoso no momento.

Isso é basicamente apenas reafirmar as respostas dos outros, mas eu tentei esses dois comandos em um prompt de administrador no Windows 7:

  1. shutdown /s & shutdown /a
  2. shutdown /s /t 0 & shutdown /a

O primeiro comando abortou com sucesso o desligamento como esperado, enquanto o segundo comando não o fez. Isso comprova que a declaração de Keltari sobre um desligamento imediato não pode ser abortada com shutdown /a .

    
por 17.07.2014 / 02:46