Essayez d'utiliser WMI pour obtenir une liste des programmes installés pour Windows XP. En utilisant wmic, j'ai essayé:
wmic /output:c:\ProgramList.txt product get name,version
et j'obtiens une liste de nombreux programmes installés, mais après avoir balayé cette liste avec l'affichage de «Ajout/Suppression de programmes», je vois beaucoup plus de programmes répertoriés dans l'interface graphique de Ajout/Suppression de programmes qu'avec la requête WMI. Dois-je utiliser une autre requête WMI pour installer le reste des programmes? Ou y a-t-il un autre endroit où je dois chercher le reste?
En outre, deux programmes installés répertoriés dans la requête WMI ne figurent pas dans Ajout/Suppression de programmes. Une idée pourquoi?
Je crois que votre syntaxe utilise le Win32_Product Class dans WMI. Une des causes est que cette classe n’affiche que les produits installés sous Windows Installer ( Voir ici ). La clé de registre de désinstallation est votre meilleur choix. Voici du code pour surveiller la clé de registre.
MISE À JOUR POUR LES COMMENTAIRES:
La clé de registre de désinstallation est l'emplacement standard pour répertorier les éléments installés et ceux qui ne le sont pas. Il s’agit de l’emplacement que la liste Ajout/Suppression de programmes utilisera pour renseigner la liste des applications. Je suis sûr qu'il existe des applications qui ne se listent pas à cet endroit. Dans ce cas, vous devrez recourir à une autre méthode plus brutale, telle que la recherche dans le répertoire Program Files ou la liste dans le menu Démarrer Programmes. Ces deux manières ne sont certainement pas idéales.
À mon avis, examiner la clé de registre est la meilleure méthode.
Tout ce que Ajout/Suppression de programmes est en train de faire, c'est de lire cette clé de registre:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
Outre la clé de registre la plus connue pour les programmes installés:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
la commande wmic et les programmes d'ajout/suppression interrogent également une autre clé de registre:
HKEY_CLASSES_ROOT\Installer\Produits
Le nom du logiciel indiqué dans la liste est lu à partir de la valeur d'une entrée de données dans cette clé appelée: ProductName
La suppression de la clé de registre pour un produit donné aux deux emplacements ci-dessus l'empêchera de s'afficher dans la liste Ajout/Suppression de programmes Ce n'est pas une méthode pour désinstaller des programmes, cela supprimera simplement l'entrée de ce que Windows sait comme logiciel installé.
En utilisant cette méthode, vous perdriez la possibilité d’utiliser le bouton Supprimer de la liste d’ajout/suppression pour supprimer proprement le logiciel de votre système; Il est recommandé d'exporter les clés de registre dans un fichier avant de les supprimer. À l'avenir, si vous décidiez de ramener cet élément à la liste, exécutez simplement le fichier de registre que vous avez stocké.
J'utilise Inno Setup pour un installateur. J'utilise uniquement Windows 7 64 bits. Je trouve que les entrées de registre sont en cours d'écriture
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
Je n'ai pas encore compris comment faire en sorte que cette liste soit signalée par WMI (bien que le programme soit répertorié comme installé dans Programmes et fonctionnalités). Si je le découvre, je vais essayer de ne pas oublier de faire rapport ici.
METTRE À JOUR:
Les entrées des programmes 32 bits installés sur un ordinateur 64 bits sont placées dans cet emplacement du registre. Il y a plus écrit ici:
http://mdb-blog.blogspot.com/2010/09/c-check-if-programapplication-is.html
Voir mon commentaire qui décrit le comportement 32 bits vs 64 bits dans le même message ici:
Malheureusement, il ne semble pas y avoir de moyen de faire en sorte que WMI dresse la liste de tous les programmes de la liste des programmes d’ajout/suppression (programmes et fonctionnalités de Windows 7, pas sûr de Vista). Mon code actuel a abandonné WMI en faveur de l'utilisation du registre. Le code lui-même pour interroger le registre est encore plus simple que d'utiliser WMI. Le code exemple est dans le lien ci-dessus.
Pas le meilleur, mais si c'est une méthode pratique:
Utilisez HijackThis .
Exécutez Hijack this, cliquez sur le bouton "Ouvrir la section Outils Divers".
cliquez sur "Open Uninstall Manager"
cliquez sur sauvegarder la liste (* .txt), oui, à l'invite, le bloc-notes s'ouvrira avec votre liste de programmes d'ajout/suppression.
Les produits installés comprennent des éléments logiciels et des fonctionnalités installés. Il est donc intéressant de vérifier les alias de wmic pour PRODUCT ainsi que de vérifier SOFTWAREELEMENT et SOFTWAREFEATURE:
wmic product get name,version
wmic softwareelement get name,version
wmic softwarefeature get name,version
Vous pouvez utiliser le script de http://technet.Microsoft.com/en-us/library/ee692772.aspx#EBAA pour accéder au registre et répertorier les applications à l'aide de WMI.
Pour créer une liste plus ou moins fiable d'applications qui apparaissent dans les "Programmes et fonctionnalités" du Panneau de configuration, vous devez considérer que toutes les applications n'ont pas été installées à l'aide de MSI. WMI fournit uniquement ceux installés avec MSI.
Voici un bref résumé de ce que j'ai découvert:
Les applications MSI ont toujours une sous-clé de code de produit (GUID) sous HKLM\...\Uninstall
et/ou sous HKLM\...\Installer\UserData\S-1-5-18\Products
. De plus, ils peuvent avoir une clé qui ressemble à HKLM\...\Uninstall\NotAGuid
.
Les applications non-MSI n'ont pas de code produit et ont donc des clés telles que HKLM\...\Uninstall\NotAGuid
ou HKCU\...\Uninstall\NotAGuid
.
J'espère que cela aidera quelqu'un: j'utilise l'énumération basée sur le registre dans mes scripts (comme suggéré par certaines des réponses ci-dessus), mais j'ai constaté qu'elle n'énumère pas correctement les logiciels 64 bits sous Windows 10 x64 via SCCM (qui utilise un client 32 bits). J'ai trouvé quelque chose comme ceci comme la solution la plus simple dans mon cas particulier:
Function Get-Programs($Bits) {
$Result = @()
$Output = (reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall /reg:$Bits /s)
Foreach ($Line in $Output) {
If ($Line -match '^\s+DisplayName\s+REG_SZ\s+(.+?)$') {
$Result += New-Object PSObject -Property @{
DisplayName = $matches[1];
Bits = "$($Bits)-bit";
}
}
}
$Result
}
$Software = Get-Programs 32
$Software += Get-Programs 64
Réalisez que ceci est un peu trop perlant, mais toutes les autres alternatives que j'ai vues impliquaient de la folie avec des scripts wrapper et des solutions similaires intelligentes, et cela semble un peu plus humain.
P.S. Nous essayons vraiment de ne pas laisser tomber une tonne de sel sur Microsoft ici pour rendre une chose absolument triviale presque impossible. C'est-à-dire qu'énumérer toutes les versions de MS Office utilisées sur un réseau est une tâche qui fait pleurer un homme adulte.
J'ai adapté le VBScript MS-Technet à mes besoins. Il vide Wow6432Node ainsi que les entrées standard dans "programms.txt" Utilisez-le à vos risques et périls, sans garantie!
Enregistrer sous dump.vbs
A partir de la ligne de commande, tapez: wscript dump.vbs
Const HKLM = &H80000002
Set objReg = GetObject("winmgmts://" & "." & "/root/default:StdRegProv")
Set objFSO = CreateObject("Scripting.FileSystemObject")
outFile="programms.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
writeList "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\", objReg, objFile
writeList "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\", objReg, objFile
objFile.Close
Function writeList(strBaseKey, objReg, objFile)
objReg.EnumKey HKLM, strBaseKey, arrSubKeys
For Each strSubKey In arrSubKeys
intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, "DisplayName", strValue)
If intRet <> 0 Then
intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, "QuietDisplayName", strValue)
End If
objReg.GetStringValue HKLM, strBaseKey & strSubKey, "DisplayVersion", version
objReg.GetStringValue HKLM, strBaseKey & strSubKey, "InstallDate", insDate
If (strValue <> "") and (intRet = 0) Then
objFile.Write strValue & "," & version & "," & insDate & vbCrLf
End If
Next
End Function
Vous pouvez l'obtenir en une seule ligne avec powershell et fichier batch:
@echo off
Powershell /command "Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-List"
Pause
Ajout/Suppression de programmes doit également examiner cette clé de registre pour rechercher les installations de l'utilisateur actuel:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
Les applications telles que Google Chrome, Dropbox ou les raccourcis installés via JavaWS (démarrage Web) ne peuvent être trouvés qu'ici.