<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Windows 11 on kenji.blog</title><link>http://kenji.blog/fr/tags/windows-11/</link><description>Recent content in Windows 11 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/windows-11/index.xml" rel="self" type="application/rss+xml"/><item><title>Création de packages MSIX pour Windows 11 et le piège des certificats auto-signés</title><link>http://kenji.blog/fr/p/windows-11-msix-packaging-guide/</link><pubDate>Sat, 12 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/windows-11-msix-packaging-guide/</guid><description>&lt;img src="http://kenji.blog/p/windows-11-msix-packaging-guide/img/eyecatch.jpg" alt="Featured image of post Création de packages MSIX pour Windows 11 et le piège des certificats auto-signés" />&lt;p>À l&amp;rsquo;ère de Windows 11, le « MSIX » devient le choix standard comme format de distribution des applications. Bien que les installateurs traditionnels tels que MSI et EXE présentaient de nombreux problèmes, on attend du MSIX qu&amp;rsquo;il soit la technologie d&amp;rsquo;empaquetage de nouvelle génération qui les résoudra. Cependant, lorsque les développeurs essaient de créer un package MSIX et d&amp;rsquo;effectuer un chargement latéral (Sideloading) au sein de leur organisation ou dans un environnement de test, ils tombent souvent dans le « piège des certificats auto-signés ».&lt;/p>
&lt;p>Cet article expliquera très en détail les détails techniques du MSIX, comment créer des packages à l&amp;rsquo;aide de Visual Studio ou d&amp;rsquo;outils en ligne de commande, ainsi que les causes et solutions aux erreurs liées aux certificats auto-signés auxquelles de nombreux développeurs sont confrontés. L&amp;rsquo;objectif est d&amp;rsquo;en faire un guide de lecture incontournable pour les développeurs d&amp;rsquo;applications Windows, les administrateurs d&amp;rsquo;infrastructure et les responsables de l&amp;rsquo;empaquetage.&lt;/p>
&lt;h2 id="1-quest-ce-que-le-msix--comparaison-avec-les-anciens-msiexe">1. Qu&amp;rsquo;est-ce que le MSIX ? Comparaison avec les anciens MSI/EXE
&lt;/h2>&lt;p>MSIX est le dernier format de package d&amp;rsquo;applications pour Windows fourni par Microsoft. Il intègre toutes les meilleures fonctionnalités et concepts des formats existants : MSI (Microsoft Installer), les installateurs personnalisés basés sur .exe, App-V (Application Virtualization) et AppX (packages d&amp;rsquo;applications Universal Windows Platform) introduits depuis Windows 8, tout en évoluant pour répondre aux exigences modernes de sécurité et de déploiement.&lt;/p>
&lt;h3 id="problèmes-des-installateurs-traditionnels-msiexe">Problèmes des installateurs traditionnels (MSI/EXE)
&lt;/h3>&lt;p>Les MSI et EXE, utilisés pendant de nombreuses années comme formats d&amp;rsquo;installation standard sous Windows, présentaient des problèmes fondamentaux tels que :&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Phénomène de Win Rot (Dégradation de Windows)&lt;/strong> : À mesure que les applications sont installées et désinstallées, des clés inutiles restent dans le registre et des DLL sont laissées dans les dossiers système (comme &lt;code>C:\Windows\System32&lt;/code>). Cela provoque un ralentissement progressif du système d&amp;rsquo;exploitation et le rend instable.&lt;/li>
&lt;li>&lt;strong>L&amp;rsquo;enfer des DLL (DLL Hell)&lt;/strong> : Lorsque plusieurs applications tentent d&amp;rsquo;installer une DLL portant le même nom (mais de version différente) dans un répertoire système partagé, l&amp;rsquo;application installée en dernier écrase la DLL existante, ce qui empêche l&amp;rsquo;application installée en premier de fonctionner correctement.&lt;/li>
&lt;li>&lt;strong>Instabilité due aux actions personnalisées (Custom Actions)&lt;/strong> : Dans les packages MSI, des scripts ou du code arbitraires, appelés « actions personnalisées », peuvent être exécutés avec les privilèges système pendant l&amp;rsquo;installation ou la désinstallation. Cela risquait de faire planter l&amp;rsquo;installateur en cours de route ou d&amp;rsquo;entraîner des modifications inattendues de la configuration du système.&lt;/li>
&lt;/ol>
&lt;h3 id="solution-grâce-à-larchitecture-conteneurisée-du-msix">Solution grâce à l&amp;rsquo;architecture conteneurisée du MSIX
&lt;/h3>&lt;p>MSIX résout ces problèmes en exécutant les applications dans des « conteneurs » légers. Cette approche de conteneurisation présente des avantages considérables :&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Désinstallation propre (Clean Uninstall)&lt;/strong> : Les applications installées avec MSIX virtualisent les écritures sur le système de fichiers et le registre (VFS : Virtual File System, VReg : Virtual Registry). Par conséquent, lors de la désinstallation, ce conteneur virtualisé est supprimé dans son intégralité, ne laissant aucun déchet (résidu) sur le système. Cela empêche complètement le Win Rot.&lt;/li>
&lt;li>&lt;strong>Isolation et sécurité (Isolation)&lt;/strong> : Chaque application s&amp;rsquo;exécute dans son propre environnement et ne détruit pas directement les DLL ou les ressources des autres applications. Cela vous libère de l&amp;rsquo;enfer des DLL.&lt;/li>
&lt;li>&lt;strong>Optimisation de la bande passante réseau&lt;/strong> : Le mécanisme de mise à jour de MSIX est très efficace, prenant en charge les mises à jour différentielles au niveau des blocs (Differential Update). Comme il ne télécharge que les quelques blocs de données binaires qui ont été modifiés, la charge sur le réseau est minimisée, même pour les mises à jour d&amp;rsquo;applications volumineuses.&lt;/li>
&lt;li>&lt;strong>État d&amp;rsquo;installation fiable&lt;/strong> : Le package inclut un fichier manifeste (&lt;code>AppxManifest.xml&lt;/code>), et les transactions d&amp;rsquo;installation sont strictement gérées au niveau du système d&amp;rsquo;exploitation. En cas d&amp;rsquo;échec, il y a une restauration complète (rollback) à l&amp;rsquo;état initial.&lt;/li>
&lt;/ul>
&lt;h2 id="2-vue-densemble-de-la-création-de-packages-msix-et-chaîne-doutils">2. Vue d&amp;rsquo;ensemble de la création de packages MSIX et chaîne d&amp;rsquo;outils
&lt;/h2>&lt;p>Il existe principalement deux approches pour créer un package MSIX. La première consiste à utiliser l&amp;rsquo;environnement de développement intégré (IDE) Visual Studio, et la seconde consiste à utiliser les outils en ligne de commande inclus dans le SDK Windows (&lt;code>MakeAppx.exe&lt;/code> et &lt;code>SignTool.exe&lt;/code>).&lt;/p>
&lt;p>Le diagramme Mermaid suivant illustre le processus allant des fichiers sources à la génération du package MSIX signé final.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Fichiers sources (EXE, DLL, Assets, etc.)&amp;#34;] --&amp;gt; B[&amp;#34;AppxManifest.xml (Définition du manifeste)&amp;#34;]
B --&amp;gt; C[&amp;#34;MakeAppx.exe (Outil de création MSIX)&amp;#34;]
C --&amp;gt; D[&amp;#34;Package MSIX non signé (.msix)&amp;#34;]
E[&amp;#34;Certificat numérique (.pfx)&amp;#34;] --&amp;gt; F[&amp;#34;SignTool.exe (Outil de signature)&amp;#34;]
D --&amp;gt; F
F --&amp;gt; G[&amp;#34;Package MSIX signé (Prêt pour le déploiement)&amp;#34;]
style A fill:#f9f9f9,stroke:#333
style B fill:#e6f7ff,stroke:#333
style D fill:#ffcccb,stroke:#333
style G fill:#d4edda,stroke:#333
&lt;/pre>
&lt;p>Comme on peut le voir dans ce processus, il ne suffit pas de rassembler et de compresser les fichiers (empaquetage) ; l&amp;rsquo;étape de « signature numérique » est absolument nécessaire. Pour des raisons de sécurité, Windows 11 n&amp;rsquo;autorise aucune installation de packages MSIX non signés.&lt;/p>
&lt;h2 id="3-approche-a--création-de-msix-à-laide-de-visual-studio">3. Approche A : Création de MSIX à l&amp;rsquo;aide de Visual Studio
&lt;/h2>&lt;p>La méthode la plus simple et la plus courante consiste à utiliser le « Projet de création de packages d&amp;rsquo;applications Windows » (Windows Application Packaging Project - WAP) de Visual Studio. En utilisant ce modèle de projet, il est possible de convertir facilement en MSIX des applications WPF, Windows Forms, WinUI 3 ou même des applications Win32 existantes en C++.&lt;/p>
&lt;h3 id="guide-étape-par-étape">Guide étape par étape
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>Ajout d&amp;rsquo;un projet WAP&lt;/strong> : Faites un clic droit sur votre solution Visual Studio existante, sélectionnez &amp;ldquo;Ajouter un nouveau projet&amp;rdquo; puis choisissez &amp;ldquo;Projet de création de packages d&amp;rsquo;applications Windows&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Sélection des plateformes cibles&lt;/strong> : Spécifiez les versions minimale et cible de Windows 10/11 prises en charge par l&amp;rsquo;application.&lt;/li>
&lt;li>&lt;strong>Référence de l&amp;rsquo;application&lt;/strong> : Faites un clic droit sur le nœud &amp;ldquo;Applications&amp;rdquo; du projet de package, sélectionnez &amp;ldquo;Ajouter une référence&amp;rdquo; et choisissez le projet principal (par exemple, le projet WPF) que vous souhaitez empaqueter.&lt;/li>
&lt;li>&lt;strong>Configuration du manifeste&lt;/strong> : Double-cliquez sur le fichier &lt;code>Package.appxmanifest&lt;/code> pour ouvrir le concepteur visuel. Ici, vous définirez le nom d&amp;rsquo;affichage de l&amp;rsquo;application, la description, l&amp;rsquo;image du logo et, plus important encore, le « Nom du package » (Identity Name) et l&amp;rsquo;« Éditeur » (Publisher).&lt;/li>
&lt;li>&lt;strong>Création du package&lt;/strong> : Faites un clic droit sur le projet et sélectionnez &amp;ldquo;Publier&amp;rdquo; -&amp;gt; &amp;ldquo;Créer des packages d&amp;rsquo;application&amp;rdquo;. Si vous sélectionnez &amp;ldquo;Sideloading&amp;rdquo; (pour le chargement latéral) et choisissez l&amp;rsquo;architecture (x64, ARM64, etc.), Visual Studio se chargera automatiquement de la compilation, de l&amp;rsquo;empaquetage via &lt;code>MakeAppx&lt;/code>, ainsi que de la génération et de la signature avec un certificat auto-signé.&lt;/li>
&lt;/ol>
&lt;p>C&amp;rsquo;est très fluide, mais c&amp;rsquo;est ici que si vous utilisez le certificat auto-signé (Test Certificate) généré automatiquement par Visual Studio, vous tomberez dans le « piège » décrit plus loin.&lt;/p>
&lt;h2 id="4-approche-b--création-via-la-ligne-de-commande-makeappxexe">4. Approche B : Création via la ligne de commande (MakeAppx.exe)
&lt;/h2>&lt;p>Les outils en ligne de commande sont nécessaires pour l&amp;rsquo;automatisation dans des pipelines CI/CD ou lors du réempaquetage manuel de fichiers à partir d&amp;rsquo;un installateur existant. Si le SDK Windows est installé, vous pouvez accéder aux outils suivants depuis l&amp;rsquo;invite de commandes du développeur.&lt;/p>
&lt;h3 id="1-préparation-du-fichier-manifeste">1. Préparation du fichier manifeste
&lt;/h3>&lt;p>Créez un &lt;code>AppxManifest.xml&lt;/code> à la racine du package avec les informations minimales requises.&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;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;Package&lt;/span> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/foundation/windows10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:uap=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/uap/windows10&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns:rescap=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&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="nt">&amp;lt;Identity&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;MyCompany.AwesomeApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Publisher=&lt;/span>&lt;span class="s">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ProcessorArchitecture=&lt;/span>&lt;span class="s">&amp;#34;x64&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&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="nt">&amp;lt;Properties&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;DisplayName&amp;gt;&lt;/span>Awesome App&lt;span class="nt">&amp;lt;/DisplayName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;PublisherDisplayName&amp;gt;&lt;/span>My Company&lt;span class="nt">&amp;lt;/PublisherDisplayName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Logo&amp;gt;&lt;/span>Assets\StoreLogo.png&lt;span class="nt">&amp;lt;/Logo&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Properties&amp;gt;&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="nt">&amp;lt;Resources&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resource&lt;/span> &lt;span class="na">Language=&lt;/span>&lt;span class="s">&amp;#34;en-us&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Resource&lt;/span> &lt;span class="na">Language=&lt;/span>&lt;span class="s">&amp;#34;ja-jp&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Resources&amp;gt;&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="nt">&amp;lt;Dependencies&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;TargetDeviceFamily&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;Windows.Desktop&amp;#34;&lt;/span> &lt;span class="na">MinVersion=&lt;/span>&lt;span class="s">&amp;#34;10.0.17763.0&amp;#34;&lt;/span> &lt;span class="na">MaxVersionTested=&lt;/span>&lt;span class="s">&amp;#34;10.0.22000.0&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Dependencies&amp;gt;&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="nt">&amp;lt;Capabilities&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;rescap:Capability&lt;/span> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;runFullTrust&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Capabilities&amp;gt;&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="nt">&amp;lt;Applications&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Application&lt;/span> &lt;span class="na">Id=&lt;/span>&lt;span class="s">&amp;#34;AwesomeApp&amp;#34;&lt;/span> &lt;span class="na">Executable=&lt;/span>&lt;span class="s">&amp;#34;AwesomeApp.exe&amp;#34;&lt;/span> &lt;span class="na">EntryPoint=&lt;/span>&lt;span class="s">&amp;#34;Windows.FullTrustApplication&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;uap:VisualElements&lt;/span> &lt;span class="na">DisplayName=&lt;/span>&lt;span class="s">&amp;#34;Awesome App&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Description=&lt;/span>&lt;span class="s">&amp;#34;The best app ever.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">BackgroundColor=&lt;/span>&lt;span class="s">&amp;#34;transparent&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Square150x150Logo=&lt;/span>&lt;span class="s">&amp;#34;Assets\Square150x150Logo.png&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Square44x44Logo=&lt;/span>&lt;span class="s">&amp;#34;Assets\Square44x44Logo.png&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/uap:VisualElements&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Application&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Applications&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/Package&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Il est important de noter ici que la valeur de &lt;code>&amp;lt;Identity Publisher=&amp;quot;...&amp;quot; /&amp;gt;&lt;/code> doit correspondre exactement au sujet (Subject) du certificat utilisé pour la signature ultérieure.&lt;/p>
&lt;h3 id="2-empaquetage-avec-makeappx">2. Empaquetage avec MakeAppx
&lt;/h3>&lt;p>Exécutez la commande suivante dans l&amp;rsquo;invite de commandes pour compresser le répertoire en un fichier MSIX.&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;/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">MakeAppx.exe pack /d &lt;span class="s2">&amp;#34;C:\Path\To\AppFolder&amp;#34;&lt;/span> /p &lt;span class="s2">&amp;#34;C:\Path\To\Output\AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Cela produit un fichier MSIX non signé, mais dans cet état, il ne peut pas être installé sur Windows.&lt;/p>
&lt;h2 id="5-signature-numérique-et-contexte-mathématique-de-la-cryptographie">5. Signature numérique et contexte mathématique de la cryptographie
&lt;/h2>&lt;p>Pour comprendre en profondeur pourquoi un package MSIX nécessite une signature, il faut comprendre les mécanismes cryptographiques sous-jacents de la signature numérique. Une signature numérique garantit que le package « a bien été créé par l&amp;rsquo;éditeur spécifié (Authentification) » et « n&amp;rsquo;a pas été altéré par un tiers depuis sa création jusqu&amp;rsquo;à présent (Intégrité) ».&lt;/p>
&lt;p>La signature d&amp;rsquo;un MSIX utilise généralement une combinaison de la cryptographie RSA et de l&amp;rsquo;algorithme SHA-256 (Secure Hash Algorithm 256-bit).&lt;/p>
&lt;h3 id="application-de-la-fonction-de-hachage">Application de la fonction de hachage
&lt;/h3>&lt;p>Tout d&amp;rsquo;abord, on considère l&amp;rsquo;ensemble du binaire du package MSIX (le contenu) comme un message $M$. L&amp;rsquo;outil de signature (SignTool.exe) applique la fonction de hachage cryptographique SHA-256 à ce message $M$ pour calculer une valeur de hachage de longueur fixe (256 bits), $H(M)$.&lt;/p>
&lt;h3 id="génération-de-la-signature-éditeur">Génération de la signature (Éditeur)
&lt;/h3>&lt;p>Ensuite, l&amp;rsquo;éditeur utilise sa propre « Clé Privée » (Private Key) $d$ pour chiffrer la valeur de hachage et générer une signature numérique $\sigma$. Dans le contexte de l&amp;rsquo;algorithme RSA, cela est exprimé sous forme d&amp;rsquo;exponentiation modulaire de la manière suivante :&lt;/p>
$$ \sigma \equiv (H(M))^d \pmod n $$&lt;p>Où $n$ est le module RSA (le produit de deux très grands nombres premiers). Le certificat (format X.509) contenant cette signature $\sigma$ et la « Clé Publique » (Public Key) $e$ de l&amp;rsquo;éditeur est intégré en tant que partie du package MSIX (&lt;code>AppxSignature.p7x&lt;/code>).&lt;/p>
&lt;h3 id="vérification-de-la-signature-windows-os">Vérification de la signature (Windows OS)
&lt;/h3>&lt;p>Lorsqu&amp;rsquo;un utilisateur tente d&amp;rsquo;installer le MSIX, le système d&amp;rsquo;exploitation Windows extrait la clé publique $e$ du certificat dans le package et effectue le calcul suivant pour restaurer la valeur de hachage $H'(M)$.&lt;/p>
$$ H'(M) \equiv \sigma^e \pmod n $$&lt;p>En même temps, l&amp;rsquo;OS recalcule lui-même la valeur de hachage $H(M)$ de l&amp;rsquo;ensemble du package MSIX téléchargé $M$.
Finalement, il vérifie si la valeur de hachage restaurée et la valeur de hachage recalculée sont égales ($H(M) = H'(M)$). Si cette équation est vérifiée, il est mathématiquement prouvé qu&amp;rsquo;« aucun bit du fichier n&amp;rsquo;a été altéré après la signature ».&lt;/p>
&lt;h2 id="6-lobstacle-majeur--le--piège-des-certificats-auto-signés-">6. L&amp;rsquo;obstacle majeur : le « piège des certificats auto-signés »
&lt;/h2>&lt;p>Même si la preuve mathématique ci-dessus est parfaite, Windows 11 n&amp;rsquo;autorisera pas l&amp;rsquo;installation pour autant. En effet, il est nécessaire de vérifier la « Chaîne de confiance » (Chain of Trust) pour répondre à la question : « Le propriétaire de cette clé publique (certificat) est-il vraiment l&amp;rsquo;organisation ou la personne sûre qu&amp;rsquo;il prétend être ? ».&lt;/p>
&lt;p>Si le certificat a été émis par une autorité de certification racine (Root CA) publique préalablement reconnue par l&amp;rsquo;OS, telle que VeriSign ou DigiCert, l&amp;rsquo;installation se déroulera sans problème (les applications distribuées via le Microsoft Store sont également reconnues par le certificat racine de Microsoft).&lt;/p>
&lt;p>Cependant, dans des cas comme le développement en cours ou les outils internes exclusifs à une entreprise, où le coût d&amp;rsquo;achat d&amp;rsquo;un certificat public ne peut être justifié, les développeurs émettent leurs propres certificats. C&amp;rsquo;est ce qu&amp;rsquo;on appelle un « Certificat auto-signé » (Self-Signed Certificate).&lt;/p>
&lt;p>Le diagramme de séquence ci-dessous montre le comportement de l&amp;rsquo;OS lorsqu&amp;rsquo;on tente d&amp;rsquo;installer un package MSIX signé avec un certificat auto-signé.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;Utilisateur (Windows 11)&amp;#34;
participant P as &amp;#34;Programme d&amp;#39;installation MSIX&amp;#34;
participant C as &amp;#34;Magasin de certificats Windows&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;Double clic sur le fichier .msix&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Lecture de AppxSignature.p7x&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Extraction de la signature et du certificat&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Vérification mathématique (Les hachages correspondent-ils ?)&amp;#34;
P-&amp;gt;&amp;gt;C: &amp;#34;Vérification de la confiance du certificat de l&amp;#39;éditeur&amp;#34;
alt &amp;#34;Le certificat est dans le magasin des AC racines de confiance&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;Confiance vérifiée avec succès&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Demander l&amp;#39;installation (Le bouton d&amp;#39;installation est ACTIF)&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;Clique sur Installer&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Installation réussie&amp;#34;
else &amp;#34;Le certificat n&amp;#39;est PAS de confiance (Le piège)&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;Échec de la vérification de confiance (0x800B0109)&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Afficher l&amp;#39;erreur : Une chaîne de certificats a été traitée, mais s&amp;#39;est terminée par un certificat racine qui n&amp;#39;est pas approuvé&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Le bouton d&amp;#39;installation est DÉSACTIVÉ&amp;#34;
end
&lt;/pre>
&lt;p>C&amp;rsquo;est exactement ça, le « piège ». Bien que le développeur ait créé et correctement signé le package, Windows 11 par défaut ne connaît pas (ne fait pas confiance à) ce certificat auto-signé, bloquant ainsi l&amp;rsquo;installation avec le code d&amp;rsquo;erreur &lt;code>0x800B0109&lt;/code>. Le bouton &amp;ldquo;Installer&amp;rdquo; de l&amp;rsquo;installateur est grisé et on ne peut pas cliquer dessus.&lt;/p>
&lt;p>De nombreux développeurs se heurtent à cette erreur et s&amp;rsquo;embourbent à réécrire leurs fichiers manifestes en se disant que &amp;ldquo;le MSIX est plein de bugs&amp;rdquo; ou que &amp;ldquo;les paramètres doivent être mauvais&amp;rdquo;, mais le problème ne réside pas dans la structure du package, mais dans la présence ou l&amp;rsquo;absence du certificat dans le magasin de certificats (Certificate Store) de l&amp;rsquo;OS.&lt;/p>
&lt;h2 id="7-solution--création-et-déploiement-dun-certificat-auto-signé-avec-powershell">7. Solution : Création et déploiement d&amp;rsquo;un certificat auto-signé avec PowerShell
&lt;/h2>&lt;p>Pour résoudre ce problème, il faut exécuter les 2 étapes suivantes :&lt;/p>
&lt;ol>
&lt;li>Créer un certificat auto-signé valide et exporter un fichier PFX contenant la clé privée.&lt;/li>
&lt;li>Installer la partie clé publique du certificat créé (fichier CER) dans le magasin des &lt;strong>« Autorités de certification racines de confiance » (Trusted Root Certification Authorities) de tous les PC cibles&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;p>Cela peut être traité de manière fiable et automatique en utilisant PowerShell.&lt;/p>
&lt;h3 id="étape-1--création-et-exportation-du-certificat-auto-signé">Étape 1 : Création et exportation du certificat auto-signé
&lt;/h3>&lt;p>Ouvrez d&amp;rsquo;abord PowerShell avec les droits d&amp;rsquo;administrateur, et exécutez le script suivant pour créer le certificat. Ici, nous générons un certificat spécifique à la signature de code (Code Signing).&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;/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. Définition des paramètres&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$SubjectName&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CertStoreLocation&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;Cert:\CurrentUser\My&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"># 2. Génération du certificat auto-signé (Usage signature de code : 1.3.6.1.5.5.7.3.3)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Cert&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">New-SelfSignedCertificate&lt;/span> &lt;span class="n">-Type&lt;/span> &lt;span class="n">Custom&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-Subject&lt;/span> &lt;span class="nv">$SubjectName&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-KeyUsage&lt;/span> &lt;span class="n">DigitalSignature&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-FriendlyName&lt;/span> &lt;span class="s2">&amp;#34;MyCompany MSIX Signing Cert&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="n">-CertStoreLocation&lt;/span> &lt;span class="nv">$CertStoreLocation&lt;/span> &lt;span class="p">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">-TextExtension&lt;/span> &lt;span class="vm">@&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;2.5.29.37={text}1.3.6.1.5.5.7.3.3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;2.5.29.19={text}&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="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Le certificat a été généré. Empreinte (Thumbprint) : &lt;/span>&lt;span class="p">$(&lt;/span>&lt;span class="nv">$Cert&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Thumbprint&lt;/span>&lt;span class="p">)&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"># 3. Création du mot de passe pour l&amp;#39;exportation du PFX (incluant la clé privée)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$Password&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">ConvertTo-SecureString&lt;/span> &lt;span class="n">-String&lt;/span> &lt;span class="s2">&amp;#34;YourSecurePassword123!&amp;#34;&lt;/span> &lt;span class="n">-Force&lt;/span> &lt;span class="n">-AsPlainText&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. Exportation du fichier PFX (Pour la signature avec SignTool)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$PfxPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.pfx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-PfxCertificate&lt;/span> &lt;span class="n">-Cert&lt;/span> &lt;span class="nv">$Cert&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$PfxPath&lt;/span> &lt;span class="n">-Password&lt;/span> &lt;span class="nv">$Password&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. Exportation du fichier CER (Clé publique uniquement, pour l&amp;#39;installation sur les PC clients)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CerPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.cer&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Export-Certificate&lt;/span> &lt;span class="n">-Cert&lt;/span> &lt;span class="nv">$Cert&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$CerPath&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Utilisez le fichier &lt;code>$PfxPath&lt;/code> créé ici pour signer le package MSIX.&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;/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">SignTool.exe sign /fd SHA256 /a /f &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.pfx&amp;#34;&lt;/span> /p &lt;span class="s2">&amp;#34;YourSecurePassword123!&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="étape-2--installation-du-certificat-sur-les-pc-clients-désamorçage-du-piège">Étape 2 : Installation du certificat sur les PC clients (Désamorçage du piège)
&lt;/h3>&lt;p>Si vous apportez le MSIX signé sur un autre PC (ou une machine virtuelle) et que vous double-cliquez dessus, il ne s&amp;rsquo;installera toujours pas, comme expliqué précédemment. Auparavant (ou en même temps), vous devez installer le fichier &lt;code>$CerPath&lt;/code> exporté tout à l&amp;rsquo;heure dans les « Autorités de certification racines de confiance » de l&amp;rsquo;« Ordinateur local ».&lt;/p>
&lt;p>Pour ce faire, ouvrez PowerShell avec des &lt;strong>droits d&amp;rsquo;administrateur&lt;/strong> sur le PC de déploiement et exécutez la commande 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;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"># Chemin vers le fichier CER&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$CerPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;C:\Path\To\Output\MyCompanyCert.cer&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"># Importation dans les « Autorités de certification racines de confiance » de la machine locale&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">Import-Certificate&lt;/span> &lt;span class="n">-FilePath&lt;/span> &lt;span class="nv">$CerPath&lt;/span> &lt;span class="n">-CertStoreLocation&lt;/span> &lt;span class="s2">&amp;#34;Cert:\LocalMachine\Root&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="nb">Write-Host&lt;/span> &lt;span class="s2">&amp;#34;Le certificat a été installé dans les autorités de certification racines de confiance.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>[!CAUTION]
Les droits d&amp;rsquo;administrateur sont obligatoires pour ajouter un certificat au magasin des autorités racines de l&amp;rsquo;« Ordinateur local » (&lt;code>LocalMachine&lt;/code>). Soyez conscient que si vous le mettez dans le magasin personnel de l&amp;rsquo;utilisateur (&lt;code>CurrentUser&lt;/code>), il se peut qu&amp;rsquo;il ne soit pas reconnu en raison du contexte de privilèges du Programme d&amp;rsquo;installation d&amp;rsquo;application (App Installer).&lt;/p>
&lt;/blockquote>
&lt;p>Immédiatement après l&amp;rsquo;exécution réussie de ce script, essayez de double-cliquer à nouveau sur le fichier MSIX qui provoquait une erreur précédemment. Comme par magie, le message d&amp;rsquo;erreur devrait disparaître et un bouton &amp;ldquo;Installer&amp;rdquo; actif bleu vif devrait s&amp;rsquo;afficher. Le « piège des certificats auto-signés » est désormais complètement surmonté.&lt;/p>
&lt;h2 id="8-déploiement-et-bonnes-pratiques-en-environnement-dentreprise">8. Déploiement et bonnes pratiques en environnement d&amp;rsquo;entreprise
&lt;/h2>&lt;p>Alors que les étapes ci-dessus sont suffisantes pour les tests locaux des développeurs, lorsque vous déployez des applications chargées latéralement sur des dizaines ou des centaines de PC au sein d&amp;rsquo;une entreprise, il n&amp;rsquo;est pas réaliste de demander à chaque utilisateur d&amp;rsquo;exécuter un script d&amp;rsquo;installation de certificat, et cela comporte également des risques de sécurité.&lt;/p>
&lt;p>Les bonnes pratiques dans un environnement d&amp;rsquo;entreprise sont les suivantes :&lt;/p>
&lt;h3 id="1-utilisation-des-stratégies-de-groupe-active-directory-gpo">1. Utilisation des stratégies de groupe Active Directory (GPO)
&lt;/h3>&lt;p>Si votre entreprise dispose d&amp;rsquo;un Active Directory, vous pouvez utiliser la stratégie « Stratégies de clé publique » de la GPO pour distribuer automatiquement le certificat auto-signé (fichier CER) dans le magasin des « Autorités de certification racines de confiance » de tous les PC joints au domaine. Ainsi, les employés peuvent installer l&amp;rsquo;application par un simple double-clic sur le fichier MSIX dans un dossier partagé, sans même avoir à se soucier du certificat.&lt;/p>
&lt;h3 id="2-déploiement-via-microsoft-intune-mdm">2. Déploiement via Microsoft Intune (MDM)
&lt;/h3>&lt;p>Les environnements modernes utilisent Microsoft Intune pour la gestion des appareils. Dans Intune, vous pouvez utiliser la fonctionnalité des « Profils de configuration » pour pousser et déployer des certificats de confiance (.cer) sur les points de terminaison. Ensuite, le package MSIX lui-même peut être déployé sous forme d&amp;rsquo;installation silencieuse en tant qu&amp;rsquo;application LOB (Line of Business).&lt;/p>
&lt;h3 id="3-mise-à-jour-automatique-via-les-fichiers-app-installer-appinstaller">3. Mise à jour automatique via les fichiers App Installer (.appinstaller)
&lt;/h3>&lt;p>MSIX possède une fonctionnalité puissante pour automatiser les mises à jour des applications. En créant un fichier &lt;code>.appinstaller&lt;/code> basé sur XML et en le plaçant sur un serveur Web ou un dossier partagé SMB, vous pouvez vérifier en arrière-plan la présence d&amp;rsquo;une nouvelle version de MSIX au lancement de l&amp;rsquo;application et appliquer automatiquement la mise à jour.&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;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-xml" data-lang="xml">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;AppInstaller&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Uri=&lt;/span>&lt;span class="s">&amp;#34;https://internal.mycompany.com/apps/AwesomeApp.appinstaller&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">xmlns=&lt;/span>&lt;span class="s">&amp;#34;http://schemas.microsoft.com/appx/appinstaller/2018&amp;#34;&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;MainPackage&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Name=&lt;/span>&lt;span class="s">&amp;#34;MyCompany.AwesomeApp&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Publisher=&lt;/span>&lt;span class="s">&amp;#34;CN=MyCompany Self-Signed, O=MyCompany&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Version=&lt;/span>&lt;span class="s">&amp;#34;1.0.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">ProcessorArchitecture=&lt;/span>&lt;span class="s">&amp;#34;x64&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="na">Uri=&lt;/span>&lt;span class="s">&amp;#34;https://internal.mycompany.com/apps/AwesomeApp_1.0.0.0_x64.msix&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;UpdateSettings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;OnLaunch&lt;/span> &lt;span class="na">HoursBetweenUpdateChecks=&lt;/span>&lt;span class="s">&amp;#34;0&amp;#34;&lt;/span> &lt;span class="nt">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/UpdateSettings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/AppInstaller&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>En distribuant et en faisant installer ce fichier aux utilisateurs, il suffira par la suite de remplacer le fichier MSIX sur le serveur et de mettre à jour le numéro de version dans le &lt;code>.appinstaller&lt;/code> pour que les applications de tous les utilisateurs soient automatiquement mises à jour.&lt;/p>
&lt;h2 id="9-dépannage--erreurs-fréquentes-liées-aux-certificats">9. Dépannage : erreurs fréquentes liées aux certificats
&lt;/h2>&lt;p>Enfin, voici un résumé des autres erreurs courantes qui peuvent survenir en lien avec les certificats et la signature, ainsi que leurs solutions.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>0x800B0101&lt;/strong> : Le certificat utilisé pour la signature a expiré. Soit vous émettez un nouveau certificat, soit vous utilisez un serveur d&amp;rsquo;horodatage (ex : &lt;code>http://timestamp.digicert.com&lt;/code>) lors de la signature pour prouver qu&amp;rsquo;elle a eu lieu pendant la période de validité du certificat (avec un horodatage, la signature est considérée comme valide même si le certificat lui-même a expiré).&lt;/li>
&lt;li>&lt;strong>0x80080204&lt;/strong> : La valeur du &lt;code>Publisher&lt;/code> décrite dans &lt;code>AppxManifest.xml&lt;/code> ne correspond pas parfaitement à la valeur du &lt;code>Subject&lt;/code> du certificat. Vérifiez strictement s&amp;rsquo;ils correspondent exactement en tant que chaînes de caractères, y compris la présence ou l&amp;rsquo;absence d&amp;rsquo;espaces après les virgules.&lt;/li>
&lt;li>&lt;strong>Vérification de l&amp;rsquo;Observateur d&amp;rsquo;événements&lt;/strong> : Pour trouver la cause plus détaillée de l&amp;rsquo;erreur, il est très important d&amp;rsquo;ouvrir l&amp;rsquo;Observateur d&amp;rsquo;événements Windows et de vérifier les journaux sous &amp;ldquo;Journaux des applications et des services&amp;rdquo; -&amp;gt; &amp;ldquo;Microsoft&amp;rdquo; -&amp;gt; &amp;ldquo;Windows&amp;rdquo; -&amp;gt; &amp;ldquo;AppxPackagingOM&amp;rdquo; ou &amp;ldquo;AppXDeployment-Server&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;h2 id="10-conclusion">10. Conclusion
&lt;/h2>&lt;p>L&amp;rsquo;empaquetage MSIX pour Windows 11 est une technologie puissante qui améliore considérablement la gestion du cycle de vie des applications. Elle vous libère du Win Rot et de l&amp;rsquo;enfer des DLL, offrant ainsi un environnement propre et sécurisé aux utilisateurs.&lt;/p>
&lt;p>D&amp;rsquo;autre part, en raison des modèles de sécurité stricts, une compréhension approfondie des signatures numériques et de la « chaîne de confiance » des certificats est essentielle. Le « piège des certificats auto-signés » est un rite de passage que rencontrent presque systématiquement les développeurs abordant la technologie MSIX pour la première fois. En comprenant les mécanismes de génération, d&amp;rsquo;exportation et d&amp;rsquo;importation appropriée des certificats dans les magasins expliqués dans cet article, et en automatisant ces processus à l&amp;rsquo;aide de scripts ou de GPO, vous pourrez réaliser un déploiement fluide en tirant pleinement parti du potentiel de MSIX.&lt;/p>
&lt;p>N&amp;rsquo;hésitez pas à utiliser ces connaissances pour créer un environnement de distribution d&amp;rsquo;applications Windows de nouvelle génération propre.&lt;/p></description></item><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>