2012-12-05 1 views
54

Ich versuche, alle Anzeigenamen des Unterschlüssels in diesem Schlüsselhalter:OpenSubKey() gibt null für einen Registrierungsschlüssel, den ich in regedit.exe sehe

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); 
    } 

Nachdem der Code ausgeführt wird, kann ich nicht einer der Schlüssel finde ich brauche:

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 die GetSubKeyNames() Methode gibt mir den Unterschlüssel: , die keinen Anzeigenamen hat.

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

+0

Können Sie es tun, wenn Sie Visual Studio als Administrator ausführen? – tsells

+0

@tsells Versuchte es und es funktioniert nicht. –

+0

Laufen Sie in einem 32-Bit-Prozess auf einem 64-Bit-Betriebssystem? –

Antwort

125

Eine 32-Bit-Anwendung auf einem 64-Bit-Betriebssystem sucht standardmäßig nach dem Knoten HKLM\Software\Wow6432Node. Um die 64-Bit-Version des Schlüssels zu lesen, müssen Sie die RegistryView angeben:

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 zu tun, wurde diese hinzugefügt in .NET 4.0; 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-vice-versa/

+0

Danke, das hat funktioniert –

+0

Dies funktioniert Lösung.Vielen Dank für meine Zeit zu sparen. –

+0

Danke. Ich hatte das gleiche Problem mit demselben Schlüssel. :) – ECC

Verwandte Themen