WMIを使用して、Windows XPにインストールされているプログラムのリストを取得しようとしています。 wmicを使用して、私は試しました:
wmic /output:c:\ProgramList.txt product get name,version
インストールされているプログラムの多くのリストを取得しますが、「プログラムの追加と削除」の表示に対してこのリストをスクラブすると、プログラムの追加と削除のGUIにWMIクエリよりも多くのプログラムが表示されます。残りのプログラムをインストールするために使用する必要がある別のWMIクエリはありますか?または、残りを探す必要がある他の場所はありますか?
また、WMIクエリにリストされている2つのインストール済みプログラムがありますが、これらはプログラムの追加と削除にはありません。理由は何ですか?
あなたの構文はWMIの Win32_Product クラスを使用していると思います。 1つの原因は、このクラスがWindowsインストーラーを使用してインストールされた製品のみを表示することです( こちらを参照 )。アンインストールレジストリキーが最善の策です。レジストリキーを監視するための コード です。
コメントの更新:
アンインストールレジストリキーは、インストールされているものとインストールされていないものをリストする標準の場所です。これは、[アプリケーションの追加と削除]リストがアプリケーションのリストを作成するために使用する場所です。この場所に自分自身をリストしないアプリケーションがあると確信しています。その場合は、Program Filesディレクトリの検索や[スタート]メニューの[プログラムリスト]の検索など、別の粗雑な方法に頼る必要があります。これらの方法はどちらも間違いなく理想的ではありません。
私の意見では、レジストリキーを調べるのが最善の方法です。
プログラムの追加と削除が実際に行っていることは、このレジストリキーを読み取ることだけです。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
インストールされているプログラムの最も一般的に知られているレジストリキーに加えて:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
wmicコマンドと追加/削除プログラムも別のレジストリキーを照会します。
HKEY_CLASSES_ROOT\Installer\Products
リストに表示されるソフトウェア名は、このキー内のデータエントリの値から読み取られます:ProductName
上記の両方の場所から特定の製品のレジストリキーを削除すると、プログラムの追加/削除リストに表示されなくなります。これはプログラムをアンインストールする方法ではなく、Windowsにインストール済みソフトウェアとして認識されているものからエントリを削除するだけです。
このメソッドを使用すると、追加/削除リストの[削除]ボタンを使用してシステムからソフトウェアを完全に削除する機会が失われるためです。削除する前に、レジストリキーをファイルにエクスポートすることをお勧めします。将来、そのアイテムをリストに戻すことにした場合は、保存したレジストリファイルを実行するだけです。
インストーラーに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ビットの動作を説明する私のコメントをここで参照してください。
残念ながら、WMIにプログラムの追加/削除リスト(Windows 7のプログラムと機能とも呼ばれるVistaについては不明)からすべてのプログラムを一覧表示させる方法はないようです。現在のコードでは、レジストリの使用を支持してWMIを削除しました。レジストリを調べるコード自体は、WMIを使用するよりも簡単です。サンプルコードは上記のリンクにあります。
最高ではありませんが、実用的な方法であるかどうか:
HijackThis を使用します。
これをハイジャックして、[その他のツールセクションを開く]ボタンをクリックします
[アンインストールマネージャーを開く]をクリックします
[保存リスト(* .txt)]をクリックし、プロンプトに対して[はい]をクリックすると、メモ帳が開き、プログラムの追加/削除リストが表示されます。
インストールされた製品はインストールされたソフトウェア要素と機能で構成されているため、PRODUCTのwmicエイリアスとSOFTWAREELEMENTおよびSOFTWAREFEATUREを確認する価値があります。
wmic product get name,version
wmic softwareelement get name,version
wmic softwarefeature get name,version
http://technet.Microsoft.com/en-us/library/ee692772.aspx#EBAA のスクリプトを使用して、レジストリにアクセスし、WMIを使用してアプリケーションを一覧表示できます。
コントロールパネルの[プログラムと機能]に表示される、信頼性の高いアプリケーションのリストを作成するには、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
などのキーがあります。
これが誰かの助けになることを願っています:私はスクリプトでレジストリベースの列挙を使用しました(上記の回答のいくつかによって示唆されています)が、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バージョンを列挙することは、成長した男を泣かせる仕事です。
この質問が出されてからかなり時間が経ちました...
レジストリのアンインストールエントリには、最近利用可能なWMIクラスがあります。これはWin32_Productよりもはるかに高速に参照できます。Win32_Productもリストで検証を実行し、列挙に時間がかかると思います。以下のPowershellコード(Powershell 3以降が必要な場合があります)にすべてのエントリが一覧表示されます(Out-Gridviewパーツはきれいに表示するためのものです)。
Get-CimInstance Win32Reg_AddRemovePrograms | Out-gridview
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
Powershellとバッチファイルを使用して1行で取得できます。
@echo off
Powershell /command "Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-List"
Pause
[プログラムの追加と削除]は、現在のユーザーのインストールを見つけるために、このレジストリキーを調べる必要もあります。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
Google Chrome、Dropbox、JavaWS(Web Start)JNLPを介してインストールされたショートカットなどのアプリケーションは、ここでのみ見つけることができます。