3

これは、この質問のフォローアップです。

このわずかに変更されたスクリプトを使用して、インストールされているすべての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

しかし、驚くべきことは、そのひどいパフォーマンスです。XPボックスにインストールされている34個のMSIパッケージを列挙するには、3〜5分かかります。

比較すると、横にあるLinuxボックスは1400以上のRPMを列挙するのに7秒かかります...ため息をつく

これに関する手がかりはありますか?

4

5 に答える 5

6

極端な速度低下は、Win32_Products の列挙に関する既知/一般的な問題です

別の解決策が必要な場合は、「アンインストール」レジストリ エントリを使用して独自の製品リストを作成することを検討してください (参照した元の質問に対する回答の 1 つに示されているように)。

アンインストールを列挙するためのいくつかの一般的な参照:

リモートで行うには、WMI レジストリ クラスStdRegProvを使用します。TechNet では、StdRegProv を使用して必要なことを実行する簡単な例を提供しています。 特定のマシンにインストールされているすべてのアプリケーションを一覧表示するにはどうすればよいですか

于 2009-12-01T20:02:11.417 に答える
4

Win32_Product WMIクラスは、一貫性チェック(Msiexec.exeを使用してすべてのパッケージを処理する)を使用するたびに実行するため、非常に低速です。

次のページで、より適切な方法を使用して問題とvbscriptコードを確認してください:http ://csi-windows.com/toolkit/288-win32product-wmi-class-replacement

于 2011-04-19T20:02:34.670 に答える
2

msi.hで宣言されているAPI関数を使用している場合は、高速です。私は自分のソフトウェアソフトウェアにAPIを使用しています-最新の状態で、数百のパケットを列挙するのに1秒かかります。

于 2008-12-31T11:41:45.687 に答える
1

私はネットワークの問題を疑っていましたが、Wireshark が正しかったことを証明してくれました。

Windows インストーラーは、ネットワーク共有に存在するファイルを含め、すべての元の .msi ファイルを喜んで再オープンしようとするようです。

于 2008-10-16T13:04:29.613 に答える
1

これは私にとってはうまくいき、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 を参照してください。

于 2013-03-21T03:30:36.890 に答える