<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Administration on kenji.blog</title><link>http://kenji.blog/de/categories/administration/</link><description>Recent content in Administration on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/de/categories/administration/index.xml" rel="self" type="application/rss+xml"/><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>