web-dev-qa-db-ja.com

レジストリを介してインストールされたプログラムを検出する

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

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

58
Mark Stahler

ユーザー固有の設定は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 Hiveを確認できます-各ユーザーのHKCUが実際に存在します(ユーザーSIDを知るか、すべてを確認する必要があります)。

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

35
Piskvor

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

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

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

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
36
Bernd Ott

MSI APIを使用して、Windowsインストーラーによってインストールされたすべてを列挙できますが、マシンで使用可能なすべてのソフトウェアがリストされません。必要なものについて詳しく知ることなく、「インストール済み」の概念は少し曖昧だと思います。巨大で複雑なインストーラーからZipファイルなど、さまざまなシステムにソフトウェアを展開する方法はたくさんあります。

9
Brian Ensink

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

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

HKCUにある場合は、HKEY_CURRENT_USERは実際には「現在のユーザー」を意味します。他のユーザーには、独自のHKCUエントリとインストールされたソフトウェアがあります。あなたはそれを見つけることができません。読み取りすべてHKEY_USERS Hiveは、ローミングプロファイルを使用した企業ネットワークの災害です。リモートの[US | China | Europe]オフィスから1000個のアカウントを取得したくありません。

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

とても幸運。失敗する方法はたくさんあります。

6
MSalters

PowerShellスクリプトを使用して、レジスターを調べ、インストールされているプログラムの詳細を取得できます。以下のスクリプトは、インストールされたプログラムの完全なリストを含むファイルを生成します。 「.ps」拡張子を付けて保存し、ファイルをダブルクリックします。

#
# Generates a full list of installed programs.
#

# Temporary auxiliar file.
$tmpFile = "tmp.txt"

# File that will hold the programs list.
$fileName = "programas-instalados.txt"

# Columns separator.
$separator = ","

# Delete previous files.
Remove-Item $tmpFile
Remove-Item $fileName

# Creates the temporary file.
Create-Item $tmpFile

# Searchs register for programs - part 1
$loc = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"        
    }
}

# Searchs register for programs - part 2
$loc = Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"
    }
}

# Sorts the result, removes duplicate lines and
# generates the final file.
gc $tmpFile | sort | get-unique > $filename
2
Arivan Bastos

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

1

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

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

0
Naikrovek

インストールされたプログラムに固有の何かを探す方がうまくいくようですが、HKCU\SoftwareとHKLM\Softwareが見たいスポットです。

0
Nick

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted

0
user10211111