C #: Comment obtenir l'installation des programmes exactement comme dans les programmes et les fonctionnalités du panneau de contrôle?

J'ai lu beaucoup d'informations sur l'obtention de programmes. Aucun des algorithmes de ne faire ce que je veux. J'ai besoin d'obtenir des programmes installés exactement comme dans le panneau de contrôle.

J'ai donc utilisé:

  1. WMI Win32_Product classe. Il montre que les msi programmes installés.
  2. Clés de registre. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. Encore une fois, certains programmes ne sont pas affichés dans le panneau de contrôle, certains programmes affichent dans le panneau de contrôle ne sont pas dans ce registre nœud.

Donc, est-il quelqu'un dans ce monde, qui savait quel algorithme utiliser le panneau de contrôle pour afficher les programmes installés?

UPD1:oui, j'utilise 64 bits, je sais qu'il est un autre nœud du 64bits installé les programmes "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" mais le code suivant énumère twise HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall section, étrange...

var programmes = new Liste(); 
string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
à l'aide de (Microsoft.Win32.RegistryKey key = Registre.LocalMachine.OpenSubKey(registry_key)) 
{ 
foreach (string subkey_name dans key.GetSubKeyNames()) 
{ 
à l'aide de (RegistryKey sous-clé = key.OpenSubKey(subkey_name)) 
{ 
var nom = (string)sous-clé.GetValue("DisplayName"); 
si(!string.IsNullOrEmpty(nom)) 
{ 
les programmes.Ajouter(nom); 
} 
} 
} 
}

registry_key = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
using
(Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key))
{
foreach (string subkey_name in key.GetSubKeyNames())
{
using
(RegistryKey subkey = key.OpenSubKey(subkey_name))
{
var name = (string)subkey.GetValue("DisplayName");
if (!string.IsNullOrEmpty(name))
{
programs
.Add(name);
}
}
}
}

foreach (var program in programs.OrderBy(x => x))
{
Console.WriteLine(program);
}

source d'informationauteur MelnikovI