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é:
- WMI
Win32_Product
classe. Il montre que les msi programmes installés. - 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
Vous devez vous connecter pour publier un commentaire.
Ok gyus, j'ai écrit de classe qui peut installer des programmes à partir du registre sans correctifs et mises à jour. Il est encore pas exactement comme dans panneau de configuration mais presque. J'espère que cela aide quelqu'un d'autre.
J'ai pris le code que MelnikovI écrit (qui a été super utile) et ajouté un couple de choses. Tout d'abord, il recherche quatre endroits dans le registre:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKCU\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
Il vérifie également s'il y a des sous-clés - si ce n'est qu'il ignore que l'un.
Enfin, il fait une regex pour permettre uniquement à un certain ensemble de caractères [^a-zA-Z0-9 .()+-].
Je suis seulement à partir de C#, donc je ne sais pas un moyen de faire une boucle par tous les quatre reg endroits, j'ai donc deux boucles (une pour HKLM et un pour HKCU).
Si quelqu'un est intéressé, j'ai comparé les résultats à l'PowerShell j'ai été de les utiliser et ils sont les mêmes.
MelnikovI de réponse est suffisant pour la plupart des fins -- j'ai eu 144 articles dans ma liste vs 143 dans Programmes et Fonctionnalités. Pour examensa solution est de frapper ces emplacements de registre:
Pour être admissible, chaque sous-clé DOIT avoir:
Et ne DOIT PAS avoir:
La un addtional amélioration j'ai trouvé est de Windows Installer entrées, défini comme:
Pour ces entrées, vous pouvez prendre l'étape supplémentaire de l'utilisation de la fonction Win32 MsiGetProductInfoW de msi.dllet en demandant le "VersionString de la propriété" pour le GUID représenté par la clé.
Si cette fonction renvoie 1605: ERROR_UNKNOWN_PRODUCTcela signifie que l'entrée n'est pas installé selon le programme d'installation de Windows, et doivent être exclus de l'affichage.
Après la mise en œuvre de ce petit tweak, ma liste est maintenant identique à Programmes et Fonctionnalités.