Détection des programmes installés via le registre

J'ai besoin de développer un processus qui détectera si l'ordinateur des utilisateurs a certains programmes installés et si oui, quelle version. Je crois que j'aurai besoin d'une liste avec l'emplacement du registre et les clés pour la rechercher et l'alimenter au programme, ce qui n'est pas un problème. Y a-t-il une meilleure façon d'accomplir cela?

Ma première pensée a été de vérifier dans le registre de la désinstallation entrées, mais il semble que l'une des applications que je souhaite détecter n'en a pas. Quel est l'emplacement standard pour tous registre en utilisant des applications pour faire une entrée dans?

56
demandé sur Mark Stahler 2009-01-10 00:06:13

9 réponses

Les paramètres spécifiques à L'utilisateur doivent être écrits dans HKCU \ Software, les paramètres spécifiques à la machine dans HKLM \ Software. Sous ces clés, la structure [software vendor name]\[application name] (par exemple HKLM\Software\Microsoft\Internet Explorer) peut être la plus courante, mais c'est juste une convention, pas une loi de la nature.

Beaucoup (la plupart?) les applications ajoutent également leurs entrées de désinstallation à HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[app name], mais encore une fois, toutes les applications ne le font pas.

Ce sont les clés les plus importantes; cependant, le contenu du registre n'a pas à représenter exactement le logiciel installé-peut-être l'application a été installée une fois, mais a ensuite été supprimée manuellement, ou peut-être que le programme de désinstallation n'en a pas supprimé toutes les traces. Si vous voulez être sûr, vérifiez le système de fichiers pour voir si l'application existe toujours là où ses entrées de Registre le disent.

Modifier:

Si vous êtes membre des administrateurs du groupe, vous pouvez vérifier la ruche HKEY_USERS - le HKCU de chaque utilisateur réside réellement là (vous devrez connaître L'utilisateur SID, ou passer en revue tous).

Note: Comme le dit @ Brian Ensink, "installé" est un peu un concept vague-essayons-nous de trouver ce que l'utilisateur pourrait exécuter? Certains logiciels n'écrivent même pas du tout dans le Registre: recherchez des "applications portables" pour voir les applications qui ont été spécifiquement modifiées pour s'exécuter directement à partir d'un support (CD/USB) et Pas pour laisser des traces sur l'ordinateur. Nous pouvons également avoir à analyser les disques, et les disques réseau, et tout ce que l'utilisateur télécharge, et les partages Windows accessibles dans le monde sur Internet (oui, de telles choses existent légitimement - \\live.sysinternals.com\tools vient à l'esprit). Dans ce sens, il n'y a pas de limite réelle de ce que l'utilisateur peut exécuter, à moins d'être empêché par les stratégies système.

33
répondu Piskvor 2011-01-13 16:18:56

Sur les systèmes 64 bits, la clé x64 est:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

La plupart des programmes y sont listés. Regarde les touches: DisplayName DisplayVersion

Notez que le dernier n'est pas toujours réglé!

Sur les systèmes 64 bits, la clé x86 (généralement avec plus d'entrées) est:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
34
répondu Bernd Ott 2016-06-19 18:01:22

Vous pouvez utiliser L'API MSI pour énumérer tout ce qui est installé par Windows Installer, mais cela ne listera pas tous les logiciels disponibles sur une machine. Sans en savoir plus sur ce dont vous avez besoin, je pense que le concept de "Installé" est un peu vague. Il existe de nombreuses façons de déployer des logiciels sur un système allant des grands installateurs compliqués aux fichiers ZIP et tout le reste.

9
répondu Brian Ensink 2009-01-09 21:40:18

Une application n'a pas besoin d'avoir d'entrée de registre. En fait, de nombreuses applications n'ont pas besoin d'être installé à tous. Les clés USB U3 sont un bon exemple; les programmes sur eux fonctionnent simplement à partir du système de fichiers.

Comme indiqué, la plupart des bonnes applications peuvent être trouvées via leur clé de registre de désinstallation. Ceci est en fait une paire de clés, par utilisateur et par machine(HKCU / HKLM-Piskvor mentionné seulement le HKLM). Il ne vous donne pas (toujours) le répertoire d'installation, cependant.

Si c'est dans HKCU, alors vous devez réaliser que HKEY_CURRENT_USER signifie vraiment "utilisateur actuel". D'autres utilisateurs ont leurs propres entrées HKCU, et leur propre logiciel installé. Vous ne trouvez pas que. Lecture chaque HKEY_USERS hive est une catastrophe sur les réseaux d'entreprise avec des profils d'itinérance. Vous ne voulez vraiment pas aller chercher 1000 comptes à partir de votre bureau distant [États-Unis|Chine / Europe].

Même si une application est installée, et vous savez où, elle peut ne pas avoir la même notion de "version" que vous avez. La meilleure source est la ressource "version" dans les exécutables. C'est en effet un pluriel, donc vous devez tous les trouver, extraire les ressources de version de tous et en cas de conflit décider de quelque chose de raisonnable.

Alors - bonne chance. Il y a dozes de moyens à l'échec.

6
répondu MSalters 2009-01-12 16:00:08

Vous pouvez utiliser un script PowerShell pour regarder les registres et obtenir les détails du programme installé. Le script soufflet va générer un fichier avec la liste complète des programmes installés. Enregistrez-le avec l'extension". ps " et double-cliquez sur le fichier.

#
# Generates a full list of installed programs.
#

# Temporary auxiliar file.
$tmpFile = "tmp.txt"

# File that will hold the programs list.
$fileName = "programas-instalados.txt"

# Columns separator.
$separator = ","

# Delete previous files.
Remove-Item $tmpFile
Remove-Item $fileName

# Creates the temporary file.
Create-Item $tmpFile

# Searchs register for programs - part 1
$loc = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"        
    }
}

# Searchs register for programs - part 2
$loc = Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"
    }
}

# Sorts the result, removes duplicate lines and
# generates the final file.
gc $tmpFile | sort | get-unique > $filename
2
répondu Arivan Bastos 2017-10-27 18:23:36

En plus de toutes les clés de registre mentionnées ci-dessus, vous devrez peut-être également regarder HKEY_CURRENT_USER\Software\Microsoft\Installer\Products pour les programmes installés uniquement pour l'utilisateur actuel.

1
répondu David Airapetyan 2011-12-15 01:01:59

Semble chercher quelque chose de spécifique au programme installé fonctionnerait mieux, mais HKCU \ Software et HKLM \ Software sont les endroits à regarder.

0
répondu Nick 2009-01-09 21:21:42

Win32_Product ne montre jamais tout, seul le logiciel installé via un programme D'installation MSI (pour autant que je sache.)

Il y a beaucoup de logiciels qui sont installés via d'autres installateurs qui n'apparaissent pas là-bas. un autre moyen est nécessaire.

0
répondu Naikrovek 2010-06-29 15:02:00

HKEY_CURRENT_USER \ Software \ Microsoft\Windows NT\CurrentVersion\AppCompatFlags \ Assistant de compatibilité\persisté

0
répondu user10211111 2018-08-11 04:30:31