web-dev-qa-db-fra.com

WMI "installé" requête différente de la liste Ajout/Suppression de programmes?

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?

39
romandas

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.

28
Rob Haupt

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
13
BobbyShaftoe

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é.

7
saalehr

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:

http://mdb-blog.blogspot.com/2010/09/c-check-if-programapplication-is.html?showComment=1300402090679#c861009270784046894

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.

5
Tyler Collier

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".

HijackThis Main Menu

cliquez sur "Open Uninstall Manager"

HijackThis Configuration

cliquez sur sauvegarder la liste (* .txt), oui, à l'invite, le bloc-notes s'ouvrira avec votre liste de programmes d'ajout/suppression.

HijackThis Add/Remove Programs Manager


La source

4
quantme

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
2
MacG

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.

2
motobói

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.

1
Ilya Kogan

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.

0
Daibhi O Domhnaill

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
0
seizu

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
0
Hackoo

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.

0
candritzky