Je dois développer un processus qui détectera si certains programmes sont installés sur l'ordinateur de l'utilisateur et, le cas échéant, quelle version. Je crois que j'aurai besoin d'une liste avec l'emplacement du registre et les clés à rechercher et à l'envoyer 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 les entrées de désinstallation, mais il semble que l’une des applications que je souhaite détecter n’en possède pas. Quel est l'emplacement standard pour tous les registres utilisant des applications pour effectuer une entrée?
Les paramètres spécifiques à l'utilisateur doivent être écrits dans HKCU\Software, les paramètres spécifiques à la machine à 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 ce n'est qu'une convention, pas une loi de la nature.
De nombreuses applications (la plupart?) Ajoutent également leurs entrées de désinstallation à HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[app name]
, mais là encore, toutes les applications ne le font pas.
Ce sont les clés les plus importantes. Cependant, le contenu du registre ne doit pas nécessairement représenter exactement le logiciel installé. L'application a peut-être été installée une fois, mais elle a ensuite été supprimée manuellement ou le programme de désinstallation n'a peut-être pas supprimé toutes les traces de celui-ci. Si vous voulez en être sûr, vérifiez le système de fichiers pour voir si l'application existe toujours là où ses entrées de registre l'indiquent.
Modifier:
Si vous êtes membre du groupe Administrateurs, vous pouvez vérifier le HKEY_USERS
Hive - chaque HKCU de chaque utilisateur y réside (vous devez connaître le SID de l'utilisateur ou les parcourir tous).
Remarque: Comme @Brian Ensink le dit, "installé" est un concept un peu 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 spécialement modifiées pour fonctionner directement à partir d'un support (CD/USB) et pas pour ne laisser aucune trace sur l'ordinateur. . Nous pouvons également devoir analyser les disques et les disques réseau, ainsi que tout ce que l’utilisateur télécharge, et les partages Windows accessibles au monde entier sur Internet (oui, de telles choses existent légitimement - je pense à \\live.sysinternals.com\tools
). Dans cette direction, il n'y a pas de réelle limite à ce que l'utilisateur peut exécuter, à moins que cela ne soit empêché par les stratégies système.
Sur les systèmes 64 bits, la clé x64 est la suivante:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
La plupart des programmes y sont listés. Regardez les clés: DisplayName
DisplayVersion
Notez que le dernier n'est pas toujours défini!
Sur les systèmes 64 bits, la clé x86 (généralement avec plus d'entrées) est la suivante:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
Vous pouvez utiliser l'API MSI pour énumérer tout ce qui est installé par Windows Installer, mais cela ne répertorie pas tous les logiciels disponibles sur une machine. Sans en savoir plus sur ce dont vous avez besoin, le concept d ’" installé "est un peu vague. Il existe de nombreuses façons de déployer un logiciel sur un système allant des gros installateurs complexes aux fichiers Zip, entre autres.
Une application n'a besoin d'aucune entrée de registre. En fait, de nombreuses applications n'ont pas besoin d'être installées du tout. Les clés USB U3 en sont un bon exemple. les programmes qu’ils exécutent s’exécutent 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. Il s’agit en fait d’une paire de clés, par utilisateur et par machine (HKCU/HKLM - Piskvor n’a mentionné que celle de HKLM). Cependant, il ne vous donne pas (toujours) le répertoire d'installation.
Si c'est en HKCU, alors vous devez comprendre que HKEY_CURRENT_USER
signifie vraiment "Utilisateur actuel". Les autres utilisateurs ont leurs propres entrées HKCU et leur propre logiciel installé. Vous ne pouvez pas trouver ça. Reading every HKEY_USERS
Hive est une catastrophe pour les réseaux d’entreprise dotés de profils itinérants. Vous ne voulez vraiment pas extraire 1000 comptes de votre bureau distant [US | China | Europe].
Même si une application est installée et que vous savez où, elle peut ne pas avoir la même notion de "version" que celle que vous avez. La meilleure source est la ressource "version" dans les exécutables. C'est en effet un pluriel, vous devez donc tous les trouver, extraire les ressources de toutes les versions et, en cas de conflit, décider de quelque chose de raisonnable.
Alors bonne chance. Il y a des dizaines de façons d'échouer.
Vous pouvez utiliser un script PowerShell pour consulter les registres et obtenir les détails du programme installé. Le script ci-dessous générera 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
Outre toutes les clés de registre mentionnées ci-dessus, vous devrez peut-être également consulter HKEY_CURRENT_USER\Software\Microsoft\Installer\Products pour connaître les programmes installés uniquement pour l'utilisateur actuel.
Win32_Product ne montre jamais tout, seulement les logiciels installés via un programme d'installation MSI (pour autant que je sache.)
Il y a beaucoup de paquets de logiciels qui sont installés via d'autres installateurs et qui n'apparaissent pas là-bas. un autre moyen est nécessaire.
On dirait que chercher quelque chose de spécifique au programme installé fonctionnerait mieux, mais HKCU\Software et HKLM\Software sont les endroits à regarder.
HKEY_CURRENT_USER\Logiciel\Microsoft\Windows NT\version actuelle\AppCompatFlags\Assistant de compatibilité\persistant