windows windows-installer wmi

windows - ¿La consulta “instalada” de WMI es diferente de la lista de agregar/eliminar programas?



windows-installer (12)

Adapté el MS-Technet VBScript para mis necesidades. Vuelca Wow6432Node, así como entradas estándar en "programms.txt" ¡Úsalo bajo tu propio riesgo, sin garantía!

Guardar como dump.vbs

Desde la línea de comando escriba: 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

Intento usar WMI para obtener una lista de los programas instalados para Windows XP. Usando wmic, intenté:

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

y obtengo una lista de muchos de los programas instalados, pero después de consultar esta lista con lo que se muestra en "Agregar / Quitar Programas", veo muchos más programas en la GUI de Agregar / Quitar Programas que con la consulta de WMI. ¿Hay alguna otra consulta de WMI que deba usar para instalar el resto de los programas? ¿O hay algún otro lugar donde necesito buscar el resto?

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


Además de la clave de registro más conocida para los programas instalados:

HKEY_LOCAL_MACHINE / Software / Microsoft / Windows / CurrentVersion / Uninstall

El comando wmic y los programas de agregar / quitar también consultan otra clave de registro:

HKEY_CLASSES_ROOT / Installer / Products

El nombre del software que se muestra en la lista se lee del valor de una entrada de datos dentro de esta clave llamada: Nombre del producto

Eliminar la clave de registro para un determinado producto de las dos ubicaciones anteriores evitará que se muestre en la lista de agregar / quitar programas. Este no es un método para desinstalar programas, simplemente eliminará la entrada de lo que Windows conoce como software instalado.

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


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

HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Uninstall

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


Creo que su sintaxis está usando la clase Win32_Product en WMI. Una de las causas es que esta clase solo muestra los productos instalados con Windows Installer ( consulte aquí ). La clave de registro de desinstalación es su mejor apuesta. Aquí hay algo de código para monitorear la clave de registro.

ACTUALIZACIÓN PARA COMENTARIOS:

La clave de registro de desinstalación es el lugar estándar para enumerar lo que está instalado y lo que no está instalado. Es la ubicación que utilizará la lista Agregar o quitar programas para completar la lista de aplicaciones. Estoy seguro de que hay aplicaciones que no se listan en esta ubicación. En ese caso, tendría que recurrir a otro método más grosero, 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.


Espero que esto ayude a alguien: he estado usando la enumeración basada en el registro en mis scripts (como lo sugieren algunas de las respuestas anteriores), pero he descubierto que no enumera correctamente el software de 64 bits cuando se ejecuta en Windows 10 x64 a través de SCCM (que utiliza un cliente de 32 bits). Encontré algo como esto para ser 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

Date cuenta de que esto es demasiado malo para Perl-ish, pero todas las otras alternativas que he visto involucraron la locura con los scripts de envoltorios y soluciones inteligentes similares, y esto parece un poco más humano.

PD. Es realmente difícil abstenerse de echar una tonelada de sal en Microsoft aquí por hacer una cosa absolutamente 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 adulto.


He estado usando Inno Setup para un instalador. Estoy usando Windows 7 de 64 bits solamente. Estoy encontrando que las entradas de registro se están escribiendo en

HKEY_LOCAL_MACHINE / SOFTWARE / Wow6432Node / Microsoft / Windows / CurrentVersion / Uninstall

Todavía no he descubierto cómo WMI informa de esta lista (aunque el programa aparece como instalado en Programas y características). Si lo descubro, trataré de recordar informar aquí.

ACTUALIZAR:

Las entradas para los programas de 32 bits instalados en una máquina de 64 bits van en esa ubicación de registro. Hay más escrito aquí:

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

Vea mi comentario que describe el comportamiento de 32 bits frente a 64 bits en esa misma publicación aquí:

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

Desafortunadamente, no parece haber una manera de hacer que WMI enumere todos los programas de la lista de agregar / quitar programas (también conocido como Programas y Características en Windows 7, no estoy seguro de Vista). Mi código actual ha eliminado a WMI a favor de usar el registro. El código en sí para interrogar al registro es incluso más fácil que usar WMI. Código de muestra se encuentra en el enlace de arriba.


Los productos instalados se componen de elementos y características de software instalados, por lo que vale la pena comprobar los alias de wmic para el PRODUCTO, así como la comprobación de SOFTWAREELEMENT y SOFTWAREFEATURE:

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


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

Usa HijackThis .

Ejecuta el secuestro de esto, haz clic en el botón "Abrir la sección de herramientas varias"

haga clic en "Abrir el administrador de desinstalación"

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

Source


Para crear una lista más o menos confiable de las aplicaciones que aparecen en "Programas y Feautres" en el Panel de Control, debe considerar que no todas las aplicaciones se instalaron utilizando MSI. WMI solo proporciona los instalados con MSI.

Aquí hay un breve resumen de lo que he descubierto:

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

Las aplicaciones que no son MSI no tienen un código de producto y, por lo tanto, tienen claves como HKLM/.../Uninstall/NotAGuid o HKCU/.../Uninstall/NotAGuid .



Puedes obtenerlo en una línea con powershell y un archivo por lotes:

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


Todo lo que realmente está haciendo Add / Remove Programs es leer esta clave de registro:

HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Uninstall