Query WMI “installata” diversa da Aggiungi / Rimuovi elenco programmi?

Cercando di utilizzare WMI per ottenere un elenco di programmi installati per Windows XP. Usando wmic, ho provato:

wmic /output:c:\ProgramList.txt product get name,version 

e ottengo un elenco di molti dei programmi installati, ma dopo aver strofinato questo elenco su cosa viene visualizzato “Aggiungi / Rimuovi programmi”, vedo molti più programmi elencati nella GUI di Aggiungi / Rimuovi programmi rispetto alla query WMI. C’è un’altra query WMI che devo usare per ottenere il resto dei programmi installati? O c’è un altro posto dove devo cercare il resto?

Inoltre, esistono due programmi installati elencati nella query WMI che non si trovano in Aggiungi / Rimuovi programmi. Qualche idea del perché?

Credo che la tua syntax stia utilizzando la class Win32_Product in WMI. Una causa è che questa class visualizza solo i prodotti installati utilizzando Windows Installer ( Vedi qui ). La chiave di disinstallazione del registro è la soluzione migliore. Ecco un codice per monitorare la chiave di registro.

AGGIORNAMENTO PER COMMENTI:

La chiave di disinstallazione del Registro di sistema è la posizione standard in cui elencare cosa è installato e cosa non è installato. È la posizione in cui l’elenco Installazione applicazioni verrà utilizzata per popolare l’elenco di applicazioni. Sono sicuro che ci sono applicazioni che non si elencano in questa posizione. In tal caso, è necessario ricorrere a un altro metodo più complesso, ad esempio la ricerca nella directory dei programmi o l’elenco dei programmi del menu Start. Entrambi questi modi non sono assolutamente ideali.

Secondo me, guardare la chiave del registro è il metodo migliore.

Tutto quello che i programmi di aggiunta / rimozione sta facendo è leggere questa chiave di registro:

 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 

Oltre alla chiave di registro più comunemente nota per i programmi installati:

HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall

Il comando wmic e i programmi di aggiunta / rimozione interrogano anche un’altra chiave di registro:

HKEY_CLASSES_ROOT \ Installer \ Products

Il nome del software visualizzato nell’elenco viene letto dal valore di una voce di dati all’interno di questa chiave denominata: ProductName

La rimozione della chiave di registro per un determinato prodotto da entrambe le posizioni sopra impedirà la visualizzazione nell’elenco Aggiungi / Rimuovi programmi. Questo non è un metodo per disinstallare i programmi, rimuoverà semplicemente la voce da ciò che è noto a Windows come software installato.

Poiché, utilizzando questo metodo, si perderebbe la possibilità di utilizzare il pulsante Rimuovi dall’elenco Aggiungi / Rimuovi per rimuovere in modo pulito il software dal sistema; è consigliabile esportare le chiavi di registro in un file prima di eliminarle. In futuro, se decidessi di riportare l’elemento nell’elenco, eseguirai semplicemente il file di registro che hai archiviato.

Sto usando Inno Setup per un programma di installazione. Sto usando solo Windows 7 a 64 bit. Sto trovando che le voci di registro sono state scritte

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall

Non ho ancora capito come ottenere questa lista per essere segnalata da WMI (anche se il programma è elencato come installato in Programmi e funzionalità). Se lo capisco, cercherò di ricordare di riferire qui.

AGGIORNARE:

Le voci per i programmi a 32 bit installati su un computer a 64 bit vanno in quella posizione del registro. C’è più scritto qui:

http://mdb-blog.blogspot.com/2010/09/c-check-if-programapplication-is.html

Vedi il mio commento che descrive il comportamento a 32-bit vs 64-bit nello stesso post qui:

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

Sfortunatamente, non sembra essere un modo per ottenere WMI per elencare tutti i programmi dall’elenco di programmi di aggiunta / rimozione (noti anche come Programmi e Funzionalità in Windows 7, non sono sicuro di Vista). Il mio codice corrente ha abbandonato WMI a favore dell’uso del registro. Il codice stesso per interrogare il registro è ancora più semplice dell’utilizzo di WMI. Il codice di esempio si trova nel link sopra.

Non il migliore, ma se è un metodo pratico:

Usa HijackThis .

Esegui questo dirottamento, fai clic sul pulsante “Apri la sezione Strumenti vari”

HijackThis Main Menu

fare clic su “Apri Gestione Disinstalla”

HijackThis Configuration

fai clic su salva elenco (* .txt), sì sulle istruzioni, il blocco note si aprirà con l’elenco di programmi di aggiunta / rimozione.

HijackThis Add / Remove Programs Manager


fonte

I prodotti installati sono costituiti da elementi software e funzionalità installati, quindi vale la pena controllare l’alias wmic per PRODUCT e controllare SOFTWAREELEMATION e SOFTWAREFEATURE:

 wmic product get name,version wmic softwareelement get name,version wmic softwarefeature get name,version 

È ansible utilizzare lo script da http://technet.microsoft.com/en-us/library/ee692772.aspx#EBAA per accedere al registro ed elencare le applicazioni tramite WMI.

Per creare un elenco più o meno affidabile di applicazioni visualizzate nei “Programmi e Feautres” nel Pannello di controllo, è necessario considerare che non tutte le applicazioni sono state installate utilizzando MSI. WMI fornisce solo quelli installati con MSI.

Ecco un breve riassunto di ciò che ho scoperto:

Le applicazioni MSI hanno sempre una sottochiave Product Code (GUID) sotto HKLM\...\Uninstall e / o sotto HKLM\...\Installer\UserData\S-1-5-18\Products . Inoltre, potrebbero avere una chiave simile a HKLM\...\Uninstall\NotAGuid .

Le applicazioni non MSI non hanno un codice prodotto e quindi hanno chiavi come HKLM\...\Uninstall\NotAGuid o HKCU\...\Uninstall\NotAGuid .

Aggiungi / Rimuovi programmi deve anche esaminare questa chiave del Registro di sistema per trovare le installazioni per l’utente corrente:

 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall 

Applicazioni come Google Chrome, Dropbox o scorciatoie installate tramite JNLP JavaWS (web start) possono essere trovate solo qui.

Ho adattato MS-Technet VBScript per le mie esigenze. Esegue il dump di Wow6432Node e delle voci standard in “programms.txt”. Usalo a tuo rischio, senza garanzia!

Salva come dump.vbs

Dal tipo di riga di comando: 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 

Puoi ottenerlo in una riga con PowerShell e file batch:

 @echo off Powershell /command "Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-List" Pause 

Spero che questo aiuti qualcuno: ho usato l’enumerazione basata sul registro nei miei script (come suggerito da alcune delle risposte precedenti), ma ho scoperto che non enumera correttamente il software a 64 bit quando viene eseguito su Windows 10 x64 tramite SCCM (che utilizza un client a 32 bit). Ho trovato qualcosa del genere come la soluzione più semplice nel mio caso particolare:

 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 

Renditi conto che questo è un po ‘troppo Perl-ish in una ctriggers via, ma tutte le altre alternative che ho visto coinvolgono la pazzia con script wrapper e simili soluzioni intelligenti e intelligenti, e questo sembra un po’ più umano.

PS Cercando davvero di trattenersi dal buttare giù un sacco di sale su Microsoft qui per rendere quasi imansible una cosa assolutamente banale. Vale a dire, enumerare tutte le versioni di MS Office in uso su una rete è un compito per far piangere un uomo adulto.