Obtenir des applications installées dans un système

Comment faire installer les applications dans le système en utilisant le code c#?

66
demandé sur George Stocker 2009-05-26 07:53:53

10 réponses

itérer par la clé de registre" SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall " semble donner une liste complète des applications installées.

mis à part l'exemple ci-dessous, vous pouvez trouver une version similaire à ce que j'ai fait ici .

ceci est un exemple approximatif, vous aurez probablement envie de faire quelque chose pour rayer les lignes vides comme dans le 2ème lien fourni.

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

Vous pouvez également utiliser WMI comme indiqué ci-dessous:

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

mais c'est un peu plus lent à exécuter, et j'ai entendu dire qu'il ne peut lister que les programmes installés sous" ALLUSERS", bien que cela puisse être incorrect. Il ignore également les composants de Windows & updates, qui peut être pratique pour vous.

92
répondu Xiaofu 2017-03-05 18:00:14

vous pouvez jeter un oeil à cet article . Il utilise le Registre pour lire la liste des applications installées.

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)
                { }
            }
        }
    }
}
10
répondu Kirtan 2009-05-26 04:02:10

il est intéressant de noter que la classe Win32_Product WMI représente les produits tels qu'ils sont installés par Windows Installer[ http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx].pas chaque application utiliser Windows installer

cependant "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" représente des applications pour 32 bits. Pour 64 bits, vous avez également besoin de traverser "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall "et comme tous les logiciels n'ont pas une version 64 bits, le total des applications installées est une union de touches sur les deux emplacements qui ont une valeur" UninstallString " avec eux.

mais les meilleures options restent les mêmes .les clés de registre de traversée est une meilleure approche puisque chaque application ont une entrée dans le Registre[y compris ceux de Windows Installer].cependant la méthode de registre n'est pas sécurisée comme si n'importe qui enlève la clé correspondante alors vous ne connaîtrez pas l'entrée D'Application.Au contraire, Modifier les installateurs HKEY_CLASSES_ROOT\est plus délicat car il est lié à des problèmes de licence tels que Microsoft office ou d'autres produits. pour une solution plus robuste, vous pouvez toujours combiner l'alternative de registre avec le WMI.

5
répondu Akshita 2014-09-25 09:28:14

je conviens que l'énumération par la clé de Registre est la meilleure façon.

Note , cependant, que la clé donnée, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" , énumérera toutes les applications dans une installation Windows 32 bits, et les applications 64 bits dans une installation Windows 64 bits.

pour voir aussi les applications 32 bits installées sur une installation Windows 64 bits, vous devez aussi énumérer la clé @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" .

4
répondu Stephen Walter 2016-05-19 04:31:55

Iterate through" HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall " keys and check their "DisplayName" values.

1
répondu Moayad Mardini 2009-05-26 04:02:06

puis-je vous suggérer de jeter un oeil à WMI ( Windows Management Instrumentation ). Si vous ajoutez le Système.Référence de gestion à votre projet C#, vous accéderez à la classe `Gestionnaire D'objectifs de recherche', que vous trouverez probablement utile.

il existe plusieurs Classes WMI pour Installed Applications , mais si elle a été installée avec Windows Installer, alors la classe Win32_Product est probablement mieux adapté pour vous.

ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
1
répondu Nick 2009-05-26 04:04:41

utilisez L'API Windows Installer!

il permet de faire l'énumération fiable de tous les programmes. Le registre n'est pas fiable, mais WMI est un poids lourd.

1
répondu Brian Haak 2013-02-05 11:54:01

j'ai utilisé Nicks approche - je devais vérifier si les outils À Distance pour Visual Studio sont installés ou non, il semble un peu lent, mais dans un fil séparé, ce est très bien pour moi. - voici mon code étendu:

    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;
    }
1
répondu Marc Loeb 2013-06-25 10:40:50

votre meilleur pari est d'utiliser WMI . Plus précisément, la classe Win32_Product .

0
répondu paxdiablo 2009-05-26 03:58:58

mon exigence est de vérifier si un logiciel spécifique est installé dans mon système. Cette solution fonctionne comme prévu. Il pourrait vous aider. J'ai utilisé une application windows en c# avec 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;

        }
-1
répondu Pardha Saradhi Vanjarpau 2017-06-21 15:54:00