44

WMIを使用して、WindowsXP用にインストールされているプログラムのリストを取得しようとしています。wmicを使用して、私は試しました:

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

インストールされているプログラムの多くのリストが表示されますが、このリストを[プログラムの追加と削除]の表示と比較すると、WMIクエリよりも多くのプログラムが[プログラムの追加と削除]のGUIに表示されます。残りのプログラムをインストールするために使用する必要がある別のWMIクエリはありますか?それとも、残りを探す必要がある他の場所はありますか?

また、プログラムの追加と削除に含まれていない、WMIクエリにリストされている2つのインストール済みプログラムがあります。なぜですか?

4

13 に答える 13

33

あなたの構文は、WMIでWin32_Productクラスを使用していると思います。原因の 1 つは、このクラスが Windows インストーラー ( See Here ) を使用してインストールされた製品のみを表示することです。アンインストール レジストリ キーが最善の策です。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall

コメントの更新:

アンインストール レジストリ キーは、インストールされているものとインストールされていないものを一覧表示する標準的な場所です。これは、[プログラムの追加と削除] リストがアプリケーションのリストを作成するために使用する場所です。この場所にリストされていないアプリケーションがあると確信しています。その場合、Program Files ディレクトリを検索したり、[スタート] メニューの [プログラム リスト] を調べたりするなど、別の粗雑な方法に頼る必要があります。どちらの方法も理想的ではありません。

私の意見では、レジストリ キーを確認するのが最善の方法です。

于 2009-03-23T13:01:15.270 に答える
12

プログラムの追加と削除が実際に行っているのは、次のレジストリキーを読み取ることだけです。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
于 2009-03-23T12:46:27.053 に答える
7

インストールされたプログラムの最も一般的なレジストリ キーに加えて、次のようなものがあります。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

wmic コマンドと追加/削除プログラムも別のレジストリ キーを照会します。

HKEY_CLASSES_ROOT\Installer\Products

リストに表示されるソフトウェア名は、次のキー内のデータ エントリの値から読み取られます: ProductName

上記の両方の場所から特定の製品のレジストリ キーを削除すると、プログラムの追加と削除の一覧に表示されなくなります。これは、プログラムをアンインストールする方法ではなく、Windows がインストール済みソフトウェアとして認識するものからエントリを削除するだけです。

この方法を使用すると、追加/削除リストから [削除] ボタンを使用してシステムからソフトウェアを完全に削除する機会が失われるためです。レジストリ キーを削除する前に、レジストリ キーをファイルにエクスポートすることをお勧めします。将来、その項目をリストに戻すことにした場合は、保存したレジストリ ファイルを実行するだけです。

于 2011-02-07T16:55:09.693 に答える
5

インストーラーに Inno Setup を使用しています。64 ビットの Windows 7 のみを使用しています。レジストリ エントリが書き込まれていることがわかりました

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

このリストを WMI で報告する方法はまだわかりません (ただし、プログラムは [プログラムと機能] にインストール済みとして表示されます)。わかったら、ここで報告することを忘れないようにします。

アップデート:

64 ビット マシンにインストールされた 32 ビット プログラムのエントリは、そのレジストリの場所に移動します。ここにもっと書かれています:

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

同じ投稿で、32 ビットと 64 ビットの動作について説明している私のコメントを参照してください。

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

残念ながら、WMI にプログラムの追加と削除の一覧からすべてのプログラムを一覧表示させる方法はないようです (別名、Windows 7 の [プログラムと機能]、Vista についてはわかりません)。現在のコードでは、レジストリを使用するために WMI を削除しています。レジストリに問い合わせるコード自体は、WMI を使用するよりもさらに簡単です。サンプルコードは上記リンクにあります。

于 2011-03-17T02:53:51.070 に答える
4

最善ではありませんが、実用的な方法であるかどうか:

HijackThisを使用します。

これをハイジャックして実行し、「その他のツールセクションを開く」ボタンをクリックします

HijackThis メイン メニュー

「アンインストールマネージャーを開く」をクリック

HijackThis 構成

[リストの保存 (*.txt)] をクリックし、プロンプトに対して [はい] をクリックします。メモ帳が開き、プログラムの追加/削除リストが表示されます。

HijackThis Add/Remove Programs Manager


ソース

于 2011-04-01T05:08:30.990 に答える
2

http://technet.microsoft.com/en-us/library/ee692772.aspx#EBAAのスクリプトを使用して、レジストリにアクセスし、WMIを使用してアプリケーションを一覧表示できます。

于 2012-01-24T18:52:43.680 に答える
1

コントロールパネルの[プログラムと機能]に表示されるアプリケーションの信頼性の高いリストを作成するには、すべてのアプリケーションがMSIを使用してインストールされているわけではないことを考慮する必要があります。WMIは、MSIとともにインストールされたもののみを提供します。

これが私が見つけたものの短い要約です:

MSIアプリケーションには、常に製品コード(GUID)サブキーが下HKLM\...\Uninstallおよび/または下にありHKLM\...\Installer\UserData\S-1-5-18\Productsます。さらに、次のようなキーが含まれている場合がありますHKLM\...\Uninstall\NotAGuid

非MSIアプリケーションには製品コードがないため、HKLM\...\Uninstall\NotAGuidまたはのようなキーがありますHKCU\...\Uninstall\NotAGuid

于 2011-12-19T07:57:04.877 に答える
1

プログラムの追加と削除は、現在のユーザーのインストールを見つけるために、このレジストリ キーも調べる必要があります。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall

Google Chrome、Dropbox、または JavaWS (web start) JNLP を介してインストールされたショートカットなどのアプリケーションは、ここでしか見つかりません。

于 2011-04-07T07:55:23.080 に答える
0

MS-Technet VBScript を自分のニーズに適合させました。Wow6432Node と標準エントリを「programms.txt」にダンプします。自己責任で使用してください。保証はありません。

dump.vbsとして保存

コマンド ラインから次のように入力します: 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
于 2016-06-24T11:15:08.560 に答える