Eu executo simulações do Matlab que às vezes levam semanas para terminar e quando o Windows reinicia, perco todo o meu trabalho, então realmente preciso de uma maneira de interromper as reinicializações automáticas.
O Windows 11 parece ter desativado todas as maneiras de contornar as reinicializações da atualização automática. Ainda existe uma solução alternativa?
Costumava ser possível definir NoAutoRebootWithLoggedOnUsers em:
Computador\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU
se você também definir AUOptions como 4 no mesmo local, mas isso não funciona para mim agora.
Como diz @Ramhound, o Windows não reinicia durante o horário de trabalho. Minha solução é executar uma tarefa agendada que altere o horário de trabalho no registro, digamos, a cada uma ou duas horas, para que nunca deixe de ser um horário de trabalho. Codifiquei este programa de arquivo em lote de linha de comando cmd:
Usei o Agendador de Tarefas do Windows para fazer esse script .bat ser executado a cada hora.
Instalei uma atualização que requer reinicialização em 31 de maio de 2024 às 15h UTC. Fui informado que este reinício ocorrerá fora do horário de trabalho. De 2 de junho às 22h UTC, 55 horas depois, nenhuma reinicialização ocorreu.
EDIT: descobri como incorporar a sugestão de @Jonathan. É mais fácil fazer matemática do módulo (e obter horas independentes de localidade) com comandos do PowerShell. Ainda é um arquivo em lote cmd, mas chama o PowerShell. Reduz o código para 4 linhas e deve funcionar em qualquer lugar.
Na verdade, o Windows possui uma API que permite que um processo que possui uma janela bloqueie o desligamento do sistema indefinidamente até que o usuário escolha manualmente o que fazer a seguir. (possivelmente, como @ josh3736 apontou, o Windows Update pode quebrar isso eventualmente. Mas eu pessoalmente não experimentei um caso concreto disso. Pelo menos deve ser seguro bloquear um desligamento quando você dorme até acordar, e então você apenas clique em cancelar para cancelar o desligamento)
https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-shutdownblockreasoncreate
Observe que chamar isso sozinho não pode bloquear um desligamento/reinicialização com êxito. Você também precisa do seu aplicativo para lidar com as mensagens
WM_QUERYENDSESSION
eWM_ENDSESSION
. Vou discuti-los no final.Se você não é um desenvolvedor e não sabe como usar a API do Windows, pode usar um pequeno programa que escrevi anos atrás exatamente para o mesmo propósito: https://github.com/real-guanyuming-he/ShutdownBlocker
De qualquer forma, quando você criar com êxito um motivo de bloqueio de desligamento, o Windows fará uma pausa quando um desligamento (incluindo uma reinicialização de atualização) for emitido e exibirá isso para você, onde você pode clicar em Cancelar para cancelar o desligamento.
Nota: Se você não tem controle sobre seu programa de simulações Matlab (eu não uso Matlab, então não sei se é possível), então pode ou não funcionar, dependendo de como o Matlab lida com a situação. De acordo com a Microsoft ( https://learn.microsoft.com/en-us/windows/win32/shutdown/shutting-down ),
Se o Matlab optar por retornar TRUE ao receber esta mensagem, ele será fechado, mesmo que o desligamento seja bloqueado desta forma. (E se você chamar a API sem retornar
FALSE
ao receberWM_QUERYENDSESSION
, ela não terá êxito, pois seu aplicativo fechará como resultado disso)A Política de Grupo Configurar Atualizações Automáticas permite impedir a instalação automática de atualizações.
gpedit.msc