Почему перечисление установленных пакетов MSI происходит так медленно? - PullRequest
3 голосов
/ 16 октября 2008

Это продолжение этого вопроса .

Я использую этот слегка измененный скрипт для перечисления всех установленных пакетов MSI:

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

Что удивительно, так это его ужасная производительность. Перечисление 34 установленных пакетов MSI на моем компьютере XP занимает от 3 до 5 минут!

Для сравнения, для Linux, который стоит рядом, требуется 7 с, чтобы перечислить 1400+ об / мин ... sigh

Есть какие-нибудь подсказки по этому поводу?

Ответы [ 5 ]

6 голосов
/ 01 декабря 2009

Чрезвычайная медлительность - известная / распространенная проблема для перечисления Win32_Products

Если вам нужно альтернативное решение, рассмотрите возможность создания собственного списка продуктов, используя записи реестра «Uninstall» (как предлагается в одном из ответов на оригинальный вопрос , на который вы ссылались).

Некоторые общие ссылки для перечисления удаления:

И для этого удаленно , используйте класс реестра WMI, StdRegProv . TechNet даже предоставляет простой пример использования StdRegProv для выполнения именно того, что вам нужно: Как мне перечислить все установленные приложения на данном компьютере

4 голосов
/ 20 апреля 2011

Win32_Product WMI класс очень медленный, потому что он выполняет проверку непротиворечивости - обрабатывает каждый пакет, используя Msiexec.exe - каждый раз, когда вы его используете.

Ознакомьтесь с проблемами и кодом VBScript, чтобы сделать это, используя лучший метод на этой странице: http://csi -windows.com / toolkit / 288-win32product-wmi-class-replace

2 голосов
/ 31 декабря 2008

Когда вы используете функции API, которые объявлены в msi.h, вы работаете со скоростью света. я использую API для своего программного обеспечения software-uptodate , и перечисление сотен пакетов занимает секунду.

1 голос
/ 21 марта 2013

Это работает для меня и позволяет избежать медлительности подхода 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

Узнайте больше об объекте Installer из http://msdn.microsoft.com/en-us/library/windows/desktop/aa369432(v=vs.85).aspx

1 голос
/ 16 октября 2008

Я подозревал, что проблема в сети, и Wireshark доказал, что я прав.

Похоже, что установщик Windows с радостью пытается открыть все исходные MSI-файлы, в том числе те, которые жили в сетевых папках.

...