2009-03-23 28 views
39

Intentando usar WMI para obtener una lista de programas instalados para Windows XP. Usando wmic, he intentado:¿La consulta WMI "instalada" es diferente de la lista de agregar/eliminar programas?

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

y me da una lista de muchos de los programas instalados, pero después de fregar esta lista en contra de lo "Agregar/quitar programas" muestra, veo muchos más programas enumerados en la interfaz gráfica de usuario de Agregar/Quitar programas que con la consulta WMI. ¿Hay otra consulta WMI que necesito usar para instalar el resto de los programas? ¿O hay algún otro lugar en el que necesite buscar el resto?

Además, hay dos programas instalados que se enumeran en la consulta WMI que no están en Agregar o quitar programas. ¿Alguna idea de por qué?

+1

+1 para la consulta WMIC – aolszowka

Respuesta

27

Creo que su sintaxis está utilizando la clase Win32_Product en WMI. Una de las causas es que esta clase solo muestra productos instalados utilizando Windows Installer (See Here). La clave de registro de desinstalación es su mejor opción. Aquí está some code para monitorear la clave de registro.

ACTUALIZACIÓN DE OBSERVACIONES:

La clave de registro de desinstalación es el lugar estándar para enumerar lo que se instala y qué no está instalado. Es la ubicación que usará la lista Agregar o quitar programas para completar la lista de aplicaciones. Estoy seguro de que hay aplicaciones que no se incluyen en esta ubicación. En ese caso, tendrías que recurrir a otro método más crudo, como buscar en el directorio Archivos de programa o buscar en la Lista de programas del menú Inicio. Ambas formas definitivamente no son ideales.

En mi opinión, mirar la clave de registro es el mejor método.

+0

¿Hay algún otro lugar para ver? IOW ¿hay algún programa que cuente como 'instalado' sin usar el Instalador o la clave de desinstalación del registro? – romandas

+0

Respuesta actualizada según su comentario. –

+0

+1 y aceptado - respuesta más completa (en el momento de este comentario), aunque listar la entrada del registro como lo hizo Bobby sería agradable. – romandas

12

Todo lo que Agregar/quitar programas está haciendo realmente está leyendo esta clave del Registro:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 
+1

En Windows 8.1, una de las aplicaciones de desinstalación se encontró en una ubicación de registro diferente: 'HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ AppName_is1'. El '_is1' es una decoración [agregada por InnoSetup] (http://www.jrsoftware.org/files/is1.3-whatsnew.htm). – cod3monk3y

6

Además de la clave de registro más comúnmente conocido por los programas instalados:

HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall

comando wmic y añadir/quitar programas también consultar otro registro clave:

HKEY_CLASSES_ROOT \ Installer \ Products

Nombre del programa se muestra en la lista se lee desde el valor de una entrada de datos dentro de esta clave llamada: ProductName

Extracción de la clave de registro para un determinado producto de las dos ubicaciones anteriores será evitar que se muestra en el complemento/eliminar lista de programas. Este no es un método para desinstalar programas, solo eliminará la entrada de lo que Windows ya conoce como software instalado.

Dado que, al usar este método, perderá la posibilidad de utilizar el botón Eliminar de la lista de agregar/eliminar para eliminar el software de su sistema de manera limpia; se recomienda exportar claves de registro a un archivo antes de eliminarlas. En el futuro, si decidiera devolver ese elemento a la lista, simplemente ejecutaría el archivo de registro que almacenó.

5

He estado usando Inno Setup para un instalador. Estoy usando Windows 7 de 64 bits solamente.Estoy encontrando que las entradas del registro se escriben en

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

aún no he descubierto la manera de obtener esta lista para ser informado por WMI (aunque el programa aparece como instalado en Programas y características). Si lo resuelvo, intentaré recordar informar aquí.

ACTUALIZACIÓN:

Las inscripciones para programas de 32 bits instalado en una máquina de 64 bits ir en esa ubicación del registro. Hay más escrito aquí:

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

ver mi comentario que describe 32 bits vs el comportamiento de 64 bits en ese mismo post aquí:

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

Por desgracia, no parece ser una forma de hacer que WMI haga una lista de todos los programas desde la lista de agregar/quitar programas (también conocidos como Programas y características en Windows 7, no estoy seguro acerca de Vista). Mi código actual ha dejado WMI a favor de usar el registro. El código en sí mismo para interrogar al registro es incluso más fácil que usar WMI. El código de muestra está en el enlace de arriba.

2

productos instalados consisten en elementos y características por lo que vale la pena revisar wmic de alias para el producto, así como la comprobación SOFTWAREELEMENT y SOFTWAREFEATURE de software instalados:

wmic product get name,version 

wmic softwareelement get name,version 

wmic softwarefeature get name,version 
4

No es el mejor, pero si se trata de un método práctico:

Use HijackThis.

Ejecutar secuestrar esto, haga clic en el botón "Abrir la sección Herramientas Varios"

HijackThis Main Menu

clic en "Abrir Uninstall Manager"

HijackThis Configuration

clic en Guardar lista (* .txt) , sí a las indicaciones, el bloc de notas se abrirá con su lista de agregar/quitar programas.

HijackThis Add/Remove Programs Manager


Source

+1

Esto parece mucho trabajo para nada y no tiene nada que ver con la pregunta, que fue cómo usar WMI para hacer la consulta. – romandas

+4

@romandas, creo que se dio esta respuesta porque quantme supuso que el póster no tenía un interés teórico puro en la consulta de WMI, sino que estaba tratando de obtener una lista completa y confiable de los programas instalados. Esta respuesta también es una respuesta a la pregunta secundaria "¿O hay algún otro lugar donde necesite buscar el resto?" –

0

Agregar/quitar programas también tiene que mirar en esta clave de registro para encontrar instalaciones para el usuario actual:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall 

aplicaciones como Google Chrome, Dropbox , o accesos directos instalados a través de JavaWS (inicio web) Los JNLP solo se pueden encontrar aquí.

1

Para compilar una lista más o menos confiable de las aplicaciones que aparecen en los "Programas y características" en el Panel de control, debe tener en cuenta que no todas las aplicaciones se instalaron con MSI. WMI solo proporciona los que están instalados con MSI.

Aquí está un breve resumen de lo que he encontrado:

aplicaciones MSI siempre tienen una subclave de código de producto (GUID) bajo HKLM\...\Uninstall y/o bajo HKLM\...\Installer\UserData\S-1-5-18\Products. Además, pueden tener una clave que se parece al HKLM\...\Uninstall\NotAGuid.

aplicaciones no MSI no tienen un código de producto, y por lo tanto tener claves como HKLM\...\Uninstall\NotAGuid o HKCU\...\Uninstall\NotAGuid.

0

Adapte el VBScript de MS-Technet para mis necesidades. Vacia Wow6432Node así como entradas estándar en "programms.txt" Úselo bajo su propio riesgo, ¡sin garantía!

Guardar como dump.vbs

De tipo de línea de comandos: 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

lo puede conseguir en una sola línea con el archivo por lotes y PowerShell:

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

Espero que esto ayude a alguien: He estado usando la enumeración basada en el registro en mis scripts (como su informadas por algunas de las respuestas anteriores), pero descubrieron que no enumera correctamente el software de 64 bits cuando se ejecuta en Windows 10 x64 a través de SCCM (que usa un cliente de 32 bits). Encontrado algo así como que se trata de la solución más sencilla en mi caso particular:

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 

consciente de que es un poco demasiado Perl-ish de una mala manera, pero todas las otras alternativas que he visto implicada la locura con la envoltura secuencias de comandos y soluciones ingeniosas inteligentes similares, y esto parece un poco más humano.

P.S. Intentando realmente evitar dejar un montón de sal en Microsoft aquí por hacer algo completamente trivial casi imposible. Es decir, enumerar todas las versiones de MS Office en uso en una red es una tarea para hacer llorar a un hombre adulto.

Cuestiones relacionadas