Recursos

UpdateLock: una herramienta de administración de actualizaciones automáticas de Windows nativa para Win32

Windows Update es una infraestructura del sistema muy importante durante el uso de Windows, pero en algunos escenarios, con [...]

Catálogo de artículos

Windows Update es una infraestructura del sistema muy importante durante el uso de Windows, pero en algunos escenarios, es posible que los usuarios desee controlar temporalmente el comportamiento de actualización automática. Por ejemplo, entornos de prueba, entornos de compatibilidad de software heredados, dispositivos dedicados que se ejecutan durante largos períodos de tiempo o escenarios en los que es necesario evitar que el sistema se reinicie automáticamente en un momento determinado.

ActualidadLock Es una herramienta ligera de Windows diseñada para esa necesidad. Dirección del proyecto:

hhht110 / UpdateLock Repositorio GitHub

A diferencia de muchos escenarios que dependen de scripts, PowerShell o tiempos de ejecución de terceros, UpdateLock utiliza Nativo C + + / Win32 Implementado, que se ejecuta como un único archivo EXE, y que adopta diferentes políticas del sistema para Windows 7, Windows 10 y Windows 11, respectivamente.

Este documento presenta principalmente el proyecto desde el ángulo de la implementación de ingeniería. La desactivación de las actualizaciones del sistema puede reducir la seguridad del sistema, y el uso real debe ser decidido con cuidado de acuerdo con el uso del dispositivo y la política de seguridad.

¿Por qué usar UpdateLock?

Windows Update no es simplemente "encendido " o" apagado ".

Las diferentes versiones de Windows difieren significativamente en los mecanismos de actualización, los elementos de política y los servicios relacionados. Windows 7 y Windows 10 / 11, en particular, no son exactamente los mismos en el modelo de gestión de actualizaciones.

Por lo tanto, una herramienta de control de actualizaciones realmente orientada a varias versiones de Windows, debe abordar varios problemas:

  1. ¿Cómo puedo reconocer la versión actual de Windows?
  2. ¿Qué estrategias deben modificarse en los diferentes sistemas?
  3. ¿Cómo evitar borrar bruscamente archivos del sistema o dañar componentes de actualización?
  4. ¿Cómo puedo guardar la configuración original del usuario antes de modificarla?
  5. ¿Cómo puedo reanudar el sitio si la modificación falla?
  6. ¿Cómo puedo confirmar que la configuración realmente se ha recuperado con éxito después de la recuperación?
  7. ¿Cómo se ejecuta sin. NET, PowerShell u otros componentes adicionales?

El diseño de UpdateLock gira en torno a estas cuestiones.

El proyecto README lo define como una "herramienta de cierre de actualización automática de Win7 / 10 / 11" que utiliza el nativo Win32 x86 EXE y realiza cambios de configuración del sistema a través de la API del Registro de Windows y la API del Administrador de Control de Servicios.


La mayor característica del proyecto: Win32 nativa

UpdateLock no selecciona PowerShell, procesamiento por lotes o reg.exe、sc.exe Estos comandos externos son llamadas directas a la API de Windows.

Como se puede ver desde el código fuente, contiene directamente:

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

La lógica central se basa directamente en la API de Win32.

Los beneficios de este diseño son muy evidentes.

1. No depende de PowerShell.

Muchos scripts de automatización de Windows ejecutan PowerShell, por ejemplo:

Set-Service
Set-ItemProperty
Get-Service

y UpdateLock no depende de estos comandos.

Esto significa que no tiene que tener en cuenta si PowerShell está disponible, si las políticas de ejecución restringen los scripts, y la resolución de la salida de comandos externos.

2. Independiente de. NET Runtime

El proyecto está construido en un enfoque de CRT estático con el objetivo de ejecutarse directamente en Windows 7 SP1, Windows 10 y Windows 11.

Por lo tanto, el usuario final se enfrenta a una más tradicional:

UpdateLock.exe

en lugar de instalar primero un paquete de software para su entorno de ejecución.

3. Manejo más directo de errores

Llamar directamente a la API de Win32 también significa que el programa puede obtener un código de error del sistema más explícito.

El código fuente define ThrowWin32()Convierte el código de error de Win32 en un mensaje de error comprensible para el usuario, como:

Win32 5:拒绝访问

Este método es más sencillo que simplemente determinar el valor de retorno de un comando externo.


¿Por qué Win7 y Win10 / 11 difieren?

Este es un punto que vale la pena prestar atención en el diseño de UpdateLock.

En lugar de adoptar un enfoque de "un conjunto de estrategias para luchar contra el mundo", el proyecto trata explícitamente a Windows 7 por separado de Windows 10 / 11.

Windows 7

El procesamiento de Windows 7 implica principalmente:

  • NoAutoUpdate
  • DisableWindowsUpdateAccess
  • wuauserv

Entre ellos wuauserv Es el servicio de Windows Update.

Es decir, el esquema de Win7 detendrá y deshabilitará el servicio de Windows Update a través del Administrador de control de servicios de Windows, además de modificar la política.

Sin embargo, el proyecto deliberadamente no se procesó más:

  • Bits
  • CryptSvc.
  • TrustedInstaller (en inglés)
  • SoftwareDistribución
  • Catroot2
  • Archivo de sistema

Esta moderación es de hecho muy importante.

Una herramienta del sistema que elimina directamente la caché de actualización, modifica el directorio del sistema o incluso reemplaza los archivos del sistema con el fin de "desactivar completamente las actualizaciones" puede pasar fácilmente de una herramienta de configuración a una herramienta de destrucción del sistema.

El esquema de UpdateLock es significativamente más inclinado a:

Modifique solo la configuración necesaria para cumplir con el objetivo.


Windows 10 / 11: Control principalmente a través de políticas

Windows 10 y Windows 11 se tratan de manera diferente.

El proyecto se refiere principalmente a las siguientes estrategias:

ExcludeWUDriversInQualityUpdate
SetUpdateNotificationLevel
UpdateNotificationLevel
NoAutoUpdate
NoAutoRebootWithLoggedOnUsers
AUOptions

Entre las comparaciones, vale la pena señalar que AUOptions。

Cuando se cierra, en lugar de simplemente fijarlo a un valor, el proyecto adopta:

Eliminar cuando se cierra y volver a escribir al estado original cuando se recupera.

Esto refleja una idea importante de gestión de configuración:

"Restaurar " no debe significar la restauración a los valores predeterminados que el programa considera, sino que debe volver al estado antes de que el usuario ejecutara el programa.

Por ejemplo, la configuración original del usuario puede ser:

AUOptions = 4

Este valor puede eliminarse después de que el programa ejecute una operación de cierre.

Cuando el usuario selecciona la restauración, el programa vuelve a escribir:

AUOptions = 4

en lugar de escribir voluntariamente otro valor predeterminado.


La versión 2.1 restringe aún más la entrada a Windows Update

UpdateLock 2.1 añade algo más:

SetDisableUXWUAccess=1

El objetivo de esta política no es detener el servicio de Windows Update, sino limitar aún más el acceso a la interfaz de usuario de Windows Update.

En pocas palabras, es reducir la cantidad de usuarios que llevan a cabo a través de la página Windows Update:

  • Comprobar manualmente las actualizaciones
  • Descargar actualizaciones
  • Instalación de actualizaciones

oportunidad de operar.

Aquí hay una diferencia importante:

Windows 10 / 11 no se detendrá directamente por esto wuauservBITS, Usosvc, SmedicSvc o Update Orchestrator.

Esto indica que los autores del proyecto no están adoptando la idea de "deshabilitar todos los servicios de actualización", sino que están utilizando los mecanismos de política proporcionados por Windows.

Desde el punto de vista de la estabilidad del sistema, este es un esquema relativamente conservador.


La copia de seguridad y la recuperación es uno de los diseños centrales de este proyecto.

Si es sólo modificar el registro, en realidad no es difícil.

Lo que es realmente difícil es:

¿Cómo se puede restaurar de manera fiable después de una modificación?

UpdateLock lo hace bastante bien en este punto.

La copia de seguridad de la directiva de Windows 10 / 11 se encuentra en:

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

Las nuevas restricciones de acceso a la interfaz de usuario de Windows Update se guardan por separado:

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

Windows 7 para usar:

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

Este diseño significa que el programa registra el estado original antes de modificar el sistema.

En lugar de simplemente asumir que:

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

Hay una diferencia esencial entre los dos.

Por ejemplo:

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

De esta manera se puede lograr una verdadera "recuperación ".


RAII en el código fuente: evitar la fuga de recursos

Como un programa nativo de Windows C + +, UpdateLock también utiliza RAII para administrar los recursos del sistema.

Varios paquetes típicos se pueden ver en el código fuente:

ScopedHandle
ScopedRegKey
ScopedServiceHandle

Por ejemplo:

struct ScopedRegKey {
    HKEY value = nullptr;

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

Este tipo de diseño aborda un problema muy típico de C + + / Win32.

La API de Win32 se utiliza en gran medida como:

HANDLE
HKEY
SC_HANDLE

Recursos para el.

Si se produce una anomalía en el medio del programa, puede aparecer fácilmente:

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

RAII permite que el ciclo de vida de los recursos se vincule a objetos C + +.

Así que:

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

El controlador del registro se libera automáticamente después de salir del alcance.

Esto es especialmente importante para una herramienta de sistema que requiere un procesamiento frecuente de registros, servicios y archivos.


La operación del registro no es simplemente "escribir valores".

La lógica del registro en el código fuente también vale la pena analizar.

El programa define una descripción de la política como esta:

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

A continuación, se utiliza:

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

Se forma una cadena de operación relativamente clara.

Se puede abstraer como:

Read
 ↓
Backup
 ↓
Modify
 ↓
Read Back
 ↓
Verify

En lugar de:

Modify
 ↓
Done

Esta es una diferencia importante entre las herramientas del sistema y los scripts simples.


9 - Después de la modificación, también debe "rever la verificación "

UpdateLock tiene un mecanismo muy útil:

Volver a leer el registro después de la escritura para verificar.

En el código fuente se puede ver:

void VerifyPolicy(const PolicyState& expected)

Volverá a llamar a la función de lectura y luego comparará:

exists
value

Si es consistente con lo esperado.

Si no es consistente, lanza un error.

Esto significa que el programa no está siendo visto:

RegSetValueExW()

Devuelve éxito y se considera que toda la operación se completó.

sino que:

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

Este diseño puede mejorar significativamente la fiabilidad de la operación para las herramientas que involucran políticas del sistema.


X. Failure Rollback

Mirando más allá, este conjunto de diseños también puede formar un proceso transaccional completo:

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

Es decir, no es simplemente realizar una serie de escrituras de registro no relacionadas entre sí.

Si falla a mitad de camino, el programa puede tratar de restaurar el contenido que ha sido modificado previamente al estado original.

Esto es muy crítico para las herramientas de configuración del sistema de Windows.

Debido a que la modificación de la configuración del sistema más temida no es un "fallo completo", sino:

mitad de éxito.

Por ejemplo:

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

Sin un mecanismo de retroceso, el usuario termina con un estado semi-modificado.


XI, el archivo de copia de seguridad en sí también considera la seguridad

También hay un detalle en el código fuente que es fácil de pasar por alto:

El programa crea:

%ProgramData%\UpdateLock

Establezca los permisos de directorio.

El código fuente utiliza descriptores de seguridad:

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

Es decir, el acceso al directorio de copia de seguridad está restringido a la cuenta del sistema y al administrador.

El diseño tiene sentido.

Debido a que los archivos de copia de seguridad registran el estado de la directiva del sistema, si se permite que los usuarios normales modifiquen estos archivos a voluntad, puede ocurrir:

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

Por lo tanto, para la copia de seguridad de la configuración del sistema:

Los archivos de copia de seguridad no son archivos de texto normales.

También debe tener en cuenta la integridad y la autoridad.


¿Por qué el formato de copia de seguridad utiliza Base64?

El código fuente también proporciona:

Base64Encode()
Base64Decode()

Incorpora la conversión entre UTF - 8 y UTF - 16.

Las API de Windows utilizan fuertemente cadenas Unicode, mientras que los archivos de copia de seguridad en sí están en formato de texto UTF - 8.

Por lo tanto, el proyecto debe abordarse:

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

Conversión inversa cuando se recupera.

La ventaja de este diseño es que el formato del archivo de copia de seguridad es más claro, al tiempo que evita problemas de análisis causados por caracteres especiales, saltos de línea o entornos de codificación locales.


XIII, derechos de administrador y protección de instancia única

Porque lo que se ha modificado es:

HKEY_LOCAL_MACHINE

y recursos a nivel de sistema, como los servicios de Windows, por lo que el programa requiere privilegios de administrador.

Además, el proyecto también incorpora protección de instancia única.

En el código fuente se define:

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

Windows Mutex evita que los usuarios inicien varias instancias de UpdateLock al mismo tiempo.

¿Por qué una instancia única?

ya que la modificación de la configuración del sistema generalmente no es adecuada para la ejecución concurrente.

Si dos instancias se ejecutan simultáneamente:

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

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

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

El estado final de la copia de seguridad puede ser problemático.

Así que:

La protección de una sola instancia también es parte de la seguridad de las transacciones de configuración.


No hay "destrucción violenta " de Windows Update

Desde el punto de vista de la ingeniería, UpdateLock tiene un control más claro sobre los límites de modificación.

No se extiende el objetivo a:

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

En cambio, se centran en:

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

Esta es una forma más consistente con los principios de diseño de herramientas de sistema:

Trate de implementar los requisitos a través de la interfaz de configuración proporcionada por el sistema operativo, en lugar de eludir los mecanismos del sistema.


15, para el usuario promedio, ¿qué problemas resuelve?

Si se ve desde el punto de vista del usuario, el valor de UpdateLock se puede resumir en una frase:

Encapsula las complejas modificaciones, copias de seguridad, restauraciones y validaciones de políticas de actualización en un programa nativo y ligero de Windows.

El usuario no tiene que abrir manualmente:

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

Luego, se modificó uno por uno.

El procedimiento es responsable de completar:

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

Cuando se recupera, lo contrario:

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

Esto es mucho más amigable que hacer que el usuario promedio manipule manualmente el registro.


16, también tiene límites claros de uso

Es importante destacar lo siguiente:

Desactivar o restringir Windows Update no está sin un precio.

En primer lugar, Windows Update no es solo responsable de los parches del sistema, sino que también involucra contenido como controladores.

El proyecto README señala específicamente que después de desactivar las actualizaciones de controladores de Windows Update, es posible que el USB u otro hardware recién conectado no obtenga automáticamente los controladores en línea.

Por lo tanto, si el equipo necesita instalar nuevo hardware, puede considerar:

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

Además, no se recomienda realizar operaciones de cierre o reanudación mientras Windows está instalando o desinstalaendo actualizaciones.

Para los equipos de entorno de producción, también debe confirmarse de antemano:

  • Existe una política de actualización empresarial;
  • Si hay requisitos de parches de seguridad;
  • Si depende de Windows Update para obtener controladores;
  • si existe un sistema unificado de gestión de terminales;
  • Si hay un requisito para restaurar la configuración del sistema

En otras palabras,

UpdateLock es una herramienta de configuración del sistema y no un sustituto del mecanismo de actualización de Windows.


XVII. Modo de construcción

El proyecto utiliza Visual Studio Build Tools, la cadena de herramientas MSVC v141 y el SDK 19041 de Windows 10.

en native Ejecución de directorios:

build-native.cmd

La construcción nativa se puede hacer.

El proyecto README indica que la salida de la compilación se encuentra en:

native\build

y el script de construcción genera:

UpdateLock.exe

y un programa de prueba nativo.

Esta estructura de proyecto es más adecuada para los desarrolladores que desean estudiar la programación de sistemas Win32.

Se puede ver directamente desde el código fuente:

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

En lugar de ocultarse detrás de una gran cantidad de marcos de terceros.


18 ¿Cómo se evalúa el proyecto?

UpdateLock no es un proyecto particularmente grande si se ve en términos de "complexidad funcional".

Pero si se ve desde la "calidad de ingeniería de las herramientas del sistema", contiene muchos diseños que vale la pena aprender:

1. API nativa

Evite depender de PowerShell, CMD, reg.exe y sc.exe.

2. Estado de backup

Registre la configuración original antes de modificarla.

3. Recuperación

Restaurar el estado original del usuario en lugar de simplemente restaurar los valores predeterminados.

4. Verificación de readback

Leer el acuse de recibo después de escribir.

5. Fallo en Rollback

Evite que el sistema esté en un estado semi-modificado en la medida de lo posible.

6. RAII

Gestión automática de recursos Win32.

7. Control de permisos

Restringir el acceso al directorio de copia de seguridad.

8. Una sola instancia

Evite múltiples operaciones de configuración simultáneas.

Estos diseños van más allá de un simple "script de cierre de Windows Update".


19. ¿Qué se puede aprender de este proyecto?

Si estás aprendiendo el desarrollo de Windows C + +, UpdateLock no es sólo "cómo desactivar Windows Update ".

Lo que es más digno de aprender es la idea de ingeniería detrás de ella:

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

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

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

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

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

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

Estos principios también se aplican a muchas otras herramientas de sistema, como:

  • Configuración de servicios de Windows;
  • Herramientas de administración de políticas de registro;
  • Herramienta de inicialización del sistema;
  • Herramientas de configuración de terminales empresariales;
  • Administrador de políticas de seguridad local;
  • Procedimientos de mantenimiento del sistema.

XX. Conclusión

UpdateLock es una pequeña herramienta nativa de Windows, pero encarna una idea típica de desarrollo de herramientas del sistema:Menos dependencia, llamada directa a la API del sistema, límites de modificación claros y centralización de la copia de seguridad, verificación y recuperación.

En lugar de tratar de resolver el problema de Windows Update eliminando archivos del sistema o deshabilitando todos los servicios relacionados, diseña estrategias por separado para las diferencias entre Windows 7 y Windows 10 / 11.

En particular,

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

constituye un bucle cerrado de ingeniería más importante de todo el proyecto.

Para el usuario promedio, lo que ofrece es una simple herramienta de control de Windows Update; mientras que para los desarrolladores, la parte más digna de estudio es Operaciones de registro Win32, control de servicio, administración de derechos, RAII, escritura de archivos atómicos y transaconalización de configuración del sistema。

Si su objetivo es aprender C + + nativo de Windows, este proyecto es un buen pequeño caso: el tamaño del código no es enorme, pero cubre muchos problemas que las herramientas del sistema Windows reales encontrarían.

Dirección del proyecto:
https://github.com/hhht110/UpdateLock

Nota: Este artículo se basa en el README actual y el código fuente del repositorio UpdateLock. La política de actualización de Windows cambiará con la versión del sistema, los parches y la política de administración empresarial, y el comportamiento específico debe estar sujeto a los resultados reales de las pruebas del sistema objetivo.