Получить установленные приложения в системе - PullRequest
71 голосов
/ 26 мая 2009

Как получить приложения, установленные в системе, используя код c #?

Ответы [ 10 ]

99 голосов
/ 26 мая 2009

Перебор раздела реестра «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Uninstall», похоже, дает полный список установленных приложений.

Помимо приведенного ниже примера, вы можете найти версию, аналогичную той, что я сделал здесь .

Это грубый пример, вы, вероятно, захотите что-то сделать, чтобы убрать пустые строки, как во второй предоставленной ссылке.

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))
        {
            Console.WriteLine(subkey.GetValue("DisplayName"));
        }
    }
}

В качестве альтернативы вы можете использовать WMI, как уже упоминалось:

ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
foreach(ManagementObject mo in mos.Get())
{
    Console.WriteLine(mo["Name"]);
}

Но это выполняется немного медленнее, и я слышал, что в нем могут отображаться только программы, установленные в «ALLUSERS», хотя это может быть неверно. Он также игнорирует компоненты и обновления Windows, которые могут быть вам полезны.

10 голосов
/ 26 мая 2009

Вы можете взглянуть на эту статью . Для чтения списка установленных приложений используется реестр.

public void GetInstalledApps()
{
    string uninstallKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(uninstallKey))
    {
        foreach (string skName in rk.GetSubKeyNames())
        {
            using (RegistryKey sk = rk.OpenSubKey(skName))
            {
                try
                {
                    lstInstalled.Items.Add(sk.GetValue("DisplayName"));
                }
                catch (Exception ex)
                { }
            }
        }
    }
}
7 голосов
/ 19 мая 2016

Я согласен, что перечисление через раздел реестра - лучший способ.

Обратите внимание, , однако, что указанный ключ, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", перечислит все приложения в 32-разрядной установке Windows и 64-разрядные приложения в 64-разрядной установке Windows.

Чтобы увидеть также 32-разрядные приложения, установленные в 64-разрядной установке Windows, вам также потребуется перечислить ключ @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall".

5 голосов
/ 25 сентября 2014

Стоит отметить, что класс WMI Win32_Product представляет продукты, так как они устанавливаются Windows Installer . не каждое приложение использует Windows Installer

однако «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows \ CurrentVersion \ Uninstall» представляет приложения для 32-разрядных. Для 64-битной версии вам также нужно пройти «HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall», и, поскольку не у каждого программного обеспечения есть 64-битная версия, общее количество установленных приложений представляет собой объединение ключей в обоих расположениях с «UninstallString». Соотношение с ними.

, но лучшие варианты остаются теми же. Ключи реестра .traverse - лучший подход, поскольку у каждого приложения есть запись в реестре [включая записи в установщике Windows]. Однако метод реестра небезопасен, как если бы кто-то удалял соответствующий ключ, тогда вы не будет знать запись приложения. Напротив, изменение HKEY_Classes_ROOT \ Installers более сложно, поскольку оно связано с проблемами лицензирования, такими как Microsoft office или другие продукты. для более надежного решения вы всегда можете объединить альтернативу реестра с WMI.

1 голос
/ 05 февраля 2013

Используйте API установщика Windows!

Позволяет составить достоверный перечень всех программ. Реестр ненадежен, но WMI имеет большой вес.

1 голос
/ 26 мая 2009

Перебирайте ключи "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" и проверяйте их значения "DisplayName".

0 голосов
/ 21 июня 2017

Мое требование - проверить, установлено ли в моей системе определенное программное обеспечение. Это решение работает, как и ожидалось. Это может помочь вам. Я использовал приложение Windows в C # с Visual Studio 2015.

 private void Form1_Load(object sender, EventArgs e)
        {

            object line;
            string softwareinstallpath = string.Empty;
            string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            using (var baseKey = Microsoft.Win32.RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
            {
                using (var key = baseKey.OpenSubKey(registry_key))
                {
                    foreach (string subkey_name in key.GetSubKeyNames())
                    {
                        using (var subKey = key.OpenSubKey(subkey_name))
                        {
                            line = subKey.GetValue("DisplayName");
                            if (line != null && (line.ToString().ToUpper().Contains("SPARK")))
                            {

                                softwareinstallpath = subKey.GetValue("InstallLocation").ToString();
                                listBox1.Items.Add(subKey.GetValue("InstallLocation"));
                                break;
                            }
                        }
                    }
                }
            }

            if(softwareinstallpath.Equals(string.Empty))
            {
                MessageBox.Show("The Mirth connect software not installed in this system.")
            }



            string targetPath = softwareinstallpath + @"\custom-lib\";
            string[] files = System.IO.Directory.GetFiles(@"D:\BaseFiles");

            // Copy the files and overwrite destination files if they already exist. 
            foreach (var item in files)
            {
                string srcfilepath = item;
                string fileName = System.IO.Path.GetFileName(item);
                System.IO.File.Copy(srcfilepath, targetPath + fileName, true);
            }
            return;

        }
0 голосов
/ 25 июня 2013

Я использовал подход Никса - мне нужно было проверить, установлены ли Remote Tools for Visual Studio или нет, это кажется немного медленным, но в отдельном потоке это нормально для меня. - вот мой расширенный код:

    private bool isRdInstalled() {
        ManagementObjectSearcher p = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
        foreach (ManagementObject program in p.Get()) {
            if (program != null && program.GetPropertyValue("Name") != null && program.GetPropertyValue("Name").ToString().Contains("Microsoft Visual Studio 2012 Remote Debugger")) {
                return true;
            }
            if (program != null && program.GetPropertyValue("Name") != null) {
                Trace.WriteLine(program.GetPropertyValue("Name"));
            }
        }
        return false;
    }
0 голосов
/ 26 мая 2009

Могу ли я предложить вам взглянуть на WMI ( Инструментарий управления Windows ). Если вы добавите ссылку на System.Management в свой проект на C #, вы получите доступ к классу ManagementObjectSearcher, который вам, вероятно, будет полезен.

Существуют различные классы WMI для Установленных приложений , но если он был установлен с помощью установщика Windows, тогда класс Win32_Product, вероятно, лучше всего подходит для вас.

ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
0 голосов
/ 26 мая 2009

Лучше всего использовать WMI . В частности, Win32_Product класс.

...