64

ユーザーのコンピューターに特定のプログラムがインストールされているかどうか、インストールされている場合はバージョンを検出するプロセスを開発する必要があります。レジストリの場所とキーを検索してプログラムに供給するためのリストが必要になると思いますが、これは問題ではありません。これを達成するためのより良い方法はありますか?

最初に考えたのは、アンインストール エントリのレジストリをチェックインすることでしたが、検出したいアプリの 1 つにレジストリがないようです。アプリケーションを使用してエントリを作成するすべてのレジストリの標準的な場所は?

4

9 に答える 9

43

64 ビット システムでは、x64 キーは次のとおりです。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

ほとんどのプログラムはそこにリストされています。キーを見てください: DisplayName DisplayVersion

最後が常に設定されているわけではないことに注意してください。

64 ビット システムでは、x86 キー (通常はより多くのエントリを含む) は次のとおりです。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
于 2009-01-09T21:26:54.703 に答える
38

ユーザー固有の設定は HKCU\Software に、マシン固有の設定は HKLM\Software に書き込む必要があります。これらのキーの下では、構造[software vendor name]\[application name](例: HKLM\Software\Microsoft\Internet Explorer) が最も一般的かもしれませんが、それは単なる慣例であり、自然の法則ではありません。

多くの (ほとんどの?) アプリケーションもアンインストール エントリを に追加しますがHKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[app name]、すべてのアプリケーションがこれを行うわけではありません。

これらは最も重要なキーです。ただし、レジストリの内容は、インストールされたソフトウェアを正確に表している必要はありません。アプリケーションが一度インストールされた後に手動で削除されたか、アンインストーラーがすべての痕跡を削除しなかった可能性があります。確認したい場合は、ファイルシステムをチェックして、レジストリエントリが示す場所にアプリケーションがまだ存在するかどうかを確認してください。

編集:

グループ Administrators のメンバーである場合は、HKEY_USERSハイブを確認できます。各ユーザーの HKCU は実際にそこに存在します (ユーザーの SID を知るか、それらすべてを確認する必要があります)。

注: @Brian Ensink が言うように、「インストール済み」は少しあいまいな概念です。ユーザーが実行できるものを見つけようとしているのですか? レジストリにまったく書き込まないソフトウェアもあります。「ポータブル アプリ」を検索して、メディア (CD/USB) から直接実行し、コンピューターに痕跡を残さないように特別に変更されたアプリを確認してください。また、ディスク、ネットワーク ディスク、ユーザーがダウンロードしたもの、およびインターネット上で世界中からアクセス可能な Windows 共有をスキャンする必要がある場合もあります (そうです、そのようなものは合法的に存在します -\\live.sysinternals.com\tools頭に浮かびます)。この方向では、システム ポリシーによって禁止されていない限り、ユーザーが実行できることの実際の制限はありません。

于 2009-01-09T21:41:23.067 に答える
9

MSI APIを使用して、Windowsインストーラーによってインストールされたすべてのものを列挙できますが、マシンで使用可能なすべてのソフトウェアが一覧表示されるわけではありません。何が必要かをよく知らなくても、「インストール済み」の概念は少し曖昧だと思います。大きくて複雑なインストーラーからZIPファイルまで、そしてその間のすべてのものに至るまで、ソフトウェアをシステムにデプロイする方法はたくさんあります。

于 2009-01-09T21:40:18.200 に答える
6

アプリケーションにレジストリ エントリは必要ありません。実際、多くのアプリケーションはまったくインストールする必要がありません。U3 USB スティックが良い例です。それらのプログラムは、ファイル システムから実行されるだけです。

前述のように、ほとんどの優れたアプリケーションは、アンインストール レジストリ キーから見つけることができます。これは実際には、ユーザーごとおよびマシンごとのキーのペアです (HKCU/HKLM - Piskvor は HKLM のみについて言及しました)。ただし、(常に)インストールディレクトリを提供するわけではありません。

それがHKCUにある場合、それはHKEY_CURRENT_USER本当に「現在のユーザー」を意味することに気付く必要があります。他のユーザーは、独自の HKCU エントリと、独自のインストール済みソフトウェアを持っています。あなたはそれを見つけることができません。すべて のハイブを読み取るHKEY_USERSことは、ローミング プロファイルを使用する企業ネットワークでは大惨事です。[米国|中国|ヨーロッパ] のリモート オフィスから 1000 のアカウントを取得したくありません。

アプリケーションがインストールされていて、その場所がわかっている場合でも、「バージョン」の概念が同じではない場合があります。最良のソースは、実行可能ファイルの「バージョン」リソースです。それは確かに複数形なので、それらすべてを見つけて、すべてからバージョンリソースを抽出し、競合が発生した場合は合理的なものを決定する必要があります。

とても幸運。失敗する方法はいくらでもあります。

于 2009-01-12T16:00:08.837 に答える
1

インストールされているプログラムに固有のものを探すほうがうまくいくように思えますが、HKCU\Software と HKLM\Software が注目すべき場所です。

于 2009-01-09T21:21:42.980 に答える
1

上記のすべてのレジストリ キーに加えて、HKEY_CURRENT_USER\Software\Microsoft\Installer\Products を調べて、現在のユーザー専用にインストールされたプログラムを確認する必要がある場合もあります。

于 2011-12-15T01:01:59.540 に答える
0

Win32_Product がすべてを表示することはなく、MSI インストーラーを介してインストールされたソフトウェアのみが表示されます (私が知る限り)。

そこに表示されない他のインストーラーを介してインストールされるソフトウェアパッケージがたくさんあります。別の方法が必要です。

于 2010-06-29T15:02:00.350 に答える