<?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/de/tags/windows-11/</link><description>Recent content in Windows 11 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 22:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/de/tags/windows-11/index.xml" rel="self" type="application/rss+xml"/><item><title>Erstellung von MSIX-Paketen für Windows 11 und die Falle der selbstsignierten Zertifikate</title><link>http://kenji.blog/de/p/windows-11-msix-packaging-guide/</link><pubDate>Sat, 12 Sep 2026 22:00:00 +0900</pubDate><guid>http://kenji.blog/de/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 Erstellung von MSIX-Paketen für Windows 11 und die Falle der selbstsignierten Zertifikate" />&lt;p>Im Zeitalter von Windows 11 wird &amp;ldquo;MSIX&amp;rdquo; zunehmend zur Standardwahl als Verteilungsformat für Anwendungen. Herkömmliche Installer wie MSI oder EXE wiesen viele Herausforderungen auf, aber von MSIX wird erwartet, dass es als Paketierungstechnologie der nächsten Generation diese löst. Wenn Entwickler jedoch versuchen, ein MSIX-Paket zu erstellen und Sideloading (Querladen) in einer Organisation oder Testumgebung durchzuführen, tappen sie oft in die „Falle des selbstsignierten Zertifikats“.&lt;/p>
&lt;p>In diesem Artikel werden wir von den technischen Details von MSIX über die Methoden zur Paketerstellung mit Visual Studio und Kommandozeilenwerkzeugen bis hin zu den Ursachen und Lösungen für Fehler im Zusammenhang mit selbstsignierten Zertifikaten, mit denen viele Entwickler konfrontiert werden, alles sehr detailliert erläutern. Wir streben an, dass dies ein unverzichtbarer Leitfaden für Windows-App-Entwickler, Infrastrukturadministratoren und Paketierungsverantwortliche wird.&lt;/p>
&lt;h2 id="1-was-ist-msix-ein-vergleich-mit-herkömmlichen-msiexe">1. Was ist MSIX? Ein Vergleich mit herkömmlichen MSI/EXE
&lt;/h2>&lt;p>MSIX ist das neueste von Microsoft bereitgestellte Anwendungspaketformat für Windows. Es integriert alle hervorragenden Funktionen und Konzepte von MSI (Microsoft Installer), benutzerdefinierten .exe-basierten Installern, App-V (Application Virtualization) und AppX (Universal Windows Platform App Package), die seit Windows 8 eingeführt wurden, und entwickelt sie weiter, um den modernen Anforderungen an Sicherheit und Bereitstellung gerecht zu werden.&lt;/p>
&lt;h3 id="herausforderungen-bei-herkömmlichen-installern-msiexe">Herausforderungen bei herkömmlichen Installern (MSI/EXE)
&lt;/h3>&lt;p>MSI und EXE, die seit vielen Jahren als Standardinstallationsformate unter Windows verwendet werden, wiesen folgende grundlegende Probleme auf:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Win Rot (Windows-Degradation)&lt;/strong>: Wenn Anwendungen wiederholt installiert und deinstalliert werden, bleiben unnötige Schlüssel in der Registrierung zurück und DLLs verbleiben im Systemordner (z.B. &lt;code>C:\Windows\System32&lt;/code>). Dies führt dazu, dass das Betriebssystem selbst allmählich langsamer und instabiler wird.&lt;/li>
&lt;li>&lt;strong>DLL-Höllen (DLL Hell)&lt;/strong>: Wenn mehrere Anwendungen versuchen, DLLs mit demselben Namen (aber unterschiedlichen Versionen) im gemeinsamen Systemverzeichnis zu installieren, überschreibt die später installierte App die vorhandene DLL, wodurch die zuvor installierte App nicht mehr richtig funktioniert.&lt;/li>
&lt;li>&lt;strong>Instabilität durch benutzerdefinierte Aktionen&lt;/strong>: In MSI-Paketen können beliebige Skripte und Codes, die als „benutzerdefinierte Aktionen“ bezeichnet werden, während der Installation und Deinstallation mit Systemrechten ausgeführt werden. Dies barg das Risiko, dass der Installer auf halbem Weg abstürzt oder unerwartete Einstellungsänderungen am System verursacht.&lt;/li>
&lt;/ol>
&lt;h3 id="lösungen-durch-die-containerisierungsarchitektur-von-msix">Lösungen durch die Containerisierungsarchitektur von MSIX
&lt;/h3>&lt;p>MSIX löst diese Probleme, indem Anwendungen in leichtgewichtigen „Containern“ ausgeführt werden. Dieser Containerisierungsansatz bietet folgende enorme Vorteile:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Saubere Deinstallation&lt;/strong>: Mit MSIX installierte Apps schreiben in das Dateisystem und die Registrierung auf virtualisierte Weise (VFS: Virtual File System, VReg: Virtual Registry). Daher wird bei der Deinstallation dieser gesamte virtualisierte Container gelöscht, sodass keine Überreste (Müll) im System verbleiben. Es verhindert Win Rot vollständig.&lt;/li>
&lt;li>&lt;strong>Isolierung und Sicherheit (Isolation)&lt;/strong>: Jede App läuft in ihrer eigenen Umgebung und kann die DLLs oder Ressourcen anderer Apps nicht direkt zerstören. Das befreit uns von der DLL-Hölle.&lt;/li>
&lt;li>&lt;strong>Optimierung der Netzwerkbandbreite&lt;/strong>: Der Update-Mechanismus von MSIX ist hervorragend und unterstützt differenzielle Updates auf Blockebene (Differential Update). Da nur die wenigen geänderten Blöcke der Binärdaten heruntergeladen werden, wird die Netzwerklast auch bei der Aktualisierung großer Anwendungen auf ein Minimum reduziert.&lt;/li>
&lt;li>&lt;strong>Zuverlässiger Installationsstatus&lt;/strong>: Das Paket enthält eine Manifestdatei (&lt;code>AppxManifest.xml&lt;/code>), und die Installationstransaktionen werden auf Betriebssystemebene streng verwaltet. Im Falle eines Fehlers wird der ursprüngliche Zustand vollständig wiederhergestellt (Rollback).&lt;/li>
&lt;/ul>
&lt;h2 id="2-überblick-über-die-msix-paketerstellung-und-toolchain">2. Überblick über die MSIX-Paketerstellung und Toolchain
&lt;/h2>&lt;p>Es gibt zwei Hauptansätze zur Erstellung eines MSIX-Pakets. Der eine besteht darin, die integrierte Entwicklungsumgebung (IDE) von Visual Studio zu verwenden, und der andere darin, die im Windows SDK enthaltenen Befehlszeilentools (&lt;code>MakeAppx.exe&lt;/code> und &lt;code>SignTool.exe&lt;/code>) zu nutzen.&lt;/p>
&lt;p>Das folgende Mermaid-Diagramm zeigt den Prozess von den Quelldateien bis zur Generierung des endgültigen signierten MSIX-Pakets.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Quelldateien (EXE, DLL, Assets, usw.)&amp;#34;] --&amp;gt; B[&amp;#34;AppxManifest.xml (Manifestdefinition)&amp;#34;]
B --&amp;gt; C[&amp;#34;MakeAppx.exe (MSIX-Packager)&amp;#34;]
C --&amp;gt; D[&amp;#34;Unsigniertes MSIX-Paket (.msix)&amp;#34;]
E[&amp;#34;Digitales Zertifikat (.pfx)&amp;#34;] --&amp;gt; F[&amp;#34;SignTool.exe (Digitaler Signierer)&amp;#34;]
D --&amp;gt; F
F --&amp;gt; G[&amp;#34;Signiertes MSIX-Paket (Bereit zur Bereitstellung)&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>Wie aus diesem Prozess ersichtlich ist, reicht es nicht aus, einfach Dateien zu sammeln und zu bündeln (Paketierung); der Schritt der &amp;ldquo;digitalen Signatur&amp;rdquo; ist zwingend erforderlich. Windows 11 erlaubt aus Sicherheitsgründen die Installation von unsignierten MSIX-Paketen überhaupt nicht.&lt;/p>
&lt;h2 id="3-ansatz-a-erstellung-von-msix-mit-visual-studio">3. Ansatz A: Erstellung von MSIX mit Visual Studio
&lt;/h2>&lt;p>Die einfachste und gängigste Methode besteht darin, das &amp;ldquo;Windows Application Packaging Project (WAP)&amp;rdquo; in Visual Studio zu verwenden. Mithilfe dieser Projektvorlage können WPF-, Windows Forms-, WinUI 3- und sogar ältere C++-Win32-Apps problemlos in MSIX konvertiert werden.&lt;/p>
&lt;h3 id="schritt-für-schritt-anleitung">Schritt-für-Schritt-Anleitung
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>Hinzufügen eines WAP-Projekts&lt;/strong>: Klicken Sie mit der rechten Maustaste auf eine vorhandene Visual Studio-Projektmappe, wählen Sie &amp;ldquo;Neues Projekt hinzufügen&amp;rdquo; und dann &amp;ldquo;Windows Application Packaging Project&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Auswahl der Zielplattform&lt;/strong>: Geben Sie die minimale und die Zielversion von Windows 10/11 an, die von der App unterstützt werden.&lt;/li>
&lt;li>&lt;strong>Anwendungsreferenz&lt;/strong>: Klicken Sie mit der rechten Maustaste auf den Knoten &amp;ldquo;Anwendungen&amp;rdquo; im Paketierungsprojekt, wählen Sie &amp;ldquo;Verweis hinzufügen&amp;rdquo; und wählen Sie das Hauptprojekt (z. B. ein WPF-Projekt), das Sie verpacken möchten.&lt;/li>
&lt;li>&lt;strong>Manifest-Einstellungen&lt;/strong>: Doppelklicken Sie auf die Datei &lt;code>Package.appxmanifest&lt;/code>, um den visuellen Designer zu öffnen. Hier legen Sie den Anzeigenamen der App, die Beschreibung, das Logobild und vor allem den &amp;ldquo;Paketnamen (Identity Name)&amp;rdquo; und den &amp;ldquo;Herausgeber (Publisher)&amp;rdquo; fest.&lt;/li>
&lt;li>&lt;strong>Paketerstellung&lt;/strong>: Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie &amp;ldquo;Veröffentlichen&amp;rdquo; -&amp;gt; &amp;ldquo;App-Pakete erstellen&amp;rdquo;. Wenn Sie &amp;ldquo;Zum Querladen (Sideloading)&amp;rdquo; auswählen und die Architektur (x64, ARM64 usw.) angeben, übernimmt Visual Studio automatisch die Kompilierung, die Paketierung mit &lt;code>MakeAppx&lt;/code> sowie die Generierung und Signierung des selbstsignierten Zertifikats.&lt;/li>
&lt;/ol>
&lt;p>Das ist sehr nahtlos, aber wenn Sie das von Visual Studio automatisch generierte selbstsignierte Zertifikat (Test Certificate) verwenden, geraten Sie in die später beschriebene &amp;ldquo;Falle&amp;rdquo;.&lt;/p>
&lt;h2 id="4-ansatz-b-erstellung-über-die-kommandozeile-makeappxexe">4. Ansatz B: Erstellung über die Kommandozeile (MakeAppx.exe)
&lt;/h2>&lt;p>Für die Automatisierung in CI/CD-Pipelines oder für die manuelle Neuverpackung von Dateien aus vorhandenen Installern sind Kommandozeilenwerkzeuge erforderlich. Wenn das Windows SDK installiert ist, können Sie über die Eingabeaufforderung für Entwickler auf die folgenden Tools zugreifen.&lt;/p>
&lt;h3 id="1-vorbereitung-der-manifestdatei">1. Vorbereitung der Manifestdatei
&lt;/h3>&lt;p>Erstellen Sie im Stammverzeichnis des Pakets eine &lt;code>AppxManifest.xml&lt;/code>, die die grundlegenden Informationen enthält.&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>Hierbei ist es wichtig, dass der Wert von &lt;code>&amp;lt;Identity Publisher=&amp;quot;...&amp;quot; /&amp;gt;&lt;/code> exakt mit dem Subject des Zertifikats übereinstimmt, das später für die Signatur verwendet wird.&lt;/p>
&lt;h3 id="2-paketierung-mit-makeappx">2. Paketierung mit MakeAppx
&lt;/h3>&lt;p>Führen Sie den folgenden Befehl in der Eingabeaufforderung aus, um das Verzeichnis in eine MSIX-Datei zu packen.&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>Damit ist die unsignierte MSIX-Datei fertig, aber in diesem Zustand kann sie nicht unter Windows installiert werden.&lt;/p>
&lt;h2 id="5-mathematischer-hintergrund-der-digitalen-signatur-und-kryptographie">5. Mathematischer Hintergrund der digitalen Signatur und Kryptographie
&lt;/h2>&lt;p>Um zu verstehen, warum MSIX-Pakete eine Signatur benötigen, ist es notwendig, die kryptographischen Mechanismen hinter digitalen Signaturen zu verstehen. Eine digitale Signatur garantiert, dass das Paket &amp;ldquo;mit Sicherheit von dem angegebenen Herausgeber erstellt wurde (Authentifizierung)&amp;rdquo; und dass es &amp;ldquo;seit der Erstellung bis heute nicht von Dritten manipuliert wurde (Integrität)&amp;rdquo;.&lt;/p>
&lt;p>Für MSIX-Signaturen wird normalerweise eine Kombination aus RSA-Verschlüsselung und SHA-256 (Secure Hash Algorithm 256-bit) verwendet.&lt;/p>
&lt;h3 id="anwendung-der-hash-funktion">Anwendung der Hash-Funktion
&lt;/h3>&lt;p>Zunächst betrachten wir die gesamte Binärdatei (den Inhalt) des MSIX-Pakets als Nachricht $M$. Das Signatur-Tool (SignTool.exe) wendet die kryptographische Hash-Funktion SHA-256 auf diese Nachricht $M$ an, um einen Hash-Wert $H(M)$ fester Länge (256 Bit) zu berechnen.&lt;/p>
&lt;h3 id="generierung-der-signatur-herausgeber">Generierung der Signatur (Herausgeber)
&lt;/h3>&lt;p>Anschließend verwendet der Herausgeber seinen &amp;ldquo;privaten Schlüssel (Private Key)&amp;rdquo; $d$, um den Hash-Wert zu verschlüsseln und die digitale Signatur $\sigma$ zu generieren. Im Kontext des RSA-Algorithmus wird dies als modulare Potenzierung wie folgt ausgedrückt:&lt;/p>
$$ \sigma \equiv (H(M))^d \pmod n $$&lt;p>Hierbei ist $n$ der RSA-Modul (das Produkt zweier sehr großer Primzahlen). Ein Zertifikat (im X.509-Format), das diese Signatur $\sigma$ und den &amp;ldquo;öffentlichen Schlüssel (Public Key)&amp;rdquo; $e$ des Herausgebers enthält, wird als Teil des MSIX-Pakets (&lt;code>AppxSignature.p7x&lt;/code>) eingebettet.&lt;/p>
&lt;h3 id="validierung-der-signatur-windows-os">Validierung der Signatur (Windows OS)
&lt;/h3>&lt;p>Wenn ein Benutzer versucht, das MSIX-Paket zu installieren, extrahiert das Windows-Betriebssystem den öffentlichen Schlüssel $e$ aus dem Zertifikat im Paket und führt die folgende Berechnung durch, um den Hash-Wert $H'(M)$ wiederherzustellen:&lt;/p>
$$ H'(M) \equiv \sigma^e \pmod n $$&lt;p>Gleichzeitig berechnet das Betriebssystem den Hash-Wert $H(M)$ der gesamten heruntergeladenen MSIX-Paketnachricht $M$ selbst neu.
Schließlich wird überprüft, ob der wiederhergestellte Hash-Wert und der neu berechnete Hash-Wert gleich sind ($H(M) = H'(M)$). Wenn diese Gleichung erfüllt ist, ist mathematisch bewiesen, dass &amp;ldquo;die Datei seit der Signierung um kein einziges Bit verändert wurde&amp;rdquo;.&lt;/p>
&lt;h2 id="6-das-größte-hindernis-die-falle-des-selbstsignierten-zertifikats">6. Das größte Hindernis: Die &amp;ldquo;Falle des selbstsignierten Zertifikats&amp;rdquo;
&lt;/h2>&lt;p>Selbst wenn der oben genannte mathematische Beweis perfekt ist, erlaubt Windows 11 die Installation allein deshalb noch nicht. Das liegt daran, dass es die Vertrauenskette (Chain of Trust) überprüfen muss: „Ist der Besitzer dieses öffentlichen Schlüssels (Zertifikats) wirklich die sichere Organisation/Person, für die er sich ausgibt?“&lt;/p>
&lt;p>Wenn das Zertifikat von einer offiziellen Stammzertifizierungsstelle (Root CA) ausgestellt wurde, der das Betriebssystem von vornherein vertraut (wie VeriSign oder DigiCert), kann es ohne Probleme installiert werden (Apps, die über den Microsoft Store verteilt werden, werden ebenfalls durch Microsoft-Stammzertifikate vertraut).&lt;/p>
&lt;p>Wenn Entwickler jedoch die Kosten für den Kauf eines offiziellen Zertifikats scheuen (z. B. während der Entwicklung oder für firmeninterne Tools), stellen sie das Zertifikat selbst aus. Dies ist ein &amp;ldquo;selbstsigniertes Zertifikat (Self-Signed Certificate)&amp;rdquo;.&lt;/p>
&lt;p>Das folgende Sequenzdiagramm zeigt das Verhalten des Betriebssystems, wenn man versucht, ein mit einem selbstsignierten Zertifikat signiertes MSIX-Paket zu installieren.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
autonumber
participant U as &amp;#34;Benutzer (Windows 11)&amp;#34;
participant P as &amp;#34;MSIX App Installer&amp;#34;
participant C as &amp;#34;Windows Zertifikatsspeicher&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;Doppelklick auf die .msix-Datei&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Liest AppxSignature.p7x&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Extrahiert Signatur &amp;amp; Zertifikat&amp;#34;
P-&amp;gt;&amp;gt;P: &amp;#34;Überprüft Mathematik (Stimmen die Hashes überein?)&amp;#34;
P-&amp;gt;&amp;gt;C: &amp;#34;Überprüft Vertrauenswürdigkeit des Herausgeberzertifikats&amp;#34;
alt &amp;#34;Zertifikat befindet sich im Speicher vertrauenswürdiger Stammzertifizierungsstellen&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;Vertrauen erfolgreich verifiziert&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Fordert zur Installation auf (Installieren-Schaltfläche ist AKTIV)&amp;#34;
U-&amp;gt;&amp;gt;P: &amp;#34;Klickt auf Installieren&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Installation erfolgreich&amp;#34;
else &amp;#34;Zertifikat ist NICHT vertrauenswürdig (Die Falle)&amp;#34;
C--&amp;gt;&amp;gt;P: &amp;#34;Vertrauensüberprüfung fehlgeschlagen (0x800B0109)&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Zeigt Fehler: Zertifikatkette verarbeitet, endete aber in einem Stammzertifikat, das nicht vertrauenswürdig ist&amp;#34;
P-&amp;gt;&amp;gt;U: &amp;#34;Installieren-Schaltfläche ist DEAKTIVIERT&amp;#34;
end
&lt;/pre>
&lt;p>Genau das ist die &amp;ldquo;Falle&amp;rdquo;. Obwohl der Entwickler es selbst erstellt und korrekt signiert hat, kennt (vertraut) Windows 11 dieses selbstsignierte Zertifikat in seinem Standardzustand nicht, weshalb die Installation mit dem Fehlercode &lt;code>0x800B0109&lt;/code> blockiert wird. Die &amp;ldquo;Installieren&amp;rdquo;-Schaltfläche des Installers ist ausgegraut und kann nicht angeklickt werden.&lt;/p>
&lt;p>Viele Entwickler stoßen auf diesen Fehler und verheddern sich in dem Irrglauben, &amp;ldquo;MSIX sei voller Bugs&amp;rdquo; oder &amp;ldquo;die Einstellungen müssten falsch sein&amp;rdquo;, und schreiben Manifestdateien immer wieder neu. Das Problem liegt jedoch nicht an der Struktur des Pakets, sondern daran, ob es im Zertifikatsspeicher (Certificate Store) des Betriebssystems registriert ist oder nicht.&lt;/p>
&lt;h2 id="7-lösung-erstellen-und-bereitstellen-eines-selbstsignierten-zertifikats-mit-powershell">7. Lösung: Erstellen und Bereitstellen eines selbstsignierten Zertifikats mit PowerShell
&lt;/h2>&lt;p>Um dieses Problem zu lösen, müssen Sie die folgenden zwei Schritte zuverlässig ausführen:&lt;/p>
&lt;ol>
&lt;li>Erstellen Sie ein gültiges selbstsigniertes Zertifikat und exportieren Sie eine PFX-Datei, die den privaten Schlüssel enthält.&lt;/li>
&lt;li>Installieren Sie den öffentlichen Schlüsselteil (CER-Datei) des erstellten Zertifikats im Speicher der &lt;strong>&amp;ldquo;Vertrauenswürdigen Stammzertifizierungsstellen (Trusted Root Certification Authorities)&amp;rdquo; aller Ziel-PCs&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;p>Diese können mit PowerShell zuverlässig und automatisch verarbeitet werden.&lt;/p>
&lt;h3 id="schritt-1-erstellung-und-export-des-selbstsignierten-zertifikats">Schritt 1: Erstellung und Export des selbstsignierten Zertifikats
&lt;/h3>&lt;p>Starten Sie zunächst PowerShell mit Administratorrechten und führen Sie das folgende Skript aus, um das Zertifikat zu erstellen. Hier generieren wir ein Zertifikat, das speziell für das Code-Signing (Code Signing) vorgesehen ist.&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. Parameterdefinition&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. Generierung eines selbstsignierten Zertifikats (Für Code Signing: 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;Zertifikat wurde generiert. 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. Erstellen eines Passworts für den Export von PFX (einschließlich privatem Schlüssel)&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. Exportieren der PFX-Datei (Zum Signieren mit 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. Exportieren der CER-Datei (Nur öffentlicher Schlüssel, für die Installation auf Client-PCs)&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>Verwenden Sie die hier erstellte Datei &lt;code>$PfxPath&lt;/code>, um das MSIX-Paket zu signieren.&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="schritt-2-installation-des-zertifikats-auf-dem-client-pc-entschärfung-der-falle">Schritt 2: Installation des Zertifikats auf dem Client-PC (Entschärfung der Falle)
&lt;/h3>&lt;p>Selbst wenn Sie das signierte MSIX auf einen anderen PC (oder in eine virtuelle Umgebung) übertragen und doppelklicken, kann es wie oben erwähnt nicht installiert werden. Vorab (oder gleichzeitig) müssen Sie die soeben exportierte Datei &lt;code>$CerPath&lt;/code> im Speicher &amp;ldquo;Vertrauenswürdige Stammzertifizierungsstellen&amp;rdquo; des &amp;ldquo;Lokalen Computers&amp;rdquo; installieren.&lt;/p>
&lt;p>Öffnen Sie dazu PowerShell mit &lt;strong>Administratorrechten&lt;/strong> auf dem Ziel-PC und führen Sie den folgenden Befehl aus.&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"># Pfad der CER-Datei&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"># In &amp;#34;Vertrauenswürdige Stammzertifizierungsstellen&amp;#34; des lokalen Rechners importieren&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;Zertifikat erfolgreich in den vertrauenswürdigen Stammzertifizierungsstellen installiert.&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]
Das Hinzufügen zum Stammzertifizierungsstellen-Speicher des &amp;ldquo;Lokalen Computers&amp;rdquo; (&lt;code>LocalMachine&lt;/code>) erfordert Administratorrechte. Beachten Sie, dass es möglicherweise aufgrund des Berechtigungskontexts des App Installers nicht erkannt wird, wenn es nur im Speicher des einzelnen Benutzers (&lt;code>CurrentUser&lt;/code>) abgelegt wird.&lt;/p>
&lt;/blockquote>
&lt;p>Direkt nach erfolgreicher Ausführung dieses Skripts versuchen Sie erneut, auf die MSIX-Datei doppelt zu klicken, die zuvor einen Fehler verursacht hat. Wie durch Magie sollte die Fehlermeldung verschwinden und eine leuchtend blaue, aktive &amp;ldquo;Installieren&amp;rdquo;-Schaltfläche angezeigt werden. Damit haben Sie die &amp;ldquo;Falle des selbstsignierten Zertifikats&amp;rdquo; vollständig überwunden.&lt;/p>
&lt;h2 id="8-betrieb-und-best-practices-in-unternehmensumgebungen">8. Betrieb und Best Practices in Unternehmensumgebungen
&lt;/h2>&lt;p>Für lokale Tests durch Entwickler ist das obige Verfahren ausreichend. Wenn Sie jedoch Sideloading-Apps auf Dutzenden oder Hunderten von PCs im Unternehmen bereitstellen, ist es unrealistisch und mit Sicherheitsrisiken verbunden, jeden Benutzer das Skript zur Zertifikatsinstallation ausführen zu lassen.&lt;/p>
&lt;p>Best Practices in Unternehmensumgebungen sind wie folgt:&lt;/p>
&lt;h3 id="1-nutzung-von-active-directory-gruppenrichtlinien-gpo">1. Nutzung von Active Directory Gruppenrichtlinien (GPO)
&lt;/h3>&lt;p>Wenn in Ihrem Unternehmen Active Directory bereitgestellt ist, können Sie die „Richtlinien für öffentliche Schlüssel“ der GPO verwenden, um selbstsignierte Zertifikate (CER-Dateien) automatisch an die „Vertrauenswürdigen Stammzertifizierungsstellen“ aller in die Domäne eingebundenen PCs zu verteilen. Dadurch können Mitarbeiter das MSIX-Paket in einem freigegebenen Ordner einfach doppelklicken und installieren, ohne sich um Zertifikate kümmern zu müssen.&lt;/p>
&lt;h3 id="2-bereitstellung-über-microsoft-intune-mdm">2. Bereitstellung über Microsoft Intune (MDM)
&lt;/h3>&lt;p>In modernen Umgebungen wird Microsoft Intune für die Geräteverwaltung verwendet. Mit Intune können Sie die Funktion „Konfigurationsprofile“ verwenden, um vertrauenswürdige Zertifikate (.cer) an Endpunkte zu pushen. Anschließend ist es möglich, das MSIX-Paket selbst als LOB-Anwendung (Line of Business) für eine stille Installation (Silent Install) bereitzustellen.&lt;/p>
&lt;h3 id="3-automatische-updates-über-app-installer-dateien-appinstaller">3. Automatische Updates über App Installer-Dateien (.appinstaller)
&lt;/h3>&lt;p>MSIX verfügt über eine leistungsstarke Funktion zur Automatisierung von App-Updates. Indem Sie eine XML-basierte &lt;code>.appinstaller&lt;/code>-Datei erstellen und auf einem Webserver oder einer SMB-Freigabe platzieren, kann die App beim Start im Hintergrund prüfen, ob eine neue Version von MSIX verfügbar ist, und das Update automatisch anwenden.&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>Indem Sie diese Datei an Benutzer verteilen und installieren lassen, werden die Apps aller Benutzer fortan automatisch aktualisiert, indem Sie einfach die MSIX-Datei auf dem Server austauschen und die Versionsnummer in &lt;code>.appinstaller&lt;/code> aktualisieren.&lt;/p>
&lt;h2 id="9-fehlerbehebung-häufige-zertifikatsfehler">9. Fehlerbehebung: Häufige Zertifikatsfehler
&lt;/h2>&lt;p>Abschließend fassen wir andere häufige Fehler und Lösungen im Zusammenhang mit Zertifikaten und Signaturen zusammen.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>0x800B0101&lt;/strong>: Das zur Signatur verwendete Zertifikat ist abgelaufen. Stellen Sie das Zertifikat neu aus oder verwenden Sie beim Signieren einen Zeitstempelserver (z. B. &lt;code>http://timestamp.digicert.com&lt;/code>), um zu beweisen, dass die Signatur während der Gültigkeitsdauer des Zertifikats vorgenommen wurde (wenn ein Zeitstempel angehängt wird, gilt die Signatur als gültig, auch wenn das Zertifikat selbst abläuft).&lt;/li>
&lt;li>&lt;strong>0x80080204&lt;/strong>: Der in der &lt;code>AppxManifest.xml&lt;/code> angegebene &lt;code>Publisher&lt;/code>-Wert und der &lt;code>Subject&lt;/code>-Wert des Zertifikats stimmen nicht exakt überein. Überprüfen Sie genau auf eine vollständige Übereinstimmung der Zeichenfolge, einschließlich des Vorhandenseins von Leerzeichen nach Kommas usw.&lt;/li>
&lt;li>&lt;strong>Überprüfen der Ereignisanzeige&lt;/strong>: Um detailliertere Fehlerursachen zu untersuchen, ist es sehr wichtig, die Windows-Ereignisanzeige zu öffnen und die Protokolle unter &amp;ldquo;Anwendungs- und Dienstprotokolle&amp;rdquo; -&amp;gt; &amp;ldquo;Microsoft&amp;rdquo; -&amp;gt; &amp;ldquo;Windows&amp;rdquo; -&amp;gt; &amp;ldquo;AppxPackagingOM&amp;rdquo; oder &amp;ldquo;AppXDeployment-Server&amp;rdquo; zu überprüfen.&lt;/li>
&lt;/ul>
&lt;h2 id="10-zusammenfassung">10. Zusammenfassung
&lt;/h2>&lt;p>Die MSIX-Paketierung für Windows 11 ist eine leistungsstarke Technologie, die das Lebenszyklusmanagement von Anwendungen drastisch verbessert. Sie befreit uns von Win Rot und DLL-Höllen und bietet Benutzern eine saubere und sichere Umgebung.&lt;/p>
&lt;p>Andererseits ist aufgrund des verschärften Sicherheitsmodells ein tiefes Verständnis von digitalen Signaturen und der &amp;ldquo;Vertrauenskette&amp;rdquo; von Zertifikaten unerlässlich. Die &amp;ldquo;Falle des selbstsignierten Zertifikats&amp;rdquo; ist eine Hürde, auf die Entwickler, die sich zum ersten Mal mit der MSIX-Technologie befassen, fast unweigerlich stoßen. Indem Sie die Mechanismen der Zertifikatsgenerierung, des Exports und des ordnungsgemäßen Imports in den Speicher verstehen und Skripte oder GPOs zur Automatisierung nutzen, wie in diesem Artikel erläutert, können Sie eine reibungslose Bereitstellung erreichen, die das Potenzial von MSIX voll ausschöpft.&lt;/p>
&lt;p>Nutzen Sie dieses Wissen unbedingt, um eine saubere Windows-Anwendungsverteilungsumgebung der nächsten Generation aufzubauen.&lt;/p></description></item><item><title>Grundlagen der Windows-Registrierung und Methoden zur programmierbaren, sicheren Bearbeitung</title><link>http://kenji.blog/de/p/windows-registry-safe-programmable-editing/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/de/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 Grundlagen der Windows-Registrierung und Methoden zur programmierbaren, sicheren Bearbeitung" />&lt;h1 id="grundlagen-der-windows-registrierung-und-methoden-zur-programmierbaren-sicheren-bearbeitung">Grundlagen der Windows-Registrierung und Methoden zur programmierbaren, sicheren Bearbeitung
&lt;/h1>&lt;p>Im Windows-Betriebssystem ist die „Registrierung“ (Registry) eine riesige hierarchische Datenbank, die verschiedene Einstellungen für das System und die Anwendungen speichert. In diesem Artikel erklären wir die grundlegende Architektur der Windows-Registrierung sowie Methoden zur programmierbaren und sicheren Bearbeitung der Registrierung mithilfe von PowerShell und C# sehr detailliert.&lt;/p>
&lt;h2 id="1-einführung-geschichte-und-entwicklung-der-windows-registrierung">1. Einführung: Geschichte und Entwicklung der Windows-Registrierung
&lt;/h2>&lt;p>In den frühen Versionen von Windows (Windows 3.x-Ära) wurden System- und Anwendungseinstellungen hauptsächlich in &lt;code>.ini&lt;/code>-Dateien (Initialisierungsdateien) gespeichert. Allerdings verteilten sich unzählige INI-Dateien für jede Anwendung über das gesamte System, was die Verwaltung extrem kompliziert machte. Da INI-Dateien zudem auf reinem Text basierten, war das Speichern von Binärdaten schwierig und es gab keinen Mechanismus zur Zugriffskontrolle (Sicherheit). Die Parsing-Geschwindigkeit von Dateien war ebenfalls langsam, weshalb sie ungeeignet waren, um umfangreiche Einstellungen zu speichern.&lt;/p>
&lt;p>Um diese Probleme grundlegend zu lösen, wurde ab Windows NT und Windows 95 die „Registrierung“ als zentralisierte Einstellungsdatenbank ernsthaft eingeführt. Die Registrierung ist eine hierarchische Datenbank, die starke Typisierung, Unterstützung für Binärdaten und robuste Sicherheitsfunktionen durch Zugriffskontrolllisten (ACLs) bietet. Dadurch wurde es für alle Komponenten, vom Betriebssystem-Kernel bis hin zu Anwendungen im Benutzermodus, möglich, Einstellungen über eine einheitliche Schnittstelle (die &lt;code>Reg*&lt;/code>-Funktionen der Win32-API) zu lesen und zu schreiben.&lt;/p>
&lt;p>Bis hin zum modernen Windows 11 fungiert die Registrierung weiterhin als das Herzstück des Betriebssystems. Alle Metadaten, die für den Betrieb des Systems erforderlich sind – wie Hardwarekonfigurationen, Ladereihenfolge von Gerätetreibern, Desktop-Umgebung des Benutzers und die Liste der installierten Software –, werden in der Registrierung zentralisiert.&lt;/p>
&lt;h2 id="2-die-tiefe-der-architektur-die-realität-der-registrierungsstruktur-hives-und-speicherzuordnung">2. Die Tiefe der Architektur: Die Realität der Registrierungsstruktur (Hives) und Speicherzuordnung
&lt;/h2>&lt;p>Obwohl die Registrierung logisch als eine riesige Baumstruktur erscheint, ist sie physisch in mehrere Dateien auf der Festplatte unterteilt, die als „Hives“ (Strukturen) bezeichnet werden. Dadurch werden systemweite Einstellungen von benutzerspezifischen Einstellungen getrennt, was ein effizientes Laden ermöglicht.&lt;/p>
&lt;p>Die wichtigsten Hive-Dateien befinden sich normalerweise im Verzeichnis &lt;code>%SystemRoot%\System32\config&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;code>SYSTEM&lt;/code>: Wichtige Einstellungen, die für den Start des Betriebssystems erforderlich sind (Treiber, Dienste, Startkonfiguration usw.).&lt;/li>
&lt;li>&lt;code>SOFTWARE&lt;/code>: Systemweite Einstellungen für installierte Software. Hier befinden sich die meisten Einstellungen von Drittanbieter-Anwendungen.&lt;/li>
&lt;li>&lt;code>SAM&lt;/code>: Security Accounts Manager (lokale Benutzerkonten und Passwort-Hashes).&lt;/li>
&lt;li>&lt;code>SECURITY&lt;/code>: Lokale Sicherheitsrichtlinien und Rechtezuweisungen.&lt;/li>
&lt;li>&lt;code>DEFAULT&lt;/code>: Das Standardbenutzerprofil (Vorlage zum Erstellen neuer Benutzer).&lt;/li>
&lt;/ul>
&lt;p>Benutzerspezifische Hive-Dateien existieren als versteckte Dateien im Profilverzeichnis des Benutzers (z. B. &lt;code>C:\Users\Username&lt;/code>).&lt;/p>
&lt;ul>
&lt;li>&lt;code>NTUSER.DAT&lt;/code>: Die Grundeinstellungen des jeweiligen Benutzers (der Großteil von HKCU).&lt;/li>
&lt;li>&lt;code>UsrClass.dat&lt;/code>: Die Dateierweiterungszuordnungen des jeweiligen Benutzers (befindet sich in &lt;code>AppData\Local\Microsoft\Windows&lt;/code>).&lt;/li>
&lt;/ul>
&lt;p>Diese Dateien werden beim Systemstart vom „Configuration Manager (CM)“ des Kernels in den Paged-Pool-Speicher des Kernels gemappt. Der Configuration Manager ist eine Kernel-Modus-Komponente, die Lese- und Schreibanforderungen an die Registrierung verarbeitet.&lt;/p>
&lt;p>Besonders bemerkenswert ist, dass nicht alle Registrierungsdaten auf der Festplatte existieren. Beispielsweise ist der Hive &lt;code>HARDWARE&lt;/code> flüchtig (Volatile) und wird überhaupt nicht in Dateien auf der Festplatte gespeichert. Jedes Mal, wenn das Betriebssystem startet und der Plug-and-Play-Manager (PnP) Hardware erkennt, wird er dynamisch im Speicher neu aufgebaut.&lt;/p>
&lt;p>Darüber hinaus implementieren moderne Windows-Versionen eine Transaktionsprotokollierung, um die Zuverlässigkeit der Registrierung zu erhöhen. Änderungen an den Hive-Dateien werden nicht direkt in die Datendateien geschrieben, sondern zuerst in Transaktionsprotokollen (&lt;code>.log1&lt;/code>, &lt;code>.log2&lt;/code>) aufgezeichnet. Dies verhindert Datenbeschädigungen (Corruption) im Falle eines unerwarteten Stromausfalls oder Systemabsturzes während des Schreibvorgangs und garantiert die Integrität der Datenbank in einer Form, die den ACID-Eigenschaften nahekommt.&lt;/p>
&lt;h2 id="3-die-hierarchische-struktur-von-registrierungsschlüsseln-und--werten">3. Die hierarchische Struktur von Registrierungsschlüsseln und -werten
&lt;/h2>&lt;p>Die Registrierung hat eine hierarchische Struktur, die einem Dateisystem sehr ähnlich ist. Der Wurzelknoten wird als „Stammschlüssel“ (Root Key) oder „Hive“ bezeichnet. Darunter befinden sich „Schlüssel“ (Keys), „Unterschlüssel“ (Subkeys) und schließlich die eigentlichen Daten, die „Werte“ (Values) genannt werden. Man kann es sich leicht so vorstellen, dass Schlüssel Verzeichnissen und Werte Dateien entsprechen.&lt;/p>
&lt;p>Die wichtigsten Stammschlüssel werden in die folgenden fünf Kategorien unterteilt:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>HKEY_LOCAL_MACHINE (HKLM)&lt;/strong>: Speichert System- und Softwareeinstellungen, die für den gesamten Computer (alle Benutzer) gelten. Änderungen erfordern Administratorrechte.&lt;/li>
&lt;li>&lt;strong>HKEY_CURRENT_USER (HKCU)&lt;/strong>: Speichert Einstellungen, die spezifisch für den aktuell angemeldeten Benutzer sind. In Wirklichkeit ist dies keine unabhängige Datenbank, sondern lediglich ein symbolischer Link (Alias) zum entsprechenden SID-Schlüssel (Security Identifier) des Benutzers unter &lt;code>HKEY_USERS&lt;/code>.&lt;/li>
&lt;li>&lt;strong>HKEY_CLASSES_ROOT (HKCR)&lt;/strong>: Speichert Dateierweiterungszuordnungen, Registrierungsinformationen für COM-Klassen (Component Object Model) und Shell-Erweiterungen. Dieser Schlüssel ist speziell; er ist eine virtuelle Ansicht, bei der der Configuration Manager &lt;code>HKLM\SOFTWARE\Classes&lt;/code> (systemweit) und &lt;code>HKCU\Software\Classes&lt;/code> (aktueller Benutzer) zusammenführt (mergt). Bei Konflikten haben die benutzerspezifischen Einstellungen (HKCU) Vorrang.&lt;/li>
&lt;li>&lt;strong>HKEY_USERS (HKU)&lt;/strong>: Speichert die Einstellungen aller Benutzerprofile auf dem System (die aktuell in den Speicher geladen sind). Sie sind basierend auf SIDs hierarchisch angeordnet.&lt;/li>
&lt;li>&lt;strong>HKEY_CURRENT_CONFIG (HKCC)&lt;/strong>: Einstellungen bezüglich des aktuellen Hardwareprofils. In Wirklichkeit ein Link zu &lt;code>HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current&lt;/code>.&lt;/li>
&lt;/ol>
&lt;p>Die Visualisierung dieser komplexen hierarchischen Struktur und der Verknüpfungen sieht wie folgt aus:&lt;/p>
&lt;pre class="mermaid">
mindmap
root((&amp;#34;Windows-Registrierung&amp;#34;))
HKLM((&amp;#34;HKEY_LOCAL_MACHINE&amp;#34;))
SAM((&amp;#34;SAM (Sicherheitskonten)&amp;#34;))
SECURITY((&amp;#34;SECURITY&amp;#34;))
SOFTWARE((&amp;#34;SOFTWARE&amp;#34;))
SYSTEM((&amp;#34;SYSTEM&amp;#34;))
HARDWARE((&amp;#34;HARDWARE (Flüchtig)&amp;#34;))
HKCU((&amp;#34;HKEY_CURRENT_USER (Link)&amp;#34;))
AppEvents((&amp;#34;AppEvents&amp;#34;))
Console((&amp;#34;Console&amp;#34;))
Software((&amp;#34;Software&amp;#34;))
System((&amp;#34;System&amp;#34;))
HKCR((&amp;#34;HKEY_CLASSES_ROOT (Zusammengeführte Ansicht)&amp;#34;))
HKU((&amp;#34;HKEY_USERS&amp;#34;))
SID((&amp;#34;Benutzer-SIDs...&amp;#34;))
HKCC((&amp;#34;HKEY_CURRENT_CONFIG (Link)&amp;#34;))
&lt;/pre>
&lt;h2 id="4-datentypen-der-registrierung-detaillierte-erklärung">4. Datentypen der Registrierung (Detaillierte Erklärung)
&lt;/h2>&lt;p>Die „Werte“ in der Registrierung haben jeweils strikt definierte Datentypen. Wenn Sie die Registrierung programmierbar manipulieren, ist es unerlässlich, diese Typen richtig zu verstehen und Daten mit dem entsprechenden Typ zu schreiben. Das Schreiben mit einem falschen Typ führt dazu, dass Anwendungen Ausnahmen auslösen oder Funktionen des Betriebssystems nicht mehr funktionieren.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>REG_SZ (Zeichenfolgenwert)&lt;/strong>: Der häufigste Datentyp. Speichert eine NULL-terminierte Unicode-Zeichenfolge (UTF-16LE). Wird für Dateipfade, URLs, UI-Anzeigenamen usw. verwendet.&lt;/li>
&lt;li>&lt;strong>REG_DWORD (Wert eines 32-Bit-Wertes)&lt;/strong>: Ein vorzeichenloser 32-Bit (4 Byte) Ganzzahlwert. Wird häufig für boolesche Werte (0=Deaktiviert, 1=Aktiviert), Timeout-Werte in Millisekunden und das Setzen von Fehlercodes verwendet. Da Windows eine Little-Endian-Architektur ist, werden die Bytes auf der Festplatte beginnend mit dem niederwertigsten Byte gespeichert (z. B. wird 0x12345678 als &lt;code>78 56 34 12&lt;/code> gespeichert).&lt;/li>
&lt;li>&lt;strong>REG_QWORD (Wert eines 64-Bit-Wertes)&lt;/strong>: Ein 64-Bit (8 Byte) Ganzzahlwert. Mit der Verbreitung von 64-Bit-Architekturen wird er verwendet, um riesige Zahlen (wie Datenträgerkontingente oder große Speichergrößenangaben) und zeigergroße Einstellungen zu speichern.&lt;/li>
&lt;li>&lt;strong>REG_MULTI_SZ (Wert der mehrteiligen Zeichenfolge)&lt;/strong>: Ein Format, das mehrere NULL-terminierte Zeichenfolgen nacheinander speichert und am Ende ein weiteres leeres NULL-Terminierungszeichen (Double NULL) hinzufügt, um es abzuschließen. Eignet sich zum Speichern von Array-ähnlichen Daten wie Listen von IP-Adressen, Listen von abhängigen Diensten oder Bindungsreihenfolgen.&lt;/li>
&lt;li>&lt;strong>REG_EXPAND_SZ (Wert der erweiterbaren Zeichenfolge)&lt;/strong>: Ein spezieller Zeichenfolgentyp, der nicht erweiterte Umgebungsvariablen wie &lt;code>%USERPROFILE%&lt;/code> oder &lt;code>%SystemRoot%&lt;/code> enthält. Wenn eine Anwendung ihn über die API &lt;code>RegQueryValueEx&lt;/code> liest oder die API &lt;code>ExpandEnvironmentStrings&lt;/code> aufruft, wird er vom Betriebssystem dynamisch in den tatsächlichen absoluten Pfad aufgelöst.&lt;/li>
&lt;li>&lt;strong>REG_BINARY (Binärwert)&lt;/strong>: Ein beliebiger roher Binärdatenstrom. Speichert verschlüsselte Passwörter (wie LSA Secrets), digitale Zertifikate und anwendungsspezifische komplexe Strukturen oder serialisierte Daten.&lt;/li>
&lt;li>&lt;strong>REG_NONE&lt;/strong>: Daten mit undefiniertem Typ. Sehr selten, wird aber manchmal für reservierte Bereiche von Verschlüsselungsschlüsseln verwendet.&lt;/li>
&lt;li>&lt;strong>REG_RESOURCE_LIST&lt;/strong> / &lt;strong>REG_FULL_RESOURCE_DESCRIPTOR&lt;/strong>: Fortgeschrittene, nur für den Kernel bestimmte Typen, die von Gerätetreibern verwendet werden, um Zuweisungsinformationen für Hardwareressourcen (IRQs, I/O-Ports, DMA-Kanäle) aufzuzeichnen.&lt;/li>
&lt;/ul>
&lt;h2 id="5-das-mathematische-modell-und-die-leistung-der-registrierung-im-betriebssystem">5. Das mathematische Modell und die Leistung der Registrierung im Betriebssystem
&lt;/h2>&lt;p>Da die Registrierung direkt an die Leistung des Betriebssystems (insbesondere Boot-Zeit und Initialisierungsgeschwindigkeit von Prozessen) gekoppelt ist, wird sie intern mithilfe einer fortschrittlichen Datenstruktur optimiert, die als „Cell Index“ bezeichnet wird und einem B-Baum (B-Tree) ähnelt.&lt;/p>
&lt;h3 id="zeitkomplexität-der-suche-time-complexity">Zeitkomplexität der Suche (Time Complexity)
&lt;/h3>&lt;p>Die Zeitkomplexität $T_{\text{search}}$ bei der Suche nach einem bestimmten Schlüssel (Pfad) innerhalb der Registrierung hängt von der Tiefe des Baums und der Anzahl der Knoten auf jeder Ebene ab. Die Komplexität beim Suchen eines Unterschlüssels der Tiefe $d$ (z. B. für &lt;code>A\B\C\D&lt;/code> ist $d=4$) kann theoretisch wie folgt modelliert werden:&lt;/p>
$$
T_{\text{search}}(d, L) = \sum_{i=1}^{d} O(\log(C_i) \cdot L_i)
$$&lt;p>Hierbei ist $C_i$ die Anzahl der untergeordneten Knoten (Unterschlüssel oder Werte) auf der Tiefe $i$, und $L_i$ ist die Länge (Anzahl der Zeichen) der zu vergleichenden Zeichenfolge. Innerhalb der Hive-Datei, die das eigentliche Subjekt der Registrierung ist, wird die Liste der Unterschlüssel als Hash-Wert des Namens oder als alphabetisch sortierter Index beibehalten. Daher ist anstelle einer einfachen linearen Suche $O(C_i)$ eine binäre Suche $O(\log(C_i))$ möglich, was selbst dann einen extrem schnellen Zugriff ermöglicht, wenn sich Zehntausende von Unterschlüsseln unter einem einzigen Schlüssel befinden.&lt;/p>
&lt;h3 id="speicherbedarf-space-complexity">Speicherbedarf (Space Complexity)
&lt;/h3>&lt;p>Die Gesamtgröße der Registrierung (der belegte Platz auf der physischen Festplatte) wird als Summe jedes Hives berechnet.&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$ ist die Anzahl der Schlüssel im Hive $h$, $S_{\text{key\_metadata}}$ ist die Größe der Metadaten pro Schlüssel (letzter Zeitstempel für Schreibvorgänge, Zeiger auf Sicherheitsbeschreibungen, Zeiger auf übergeordnete Schlüssel usw.), und $S_{\text{value}}(v)$ ist die Nutzlastgröße des Wertes $v$. Der Overhead $S_{\text{overhead}}$ durch Transaktionsprotokolle und nicht mehr benötigte leere Zellen (Fragmentierung) ist ebenfalls enthalten. Wenn unnötige Daten (wie Überreste von Software, die nicht vollständig deinstalliert wurde) über einen langen Zeitraum in der Registrierung belassen werden, erhöht sich dieser Speicherbedarf, was den Paged-Pool-Speicher des Betriebssystems belasten und zu Leistungseinbußen führen kann.&lt;/p>
&lt;h2 id="6-risiken-manueller-bearbeitung-und-wahrscheinlichkeit-von-beschädigungen-die-die-systemstabilität-bedrohen">6. Risiken manueller Bearbeitung und Wahrscheinlichkeit von Beschädigungen, die die Systemstabilität bedrohen
&lt;/h2>&lt;p>Die manuelle Bearbeitung mit dem Registrierungs-Editor (&lt;code>regedit.exe&lt;/code>) sollte als letztes Mittel der Systemverwaltung betrachtet werden. Der Registrierung fehlt eine „Rückgängig“ (Undo)-Funktion, die man in gewöhnlichen Dokumenteneditoren findet, und Änderungen an Werten oder das Löschen von Schlüsseln werden über den Configuration Manager sofort im System widergespiegelt.&lt;/p>
&lt;p>Insbesondere das irrtümliche Ändern oder Löschen von nur einem Zeichen in kritischen Schlüsseln, die für den Systemstart unerlässlich sind (z. B. Einstellungen für Festplattencontroller-Treiber unter &lt;code>HKLM\SYSTEM\CurrentControlSet\Services&lt;/code> oder der Wert &lt;code>Userinit&lt;/code> in &lt;code>HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon&lt;/code>), birgt das fatale Risiko, dass das Betriebssystem einen Blue Screen (BSoD) verursacht und nicht mehr booten kann oder nicht über den Anmeldebildschirm hinauskommt (Black Screen).&lt;/p>
&lt;h3 id="mathematisches-modell-der-beschädigungswahrscheinlichkeit">Mathematisches Modell der Beschädigungswahrscheinlichkeit
&lt;/h3>&lt;p>Betrachten wir die Wahrscheinlichkeit eines Systemausfalls, wenn Schlüssel in der Registrierung zufällig geändert oder gelöscht werden. Sei die Menge der kritischen Schlüssel, die für die ordnungsgemäße Funktion des Systems unerlässlich sind, $C$, und ihre Gesamtzahl $N_c = |C|$. Sei die Gesamtzahl der Schlüssel in der gesamten Registrierung $N_{\text{total}}$.
Wenn zufällig $k$ Schlüssel gelöscht oder zerstört werden, wird die Wahrscheinlichkeit $P_{\text{failure}}$, dass mindestens ein kritischer Schlüssel beschädigt wird, durch die Wahrscheinlichkeitsrechnung des Ziehens ohne Zurücklegen (Sampling without replacement) wie folgt ausgedrückt:&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>Die Gesamtzahl der Schlüssel in der Registrierung $N_{\text{total}}$ liegt in der Größenordnung von Hunderttausenden bis Millionen, aber auch $N_c$ existiert in der Größenordnung von Zehntausenden. Mathematisch gesehen steigt die Ausfallwahrscheinlichkeit selbst bei zufälligen Operationen stark an, wenn $k$ zunimmt. Darüber hinaus operieren Benutzer in der Praxis nicht „zufällig“, sondern manipulieren absichtlich Bereiche, die direkt mit Systemeinstellungen und dem Softwarebetrieb zusammenhängen (während sie auf Tutorial-Seiten usw. schauen), sodass die Wahrscheinlichkeit, einen kritischen Schlüssel zu berühren, weitaus höher ist als der oben genannte theoretische Wert.&lt;/p>
&lt;h2 id="7-registrierungsvirtualisierung-und-wow64-architektur">7. Registrierungsvirtualisierung und WOW64-Architektur
&lt;/h2>&lt;p>Um die Kompatibilität mit Legacy-Anwendungen aufrechtzuerhalten, implementiert Windows einige fortschrittliche „Virtualisierungs“-Mechanismen (Umleitung) für den Registrierungszugriff. Die Programmierung ohne Verständnis dieser Mechanismen ist die Ursache für schwerwiegende Fehler.&lt;/p>
&lt;h3 id="uac-registrierungsvirtualisierung-registry-virtualization">UAC-Registrierungsvirtualisierung (Registry Virtualization)
&lt;/h3>&lt;p>Ab Windows Vista wurde die Benutzerkontensteuerung (UAC) eingeführt. Wenn eine alte Anwendung, die in der Windows XP-Ära erstellt wurde (und mit Standardbenutzerrechten läuft), versucht, in geschützte Schlüssel wie &lt;code>HKLM\SOFTWARE&lt;/code> zu schreiben, die eigentlich Administratorrechte erfordern, verhindert Windows Abstürze aufgrund von Zugriffsverweigerungsfehlern (Access Denied), indem es den Schreibvorgang heimlich in den virtuellen Speicher &lt;code>HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE&lt;/code> im Benutzerprofil umleitet. Beim Lesen fügt es sowohl den ursprünglichen Speicherort als auch den virtuellen Speicher zusammen und gibt sie zurück. Dadurch kann die Anwendung ohne Erkennung eines Fehlers normal weiterlaufen.
Wenn Sie jedoch ein Tool entwickeln, das systemweite Einstellungen programmierbar ändert, müssen Sie &lt;code>&amp;lt;requestedExecutionLevel level=&amp;quot;requireAdministrator&amp;quot; /&amp;gt;&lt;/code> in der Manifestdatei angeben und diese Virtualisierung deaktivieren.&lt;/p>
&lt;h3 id="wow64-windows-32-bit-on-windows-64-bit-umleitung">WOW64 (Windows 32-bit on Windows 64-bit) Umleitung
&lt;/h3>&lt;p>Wenn eine ältere 32-Bit-Anwendung auf einer 64-Bit-Version von Windows (dem aktuellen Mainstream) ausgeführt wird, werden bestimmte Registrierungsschlüssel automatisch isoliert und umgeleitet, um zu verhindern, dass die 32-Bit-App versehentlich native 64-Bit-Systemeinstellungen überschreibt oder inkompatible 64-Bit-DLLs lädt.
Wenn beispielsweise eine 32-Bit-App versucht, auf &lt;code>HKLM\SOFTWARE\Vendor\App&lt;/code> zuzugreifen, leitet das Betriebssystem sie transparent an &lt;code>HKLM\SOFTWARE\WOW6432Node\Vendor\App&lt;/code> um.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
App32[&amp;#34;32-Bit-Anwendung&amp;#34;]
App64[&amp;#34;64-Bit-Anwendung&amp;#34;]
RegAPI[&amp;#34;Registry-API (Advapi32.dll)&amp;#34;]
CM[&amp;#34;Configuration Manager (Kernel)&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;| Wenn 64-Bit-Prozess | HKLM_Soft
CM --&amp;gt;| Wenn 32-Bit-Prozess (Umleitung) | HKLM_WOW64
&lt;/pre>
&lt;p>Beim Bearbeiten der Registrierung über ein PowerShell-Skript oder eine C#-Anwendung müssen Sie sich unbedingt bewusst sein, ob der ausführende Prozess selbst 32-Bit oder 64-Bit ist. Andernfalls wird das lästige Problem verursacht, dass „die geschriebenen Einstellungen im Explorer nicht sichtbar sind (an einer anderen Stelle geschrieben wurden)“.&lt;/p>
&lt;h2 id="8-programmierbare-sichere-bearbeitung-mit-powershell">8. Programmierbare sichere Bearbeitung mit PowerShell
&lt;/h2>&lt;p>Um das Risiko der manuellen Bearbeitung der Registrierung zu minimieren, besteht die moderne Best Practice darin, Vorgänge mit PowerShell-Skripten zu codieren (Infrastructure as Code) und Automatisierung, Reproduzierbarkeit und Testbarkeit sicherzustellen. PowerShell verfügt über einen „Registry Provider“, mit dem Sie die Registrierung transparent mit genau denselben Cmdlets (&lt;code>Get-ChildItem&lt;/code>, &lt;code>Get-ItemProperty&lt;/code>, &lt;code>New-Item&lt;/code> usw.) bearbeiten können, mit denen Sie auch Dateisysteme (wie das Laufwerk C:) bearbeiten.&lt;/p>
&lt;p>In PowerShell sind dedizierte PSDrives (ähnlich wie Laufwerksbuchstaben) wie &lt;code>HKLM:&lt;/code> und &lt;code>HKCU:&lt;/code> standardmäßig gemountet.&lt;/p>
&lt;h3 id="grundlegende-crud-operationen">Grundlegende CRUD-Operationen
&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. Existenzprüfung (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. Erstellen eines neuen Schlüssels (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;Schlüssel erstellt.&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. Schreiben/Aktualisieren eines Wertes (Update) - Schreibt 1 als 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. Lesen eines Wertes (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;Aktuelles Debug-Flag: &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. Löschen eines Wertes (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="praxisbeispiel-1-automatische-einrichtung-der-entwicklungsumgebung-hinzufügen-von-path-umgebungsvariablen">Praxisbeispiel 1: Automatische Einrichtung der Entwicklungsumgebung (Hinzufügen von PATH-Umgebungsvariablen)
&lt;/h3>&lt;p>Das folgende Skript ist ein Automatisierungsbeispiel, das das Verzeichnis benutzerdefinierter Tools sicher zur Benutzerumgebungsvariablen &lt;code>PATH&lt;/code> hinzufügt, wenn ein Entwickler einen neuen Windows-Computer einrichtet.&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"># Aktuellen PATH lesen (Fehler unterdrücken, um sicher zu erhalten)&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"># Mit regulärem Ausdruck prüfen, ob es bereits enthalten ist&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"># Wenn am Ende kein Semikolon steht, hinzufügen und verbinden&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"># Als REG_EXPAND_SZ-Typ schreiben (Wichtig)&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;PATH-Umgebungsvariable aktualisiert: &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"># Ausführende Prozesse über Änderungen der Umgebungsvariablen benachrichtigen (WM_SETTINGCHANGE)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># Dadurch wird die Änderung in neuen Explorern usw. ohne Neustart wirksam&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;PATH ist bereits hinzugefügt.&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="praxisbeispiel-2-hinzufügen-einer-benutzerdefinierten-aktion-zum-kontextmenü">Praxisbeispiel 2: Hinzufügen einer benutzerdefinierten Aktion zum Kontextmenü
&lt;/h3>&lt;p>Dies ist ein Skript, das ein benutzerdefiniertes Element namens „In My IDE öffnen“ zum Kontextmenü hinzufügt, wenn Sie mit der rechten Maustaste auf eine bestimmte Datei oder ein bestimmtes Verzeichnis klicken.&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"># Das Menü, wenn Sie mit der rechten Maustaste auf den Hintergrund (den leeren Bereich) eines Verzeichnisses klicken&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"># Übergeordneten Schlüssel für das Menüelement erstellen&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"># Anzeigenamen im Wert (Standard) festlegen&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;In My IDE öffnen&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"># Symbol festlegen (Optional)&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"># command-Unterschlüssel erstellen und die auszuführende Befehlszeile festlegen&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c"># %V ist eine Variable, die zum Pfad des aktuellen Verzeichnisses erweitert wird&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;Kontextmenü wurde hinzugefügt.&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;Ändern der Registrierung fehlgeschlagen. Überprüfen Sie, ob Sie es mit Administratorrechten ausführen. Fehler: &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="interne-sequenz-des-registrierungszugriffs-von-powershell">Interne Sequenz des Registrierungszugriffs von PowerShell
&lt;/h3>&lt;p>Die interne Betriebssystemsequenz, wenn ein PowerShell-Skript die Registrierung ändert, wird unten gezeigt.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant U as &amp;#34;Admin / PowerShell&amp;#34;
participant PS as &amp;#34;Registry Provider (.NET)&amp;#34;
participant CM as &amp;#34;Configuration Manager (Kernel)&amp;#34;
participant Disk as &amp;#34;Hive-Dateien auf 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;Pfad parsen &amp;amp; Datentypen validieren&amp;#34;
PS-&amp;gt;&amp;gt;CM: &amp;#34;NtSetValueKey (Systemaufruf)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;Zugriffstoken gegen Schlüssel-ACL prüfen&amp;#34;
alt &amp;#34;Zugriff gewährt (Admin-Token)&amp;#34;
CM-&amp;gt;&amp;gt;CM: &amp;#34;Zelle im flüchtigen Cache zuweisen&amp;#34;
CM-&amp;gt;&amp;gt;Disk: &amp;#34;In Transaktionsprotokoll schreiben (.log1)&amp;#34;
Disk--&amp;gt;&amp;gt;CM: &amp;#34;Protokoll erfolgreich geschrieben&amp;#34;
CM-&amp;gt;&amp;gt;Disk: &amp;#34;Verzögertes Schreiben in Hive-Datendatei (Hintergrund)&amp;#34;
CM--&amp;gt;&amp;gt;PS: &amp;#34;STATUS_SUCCESS (0x00000000)&amp;#34;
PS--&amp;gt;&amp;gt;U: &amp;#34;Befehl abgeschlossen&amp;#34;
else &amp;#34;Zugriff verweigert (Standardbenutzer)&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 ausgelöst&amp;#34;
end
&lt;/pre>
&lt;h2 id="9-robuster-registrierungszugriff-mit-c-net">9. Robuster Registrierungszugriff mit C# (.NET)
&lt;/h2>&lt;p>Wenn Sie von einer .NET-Anwendung (z. B. C#) auf die Registrierung zugreifen, verwenden Sie die Klassen &lt;code>Microsoft.Win32.Registry&lt;/code> und &lt;code>RegistryKey&lt;/code>.
Der größte Vorteil bei der Verwendung von C# ist eine robuste Fehlerbehandlung durch starke Ausnahmebehandlung (&lt;code>try-catch&lt;/code>), strikte Typprüfung und die Möglichkeit, explizit 32-Bit/64-Bit-Ansichten mit der &lt;code>RegistryView&lt;/code>-Enumeration anzugeben.&lt;/p>
&lt;p>Das folgende C#-Codebeispiel liest und schreibt die Registrierung auf der 64-Bit-Seite zuverlässig (wobei die WOW6432Node-Umleitung vermieden wird) in einer 64-Bit-Betriebssystemumgebung.&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">// Pfad unter HKLM (erfordert Administratorrechte)&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">// Native 64-Bit-Ansicht durch Angabe von RegistryView.Registry64 öffnen&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Verwenden der using-Anweisung, um sicherzustellen, dass das Handle des Registrierungsschlüssels (nicht verwaltete Ressource) zuverlässig freigegeben (Disposed) wird&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">// Schlüssel mit Schreibberechtigung (writable: true) öffnen. Erstellen, falls nicht vorhanden.&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">// Wert als REG_DWORD schreiben&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">// Wert als REG_SZ schreiben&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">// Byte-Array als REG_BINARY schreiben&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;Schreiben in die Registrierung erfolgreich.&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">// Tritt oft auf, wenn nicht als Administrator ausgeführt wird&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;Berechtigungsfehler: Bitte führen Sie das Programm \&amp;#34;&lt;/span>&lt;span class="n">Als&lt;/span> &lt;span class="n">Administrator&lt;/span> &lt;span class="n">ausführen&lt;/span>&lt;span class="err">\&lt;/span>&lt;span class="s">&amp;#34; aus. Details: {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">// Wenn durch die Codezugriffssicherheit (CAS) von .NET blockiert&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;Sicherheitsausnahme: {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">// Andere unerwartete E/A-Fehler usw.&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;Unerwarteter Fehler: {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>Das vom Betriebssystem zurückgegebene „Handle“, wenn ein Registrierungsschlüssel geöffnet wird, ist eine nicht verwaltete Ressource, die Arbeitsspeicher und Systemressourcen verbraucht. Daher ist es eine eiserne Regel bei der C#-Programmierung, &lt;code>using&lt;/code>-Blöcke zu verwenden oder &lt;code>.Dispose()&lt;/code> (oder &lt;code>.Close()&lt;/code>) explizit im &lt;code>finally&lt;/code>-Block aufzurufen, um Handle-Lecks sicher zu verhindern.&lt;/p>
&lt;h2 id="10-sicherungs--und-wiederherstellungsmethoden-für-die-registrierung">10. Sicherungs- und Wiederherstellungsmethoden für die Registrierung
&lt;/h2>&lt;p>Selbst bei Automatisierung durch Skripte oder Programme ist es absolut unerlässlich, vor kritischen Änderungen ein Backup zu erstellen.&lt;/p>
&lt;h3 id="backup-und-import-mit-reg-dateien">Backup und Import mit .reg-Dateien
&lt;/h3>&lt;p>Die klassischste und universellste Methode ist der Export in eine &lt;code>.reg&lt;/code>-Datei. Diese Datei ist eine textbasierte Datei mit einem eigenen Format, und ihre Struktur sieht wie folgt aus:&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>Hinweis: Binärdaten werden durch kommagetrennte Hexadezimalzahlen dargestellt, die auf &lt;code>hex:&lt;/code> folgen.&lt;/em>&lt;/p>
&lt;p>Sie können das Befehlszeilentool &lt;code>reg.exe&lt;/code> verwenden, um automatische Backups in Batch-Skripten zu implementieren.&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 Den angegebenen Schlüssel sichern (Unterschlüssel werden auch rekursiv exportiert)&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 Sicherung wiederherstellen&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="fortgeschrittenere-sicherungsmethoden-mit-powershell">Fortgeschrittenere Sicherungsmethoden mit PowerShell
&lt;/h3>&lt;p>Anstatt nur einfachen Text zu verwenden, ist es auch möglich, die Objektorientierung von PowerShell zu nutzen, um Registrierungsobjekte zu exportieren und im XML-Format (CliXML) zu speichern. Dadurch können Sie bei der Wiederherstellung Typinformationen beibehalten, anstatt sich auf das Parsen von Zeichenfolgen zu verlassen.&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"># Backup abrufen (Eigenschaften als XML speichern)&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"># Wiederherstellungskonzept&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"># Da in $backup das wiederhergestellte benutzerdefinierte PSObject gespeichert ist,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># können Sie eine Logik aufbauen, um über dessen Eigenschaften zu schleifen und sie mit Set-ItemProperty erneut anzuwenden.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="11-fehlerbehebung-mit-sysinternals-process-monitor-procmon">11. Fehlerbehebung mit Sysinternals Process Monitor (Procmon)
&lt;/h2>&lt;p>Wenn unklar ist, wo ein Programm in die Registrierung schreibt, oder wenn Sie nach der Ursache für „Access Denied“ suchen, ist der von Microsoft kostenlos bereitgestellte &lt;strong>Process Monitor (Procmon)&lt;/strong> aus den Sysinternals-Tools extrem leistungsstark.
Mit Procmon können Sie alle Registrierungs-API-Aufrufe (wie &lt;code>RegOpenKey&lt;/code>, &lt;code>RegQueryValue&lt;/code>, &lt;code>RegSetValue&lt;/code>), die im Betriebssystem auftreten, in Echtzeit erfassen und Fehler mit erweiterten Filtern wie den folgenden beheben:&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>Dadurch können Sie in Sekundenbruchteilen identifizieren, welchem Schlüssel die ACL-Einstellungen fehlen oder ob er fälschlicherweise an WOW6432Node umgeleitet wird.&lt;/p>
&lt;h2 id="12-sicherheit-und-best-practices">12. Sicherheit und Best Practices
&lt;/h2>&lt;p>Abschließend fassen wir wichtige Designprinzipien und Best Practices im Umgang mit der Registrierung zusammen.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Das Prinzip der geringsten Privilegien durchsetzen&lt;/strong>: Einstellungen für Anwendungen und Skripte sollten nach Möglichkeit immer unter dem &lt;code>Software&lt;/code>-Schlüssel in &lt;code>HKCU&lt;/code> (dem aktuellen Benutzer) gespeichert werden. Das Schreiben nach &lt;code>HKLM&lt;/code> erfordert eine UAC-Rechteausweitung auf Administratorrechte, was die Angriffsfläche (Attack Surface) für Sicherheitsbedrohungen vergrößert und die Benutzererfahrung beeinträchtigt.&lt;/li>
&lt;li>&lt;strong>Überwachung (Auditing) aktivieren&lt;/strong>: Für sicherheitskritische Schlüssel (z. B. der &lt;code>Run&lt;/code>-Schlüssel, der das Autostartverhalten steuert, oder Dienstkonfigurationsschlüssel) sollten Sie eine SACL (System Access Control List) konfigurieren, um im „Sicherheitsprotokoll“ in der Windows-Ereignisanzeige aufzuzeichnen (zu überwachen), wer Werte wann geändert oder gelöscht hat.&lt;/li>
&lt;li>&lt;strong>Umgang mit der Veraltung von Transaktionsfunktionen&lt;/strong>: Die Transaktionsfunktion der Registrierung (TxR) unter Verwendung des in Windows Vista eingeführten „Kernel Transaction Manager (KTM)“ gilt ab Windows 10 als veraltet (Deprecated). Es ist erforderlich, einen eigenen Backup- und Rollback-Mechanismus in der Anwendung zu implementieren (z. B. den ursprünglichen Wert vor Änderungen lesen und im Speicher behalten).&lt;/li>
&lt;li>&lt;strong>Vorsicht vor Konflikten mit Gruppenrichtlinien (GPO)&lt;/strong>: Bereiche wie &lt;code>HKLM\SOFTWARE\Policies&lt;/code> und &lt;code>HKCU\Software\Policies&lt;/code> sollten durch Active Directory-Gruppenrichtlinien zentral verwaltet werden. Wenn Sie diese Schlüssel direkt aus einem Skript umschreiben, werden sie im nächsten Aktualisierungszyklus für Gruppenrichtlinien im Hintergrund (in der Regel alle 90 bis 120 Minuten) durch die Einstellungen des Domänencontrollers zwangsüberschrieben, weshalb die Einstellungen nicht dauerhaft bleiben.&lt;/li>
&lt;/ol>
&lt;h2 id="fazit">Fazit
&lt;/h2>&lt;p>Die Windows-Registrierung ist ein leistungsstarkes und komplexes Basissystem, das alle Verhaltensweisen des Betriebssystems und der Anwendungseinstellungen integriert verwaltet. Chaotisches manuelles Bearbeiten birgt ein hohes mathematisch nachgewiesenes Risiko für Systembeschädigungen. Daher ist es im modernen Systemmanagement und in der Entwicklung unerlässlich, programmierbare Mittel wie PowerShell oder C# zu verwenden, um das Konfigurationsmanagement nach den Prinzipien von Infrastructure as Code auf sichere, testbare und reproduzierbare Weise durchzuführen. Bitte nutzen Sie das in diesem Artikel erläuterte tiefe Verständnis der Architektur und die Implementierungsmuster, um eine robustere und sicherere Windows-Umgebung aufzubauen.&lt;/p></description></item></channel></rss>