OpenSubKey () gibt null für einen Registrierungsschlüssel zurück, den ich in regedit.exe sehen kann

78

Ich versuche, alle Anzeigenamen der Unterschlüssel in diesem Schlüssel abzurufen:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Mit diesem Code:

     RegistryKey newKey;
     string val;

     string KeyPath64Bit = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
     RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(KeyPath64Bit);

     string[] RegKeys64Bits = Registry.LocalMachine.OpenSubKey(KeyPath64Bit).GetSubKeyNames();

     foreach (string s in RegKeys64Bits)
     {
        newKey = mainKey.OpenSubKey(s);
        val = newKey.GetValue("DisplayName", -1, RegistryValueOptions.None).ToString();
        if (val != "-1")
           file64.WriteLine(val);
     }

Nach dem Ausführen des Codes kann ich keinen der benötigten Schlüssel finden:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}

Und es sollte den Anzeigenamen haben: Microsoft Visual C ++ 2010 x64 Redistributable - 10.0.30319, aber stattdessen GetSubKeyNames()gibt mir die Methode den Unterschlüssel: {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757der keinen Anzeigenamen hat.

Warum kann ich nicht den genauen Unterschlüssel bekommen, den ich brauche ( {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}) und wie kann ich ihn bekommen?

Zak Soliman
quelle
Können Sie dies tun, wenn Sie Visual Studio als Administrator ausführen?
Tsells
@tsells Versuchte es und es funktioniert nicht.
Zak Soliman
Führen Sie einen 32-Bit-Prozess auf einem 64-Bit-Betriebssystem aus?
Richard Deeming
@ RichardDeeming Die ausführbare Datei ist für 32 Bit kompiliert und mein Betriebssystem ist 64 Bit
Zak Soliman

Antworten:

185

Eine 32-Bit-Anwendung unter einem 64-Bit-Betriebssystem HKLM\Software\Wow6432Nodeüberprüft standardmäßig den Knoten. Um die 64-Bit-Version des Schlüssels zu lesen, müssen Sie Folgendes angeben RegistryView:

using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
{
   // key now points to the 64-bit key
}

Die API dazu wurde in .NET 4.0 hinzugefügt. Wenn Sie immer noch 3.5 verwenden, müssen Sie P / Invoke verwenden, um auf die 64-Bit-Schlüssel zuzugreifen: http://www.rhyous.com/2011/01/24/how-read-the-64-bit -registry-from-a-32-bit-application-or-umgekehrt /

Richard Deeming
quelle
Vielen Dank. Ich hatte das gleiche Problem mit dem gleichen Schlüssel. :)
Eduardo
1
Danke dafür. Obwohl ich immer noch nicht verstehe, warum es zwei Register gibt.
Robert Noack
@RobertNoack: Ich denke, es ist hauptsächlich für COM und um sicherzustellen, dass Umgebungsvariablen in REG_EXPAND_SZWerten korrekt erweitert werden . Es gibt einige Informationen über MSDN - Registry Redirector
Richard Deeming
Du hast meinen Tag gerettet. Ich war total verrückt nach dem Verhalten des Registrierungsschlüssels für mich. +1.
RBT
Ich muss ein Dutzend Erklärer gelesen haben; Dies ist der erste Schritt, der den Schritt RegistryKey.OpenBaseKey (RegistryHive.LocalMachine, RegistryView.Registry64) anzeigt. Vielen Dank!!
Joe Baker
14

In Visual Studio 2017 gehen Sie zu

Project > Properties > Build > Uncheck 32 bit and Platform target as "Any CPU".
Clint
quelle
2
Ich hatte das gleiche Problem - ich habe 32Bit deaktiviert und es hat gut funktioniert.
RDV