Получить установленные приложения в системе

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

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

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

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

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, которые могут быть вам полезны.

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

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

стоит отметить, что class WMI Win32_Product представляет продукты, поскольку они установлены установщиком Windows [ http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx%5D.not каждое приложение использовать установщик Windows

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

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

Я согласен с тем, что перечисление через ключ реестра – лучший способ.

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

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

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

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

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

 ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 

Использовать Windows Installer API!

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

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

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

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

Мое требование – проверить, установлено ли в моей системе определенное программное обеспечение. Это решение работает так, как ожидалось. Это может помочь вам. Я использовал приложение 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; } 
  • Получить установленную дату приложения на Android
  • Добавление пользовательских prerequsites в проект настройки визуальной студии
  • Ошибка установки углового с использованием npm из-за необходимости использовать строку
  • Различия между utf8 и latin1
  • Как лучше использовать файлы MSI
  • Создайте программу установки для приложений C # и включите установщик .NET Framework в настройку
  • Как получить COM-сервер для Excel, написанный на VB.NET, установленный и зарегистрированный в списке серверов автоматизации?
  • Как изменить местоположение библиотеки в R?
  • расположение каталога данных mysql
  • В проекте установки Visual Studio, как мне создать сценарий удаления?
  • Как установить конкретный JDK в Mac OS X?
  • Interesting Posts

    Два интернет-соединения, одна локальная сеть – как поделиться?

    Может ли модуль тестирования проекта загрузить файл app.config целевого приложения?

    Создание массива из текстового файла в Bash

    Android: ProgressDialog.show () сбой с getApplicationContext

    Сравнение скорости между USB 2.0, USB 3.0 и SATA и Firewire

    Angular2 Tutorial (Tour of Heroes): Не удается найти модуль ‘angular2-in-memory-web-api’

    Могу ли я уменьшить свой браузер до сетевой активности «голых костей»?

    Как загрузить несколько файлов с помощью одного HTTP-запроса?

    Почему параллельный stream получается последовательно в Java 8

    Как избежать бит-торрента, чтобы снизить производительность соединения без ограничения использования полосы пропускания?

    Находите диапазон диапазонов дат в пределах одной таблицы, для конкретного пользователя MySQL

    Excel можно заполнить две ячейки одной if-формулой

    Передача многомерных массивов в качестве аргументов функции в C

    Объединение int в строку с использованием препроцессора C

    Перенаправление локальной локальной сети и интернет-трафика в VPN

    Давайте будем гением компьютера.