Я прочитал много информации о получении программ. Ни один из алгоритмов не сделал то, что я хочу. Мне нужно установить установленные программы точно так же, как на панели управления.
Итак, я использовал:
- Класс WMI
Win32_Product
. Он показывает только установленные программы msi. - Ключи реестра.
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
. Опять же, некоторые программы не отображаются на панели управления, некоторые программы отображаются на панели управления не в этом реестре node.
Итак, есть ли кто-нибудь в этом мире, кто знал, какой алгоритм использует панель управления для отображения установленных программ?
UPD1: да, я использую 64-битный, я знаю, что есть еще один node для 64-битных установленных программ "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall", но следующий код перечисляет твиз HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall, странно...
var programs = new List();
string registry_key = @"SOFTWARE\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);
}
}
}
}
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);
}