<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Registry on kenji.blog</title><link>http://kenji.blog/fr/tags/registry/</link><description>Recent content in Registry on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/registry/index.xml" rel="self" type="application/rss+xml"/><item><title>Les bases du Registre Windows et les méthodes d'édition programmables et sécurisées</title><link>http://kenji.blog/fr/p/windows-registry-safe-programmable-editing/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/windows-registry-safe-programmable-editing/</guid><description>&lt;img src="http://kenji.blog/p/windows-registry-safe-programmable-editing/img/eyecatch.jpg" alt="Featured image of post Les bases du Registre Windows et les méthodes d'édition programmables et sécurisées" />&lt;h1 id="les-bases-du-registre-windows-et-les-méthodes-dédition-programmables-et-sécurisées">Les bases du Registre Windows et les méthodes d&amp;rsquo;édition programmables et sécurisées
&lt;/h1>&lt;p>Dans le système d&amp;rsquo;exploitation Windows, le « Registre » (Registry) est une immense base de données hiérarchique qui stocke divers paramètres du système et des applications. Cet article explique en détail l&amp;rsquo;architecture de base du Registre Windows et les méthodes programmables et sécurisées pour le modifier à l&amp;rsquo;aide de PowerShell et C#.&lt;/p>
&lt;h2 id="1-introduction--lhistoire-et-lévolution-du-registre-windows">1. Introduction : L&amp;rsquo;histoire et l&amp;rsquo;évolution du Registre Windows
&lt;/h2>&lt;p>Dans les premières versions de Windows (l&amp;rsquo;ère Windows 3.x), les paramètres du système et des applications étaient principalement enregistrés dans des fichiers &lt;code>.ini&lt;/code> (fichiers d&amp;rsquo;initialisation). Cependant, d&amp;rsquo;innombrables fichiers INI se sont éparpillés dans tout le système pour chaque application, rendant la gestion considérablement complexe. De plus, comme les fichiers INI étaient basés sur du texte brut, il était difficile de stocker des données binaires, et il n&amp;rsquo;y avait aucun mécanisme de contrôle d&amp;rsquo;accès (sécurité). La vitesse d&amp;rsquo;analyse des fichiers était également lente, ce qui les rendait inadaptés à l&amp;rsquo;enregistrement de configurations à grande échelle.&lt;/p>
&lt;p>Pour résoudre fondamentalement ces problèmes, à partir de Windows NT et Windows 95, le « Registre » a été adopté à grande échelle en tant que base de données de configuration centralisée. Le registre est une base de données hiérarchisée qui offre un typage fort, la prise en charge des données binaires et de solides fonctionnalités de sécurité via des listes de contrôle d&amp;rsquo;accès (ACL). Cela a permis à tous les composants, du noyau du système d&amp;rsquo;exploitation aux applications de l&amp;rsquo;espace utilisateur, de lire et d&amp;rsquo;écrire des paramètres via une interface unifiée (l&amp;rsquo;ensemble des fonctions &lt;code>Reg*&lt;/code> de l&amp;rsquo;API Win32).&lt;/p>
&lt;p>Jusqu&amp;rsquo;au Windows 11 moderne, le registre continue de fonctionner comme le cœur du système d&amp;rsquo;exploitation. La configuration matérielle, l&amp;rsquo;ordre de chargement des pilotes de périphériques, l&amp;rsquo;environnement de bureau de l&amp;rsquo;utilisateur, la liste des logiciels installés, et toutes les métadonnées nécessaires au fonctionnement du système sont consolidées dans le registre.&lt;/p>
&lt;h2 id="2-au-cœur-de-larchitecture--lessence-des-ruches-du-registre-et-le-mappage-en-mémoire">2. Au cœur de l&amp;rsquo;architecture : L&amp;rsquo;essence des ruches du Registre et le mappage en mémoire
&lt;/h2>&lt;p>Bien que le registre apparaisse logiquement comme une immense structure arborescente, il est physiquement divisé en plusieurs fichiers appelés « ruches » (Hives) enregistrés sur le disque. Cela sépare les paramètres à l&amp;rsquo;échelle du système des paramètres spécifiques à l&amp;rsquo;utilisateur, permettant un chargement efficace.&lt;/p>
&lt;p>Les principaux fichiers de ruche se trouvent généralement dans le répertoire &lt;code>%SystemRoot%\System32\config&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>SYSTEM&lt;/code> : Paramètres critiques nécessaires au démarrage du système d&amp;rsquo;exploitation (pilotes, services, configuration de démarrage, etc.).&lt;/li>
&lt;li>&lt;code>SOFTWARE&lt;/code> : Paramètres globaux du système pour les logiciels installés. La plupart des paramètres des applications tierces s&amp;rsquo;y trouvent.&lt;/li>
&lt;li>&lt;code>SAM&lt;/code> : Security Accounts Manager (comptes d&amp;rsquo;utilisateurs locaux et hachages de mots de passe).&lt;/li>
&lt;li>&lt;code>SECURITY&lt;/code> : Politiques de sécurité locales et attribution des droits.&lt;/li>
&lt;li>&lt;code>DEFAULT&lt;/code> : Profil d&amp;rsquo;utilisateur par défaut (modèle lors de la création d&amp;rsquo;un nouvel utilisateur).&lt;/li>
&lt;/ul>
&lt;p>Les fichiers de ruche spécifiques à l&amp;rsquo;utilisateur existent en tant que fichiers cachés dans le répertoire de profil de l&amp;rsquo;utilisateur (par exemple, &lt;code>C:\Users\Username&lt;/code>).&lt;/p>
&lt;ul>
&lt;li>&lt;code>NTUSER.DAT&lt;/code> : Les paramètres de base de cet utilisateur (la majeure partie de HKCU).&lt;/li>
&lt;li>&lt;code>UsrClass.dat&lt;/code> : Les paramètres d&amp;rsquo;association d&amp;rsquo;extensions de fichiers de cet utilisateur (situé dans &lt;code>AppData\Local\Microsoft\Windows&lt;/code>).&lt;/li>
&lt;/ul>
&lt;p>Ces fichiers sont mappés dans la mémoire du pool paginé du noyau par le « Configuration Manager (CM) » du noyau lors du démarrage du système d&amp;rsquo;exploitation. Le Configuration Manager est le composant en mode noyau qui traite les demandes de lecture/écriture du registre.&lt;/p>
&lt;p>Il est à noter que toutes les données du registre n&amp;rsquo;existent pas sur le disque. Par exemple, la ruche &lt;code>HARDWARE&lt;/code> est volatile et n&amp;rsquo;est jamais enregistrée dans un fichier sur le disque. Chaque fois que le système d&amp;rsquo;exploitation démarre et que le gestionnaire Plug-and-Play (PnP) détecte du matériel, elle est reconstruite de manière dynamique en mémoire.&lt;/p>
&lt;p>De plus, dans les versions récentes de Windows, la journalisation des transactions est implémentée pour améliorer la fiabilité du registre. Les modifications apportées aux fichiers de ruche ne sont pas directement écrites dans les fichiers de données, mais sont d&amp;rsquo;abord enregistrées dans un journal de transactions (&lt;code>.log1&lt;/code>, &lt;code>.log2&lt;/code>). Cela empêche la corruption des données lors d&amp;rsquo;une perte d&amp;rsquo;alimentation inattendue pendant l&amp;rsquo;écriture ou lors d&amp;rsquo;un plantage du système, garantissant l&amp;rsquo;intégrité de la base de données d&amp;rsquo;une manière proche des propriétés ACID.&lt;/p>
&lt;h2 id="3-structure-hiérarchique-des-clés-et-des-valeurs-du-registre">3. Structure hiérarchique des clés et des valeurs du Registre
&lt;/h2>&lt;p>Le registre a une structure hiérarchique très similaire à celle d&amp;rsquo;un système de fichiers. Le nœud racine est appelé « clé racine » (root key) ou « ruche » (hive), sous laquelle sont stockées les « clés » (keys), les « sous-clés » (subkeys), et l&amp;rsquo;essence même des données, les « valeurs » (values). Il est plus facile de comprendre en considérant les clés comme des répertoires et les valeurs comme des fichiers.&lt;/p>
&lt;p>Les principales clés racines sont classées en cinq catégories :&lt;/p>
&lt;ol>
&lt;li>&lt;strong>HKEY_LOCAL_MACHINE (HKLM)&lt;/strong> : Stocke les paramètres du système et des logiciels applicables à l&amp;rsquo;ensemble de l&amp;rsquo;ordinateur (à tous les utilisateurs). Des privilèges d&amp;rsquo;administrateur sont nécessaires pour les modifications.&lt;/li>
&lt;li>&lt;strong>HKEY_CURRENT_USER (HKCU)&lt;/strong> : Stocke les paramètres spécifiques à l&amp;rsquo;utilisateur actuellement connecté. En réalité, il ne s&amp;rsquo;agit pas d&amp;rsquo;une base de données indépendante, mais d&amp;rsquo;un lien symbolique (alias) vers la clé SID (identifiant de sécurité) de l&amp;rsquo;utilisateur sous &lt;code>HKEY_USERS&lt;/code>.&lt;/li>
&lt;li>&lt;strong>HKEY_CLASSES_ROOT (HKCR)&lt;/strong> : Stocke les associations d&amp;rsquo;extensions de fichiers, les informations d&amp;rsquo;enregistrement des classes COM (Component Object Model) et les extensions de l&amp;rsquo;interface graphique (shell). Cette clé est spéciale ; il s&amp;rsquo;agit d&amp;rsquo;une vue virtuelle où le Configuration Manager fusionne &lt;code>HKLM\SOFTWARE\Classes&lt;/code> (à l&amp;rsquo;échelle du système) et &lt;code>HKCU\Software\Classes&lt;/code> (utilisateur actuel). En cas de conflit, les paramètres spécifiques à l&amp;rsquo;utilisateur (HKCU) priment.&lt;/li>
&lt;li>&lt;strong>HKEY_USERS (HKU)&lt;/strong> : Stocke les paramètres de tous les profils d&amp;rsquo;utilisateurs sur le système (ceux actuellement chargés en mémoire). Ils sont hiérarchisés par SID.&lt;/li>
&lt;li>&lt;strong>HKEY_CURRENT_CONFIG (HKCC)&lt;/strong> : Paramètres concernant le profil matériel actuel. L&amp;rsquo;entité réelle est un lien vers &lt;code>HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>La visualisation de cette structure hiérarchique complexe et des relations de liens donne ceci :&lt;/p>
&lt;pre class="mermaid">
mindmap
root((&amp;#34;Registre Windows&amp;#34;))
HKLM((&amp;#34;HKEY_LOCAL_MACHINE&amp;#34;))
SAM((&amp;#34;SAM (Comptes de Sécurité)&amp;#34;))
SECURITY((&amp;#34;SÉCURITÉ&amp;#34;))
SOFTWARE((&amp;#34;LOGICIEL&amp;#34;))
SYSTEM((&amp;#34;SYSTÈME&amp;#34;))
HARDWARE((&amp;#34;MATÉRIEL (Volatil)&amp;#34;))
HKCU((&amp;#34;HKEY_CURRENT_USER (Lien)&amp;#34;))
AppEvents((&amp;#34;Événements d&amp;#39;Application&amp;#34;))
Console((&amp;#34;Console&amp;#34;))
Software((&amp;#34;Logiciel&amp;#34;))
System((&amp;#34;Système&amp;#34;))
HKCR((&amp;#34;HKEY_CLASSES_ROOT (Vue Fusionnée)&amp;#34;))
HKU((&amp;#34;HKEY_USERS&amp;#34;))
SID((&amp;#34;SID des Utilisateurs...&amp;#34;))
HKCC((&amp;#34;HKEY_CURRENT_CONFIG (Lien)&amp;#34;))
&lt;/pre>
&lt;h2 id="4-types-de-données-du-registre-explication-détaillée">4. Types de données du Registre (Explication détaillée)
&lt;/h2>&lt;p>Les « valeurs » du registre ont chacune un type de données strictement défini. Lorsque l&amp;rsquo;on manipule le registre de manière programmable, il est essentiel de comprendre ces types et d&amp;rsquo;écrire les données avec le type approprié. Écrire avec un type incorrect peut amener les applications à lever des exceptions ou provoquer l&amp;rsquo;arrêt des fonctionnalités du système d&amp;rsquo;exploitation.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>REG_SZ (Valeur chaîne)&lt;/strong> : Le type de données le plus courant. Il stocke une chaîne Unicode (UTF-16LE) terminée par NULL. Il est utilisé pour les chemins de fichiers, les URL, les noms d&amp;rsquo;affichage de l&amp;rsquo;interface utilisateur, etc.&lt;/li>
&lt;li>&lt;strong>REG_DWORD (Valeur de mot double 32 bits)&lt;/strong> : Une valeur entière non signée de 32 bits (4 octets). Il est fréquemment utilisé pour les valeurs booléennes (0=désactivé, 1=activé), les valeurs de délai d&amp;rsquo;attente en millisecondes et la définition des codes d&amp;rsquo;erreur. Étant donné que Windows est une architecture little-endian, les données sont stockées sur le disque à partir de l&amp;rsquo;octet de poids faible (ex: 0x12345678 est stocké comme &lt;code>78 56 34 12&lt;/code>).&lt;/li>
&lt;li>&lt;strong>REG_QWORD (Valeur de mot quadruple 64 bits)&lt;/strong> : Une valeur entière de 64 bits (8 octets). Avec la popularisation des architectures 64 bits, il est utilisé pour stocker de grands nombres (comme les quotas de disque ou la spécification de tailles de mémoire importantes) et les paramètres de taille de pointeur.&lt;/li>
&lt;li>&lt;strong>REG_MULTI_SZ (Valeur de chaînes multiples)&lt;/strong> : Il stocke consécutivement plusieurs chaînes terminées par NULL, avec un autre caractère NULL vide (double NULL) à la fin pour marquer la terminaison. Il convient pour stocker des données sous forme de tableau, comme une liste d&amp;rsquo;adresses IP, une liste de services dépendants ou l&amp;rsquo;ordre des liaisons.&lt;/li>
&lt;li>&lt;strong>REG_EXPAND_SZ (Valeur chaîne extensible)&lt;/strong> : Un type de chaîne spécial contenant des chaînes de variables d&amp;rsquo;environnement non étendues comme &lt;code>%USERPROFILE%&lt;/code> ou &lt;code>%SystemRoot%&lt;/code>. Lorsqu&amp;rsquo;une application la lit via l&amp;rsquo;API &lt;code>RegQueryValueEx&lt;/code>, ou en appelant l&amp;rsquo;API &lt;code>ExpandEnvironmentStrings&lt;/code>, le système d&amp;rsquo;exploitation l&amp;rsquo;étend dynamiquement en chemin absolu réel.&lt;/li>
&lt;li>&lt;strong>REG_BINARY (Valeur binaire)&lt;/strong> : Un flux de données binaires brutes arbitraire. Il stocke des mots de passe chiffrés (comme LSA Secrets), des certificats numériques, et des structures complexes ou des données sérialisées spécifiques aux applications.&lt;/li>
&lt;li>&lt;strong>REG_NONE&lt;/strong> : Données de type non défini. Très rare, mais utilisé pour les zones réservées aux clés de chiffrement, etc.&lt;/li>
&lt;li>&lt;strong>REG_RESOURCE_LIST&lt;/strong> / &lt;strong>REG_FULL_RESOURCE_DESCRIPTOR&lt;/strong> : Types avancés réservés au noyau, utilisés par les pilotes de périphériques pour enregistrer les informations d&amp;rsquo;allocation des ressources matérielles (IRQ, ports d&amp;rsquo;E/S, canaux DMA).&lt;/li>
&lt;/ul>
&lt;h2 id="5-modèles-mathématiques-et-performances-du-registre-dans-le-système-dexploitation">5. Modèles mathématiques et performances du Registre dans le système d&amp;rsquo;exploitation
&lt;/h2>&lt;p>Puisque le registre est directement lié aux performances du système d&amp;rsquo;exploitation (en particulier le temps de démarrage et la vitesse d&amp;rsquo;initialisation des processus), il est optimisé en interne à l&amp;rsquo;aide d&amp;rsquo;une structure de données avancée similaire à un B-Tree (Arbre B) appelée « Cell Index ».&lt;/p>
&lt;h3 id="complexité-algorithmique-de-la-recherche-time-complexity">Complexité algorithmique de la recherche (Time Complexity)
&lt;/h3>&lt;p>La complexité temporelle $T_{\text{search}}$ lors de la recherche d&amp;rsquo;une clé spécifique (chemin) dans le registre dépend de la profondeur de l&amp;rsquo;arbre et du nombre de nœuds à chaque niveau de la hiérarchie. Lors de la recherche d&amp;rsquo;une sous-clé de profondeur $d$ (par exemple, $d=4$ pour &lt;code>A\B\C\D&lt;/code>), la complexité peut théoriquement être modélisée comme suit :&lt;/p>
$$
T_{\text{search}}(d, L) = \sum_{i=1}^{d} O(\log(C_i) \cdot L_i)
$$&lt;p>Où $C_i$ est le nombre de nœuds enfants (sous-clés ou valeurs) à la profondeur $i$, et $L_i$ est la longueur de la chaîne (nombre de caractères) à comparer. Dans les fichiers de ruche, qui sont les entités physiques du registre, la liste des sous-clés est conservée sous forme d&amp;rsquo;index trié par la valeur de hachage du nom ou par ordre alphabétique. De ce fait, une recherche dichotomique $O(\log(C_i))$ est possible au lieu d&amp;rsquo;une simple recherche linéaire $O(C_i)$, permettant un accès extrêmement rapide même s&amp;rsquo;il y a des dizaines de milliers de sous-clés sous une seule clé.&lt;/p>
&lt;h3 id="empreinte-de-stockage-space-complexity">Empreinte de stockage (Space Complexity)
&lt;/h3>&lt;p>La taille globale du registre (l&amp;rsquo;espace occupé sur le disque physique) est calculée comme la somme de chaque ruche.&lt;/p>
$$
\text{Size}_{\text{Total}} = \sum_{h \in \text{Hives}} \left( N_{h} \times S_{\text{key\_metadata}} + \sum_{v \in h} S_{\text{value}}(v) \right) + S_{\text{overhead}}
$$&lt;p>$N_h$ est le nombre de clés dans la ruche $h$, $S_{\text{key\_metadata}}$ est la taille des métadonnées par clé (horodatage de la dernière écriture, pointeur vers le descripteur de sécurité, pointeur vers la clé parente, etc.), et $S_{\text{value}}(v)$ est la taille de la charge utile de la valeur $v$. Sont également inclus la surcharge (overhead) $S_{\text{overhead}}$ due aux journaux de transactions et aux cellules vides devenues inutiles (fragmentation). Si des données inutiles (comme les restes de logiciels mal désinstallés) sont laissées dans le registre pendant une longue période, cette empreinte augmentera, ce qui pourrait mettre sous pression la mémoire du pool paginé du système d&amp;rsquo;exploitation et entraîner une baisse des performances.&lt;/p>
&lt;h2 id="6-les-risques-de-lédition-manuelle-menaçant-la-robustesse-du-système-et-la-probabilité-de-corruption">6. Les risques de l&amp;rsquo;édition manuelle menaçant la robustesse du système et la probabilité de corruption
&lt;/h2>&lt;p>L&amp;rsquo;édition manuelle à l&amp;rsquo;aide de l&amp;rsquo;Éditeur du Registre (&lt;code>regedit.exe&lt;/code>) doit être considérée comme l&amp;rsquo;ultime recours en matière d&amp;rsquo;administration système. Le registre n&amp;rsquo;intègre pas de fonction « Annuler » (Undo) comme on en trouve dans les éditeurs de texte classiques, et les modifications de valeurs ou suppressions de clés sont immédiatement appliquées au système via le Configuration Manager.&lt;/p>
&lt;p>En particulier, si vous modifiez ou supprimez par erreur ne serait-ce qu&amp;rsquo;un seul caractère dans une clé critique essentielle au démarrage du système (par exemple, les paramètres du pilote du contrôleur de disque sous &lt;code>HKLM\SYSTEM\CurrentControlSet\Services&lt;/code> ou la valeur &lt;code>Userinit&lt;/code> de &lt;code>HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon&lt;/code>), il existe un risque fatal que le système d&amp;rsquo;exploitation rencontre un écran bleu (BSoD) le rendant incapable de démarrer, ou reste bloqué à l&amp;rsquo;écran de connexion (écran noir).&lt;/p>
&lt;h3 id="modèle-mathématique-de-la-probabilité-de-corruption">Modèle mathématique de la probabilité de corruption
&lt;/h3>&lt;p>Considérons la probabilité d&amp;rsquo;une panne système si nous modifions ou supprimons aléatoirement des clés dans le registre. Soit $C$ l&amp;rsquo;ensemble des clés critiques indispensables au bon fonctionnement du système, et $N_c = |C|$ leur nombre total. Soit $N_{\text{total}}$ le nombre total de clés dans l&amp;rsquo;ensemble du registre.
Si $k$ clés sont supprimées ou détruites de manière aléatoire, la probabilité $P_{\text{failure}}$ qu&amp;rsquo;au moins une clé critique soit corrompue est donnée par le calcul de probabilité d&amp;rsquo;un tirage sans remise (Sampling without replacement) comme suit :&lt;/p>
$$
P_{\text{failure}} = 1 - \frac{\binom{N_{\text{total}} - N_c}{k}}{\binom{N_{\text{total}}}{k}} = 1 - \prod_{i=0}^{k-1} \left( 1 - \frac{N_c}{N_{\text{total}} - i} \right)
$$&lt;p>Le nombre total de clés $N_{\text{total}}$ dans l&amp;rsquo;ensemble du registre est de l&amp;rsquo;ordre de centaines de milliers à des millions, mais $N_c$ se compte également en dizaines de milliers. Mathématiquement, même avec des opérations aléatoires, la probabilité de défaillance augmente drastiquement à mesure que $k$ augmente. De plus, dans la réalité des opérations manuelles, les utilisateurs ne modifient pas de manière « aléatoire » ; ils manipulent intentionnellement (en suivant des sites de tutoriels, etc.) des emplacements directement liés à la configuration du système et au comportement des logiciels, de sorte que la probabilité de toucher une clé critique est bien plus élevée que cette valeur théorique.&lt;/p>
&lt;h2 id="7-virtualisation-du-registre-et-architecture-wow64">7. Virtualisation du Registre et architecture WOW64
&lt;/h2>&lt;p>Afin de maintenir la compatibilité avec les applications existantes (legacy), Windows implémente plusieurs mécanismes de « virtualisation » (redirection) avancés pour l&amp;rsquo;accès au registre. Programmer sans comprendre cela peut causer des bugs majeurs.&lt;/p>
&lt;h3 id="virtualisation-du-registre-uac-registry-virtualization">Virtualisation du Registre UAC (Registry Virtualization)
&lt;/h3>&lt;p>Depuis Windows Vista, le Contrôle de compte d&amp;rsquo;utilisateur (UAC) a été introduit. Lorsqu&amp;rsquo;une ancienne application créée à l&amp;rsquo;époque de Windows XP (fonctionnant avec les privilèges d&amp;rsquo;un utilisateur standard) tente d&amp;rsquo;écrire dans des clés protégées comme &lt;code>HKLM\SOFTWARE&lt;/code> qui nécessitent normalement des privilèges d&amp;rsquo;administrateur, afin d&amp;rsquo;éviter qu&amp;rsquo;elle ne plante avec une erreur d&amp;rsquo;accès refusé (Access Denied), Windows redirige silencieusement cette écriture vers le magasin virtuel dans le profil utilisateur : &lt;code>HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE&lt;/code>. Lors de la lecture, il fusionne les deux emplacements, celui d&amp;rsquo;origine et le magasin virtuel, et renvoie le résultat. Ainsi, l&amp;rsquo;application peut continuer à fonctionner normalement sans détecter d&amp;rsquo;erreur.
Cependant, si vous développez un outil pour modifier les paramètres de l&amp;rsquo;ensemble du système de manière programmable, vous devez spécifier &lt;code>&amp;lt;requestedExecutionLevel level=&amp;quot;requireAdministrator&amp;quot; /&amp;gt;&lt;/code> dans le fichier manifeste et désactiver cette virtualisation.&lt;/p>
&lt;h3 id="redirection-wow64-windows-32-bit-on-windows-64-bit">Redirection WOW64 (Windows 32-bit on Windows 64-bit)
&lt;/h3>&lt;p>Lors de l&amp;rsquo;exécution d&amp;rsquo;une ancienne application 32 bits sur une version 64 bits de Windows (le standard actuel), pour éviter que l&amp;rsquo;application 32 bits n&amp;rsquo;écrase accidentellement les paramètres système natifs 64 bits ou ne charge des DLL 64 bits incompatibles, certaines clés de registre sont automatiquement isolées et redirigées.
Par exemple, si une application 32 bits tente d&amp;rsquo;accéder à &lt;code>HKLM\SOFTWARE\Vendor\App&lt;/code>, le système d&amp;rsquo;exploitation la redirige de manière transparente vers &lt;code>HKLM\SOFTWARE\WOW6432Node\Vendor\App&lt;/code>.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
App32[&amp;#34;Application 32 bits&amp;#34;]
App64[&amp;#34;Application 64 bits&amp;#34;]
RegAPI[&amp;#34;API du Registre (Advapi32.dll)&amp;#34;]
CM[&amp;#34;Configuration Manager (Noyau)&amp;#34;]
HKLM_Soft[&amp;#34;HKLM\\SOFTWARE&amp;#34;]
HKLM_WOW64[&amp;#34;HKLM\\SOFTWARE\\WOW6432Node&amp;#34;]
App32 --&amp;gt;| RegOpenKeyEx() | RegAPI
App64 --&amp;gt;| RegOpenKeyEx() | RegAPI
RegAPI --&amp;gt; CM
CM --&amp;gt;| Si Processus 64 bits | HKLM_Soft
CM --&amp;gt;| Si Processus 32 bits (Redirection) | HKLM_WOW64
&lt;/pre>
&lt;p>Lorsque vous modifiez le registre à l&amp;rsquo;aide d&amp;rsquo;un script PowerShell ou d&amp;rsquo;une application C#, vous devez être très conscient du fait que le processus en cours d&amp;rsquo;exécution lui-même est en 32 bits ou en 64 bits. Sinon, vous rencontrerez le problème épineux des « paramètres qui devraient avoir été écrits mais qui ne sont pas visibles dans l&amp;rsquo;Explorateur (car ils ont été écrits ailleurs) ».&lt;/p>
&lt;h2 id="8-édition-programmable-et-sécurisée-avec-powershell">8. Édition programmable et sécurisée avec PowerShell
&lt;/h2>&lt;p>Pour minimiser les risques liés à la modification manuelle du registre, la meilleure pratique moderne consiste à coder les opérations (Infrastructure as Code) à l&amp;rsquo;aide de scripts PowerShell, garantissant ainsi l&amp;rsquo;automatisation, la reproductibilité et la testabilité. PowerShell dispose d&amp;rsquo;un « Fournisseur de Registre » (Registry Provider), vous permettant de manipuler le registre de manière transparente avec les mêmes applets de commande (&lt;code>Get-ChildItem&lt;/code>, &lt;code>Get-ItemProperty&lt;/code>, &lt;code>New-Item&lt;/code>, etc.) que celles utilisées pour manipuler le système de fichiers (comme le lecteur C:).&lt;/p>
&lt;p>Dans PowerShell, par défaut, des PSDrives dédiés (similaires à des lettres de lecteur) tels que &lt;code>HKLM:&lt;/code> et &lt;code>HKCU:&lt;/code> sont montés.&lt;/p>
&lt;h3 id="opérations-crud-de-base">Opérations CRUD de base
&lt;/h3>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 1. Vérification de l&amp;#39;existence (Read)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$keyPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software\MyCustomApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">-Not&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Test-Path&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># 2. Création d&amp;#39;une nouvelle clé (Create)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software&amp;#34;&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;MyCustomApp&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;La clé a été créée.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 3. Écriture / Mise à jour de la valeur (Update) - Écrire 1 en tant que REG_DWORD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;EnableDebug&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="mf">1&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">DWord&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 4. Lecture de la valeur (Read)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$debugFlag&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="py">EnableDebug&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Indicateur de débogage actuel : &lt;/span>&lt;span class="nv">$debugFlag&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># 5. Suppression de la valeur (Delete)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Remove-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$keyPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;EnableDebug&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="exemple-pratique-1--configuration-automatique-de-lenvironnement-de-développement-ajout-au-path-des-variables-denvironnement">Exemple pratique 1 : Configuration automatique de l&amp;rsquo;environnement de développement (Ajout au PATH des variables d&amp;rsquo;environnement)
&lt;/h3>&lt;p>Le script suivant est un exemple d&amp;rsquo;automatisation dans lequel un développeur ajoute en toute sécurité le répertoire d&amp;rsquo;un outil personnalisé à la variable d&amp;rsquo;environnement utilisateur &lt;code>PATH&lt;/code> lors de la configuration d&amp;rsquo;une nouvelle machine Windows.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$envKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Environment&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$newPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\tools\bin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Lire le PATH actuel (supprimer les erreurs pour une récupération sécurisée)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$currentPathInfo&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$envKey&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">SilentlyContinue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPathInfo&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nv">$currentPathInfo&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="py">Path&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Vérifier par expression régulière s&amp;#39;il est déjà inclus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-notmatch&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">regex&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">Escape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">$newPath&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Ajouter un point-virgule à la fin s&amp;#39;il n&amp;#39;y en a pas et concaténer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-and&lt;/span> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="o">-notmatch&lt;/span> &lt;span class="s2">&amp;#34;;$&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">+=&lt;/span> &lt;span class="s2">&amp;#34;;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">$updatedPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nv">$currentPath&lt;/span> &lt;span class="p">+&lt;/span> &lt;span class="nv">$newPath&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># L&amp;#39;écrire en tant que type REG_EXPAND_SZ (Important)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$envKey&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="nv">$updatedPath&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">ExpandString&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;La variable d&amp;#39;environnement PATH a été mise à jour : &lt;/span>&lt;span class="nv">$newPath&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Informer les processus en cours de l&amp;#39;exécution de la modification des variables d&amp;#39;environnement (WM_SETTINGCHANGE)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Cela permet aux nouveaux explorateurs, etc., de refléter le changement sans redémarrer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">[&lt;/span>&lt;span class="no">Environment&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">SetEnvironmentVariable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Path&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nv">$updatedPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="no">EnvironmentVariableTarget&lt;/span>&lt;span class="p">]::&lt;/span>&lt;span class="n">User&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Le PATH a déjà été ajouté.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="exemple-pratique-2--ajout-dune-action-personnalisée-au-menu-contextuel">Exemple pratique 2 : Ajout d&amp;rsquo;une action personnalisée au menu contextuel
&lt;/h3>&lt;p>Il s&amp;rsquo;agit d&amp;rsquo;un script qui ajoute un élément personnalisé intitulé « Ouvrir avec My IDE » au menu contextuel qui apparaît lors d&amp;rsquo;un clic droit sur un répertoire ou un fichier spécifique.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Le menu lorsque vous faites un clic droit sur l&amp;#39;arrière-plan d&amp;#39;un répertoire (zone vide)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$menuPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;HKCR:\Directory\Background\shell\OpenWithMyIDE&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$commandPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$menuPath&lt;/span>&lt;span class="s2">\command&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Créer la clé parente pour l&amp;#39;élément de menu&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">Stop&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Définir le nom d&amp;#39;affichage dans la valeur (par défaut)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;(default)&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;Ouvrir avec My IDE&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Définir l&amp;#39;icône (Optionnel)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$menuPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;Icon&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;C:\Program Files\MyIDE\ide.exe,0&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Créer la sous-clé command et définir la ligne de commande à exécuter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># %V est une variable qui se développe dans le chemin du répertoire de travail actuel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">New-Item&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$commandPath&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-ErrorAction&lt;/span> &lt;span class="n">Stop&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Out-Null&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Set-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="nv">$commandPath&lt;/span> &lt;span class="n">-Name&lt;/span> &lt;span class="s2">&amp;#34;(default)&amp;#34;&lt;/span> &lt;span class="n">-Value&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">C:\Program Files\MyIDE\ide.exe&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2"> &lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">%V&lt;/span>&lt;span class="se">`&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">String&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Le menu contextuel a été ajouté.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Write-Error&lt;/span> &lt;span class="s2">&amp;#34;Échec de la modification du registre. Veuillez vérifier si vous l&amp;#39;exécutez avec des privilèges d&amp;#39;administrateur. Erreur : &lt;/span>&lt;span class="nv">$_&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="séquence-interne-de-laccès-au-registre-depuis-powershell">Séquence interne de l&amp;rsquo;accès au registre depuis PowerShell
&lt;/h3>&lt;p>La séquence d&amp;rsquo;actions internes au système d&amp;rsquo;exploitation lorsqu&amp;rsquo;un script PowerShell modifie le registre est illustrée ci-dessous.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;Admin / PowerShell&amp;#34;
participant PS as &amp;#34;Fournisseur de Registre (.NET)&amp;#34;
participant CM as &amp;#34;Configuration Manager (Noyau)&amp;#34;
participant Disk as &amp;#34;Fichiers de Ruche sur NTFS&amp;#34;
U-&amp;gt;&amp;gt;PS: &amp;#34;Set-ItemProperty -Path ... -Value ...&amp;#34;
PS-&amp;gt;&amp;gt;PS: &amp;#34;Analyser le Chemin &amp;amp; Valider les Types de Données&amp;#34;
PS-&amp;gt;&amp;gt;CM: &amp;#34;NtSetValueKey (Appel Système)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;Vérifier le Jeton d&amp;#39;Accès par rapport à l&amp;#39;ACL de la Clé&amp;#34;
alt &amp;#34;Accès Autorisé (Jeton Admin)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;Allouer la Cellule dans le Cache Volatil&amp;#34;
CM-&amp;gt;&amp;gt;Disk: &amp;#34;Purger vers le Journal de Transactions (.log1)&amp;#34;
Disk--&amp;gt;&amp;gt;CM: &amp;#34;Journal Écrit avec Succès&amp;#34;
CM-&amp;gt;&amp;gt;Disk: &amp;#34;Écriture Paresseuse vers le Fichier de Données de la Ruche (Arrière-plan)&amp;#34;
CM--&amp;gt;&amp;gt;PS: &amp;#34;STATUS_SUCCESS (0x00000000)&amp;#34;
PS--&amp;gt;&amp;gt;U: &amp;#34;Commande Terminée&amp;#34;
else &amp;#34;Accès Refusé (Utilisateur Standard)&amp;#34;
CM--&amp;gt;&amp;gt;PS: &amp;#34;STATUS_ACCESS_DENIED (0xC0000022)&amp;#34;
PS--&amp;gt;&amp;gt;U: &amp;#34;UnauthorizedAccessException Lancée&amp;#34;
end
&lt;/pre>
&lt;h2 id="9-accès-robuste-au-registre-avec-c-net">9. Accès robuste au registre avec C# (.NET)
&lt;/h2>&lt;p>Lorsque vous accédez au registre à partir d&amp;rsquo;une application .NET (comme C#), vous utilisez les classes &lt;code>Microsoft.Win32.Registry&lt;/code> et &lt;code>RegistryKey&lt;/code>.
Le principal avantage d&amp;rsquo;utiliser C# réside dans une gestion robuste des erreurs grâce à une puissante gestion des exceptions (&lt;code>try-catch&lt;/code>), une vérification de type stricte et la possibilité de spécifier explicitement une vue 32 bits/64 bits à l&amp;rsquo;aide de l&amp;rsquo;énumération &lt;code>RegistryView&lt;/code>.&lt;/p>
&lt;p>Voici un exemple de code C# permettant de lire et d&amp;rsquo;écrire en toute sécurité dans le registre côté 64 bits (en évitant la redirection WOW6432Node) dans un environnement de système d&amp;rsquo;exploitation 64 bits.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System.Security&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Microsoft.Win32&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">RegistryEditor&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">static&lt;/span> &lt;span class="k">void&lt;/span> &lt;span class="n">Main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Chemin sous HKLM (nécessite des privilèges d&amp;#39;administrateur)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">string&lt;/span> &lt;span class="n">keyPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">@&amp;#34;SOFTWARE\MyEnterpriseApp\Settings&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Ouvrir la vue native 64 bits en spécifiant RegistryView.Registry64&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Utiliser l&amp;#39;instruction using pour s&amp;#39;assurer que le handle de la clé de registre (ressource non gérée) est libéré (Dispose)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">using&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">RegistryKey&lt;/span> &lt;span class="n">baseKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">RegistryKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">OpenBaseKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RegistryHive&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">LocalMachine&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryView&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Registry64&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Ouvrir la clé avec les droits d&amp;#39;écriture (writable: true). Crée la clé si elle n&amp;#39;existe pas.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">using&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">RegistryKey&lt;/span> &lt;span class="n">subKey&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">baseKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CreateSubKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">keyPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">writable&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">subKey&lt;/span> &lt;span class="p">!=&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Écrire la valeur en tant que REG_DWORD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;MaxConnections&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">DWord&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Écrire la valeur en tant que REG_SZ&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;ApiEndpoint&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;https://api.example.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Écrire un tableau d&amp;#39;octets en tant que REG_BINARY&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">byte&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="n">secretData&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="m">0x01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0x02&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0x0A&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0xFF&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">subKey&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;BinarySecret&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">secretData&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistryValueKind&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Binary&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;L&amp;#39;écriture dans le registre a réussi.&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">UnauthorizedAccessException&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Se produit souvent s&amp;#39;il n&amp;#39;est pas exécuté en tant qu&amp;#39;administrateur&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;Erreur d&amp;#39;autorisation : Veuillez « Exécuter en tant qu&amp;#39;administrateur » le programme. Détails : {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">SecurityException&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Bloqué par la sécurité d&amp;#39;accès du code (CAS) de .NET&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;Exception de sécurité : {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Exception&lt;/span> &lt;span class="n">ex&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Autres erreurs IO inattendues, etc.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;Erreur inattendue : {ex.Message}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Le « handle » renvoyé par le système d&amp;rsquo;exploitation lors de l&amp;rsquo;ouverture d&amp;rsquo;une clé de registre est une ressource non gérée (unmanaged resource) qui consomme de la mémoire et des ressources système. Par conséquent, il est de règle d&amp;rsquo;or dans la programmation C# d&amp;rsquo;utiliser un bloc &lt;code>using&lt;/code> ou d&amp;rsquo;appeler explicitement &lt;code>.Dispose()&lt;/code> (ou &lt;code>.Close()&lt;/code>) dans un bloc &lt;code>finally&lt;/code> pour prévenir de manière fiable les fuites de handle.&lt;/p>
&lt;h2 id="10-méthodes-de-sauvegarde-et-de-restauration-du-registre">10. Méthodes de sauvegarde et de restauration du Registre
&lt;/h2>&lt;p>Même avec l&amp;rsquo;automatisation via des scripts ou des programmes, il est absolument impératif de réaliser une sauvegarde avant d&amp;rsquo;effectuer des modifications critiques.&lt;/p>
&lt;h3 id="sauvegarde-et-importation-via-les-fichiers-reg">Sauvegarde et importation via les fichiers .reg
&lt;/h3>&lt;p>La méthode la plus classique et universelle est l&amp;rsquo;exportation vers un fichier &lt;code>.reg&lt;/code>. Ce fichier est un fichier texte possédant un format spécifique dont la structure est la suivante :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Windows Registry Editor Version 5.00
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[HKEY_CURRENT_USER\Software\MyCustomApp]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;EnableDebug&amp;#34;=dword:00000001
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;ApiEndpoint&amp;#34;=&amp;#34;https://api.example.com&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;BinaryData&amp;#34;=hex:01,02,0a,ff
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;em>Remarque : Les données binaires sont représentées par des valeurs hexadécimales séparées par des virgules à la suite de &lt;code>hex:&lt;/code>.&lt;/em>&lt;/p>
&lt;p>Vous pouvez implémenter des sauvegardes automatiques au sein de scripts batch en utilisant l&amp;rsquo;outil en ligne de commande &lt;code>reg.exe&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmd" data-lang="cmd">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">REM Sauvegarder la clé spécifiée (les sous-clés sont également exportées de manière récursive)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reg export HKLM\SOFTWARE\MyEnterpriseApp C:\backup\myapp_backup.reg /y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">REM Restaurer la sauvegarde&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reg import C:\backup\myapp_backup.reg
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="méthodes-de-sauvegarde-plus-avancées-utilisant-powershell">Méthodes de sauvegarde plus avancées utilisant PowerShell
&lt;/h3>&lt;p>Au lieu de le traiter comme un simple texte, vous pouvez exploiter l&amp;rsquo;orientation objet de PowerShell pour exporter les objets du registre et les enregistrer au format XML (CliXML). Ainsi, lors de la restauration, vous pouvez les gérer en conservant les informations de type, sans dépendre de l&amp;rsquo;analyse des chaînes de caractères.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-powershell" data-lang="powershell">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Création de la sauvegarde (enregistrement des propriétés en tant que XML)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Get-ItemProperty&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;HKCU:\Software\MyCustomApp&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="nb">Export-Clixml&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\backup\reg_backup.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Concept de restauration&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$backup&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">Import-Clixml&lt;/span> &lt;span class="n">-Path&lt;/span> &lt;span class="s2">&amp;#34;C:\backup\reg_backup.xml&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Puisque $backup contient le PSObject personnalisé restauré,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># vous pouvez créer une logique pour boucler sur ses propriétés et les réappliquer avec Set-ItemProperty.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="11-dépannage-avec-sysinternals-process-monitor-procmon">11. Dépannage avec Sysinternals Process Monitor (Procmon)
&lt;/h2>&lt;p>Si vous ne savez pas où un programme écrit dans le registre ou si vous recherchez la cause d&amp;rsquo;un accès refusé (« Access Denied »), l&amp;rsquo;outil &lt;strong>Process Monitor (Procmon)&lt;/strong> de Sysinternals, fourni gratuitement par Microsoft, est très puissant.
Procmon permet de capturer en temps réel tous les appels d&amp;rsquo;API du registre (&lt;code>RegOpenKey&lt;/code>, &lt;code>RegQueryValue&lt;/code>, &lt;code>RegSetValue&lt;/code>, etc.) survenant sur le système d&amp;rsquo;exploitation et permet le dépannage grâce à un filtrage avancé tel que :&lt;/p>
&lt;ul>
&lt;li>&lt;code>Process Name&lt;/code> is &lt;code>powershell.exe&lt;/code>&lt;/li>
&lt;li>&lt;code>Operation&lt;/code> begins with &lt;code>Reg&lt;/code>&lt;/li>
&lt;li>&lt;code>Result&lt;/code> is &lt;code>ACCESS DENIED&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Ceci vous permet d&amp;rsquo;identifier instantanément quelles configurations ACL de clé sont manquantes ou si elles ont été incorrectement redirigées vers WOW6432Node.&lt;/p>
&lt;h2 id="12-sécurité-et-bonnes-pratiques">12. Sécurité et Bonnes Pratiques
&lt;/h2>&lt;p>Enfin, voici un résumé des principes de conception et des bonnes pratiques importants lors de la manipulation du registre.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Appliquer strictement le principe du moindre privilège&lt;/strong> : Les paramètres des applications et des scripts doivent être stockés autant que possible sous la clé &lt;code>Software&lt;/code> de &lt;code>HKCU&lt;/code> (utilisateur actuel). L&amp;rsquo;écriture dans &lt;code>HKLM&lt;/code> nécessite une élévation de privilèges administrateur par l&amp;rsquo;UAC, ce qui élargit la surface d&amp;rsquo;attaque en termes de sécurité et détériore l&amp;rsquo;expérience utilisateur.&lt;/li>
&lt;li>&lt;strong>Activation de l&amp;rsquo;Audit (Auditing)&lt;/strong> : Pour les clés d&amp;rsquo;une importance extrême pour la sécurité (comme la clé &lt;code>Run&lt;/code> gérant le démarrage automatique ou les clés de configuration des services), vous devez configurer la SACL (System Access Control List) et la configurer pour enregistrer (auditer) qui a modifié ou supprimé la valeur et quand, dans le journal de sécurité de l&amp;rsquo;Observateur d&amp;rsquo;événements de Windows.&lt;/li>
&lt;li>&lt;strong>Réagir à l&amp;rsquo;obsolescence de la fonctionnalité transactionnelle&lt;/strong> : La fonction de transaction du registre (TxR), introduite autrefois dans Windows Vista et utilisant le Gestionnaire de transactions du noyau (KTM), est dépréciée depuis Windows 10. Les applications doivent implémenter leurs propres mécanismes de sauvegarde et de restauration (comme la lecture de la valeur d&amp;rsquo;origine avant la modification pour la conserver en mémoire).&lt;/li>
&lt;li>&lt;strong>Attention aux conflits avec la stratégie de groupe (GPO)&lt;/strong> : Les zones de &lt;code>HKLM\SOFTWARE\Policies&lt;/code> et de &lt;code>HKCU\Software\Policies&lt;/code> sont des domaines qui devraient être gérés de manière centralisée par les stratégies de groupe d&amp;rsquo;Active Directory. Même si un script réécrit directement ces clés, elles seront écrasées de force par les paramètres du contrôleur de domaine lors du prochain cycle de mise à jour en arrière-plan des stratégies de groupe (généralement à des intervalles de 90 à 120 minutes), ce qui fait que les paramètres ne persistent pas.&lt;/li>
&lt;/ol>
&lt;h2 id="résumé">Résumé
&lt;/h2>&lt;p>Le Registre Windows est un système fondamental puissant et complexe qui gère de manière intégrée tous les comportements du système d&amp;rsquo;exploitation et les paramètres des applications. Les modifications manuelles non structurées comportent un risque très élevé de corruption du système, prouvé mathématiquement. C&amp;rsquo;est pourquoi, dans la gestion système et le développement modernes, il est essentiel de configurer et de gérer l&amp;rsquo;infrastructure de manière sûre, testable et reproductible à l&amp;rsquo;aide de méthodes programmables telles que PowerShell et C#, en adhérant aux principes de l&amp;rsquo;Infrastructure as Code. Utilisez la compréhension approfondie de l&amp;rsquo;architecture et les modèles d&amp;rsquo;implémentation expliqués dans cet article pour vous orienter vers la construction d&amp;rsquo;environnements Windows plus robustes et sécurisés.&lt;/p></description></item></channel></rss>