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?
La clase WMI de Win32_Product es muy lenta porque está haciendo una comprobación de coherencia, procesando cada paquete usando Msiexec.exe, cada vez que la usa.
Consulte los problemas y el código vbscript para hacerlo usando un método mejor en esta página: http://csi-windows.com/toolkit/288-win32product-wmi-class-replacement
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:
- Ejemplo de TechNet VBScript: lista de software instalado
- Microsoft KB: cómo enumerar los productos de software que se pueden desinstalar en una computadora
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?