Похоже, что Windows 11 отключила все способы обхода автоматической перезагрузки обновлений. Есть ли обходной путь?

Вопрос или проблема

Я запускаю симуляции Matlab, которые иногда занимают недели, и когда Windows перезапускается, я теряю всю свою работу, поэтому мне действительно нужен способ остановить автоматические перезапуски.

Кажется, что Windows 11 отключила все способы обхода автоматических перезапусков обновлений. Есть ли ещё какое-то решение?

Раньше можно было установить NoAutoRebootWithLoggedOnUsers в:

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU

если также установить AUOptions на 4 в том же месте, но сейчас это не работает для меня.

Windows не будет перезапускаться в рабочие часы. Моё решение – запускать запланированную задачу, которая изменяет рабочие часы в реестре, скажем, каждый час или два, чтобы это всегда было рабочее время. Я написал эту 4-строчную команду cmd:

for /f %%i in ('powershell "((get-date).Hour+18) %% 24"') do set startHour=%%i
for /f %%i in ('powershell "((get-date).Hour+12) %% 24"') do set endHour=%%i

reg add HKLM\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings /v ActiveHoursStart /t REG_DWORD /d %startHour% /f 
reg add HKLM\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings /v ActiveHoursEnd /t REG_DWORD /d %endHour% /f  

Я потом использовал Планировщик задач Windows, чтобы эта .bat программа запускалась каждый час в течение 1 дня и повторялась ежедневно.

Чтобы остановить появление командных окон, заставьте планировщик задач запускать программу/скрипт “cmd.exe”

и укажите в его аргументах:

/c start /min C:\work\disableautoupdate.bat ^& exit

(Замените ваше имя файла на C:\work\disableautoupdate.bat)

Это минимизирует окно, в котором выполняется ваш скрипт.

Task Schedule View

Проверено: Это работает! Я установил обновление, требующее перезапуска, 31 мая. Меня информируют, что этот перезапуск произойдет вне рабочего времени. По состоянию на 20 июня, через 22 дня, перезапуска не произошло.

Я разобрался, как включить обратную связь от @Jonathan. Проще делать модульную арифметику (и получать час независимо от локали/региона/предпочтений формата) с командами powershell. Это всё ещё cmd файл, но он вызывает powershell. Сократился до 4 строк и должен работать везде.

Windows на самом деле имеет API, который позволяет процессу, имеющему окно, блокировать завершение системы на неопределённый срок, пока пользователь не выберет что делать дальше. (возможно, как отметил @josh3736, Windows Update в конечном итоге может это нарушить. Но лично у меня не было конкретного случая этого. По крайней мере, должно быть безопасно блокировать завершение работы, когда вы спите, до того, как вы проснётесь и просто нажмёте отмену, чтобы отменить завершение работы)

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-shutdownblockreasoncreate

Функция ShutdownBlockReasonCreate (winuser.h)

Указывает, что систему нельзя завершить, и задает строку причины, которая будет отображаться пользователю, если инициируется завершение системы.

Обратите внимание, что вызов этого самостоятельно не может успешно заблокировать завершение/перезапуск. Вам также нужно, чтобы ваше приложение обрабатывало сообщения WM_QUERYENDSESSION и WM_ENDSESSION. Я обсудю их в конце.

Если вы не разработчик и не знаете, как использовать Windows API, вы можете использовать небольшую программу, которую я написал годы назад для той же цели: https://github.com/real-guanyuming-he/ShutdownBlocker

В любом случае, когда вы успешно создали причину блокировки завершения работы, Windows остановится, когда будет выдано завершение работы (включая перезапуск обновления), и покажет это вам, где вы можете нажать Отменить, чтобы отменить завершение работы.
enter image description here

Примечание: Если у вас нет контроля над программой симуляций Matlab (я не использую Matlab, поэтому не знаю, возможно ли это), то это может сработать, а может и нет, в зависимости от того, как Matlab обрабатывает эту ситуацию. Согласно Microsoft (https://learn.microsoft.com/en-us/windows/win32/shutdown/shutting-down),

Приложения с окном и очередью сообщений получают уведомления о завершении работы через сообщения WM_QUERYENDSESSION и WM_ENDSESSION. Эти приложения должны возвращать TRUE, чтобы указать, что их можно завершить.

Если Matlab решит вернуть TRUE при получении этого сообщения, он закроется, даже если завершение работы будет заблокировано таким образом. (И если вы вызовите API без возврата FALSE при получении WM_QUERYENDSESSION, тогда это не удастся, так как ваше приложение закроется в результате этого)

Групповая политика Настроить автоматическое обновление позволяет предотвратить автоматическую установку обновлений.

  1. Откройте gpedit.msc
  2. Компьютер -> Административные шаблоны -> Компоненты Windows -> Центр обновления Windows -> Управление опытом конечного пользователя -> Настроить автоматическое обновление (Кроме того, пройдите через “все настройки”, если вы используете английский и знаете название отсюда)
  3. Включите, установите на (2) только уведомление

Указывает, будет ли этот компьютер получать обновления безопасности и другие важные загрузки через службу автоматического обновления Windows.

Эта настройка позволяет вам указать, будет ли автоматическое обновление включено на этом компьютере. Если служба включена, вы должны выбрать один из четырех вариантов в настройках групповой политики:

2 = Уведомлять перед загрузкой и установкой любых обновлений.

Когда Windows обнаруживает обновления, которые применяются к этому компьютеру, пользователи будут уведомлены, что обновления готовы к загрузке. После перехода в Центр обновления Windows пользователи могут загрузить и установить любые доступные обновления.

.

Ответ или решение

Автоматические перезагрузки после обновлений Windows могут представлять серьезную проблему для пользователей, запускающих долгосрочные вычислительные процессы, такие как симуляции в Matlab, которые могут занимать недели. Ваша работа может быть внезапно прервана, если система перезагрузится, чтобы завершить процесс обновления. Несмотря на то, что в Windows 11 стандартные методы обхода автоматических перезагрузок могли быть отключены или ограничены, существуют некоторые нестандартные подходы, которые могут помочь.

Теория

Системный механизм обновления Windows преимущественно ориентирован на обеспечение безопасности и стабильности системы. Активные часы работы, которые определяют периоды, когда система не будет автоматически перезагружаться, могут не покрывать ваши специфические нужды в длительных вычислительных процессах, что требует поиска решений за пределами стандартных настроек.

Пример

Возможно, вы уже пробовали использовать реестр для управления обновлениями. Ранее ставила возможность использовать ключи реестра, такие как NoAutoRebootWithLoggedOnUsers и AUOptions, но они, возможно, больше не работают должным образом в Windows 11 из-за изменений в системе обновлений.

Также есть возможность программно изменить активные часы работы системы с помощью скрипта на cmd или PowerShell и запустить его через Планировщик задач Windows. Это обеспечивает способ постоянно изменять время активных часов, чтобы избежать автоматических перезагрузок в течение необходимых периодов.

Применение

  1. Изменение активных часов работы. Используйте программный скрипт, чтобы постоянно обновлять время активных часов, тем самым минимизируя вероятность автоматических перезагрузок. Приведенный в вашем описании скрипт является хорошим началом:

    for /f %%i in ('powershell "((get-date).Hour+18) %% 24"') do set startHour=%%i
    for /f %%i in ('powershell "((get-date).Hour+12) %% 24"') do set endHour=%%i
    
    reg add HKLM\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings /v ActiveHoursStart /t REG_DWORD /d %startHour% /f 
    reg add HKLM\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings /v ActiveHoursEnd /t REG_DWORD /d %endHour% /f  

    Этот скрипт можно запустить через Памятный планировщик задач, чтобы он выполнялся каждый час.

  2. Использование API для блокировки завершения работы системы. Windows предоставляет API, которое может использоваться для блокировки завершения работы или перезагрузки до тех пор, пока пользователь не решит, что делать дальше. Функция ShutdownBlockReasonCreate вместе с сообщениями WM_QUERYENDSESSION и WM_ENDSESSION может помочь отклонить перезагрузку:

    • Если вы не являетесь разработчиком, вы можете использовать готовые утилиты, такие как ShutdownBlocker.
  3. Использование Групповой Политики. Настройка Групповой Политики может позволить вам переключить режим обновления на уведомление только – что исключит автоматическую установку и перезагрузку:

    • Откройте gpedit.msc.
    • Перейдите в Компьютер -> Административные шаблоны -> Компоненты Windows -> Центр обновления Windows -> Управление конечным пользовательским опытом -> Настроить автоматические обновления.
    • Активируйте и установите значение 2 для режима уведомления перед загрузкой и установкой обновлений.

Заключение

Предложенные выше решения помогут предотвратить потерю данных в результате автоматической перезагрузки Windows 11. Каждое из них имеет как свои сильные стороны, так и потенциальные ограничения, которые зависят от вашего уровня технологической подготовки и возможностей системы. Настройка активных часов и использование API являются наиболее надежными, но требуют некоторого уровня технических знаний. Использование Групповой Политики проще, но менее гибкое и может не решить всех проблем в полном объеме. Тщательно тестируйте каждое решение, чтобы убедиться, что оно подходит именно для ваших нужд.

Оцените материал
Добавить комментарий

Капча загружается...