Ресурсы

UpdateLock: Нативный Win32 инструмент управления автоматическими обновлениями Windows

Windows Update является очень важной системной инфраструктурой в процессе использования Windows, но в некоторых сценариях, с [...]

Статьи

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

Updatelock Легкий инструмент Windows, разработанный для решения этой задачи.Адрес проекта:

hhht110 / UpdateLock Репозиторий GitHub

В отличие от многих сценариев, которые зависят от скриптов, PowerShell или стороннего времени выполнения, UpdateLock использует Нативный C + + / Win32 Реализация, выполняемая в виде одного файла EXE и использующая разные системные политики для Windows 7, Windows 10 и Windows 11.

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

Почему нужно делать UpdateLock?

Windows Update не просто «включает» или «выключает».

Различные версии Windows существуют значительные различия в механизме обновления, элементах политики и связанных с ними службах.В частности, Windows 7 и Windows 10 / 11 не совсем одинаковы в модели управления обновлениями.

Таким образом, инструмент управления обновлениями, действительно ориентированный на несколько версий Windows, должен решить несколько проблем:

  1. Как определить текущую версию Windows?
  2. Какие стратегии должны быть изменены в разных системах?
  3. Как избежать грубого удаления системных файлов или повреждения компонентов обновления?
  4. Как сохранить предыдущую конфигурацию пользователя до изменения?
  5. Как восстановить объект, если изменение не удалось?
  6. Как убедиться в том, что конфигурация действительно восстановлена успешно после восстановления?
  7. Как работать без. NET, PowerShell или других дополнительных компонентов?

UpdateLock в основном разрабатывается вокруг этих вопросов.

Проект README определяет его как «инструмент для автоматического отключения обновлений Win7 / 10 / 11», использующий встроенный Win32 x86 EXE и выполняющий изменения конфигурации системы через API реестра Windows и API диспетчера управления услугами.


Основная особенность проекта - Win32

UpdateLock не выбирает PowerShell, пакетную обработку или reg.exe、sc.exe Такие внешние команды, вместо того, чтобы непосредственно вызвать API Windows.

Как видно из исходного кода, он непосредственно содержит:

  • windows.h
  • commctrl.h
  • shellapi.h
  • shlobj.h
  • sddl.h
  • aclapi.h
  • wincrypt.h
  • objbase.h
  • wuapi.h

Ядерная логика построена непосредственно на основе Win32 API.

Преимущества такой конструкции очевидны.

1.Не зависит от PowerShell

Многие сценарии для автоматизации Windows выполняют PowerShell, например:

Set-Service
Set-ItemProperty
Get-Service

UpdateLock не зависит от этих команд.

Это означает, что ему не нужно рассматривать такие вопросы, как доступность PowerShell, ограничивает ли политика выполнения скриптов или анализ вывода внешних команд.

2.Не зависит от времени выполнения. NET

Проект был построен в статическом CRT-подходе и предназначен для работы непосредственно на Windows 7 SP1, Windows 10 и Windows 11.

Таким образом, конечный пользователь сталкивается с более традиционным:

UpdateLock.exe

Вместо того, чтобы сначала устанавливать пакет среды выполнения.

3.Более непосредственная обработка ошибок

Прямые вызовы к Win32 API также означают, что программа получает более четкие коды системных ошибок.

В исходном коде определено ThrowWin32()Коды ошибок Win32 преобразуются в понятные пользователям сообщения об ошибке, например:

Win32 5:拒绝访问

Это более простое решение, чем простое определение значения, возвращаемого внешней командой.


Почему Win7 и Win10 / 11 отличаются?

Это один из важных аспектов дизайна UpdateLock.

Вместо того, чтобы использовать подход «один набор стратегий», проект явно разделил Windows 7 от Windows 10 / 11.

Windows 7

Windows 7 в основном включает в себя:

  • NoAutoUpdate
  • DisableWindowsUpdateAccess
  • wuauserv

Из них wuauserv Это сервис Windows Update.

Это означает, что в дополнение к изменению политики, сценарий для Windows 7 также останавливает и отключает службу Windows Update через Диспетчер управления службами Windows.

Однако проект намеренно не был рассмотрен далее:

  • БИТЫ
  • CryptSvc
  • TrustedInstaller
  • SoftwareDistribution
  • Catroot2
  • Системные файлы

По сути, такая сдержанность очень важна

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

Схема UpdateLock явно предпочитает:

Измените только конфигурации, необходимые для достижения цели.


Windows 10 / 11: управление главным образом политикой

В Windows 10 и Windows 11 работают по-разному.

Проект предусматривает, в частности, следующие стратегии:

ExcludeWUDriversInQualityUpdate
SetUpdateNotificationLevel
UpdateNotificationLevel
NoAutoUpdate
NoAutoRebootWithLoggedOnUsers
AUOptions

Среди них стоит отметить: AUOptions。

Когда закрывается, проект не просто закрепляет его в каком-то значении, а принимает:

Удаление при закрытии, перезапись в исходное состояние при восстановлении.

Это отражает очень важную идею управления конфигурацией:

«Восстановление» не означает восстановление по умолчанию, как считает программа, а восстановление в состоянии до запуска программы пользователем.

Например, первоначальная конфигурация пользователя может быть:

AUOptions = 4

Это значение может быть удалено после закрытия программы.

Когда пользователь выбирает восстановление, программа перезаписывает:

AUOptions = 4

вместо того, чтобы по собственному усмотрению записывать другое значение по умолчанию.


Версия 2.1 ограничивает доступ к Windows Update

UpdateLock 2.1 добавляет следующий элемент:

SetDisableUXWUAccess=1

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

Проще говоря, это уменьшение количества пользователей, проходящих через страницу Windows Update:

  • Проверка обновлений вручную
  • Скачать обновления
  • Установка обновления

Возможности для проведения операций.

Есть одно очень важное различие:

Windows 10 / 11 не остановится сразу wuauserv, BITS, Usosvc, "SMedicalSvc " или" Update Orchestrator ".

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

С точки зрения стабильности системы это относительно консервативный вариант.


Резервное копирование и восстановление являются одним из основных проектов.

Если просто изменить реестр, на самом деле не сложно.

Что действительно сложно:

Как можно надежно восстановить после изменения?

UpdateLock делает это более полно.

Резервное копирование политики для Windows 10 / 11 находится на:

%ProgramData%\UpdateLock\policy-backup-v1.txt

Добавленные ограничения доступа к интерфейсу пользователя Windows Update сохраняются отдельно:

%ProgramData%\UpdateLock\windows-update-access-backup-v1.txt

Windows 7 используется:

%ProgramData%\UpdateLock\windows7-original-state-v1.txt

Такая конструкция означает, что программа записывает исходное состояние, прежде чем модифицировать систему.

Вместо того, чтобы просто предположить:

恢复 = 删除我刚刚写入的值

Существует существенное различие между ними.

Например:

用户原配置
    ↓
读取并保存
    ↓
UpdateLock 修改
    ↓
Windows Update 被限制
    ↓
用户选择恢复
    ↓
重新写入原配置

Таким образом, можно добиться «реставрации».


VII. RAII в исходном коде: предотвращение утечки ресурсов

Как встроенная программа C + + для Windows, UpdateLock также использует RAII для управления системными ресурсами.

В исходном коде можно увидеть несколько типичных пакетов:

ScopedHandle
ScopedRegKey
ScopedServiceHandle

Например:

struct ScopedRegKey {
    HKEY value = nullptr;

    ~ScopedRegKey() {
        if (value) RegCloseKey(value);
    }
};

Такой дизайн решает очень типичную проблему C + + / Win32.

Win32 API используется в большом количестве, как:

HANDLE
HKEY
SC_HANDLE

Управление ресурсами.

Если в середине программы произойдет аномалия, то легко возникнуть:

打开资源
↓
执行操作
↓
中途失败
↓
没有释放资源

RAII позволяет связывать жизненный цикл ресурсов с объектами C + +.

Таким образом:

{
    ScopedRegKey key;
    // 操作注册表
}

После выхода из сферы действия ручки реестра автоматически освобождаются.

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


Операция реестра - это не просто «запись».

Логика реестра в исходном коде также стоит анализировать.

Программа определяет описание политики примерно так:

struct PolicyValue {
    const wchar_t* path;
    const wchar_t* name;
};

Затем использовать:

ReadDwordState()
SetDword()
DeleteDword()
RestorePolicy()
VerifyPolicy()

Сформирована более четкая цепочка операций.

Можно абстрагировать как:

Read
 ↓
Backup
 ↓
Modify
 ↓
Read Back
 ↓
Verify

Вместо этого:

Modify
 ↓
Done

В этом заключается важное различие между системными инструментами и простыми сценариями.


После внесения изменений необходимо «проверять».

У UpdateLock есть очень полезный механизм:

После записи реестр заново прочитывается для проверки.

В исходном коде можно увидеть:

void VerifyPolicy(const PolicyState& expected)

Он снова вызывает функцию чтения, а затем сравнивает:

exists
value

Совпадает ли это с ожиданиями.

В случае несогласованности выводят ошибку.

Это означает, что программа не видит:

RegSetValueExW()

Возвращение успеха означает, что операция завершена.

Вместо этого,

写入成功
    ↓
重新读取
    ↓
比较预期状态
    ↓
确认一致

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


X. Неудачное возвращение

Далее, этот набор также может создать полный транзакционный процесс:

保存原始状态
       ↓
修改策略 A
       ↓
修改策略 B
       ↓
修改策略 C
       ↓
某一步失败
       ↓
恢复 A
       ↓
恢复 B
       ↓
恢复 C

То есть, это не просто выполнение серии не связанных друг с другом записей в реестре.

В случае неудачи, программа может попытаться вернуть ранее измененное содержимое в исходное состояние.

Это очень важно для инструментов конфигурации системы Windows.

Изменение конфигурации системы больше всего боится не «полной неудачи», а:

Половину успешных.

Например:

策略 1 修改成功
策略 2 修改成功
策略 3 修改失败

Без механизма обратного отвода пользователь в конечном итоге получает полуизмененное состояние.


И сам файл резервного копирования учитывает безопасность.

Есть еще одна деталь в исходном коде, которую легко игнорировать:

Программа создает следующее:

%ProgramData%\UpdateLock

Задание прав каталога.

Использование в исходном коде описателей безопасности:

D:P(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)

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

Этот дизайн имеет большой смысл.

Поскольку файлы резервного копирования записывают состояние системной политики, если обычным пользователям разрешается произвольно изменять эти файлы, то могут возникнуть следующие ситуации:

程序保存状态
        ↓
文件被篡改
        ↓
用户点击恢复
        ↓
程序恢复恶意/错误配置

Таким образом, для резервного копирования конфигурации системы:

Файл резервного копирования не является обычным текстовым файлом.

Он также должен учитывать целостность и компетентность.


Почему используется формат Base64?

Исходный код также содержит:

Base64Encode()
Base64Decode()

Преобразование между UTF-8 и UTF-16.

В интерфейсе интерфейса Windows широко используются строки Unicode, а сами файлы резервного копирования используются в текстовом формате UTF-8.

Таким образом, проект должен быть рассмотрен:

Windows UTF-16
        ↓
UTF-8
        ↓
Base64
        ↓
备份文件

Возобновление преобразования в обратном направлении.

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


Администраторские права и защита одного экземпляра.

Потому что измененные:

HKEY_LOCAL_MACHINE

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

В дополнение к этому, проект также включил защиту одного экземпляра.

В исходном коде определено:

const wchar_t* const kMutexName =
    L"Global\\UpdateLock.SingleInstance.7A64EA9A";

Windows Mutex позволяет избежать одновременного запуска нескольких экземпляров UpdateLock.

Зачем нужен один пример?

Изменения конфигурации системы, как правило, не подходят для одновременного выполнения.

При одновременном выполнении двух экземпляров:

实例 A:读取旧配置
实例 B:读取旧配置

实例 A:写入新配置
实例 B:写入新配置

实例 A:备份
实例 B:备份

В конечном итоге могут возникнуть проблемы с резервным копированием.

Таким образом:

Защита от одного экземпляра также является частью конфигурации транзакций.


Не существует «насильственного разрушения» проекта Windows Update

С инженерной точки зрения, UpdateLock имеет положительный характер в том, что он обеспечивает более четкий контроль за изменением границ.

Он не расширяет свои цели, чтобы:

删除 SoftwareDistribution
删除 Catroot2
禁用所有相关服务
删除更新文件
修改系统文件
阻止 Windows Update 进程启动

В основном они сосредоточены на следующем:

Windows Update Policy
+
必要的服务控制
+
备份与恢复

Это более соответствующий принципам проектирования системных инструментов:

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


Какие проблемы он решает для обычных пользователей?

С точки зрения пользователя, ценность UpdateLock может быть резюмирована в следующем предложении:

Сложные изменения политики обновления, резервное копирование, восстановление и проверка выполняются с помощью встроенной, легкой программы Windows.

Пользователям не требуется открывать вручную:

注册表编辑器
本地组策略
服务管理器
命令提示符
PowerShell

Затем пересматриваются пункты по пунктам.

Процедура несет ответственность за выполнение:

识别系统
   ↓
读取原配置
   ↓
备份
   ↓
修改策略
   ↓
验证
   ↓
必要时回滚

Восстановление происходит наоборот:

读取备份
   ↓
恢复原配置
   ↓
回读
   ↓
验证

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


Кроме того, существуют четкие границы использования.

Следует особо подчеркнуть:

Выключение или ограничение обновления Windows не без цены.

Во-первых, Windows Update несет ответственность не только за исправления системы, но и за драйверы и т. д.

В проекте README, в частности, отмечается, что после отключения обновления драйверов для Windows Update, новое подключенное USB или другое оборудование может не получать драйверы автоматически в режиме онлайн.

Поэтому, если на устройстве требуется установка нового оборудования, можно рассмотреть:

恢复 Windows Update
       ↓
安装/获取驱动
       ↓
重新关闭更新策略

Кроме того, не рекомендуется выполнять операции закрытия или восстановления, когда Windows устанавливает или удаляет обновления.

Для производственного оборудования окружающей среды следует также заранее подтвердить:

  • наличие корпоративной политики обновления;
  • наличие требований к исправлениям безопасности;
  • полагается ли Windows Update для получения драйверов;
  • наличие единой системы управления терминалами;
  • Существует ли требование восстановления конфигурации системы.

Другими словами:

UpdateLock - это инструмент конфигурации системы, а не замена механизма обновления Windows.


XVII. Способы построения

В проекте используются инструменты создания Visual Studio, цепочка инструментов MSVC v141 и SDK 19041 для Windows 10.

В native Использование каталога:

build-native.cmd

Можно создать собственную конструкцию.

Проект README показывает, что выход сборки находится в:

native\build

Сценарий построения также создает:

UpdateLock.exe

и встроенные программы тестирования.

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

Вы можете посмотреть прямо из исходного кода:

Win32 API
   ↓
Registry API
   ↓
SCM API
   ↓
文件 API
   ↓
安全描述符 API
   ↓
GUI

Вместо того, чтобы скрываться за большим количеством сторонних фреймворков.


18 Как оценить этот проект?

С точки зрения «функциональной сложности», UpdateLock не является особо обширным проектом.

Но если смотреть на «инженерное качество системных инструментов», то в нем есть много конструкций, которые стоит изучить:

1.Нативные API

Избегайте зависимости от PowerShell, CMD, reg.exe и sc.exe

2.Резервное копирование состояния

Записывать исходную конфигурацию перед внесением изменений.

3.Восстанавливается.

Восстанавливается исходное состояние пользователя, а не просто восстанавливается значение по умолчанию.

4.Проверка считывания

Прочитать подтверждение после записи.

5.Неудачный откат

Насколько это возможно, избегать полумодифицированного состояния системы.

6. RAII

Автоматическое управление ресурсами Win32.

7.Управление правами

Ограничение доступа к каталогу резервного копирования.

8.Однократный случай

Предотвращение одновременного выполнения нескольких операций конфигурации.

Эти конструкции выходят за рамки простого «скрытия сценария Windows Update».


19. Чего мы можем извлечь из этого проекта?

Если вы изучаете разработку Windows C + +, то UpdateLock стоит обратить внимание не только на «как закрыть Windows Update».

Больше всего стоит изучить идею инженерии, стоящую за ней:

不要直接修改
      ↓
先读取状态

不要假设修改成功
      ↓
写入后验证

不要覆盖用户配置
      ↓
先备份

不要只考虑成功路径
      ↓
设计失败回滚

不要依赖外部命令
      ↓
直接调用系统 API

不要无限扩大修改范围
      ↓
只操作必要的系统接口

Эти принципы также применяются ко многим другим системным инструментам, таким, как:

  • Конфигуратор услуг Windows;
  • Инструменты управления политикой реестра;
  • Инструменты для инициализации системы;
  • Инструменты конфигурации корпоративного терминала;
  • локальный менеджер политики безопасности;
  • Процедура технического обслуживания системы.

ХХ. Заключение

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

Вместо того, чтобы попытаться решить проблемы с Windows Update, удаляя системные файлы или грубо отключая все связанные службы, он разработал отдельную политику для различий между Windows 7 и Windows 10 / 11.

В частности,

原始状态备份
      +
策略修改
      +
回读验证
      +
失败回滚
      +
完整恢复

Это составляет наиболее важный инженерный цикл в целом.

Для обычных пользователей он предлагает простой инструмент управления обновлением Windows; для разработчиков, что больше стоит изучить, это: Операции реестра Win32, управление услугами, управление правами, RAII, запись атомных файлов и транзакции конфигурации системы。

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

Адрес проекта:
https://github.com/hhht110/UpdateLock

Примечание: Настоящая статья основана на текущем README и исходном коде репозитория UpdateLock.Политики обновления Windows изменяются в зависимости от версии системы, исправлений и политики корпоративного управления, и их поведение зависит от фактических результатов тестирования целевой системы.