web-dev-qa-db-ja.com

プログラムの追加/削除リストとは異なるWMI「インストール済み」クエリ

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

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

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

また、WMIクエリにリストされている2つのインストール済みプログラムがありますが、これらはプログラムの追加と削除にはありません。理由は何ですか?

39
romandas

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

コメントの更新:

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

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

29
Rob Haupt

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

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
13
BobbyShaftoe

インストールされているプログラムの最も一般的に知られているレジストリキーに加えて:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall

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

HKEY_CLASSES_ROOT\Installer\Products

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

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

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

7
saalehr

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

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

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

UPDATE:

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を使用するよりも簡単です。サンプルコードは上記のリンクにあります。

5
Tyler Collier

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

HijackThis を使用します。

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

HijackThis Main Menu

[アンインストールマネージャーを開く]をクリックします

HijackThis Configuration

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

HijackThis Add/Remove Programs Manager


ソース

4
quantme

インストールされた製品はインストールされたソフトウェア要素と機能で構成されているため、PRODUCTのwmicエイリアスとSOFTWAREELEMENTおよびSOFTWAREFEATUREを確認する価値があります。

wmic product get name,version

wmic softwareelement get name,version

wmic softwarefeature get name,version
2
MacG

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

2
motobói

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

ここに私が見つけたものの短い要約があります:

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

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

1
Ilya Kogan

これが誰かの助けになることを願っています:私はスクリプトでレジストリベースの列挙を使用しました(上記の回答のいくつかによって示唆されています)が、Windows 10 x64で=経由で実行すると64ビットソフトウェアを適切に列挙しないことがわかりましたSCCM(32ビットクライアントを使用)。このような何かが私の特定のケースで最も簡単なソリューションであることがわかりました。

Function Get-Programs($Bits) {
  $Result = @()
  $Output = (reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall /reg:$Bits /s)

  Foreach ($Line in $Output) {
    If ($Line -match '^\s+DisplayName\s+REG_SZ\s+(.+?)$') {
      $Result += New-Object PSObject -Property @{
        DisplayName = $matches[1];
        Bits = "$($Bits)-bit";
      }
    }
  }

  $Result
}

$Software  = Get-Programs 32
$Software += Get-Programs 64

これは、Perlのように少し悪いことですが、私が見た他のすべての代替手段は、ラッパースクリプトや同様の賢い解決策に狂気を巻き込んでおり、これはもう少し人間的です。

追伸ここでは絶対に些細なことを不可能に近いものにするために、Microsoftに大量の塩を投棄することを控えるように本当に努力しています。つまり、ネットワークで使用中のすべてのMS Officeバージョンを列挙することは、成長した男を泣かせる仕事です。

0

この質問が出されてからかなり時間が経ちました...

レジストリのアンインストールエントリには、最近利用可能なWMIクラスがあります。これはWin32_Productよりもはるかに高速に参照できます。Win32_Productもリストで検証を実行し、列挙に時間がかかると思います。以下のPowershellコード(Powershell 3以降が必要な場合があります)にすべてのエントリが一覧表示されます(Out-Gridviewパーツはきれいに表示するためのものです)。

Get-CimInstance Win32Reg_AddRemovePrograms | Out-gridview
0
Pres

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
0
seizu

Powershellとバッチファイルを使用して1行で取得できます。

@echo off
Powershell /command "Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-List"
Pause
0
Hackoo

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

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall

Google Chrome、Dropbox、JavaWS(Web Start)JNLPを介してインストールされたショートカットなどのアプリケーションは、ここでのみ見つけることができます。

0
candritzky