ressources

UpdateLock : un outil de gestion des mises à jour automatiques de Windows natif pour Win32

Windows Update est une infrastructure système très importante lors de l'utilisation de Windows, mais dans certains scénarios, avec [...]

Catalogue des articles

Windows Update est une infrastructure système très importante lors de l'utilisation de Windows, mais dans certains scénarios, les utilisateurs peuvent souhaiter contrôler temporairement le comportement de mise à jour automatique. tels que les environnements de test, les environnements de compatibilité logicielle hérités, les périphériques dédiés à long terme ou les scénarios dans lesquels il est nécessaire d'éviter le redémarrage automatique du système à un moment donné.

UpdateLock à C'est un outil Windows léger conçu pour répondre à cette exigence. Adresse du projet :

hhht110 / UpdateLock référentiel GitHub

Contrairement à de nombreux scénarios qui dépendent de scripts, de PowerShell ou d'un runtime tiers, UpdateLock utilise Native C + + / Win32 Mise en œuvre, exécuté sous la forme d'un fichier unique EXE et utilisant différentes stratégies système pour Windows 7, Windows 10 et Windows 11, respectivement.

Cet article présente principalement le projet du point de vue de la réalisation du projet. La désactivation des mises à jour du système peut réduire la sécurité du système et doit être décidée avec prudence en fonction de l'utilisation réelle de l'appareil et de la politique de sécurité.

Pourquoi utiliser l'Update Lock ?

Windows Update n'est pas simplement « ouvert » ou « fermé ».

Il existe des différences importantes entre les différentes versions de Windows en ce qui concerne les mécanismes de mise à jour, les éléments de stratégie et les services associés. Windows 7 et Windows 10 / 11, en particulier, ne sont pas exactement identiques sur le modèle de gestion des mises à jour.

Ainsi, un outil de contrôle de mise à jour véritablement destiné à plusieurs versions de Windows, nécessite de résoudre plusieurs problèmes :

  1. Comment identifier la version actuelle de Windows ?
  2. Quelles politiques doivent être modifiées pour les différents systèmes ?
  3. Comment éviter de supprimer brutalement les fichiers système ou de corrompre les composants de mise à jour ?
  4. Comment puis-je enregistrer la configuration d'origine de l'utilisateur avant de la modifier ?
  5. Comment restaurer le site si la modification échoue ?
  6. Comment puis-je confirmer que la configuration a réussi après la restauration ?
  7. Comment fonctionner sans. NET, PowerShell ou autres add-ons ?

La conception de UpdateLock s'articule essentiellement autour de ces questions.

Le projet README le définit comme un « outil de mise à jour automatique de Win7 / 10 / 11 » qui utilise l'EXE natif Win32 x86 et effectue des modifications de configuration système via l'API du Registre Windows et l'API du Gestionnaire de contrôle de service.


Deuxièmement, la plus grande caractéristique du projet : Win32 natif

UpdateLock n'a pas sélectionné PowerShell, Batch ou reg.exe、sc.exe De telles commandes externes appellent directement l'API Windows.

Comme on peut le voir dans le code source, il contient directement :

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

La logique de base est construite directement au-dessus de l'API Win32.

Les avantages de cette conception sont très évidents.

1. Ne pas dépendre de PowerShell

De nombreux scripts d'automatisation Windows exécutent PowerShell, par exemple :

Set-Service
Set-ItemProperty
Get-Service

UpdateLock ne dépend pas de ces commandes.

Cela signifie qu 'il n'a pas besoin de se soucier de questions telles que la disponibilité de PowerShell, la restriction des stratégies d'exécution des scripts et la résolution de la sortie de commande externe.

2. Indépendance du. NET Runtime

Le projet a été construit de manière CRT statique, dans le but de fonctionner directement sur Windows 7 SP1, Windows 10 et Windows 11.

Ainsi, l'utilisateur final est confronté à un plus traditionnel :

UpdateLock.exe

plutôt que de nécessiter l'installation préalable d'un package logiciel pour l'environnement d'exécution.

3. Gestion d'erreur plus directe

L'appel direct de l'API Win32 signifie également que le programme peut obtenir un code d'erreur système plus explicite.

Le code source est défini ThrowWin32()Le code d'erreur Win32 est converti en un message d'erreur compréhensible par l'utilisateur, par exemple :

Win32 5:拒绝访问

Cette approche est plus simple que de simplement déterminer la valeur de retour d'une commande externe.


Pourquoi Win7 et Win10 / 11 sont-ils différents ?

C'est un point important dans la conception de UpdateLock.

Plutôt que d'adopter une approche « un ensemble de stratégies pour battre le monde », le projet traite explicitement Windows 7 séparément de Windows 10 / 11.

Windows 7

Le traitement de Windows 7 concerne principalement :

  • NoAutoUpdate
  • DisableWindowsUpdateAccess
  • wuauserv

dans lequel wuauserv C'est le service Windows Update.

En d'autres termes, le scénario de Win7 arrête et désactive le service Windows Update via le Gestionnaire de contrôle de service de Windows, en plus de modifier la stratégie.

Mais le projet n'a pas été délibérément traité plus loin :

  • Bits
  • cryptosvc
  • TrustedInstaller
  • LogicielDistribution
  • Catroot2
  • Fichiers système

Cette retenue est très importante.

Un outil système qui supprime directement le cache de mise à jour, modifie le répertoire système ou même remplace les fichiers système pour « désactiver complètement les mises à jour » peut facilement passer d'un outil de configuration à un outil de destruction du système.

Le schéma de UpdateLock est nettement plus enclin à :

Modifiez uniquement la configuration nécessaire pour atteindre votre objectif.


Windows 10 / 11 : contrôle principalement par stratégie

Windows 10 et Windows 11 sont traités différemment.

Le projet concerne principalement les stratégies suivantes :

ExcludeWUDriversInQualityUpdate
SetUpdateNotificationLevel
UpdateNotificationLevel
NoAutoUpdate
NoAutoRebootWithLoggedOnUsers
AUOptions

Parmi les comparaisons remarquables, AUOptions。

Lorsqu 'il est fermé, le projet ne le fixe pas simplement à une certaine valeur, mais adopte :

Supprimer lors de l'arrêt et réécrire à l'état d'origine lors de la restauration.

Cela incarne une idée importante de gestion de la configuration :

« Restaurer » ne devrait pas signifier la restauration à la valeur par défaut que le programme considère, mais plutôt la restauration à l'état précédent l'exécution du programme par l'utilisateur.

Par exemple, la configuration initiale de l'utilisateur peut être :

AUOptions = 4

Cette valeur peut être supprimée après que le programme ait effectué une opération d'arrêt.

Lorsque l'utilisateur sélectionne la restauration, le programme réécrit :

AUOptions = 4

plutôt que d'écrire une autre valeur par défaut à sa propre discrétion.


La version 2.1 limite davantage l'accès à Windows Update

UpdateLock 2.1 a ajouté un autre :

SetDisableUXWUAccess=1

L'objectif de cette stratégie n'est pas d'arrêter le service Windows Update, mais de limiter davantage l'accès à l'interface utilisateur de Windows Update.

En termes simples, c'est de réduire les utilisateurs à travers la page Windows Update :

  • Vérifier manuellement les mises à jour
  • Télécharger la mise à jour
  • Installation des updates

Une opportunité d'opération.

Voici une différence importante :

Windows 10 / 11 ne s'arrête pas directement pour cela wuauservBITS, Usosvc, SmedicalSvc ou Update Orchestrator.

Cela suggère que les auteurs du projet n'ont pas adopté l'idée de « désactiver tous les services de mise à jour », mais ont plutôt essayé d'utiliser le mécanisme de stratégie fourni par Windows lui-même.

Du point de vue de la stabilité du système, c'est un schéma relativement conservateur.


La sauvegarde et la restauration sont l'une des conceptions de base de ce projet.

Si vous modifiez simplement le registre, ce n'est pas difficile.

Ce qui est vraiment difficile :

Comment récupérer de manière fiable après une modification ?

UpdateLock est relativement complet à ce stade.

Une sauvegarde de stratégie pour Windows 10 / 11 se trouve à :

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

Les nouvelles restrictions d'accès à l'interface utilisateur Windows Update sont enregistrées séparément :

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

Windows 7 utilise :

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

Cette conception signifie que le programme enregistre l'état d'origine avant de modifier le système.

Plutôt que de simplement supposer que :

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

Il y a une différence essentielle entre les deux.

Par exemple :

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

C'est ainsi qu ' il est possible de réellement « récupérer »


VII. RAII dans le code source : éviter les fuites de ressources

En tant que programme Windows natif C + +, UpdateLock utilise également RAII pour gérer les ressources système.

Plusieurs encapsulation typiques peuvent être vus dans le code source :

ScopedHandle
ScopedRegKey
ScopedServiceHandle

Par exemple :

struct ScopedRegKey {
    HKEY value = nullptr;

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

Ce type de conception résout un problème très typique de C + + / Win32.

L'API Win32 est largement utilisée comme :

HANDLE
HKEY
SC_HANDLE

Le handle de ressources.

Si une exception se produit à mi-chemin du programme, il est facile de se produire :

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

RAII permet de lier le cycle de vie des ressources aux objets C + +.

Par conséquent :

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

Après avoir quitté la portée, la poignée de Registre est automatiquement libérée.

Ceci est particulièrement important pour un outil système qui doit travailler fréquemment avec le registre, les services et les fichiers.


L'opération de registre n'est pas une simple « écriture ».

La logique du registre dans le code source vaut également la peine d'être analysée.

Le programme définit une description de la politique comme celle-ci :

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

Ensuite, utilisez :

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

formant un ensemble de chaînes d'opération relativement claires.

Il peut être abstrait comme :

Read
 ↓
Backup
 ↓
Modify
 ↓
Read Back
 ↓
Verify

Au lieu de :

Modify
 ↓
Done

C'est une différence importante entre les outils système et les scripts simples.


Après la modification, il faut « vérifier ».

UpdateLock dispose d'un mécanisme pratique :

Lire à nouveau le registre après l'écriture pour vérifier.

Vous pouvez voir dans le code source :

void VerifyPolicy(const PolicyState& expected)

Il réappelle la fonction read, puis compare :

exists
value

s'il est conforme aux attentes.

S'il n'est pas cohérent, l'erreur est lancée.

Cela signifie que le programme n'est pas vu :

RegSetValueExW()

Renvoie un succès et considère l'opération terminée.

Mais plutôt :

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

Cette conception peut améliorer considérablement la fiabilité du fonctionnement pour les outils impliquant des stratégies système.


Défaut Rollback

Plus loin, cette conception peut également former un processus transactionnel complet :

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

C'est - à - dire qu 'il ne s'agit pas simplement d'effectuer une série d'écritures de registre indépendantes les unes des autres.

En cas d'échec à mi-chemin, le programme peut essayer de restaurer le contenu précédemment modifié à l'état d'origine.

Ceci est très important pour les outils de configuration du système Windows.

Parce que la modification de la configuration du système le plus craint n'est pas "l'échec total", mais :

C'est la moitié du succès.

Par exemple :

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

Sans le mécanisme de retour en arrière, l'utilisateur finit par obtenir un état semi-modifié.


11, le fichier de sauvegarde lui-même prend également en compte la sécurité

Il y a un autre détail dans le code source qui est facilement négligé :

Le programme crée :

%ProgramData%\UpdateLock

Définir les droits de répertoire.

Le code source utilise le descripteur de sécurité :

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

Autrement dit, l'accès au répertoire de sauvegarde est limité aux comptes système et aux administrateurs.

Le design a un sens.

Étant donné que les fichiers de sauvegarde enregistrent l'état de la stratégie système, si l'utilisateur ordinaire est autorisé à modifier ces fichiers à volonté, il peut apparaître :

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

Pour la sauvegarde de la configuration du système :

Le fichier de sauvegarde n'est pas un fichier texte ordinaire.

Il doit également tenir compte de l'intégrité et de l'autorité.


Pourquoi utiliser Base64 pour la sauvegarde ?

Le code source offre également :

Base64Encode()
Base64Decode()

et intègre la conversion entre UTF - 8 et UTF - 16.

L'API Windows utilise fortement des chaînes Unicode, tandis que les fichiers de sauvegarde eux-mêmes sont au format texte UTF - 8.

Le projet doit donc être traité :

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

La conversion inverse est effectuée lors de la restauration.

L'avantage de cette conception est que le format du fichier de sauvegarde est plus explicite, tout en évitant les problèmes d'analyse causés par certains caractères spéciaux, sauts de ligne ou environnements de codage locaux.


Autorisations de l'administrateur et protection d'instance unique

Parce que les modifications sont :

HKEY_LOCAL_MACHINE

et les ressources au niveau du système telles que les services Windows, de sorte que le programme nécessite des droits d'administrateur.

En outre, le projet a ajouté une protection d'instance unique.

Le code source définit :

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

Windows Mutex empêche les utilisateurs de démarrer plusieurs instances de UpdateLock en même temps.

Pourquoi une instance unique ?

puisque la modification de la configuration du système n'est généralement pas appropriée pour l'exécution simultanée.

Si deux instances s'exécutent simultanément :

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

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

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

L'état final de la sauvegarde peut avoir des problèmes.

Par conséquent :

La protection à instance unique fait également partie de la sécurité des transactions de configuration.


Pas de « destruction violente » de Windows Update

D'un point de vue d'ingénierie, UpdateLock est un point positif, c'est qu 'il a un contrôle clair sur la modification des limites.

Il n'a pas élargi ses objectifs à :

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

Mais se concentre principalement sur :

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

C'est une façon de mieux s'adapter aux principes de conception des outils système :

Essayez de mettre en œuvre les exigences via l'interface de configuration fournie par le système d'exploitation plutôt que de contourner le mécanisme système.


Quels problèmes résolve-t - il pour les utilisateurs ordinaires ?

Si vous le voyez du point de vue de l'utilisateur, la valeur de UpdateLock peut être résumée en une phrase :

Encapsulez la modification, la sauvegarde, la restauration et la validation des stratégies de mise à jour complexes avec un programme Windows natif et léger.

L'utilisateur n'a pas besoin d'ouvrir manuellement :

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

Ensuite, modifiez-le un par un.

Le programme est responsable de l'achèvement :

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

La restauration est inverse :

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

C'est beaucoup plus convivial que de laisser un utilisateur moyen manipuler manuellement le registre.


16, il existe également des limites d'utilisation claires

Il convient de souligner en particulier :

La désactivation ou la limitation de Windows Update n'est pas sans coût.

Tout d'abord, Windows Update n'est pas seulement responsable des correctifs système, mais implique également des pilotes et d'autres contenus.

Le projet README note en particulier qu ' après avoir désactivé les mises à jour de pilotes pour Windows Update, un USB ou un autre matériel nouvellement connecté peut ne pas obtenir automatiquement les pilotes en ligne.

Ainsi, si l'appareil nécessite l'installation de nouveaux matériels, vous pouvez envisager :

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

De plus, il n'est pas recommandé d'effectuer des opérations d'arrêt ou de reprise lorsque Windows installe ou désinstalle des mises à jour.

Pour les équipements environnementaux de production, il faut également confirmer à l'avance :

  • s'il existe une politique de mise à jour d'entreprise ;
  • Exigences de patch de sécurité ;
  • s'appuyer sur Windows Update pour obtenir des pilotes ;
  • S'il existe un système de gestion unifié des terminaux ;
  • S'il y a une demande pour restaurer la configuration du système.

En d'autres termes :

UpdateLock est un outil de configuration système et ne remplace pas le mécanisme de mise à jour de Windows.


XVII. Modèle de construction

Le projet utilise Visual Studio Build Tools, la chaîne d'outils MSVC v141 et le SDK Windows 10 19041.

dans native Répertoire Exécution :

build-native.cmd

La construction native est disponible.

Le projet README indique que la sortie de la construction se trouve à :

native\build

et le script de construction génère simultanément :

UpdateLock.exe

et un programme de test natif.

Cette structure de projet convient aux développeurs qui souhaitent étudier la programmation du système Win32.

Vous pouvez le voir directement à partir du code source :

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

Plutôt que de se cacher derrière un grand nombre de cadres tiers.


18 Comment évaluer ce projet ?

UpdateLock n'est pas un projet particulièrement énorme si on le considère en termes de « complexité fonctionnelle ».

Mais si vous en voyez de la « qualité d'ingénierie des outils système », il contient beaucoup de conceptions qui valent la peine d'être apprises :

1. API native

Évitez de vous fier à PowerShell, CMD, reg.exe et sc.exe.

2.État Backup

Enregistrer la configuration originale avant de modifier.

3. Récupérable

La restauration est l'état d'origine de l'utilisateur, pas simplement la restauration de la valeur par défaut.

4. Vérification Readback

Lire la confirmation après l'écriture.

5. Failure de rollback

Évitez autant que possible le système dans un état semi-modifié.

6. RAII

Gérer automatiquement les ressources Win32.

7. Autorisation de contrôle

Limiter l'accès au répertoire de sauvegarde.

8. Une seule instance

Évitez plusieurs opérations de configuration simultanément.

Ces conceptions vont au-delà d'un simple « script de fermeture de Windows Update ».


19 Qu ' est-ce que l'on peut apprendre de ce projet ?

Si vous apprenez le développement de Windows C + +, UpdateLock ne vaut pas seulement la peine de vous concentrer sur « comment fermer Windows Update ».

Plus digne d'apprendre, c'est l'idée d'ingénierie derrière cela :

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

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

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

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

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

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

Ces principes s'appliquent également à de nombreux autres outils système, tels que :

  • Configurateur de service Windows ;
  • Outil de gestion des politiques de registre ;
  • outils d'initialisation du système ;
  • outils de configuration de terminal d'entreprise ;
  • Gestionnaire de stratégie de sécurité locale ;
  • Procédures de maintenance du système.

XX. Conclusion

UpdateLock est un petit outil natif de Windows, mais il incarne une idée de développement d'outils système typique :Moins de dépendance, appeler directement l'API système, modifier clairement les limites et mettre la sauvegarde, la vérification et la récupération au cœur.

Au lieu de tenter de résoudre le problème de Windows Update en supprimant les fichiers système ou en désactivant grossièrement tous les services pertinents, il conçoit des stratégies séparées pour les différences entre Windows 7 et Windows 10 / 11.

Plus particulièrement :

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

Il constitue une boucle fermée d'ingénierie importante pour l'ensemble du projet.

Pour les utilisateurs ordinaires, il fournit un outil de contrôle Windows Update simple ; pour les développeurs, il vaut la peine d'étudier la partie, c'est opérations de registre Win32, contrôle de service, gestion des droits, RAII, écriture de fichiers atomiques et transactionnalisation de configuration système。

Si votre objectif est d'apprendre le C + + natif de Windows, ce projet est un bon petit cas : la taille du code n'est pas énorme, mais il couvre de nombreux problèmes rencontrés par les outils système Windows réels.

Adresse du projet :
https://github.com/hhht110/UpdateLock

Remarque : Cet article est organisé en fonction du README actuel et du code source de l'entrepôt UpdateLock. Les stratégies de mise à jour de Windows changent en fonction de la version du système, des correctifs et des stratégies de gestion d'entreprise, et le comportement spécifique doit être soumis aux résultats des tests réels du système cible.