vs_prerequisites_x64_esm sqlsupport_msi sqlsupport services puedo porque paquete necesario msi instalar existe exist error doesn descargar 0x858c0038 windows-installer wmi

windows installer - sqlsupport_msi - ¿Por qué enumerar paquetes instalados de MSI es tan lento?



sqlsupport_msi necesario (5)

Cuando estás utilizando las funciones api que están declaradas en msi.h, estás a la velocidad de la luz. Estoy usando la API para mi actualización de software de software y enumerar cientos de paquetes requiere un segundo.

Este es un seguimiento de esta pregunta .

Estoy usando este script ligeramente modificado para enumerar todos los paquetes MSI instalados:

strComputer = "." Set objWMIService = GetObject("winmgmts:" & _ "{impersonationLevel=impersonate}!//" & _ strComputer & _ "/root/cimv2") Set colSoftware = objWMIService.ExecQuery _ ("SELECT * FROM Win32_Product") If colSoftware.Count > 0 Then For Each objSoftware in colSoftware WScript.Echo objSoftware.Caption & vbtab & _ objSoftware.Version Next Else WScript.Echo "Cannot retrieve software from this computer." End If

Lo que es sorprendente, sin embargo, es su rendimiento abismal. ¡Enumerar los 34 paquetes instalados de MSI en mi caja de XP lleva entre 3 y 5 minutos!

En comparación, la caja de Linux que se encuentra junto está tomando 7s para enumerar 1400+ RPM ... suspiro

Alguna pista sobre esto?



Sospechaba un problema de red y Wireshark me demostró que tenía razón.

Parece que Windows Installer felizmente intenta reabrir todos los archivos .msi originales, incluidos los que vivían en recursos compartidos de red.


Esto funciona para mí y evita la lentitud del enfoque de WMI:

Dim installer Set installer = CreateObject("WindowsInstaller.Installer") Dim productCode, productName For Each productCode In installer.Products productName = installer.ProductInfo(productCode, "ProductName") WScript.Echo productCode & " , " & productName Next

Obtenga más información sobre el objeto Installer desde http://msdn.microsoft.com/en-us/library/windows/desktop/aa369432(v=vs.85).aspx


La lentitud extrema es un problema conocido / común para enumerar Win32_Products

Si necesita una solución alternativa, considere la posibilidad de crear su propia lista de productos utilizando las entradas de registro ''Desinstalar'' (como se sugiere en una de las respuestas a la pregunta original a la que se refirió).

Algunas referencias generales para enumerar Desinstalar:

Y para hacerlo remotamente , use la clase de registro WMI, StdRegProv . TechNet incluso proporciona convenientemente un ejemplo simple de uso de StdRegProv para hacer lo que desea: ¿Cómo puedo enumerar todas las aplicaciones instaladas en una máquina determinada?