2012-12-05 8 views
54

Próbuję uzyskać wszystkie nazwy wyświetlane kluczy podrzędnych w tym kluczu:OpenSubKey() zwraca wartość null dla klucza rejestru, który widzę w regedit.exe

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 

z tym kodem:

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

Po uruchomieniu kodu nie mogę znaleźć jednego z klawiszy muszę:

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

Powinna również mieć wyświetlaną nazwę: Microsoft Visual C++ 2010 x64 Redistributable - 10.0.30319, ale zamiast tego metoda GetSubKeyNames() podaje mi klucz podrzędny: , który nie ma żadnej wyświetlanej nazwy.

Dlaczego nie mogę uzyskać dokładnego klucza podrzędnego, którego potrzebuję ({DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}) i jak mogę go uzyskać?

+0

Czy możesz to zrobić, jeśli prowadzisz studio graficzne jako administrator? – tsells

+0

@tsells Próbowałem i to nie działa. –

+0

Czy pracujesz w 32-bitowym procesie w 64-bitowym systemie operacyjnym? –

Odpowiedz

125

32-bitowa aplikacja w 64-bitowym systemie operacyjnym będzie domyślnie przeglądać węzeł HKLM\Software\Wow6432Node. Aby zapoznać się z 64-bitowej wersji klucza, musisz określić 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 
} 

API do zrobienia tego dodano w .NET 4.0; jeśli nadal używasz 3.5, musisz użyć P/Invoke, aby uzyskać dostęp do kluczy 64-bitowych: http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a-32-bit-application-or-vice-versa/

+0

Dzięki, że działało –

+0

To działa rozwiązanie. Dzięki za oszczędność czasu. –

+0

Dzięki. Miałem ten sam problem, z tym samym kluczem. :) – ECC

Powiązane problemy