Обнаружение установленных программ через реестр - PullRequest
58 голосов
/ 10 января 2009

Мне нужно разработать процесс, который будет определять, установлены ли на компьютере пользователя определенные программы и, если да, то какая версия. Я считаю, что мне понадобится список с местом в реестре и ключами, чтобы искать и передавать его в программу, которая не является проблемой. Есть ли лучший способ сделать это?

Моей первой мыслью было проверить реестр в записях удаления, но, похоже, у одного из приложений, которые я хочу обнаружить, его нет. Каково стандартное расположение всех реестров, использующих приложения для записи?

Ответы [ 9 ]

36 голосов
/ 10 января 2009

В 64-битных системах ключ x64:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Большинство программ перечислены там. Посмотрите на ключи: DisplayName DisplayVersion

Обратите внимание, что последний не всегда установлен!

В 64-битных системах ключ x86 (обычно с большим количеством записей):

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
35 голосов
/ 10 января 2009

Пользовательские настройки должны быть записаны в HKCU \ Software, индивидуальные настройки машины - в HKLM \ Software. Под этими ключами структура [software vendor name]\[application name] (например, HKLM\Software\Microsoft\Internet Explorer) может быть наиболее распространенной, но это всего лишь соглашение, а не закон природы.

Многие (большинство?) Приложений также добавляют свои записи удаления в HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[app name], но, опять же, не все приложения делают это.

Это самые важные ключи; однако содержимое реестра не обязательно должно точно представлять установленное программное обеспечение - возможно, приложение было установлено один раз, но затем было удалено вручную, или, возможно, деинсталлятор не удалил все его следы. Если вы хотите быть уверены, проверьте файловую систему, чтобы увидеть, существует ли приложение там, где его записи реестра говорят, что оно есть.

Edit:

Если вы являетесь членом группы «Администраторы», вы можете проверить улей HKEY_USERS - HKCU каждого пользователя фактически находится там (вам нужно знать SID пользователя или просмотреть все их).

Примечание: как говорит @Brian Ensink, «установленный» - это немного расплывчатое понятие - пытаемся ли мы найти то, что может запустить пользователь? Некоторые программы вообще не пишут в Реестр: ищите «переносимые приложения», чтобы увидеть приложения, которые были специально модифицированы для запуска непосредственно с носителя (CD / USB) и , а не , чтобы оставить следы на компьютер. Возможно, нам также придется сканировать диски, сетевые диски и все, что пользователь загружает, и общедоступные ресурсы Windows в Интернете (да, такие вещи существуют законно - на ум приходит \\live.sysinternals.com\tools). В этом направлении нет реальных ограничений на то, что пользователь может запустить, если это не предотвращено системными политиками.

9 голосов
/ 10 января 2009

Вы можете использовать MSI API для перечисления всего, что установлено установщиком Windows, но в нем не перечислены все программы, доступные на компьютере. Не зная больше о том, что вам нужно, я думаю, что понятие «установлен» немного расплывчато. Существует много способов развертывания программного обеспечения в системе - от больших сложных установщиков до ZIP-файлов и всего, что между ними.

6 голосов
/ 12 января 2009

Приложение не должно иметь записи в реестре. На самом деле, многие приложения вообще не нужно устанавливать. U3 USB-флешки - хороший пример; программы на них просто запускаются из файловой системы.

Как уже отмечалось, большинство хороших приложений можно найти через их раздел реестра для удаления. На самом деле это пара ключей, для каждого пользователя и для каждой машины (HKCU / HKLM - Писквор упомянул только HKLM). Тем не менее, он не всегда дает вам каталог установки.

Если он в HKCU, то вы должны понимать, что HKEY_CURRENT_USER действительно означает «Текущий пользователь». У других пользователей есть собственные записи HKCU и собственное установленное программное обеспечение. Вы не можете найти это. Чтение каждого HKEY_USERS куста - это катастрофа в корпоративных сетях с перемещаемыми профилями. Вы действительно не хотите получать 1000 учетных записей из своего удаленного офиса [США | Китай | Европа].

Даже если приложение установлено, и вы знаете, где оно может не совпадать с представлением «версия». Лучший источник - это ресурс "version" в исполняемых файлах. Это действительно множественное число, так что вы должны найти их все, извлечь ресурсы версий из всех и, в случае конфликта, принять решение о чем-то разумном.

Итак - удачи. Есть множество способов потерпеть неудачу.

2 голосов
/ 14 июля 2017

Вы можете использовать скрипт 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
1 голос
/ 15 декабря 2011

В дополнение ко всем разделам реестра, упомянутым выше, вам также может понадобиться обратиться к HKEY_CURRENT_USER \ Software \ Microsoft \ Installer \ Products для программ, установленных только для текущего пользователя.

0 голосов
/ 11 августа 2018

HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Помощник по совместимости \ Persisted

0 голосов
/ 29 июня 2010

Win32_Product никогда не показывает все, только программное обеспечение, установленное через установщик MSI (насколько я могу судить.)

Существует множество программных пакетов, которые устанавливаются через другие установщики, которые там не отображаются. нужен другой путь.

0 голосов
/ 10 января 2009

Похоже, что поиск чего-то определенного для установленной программы будет работать лучше, но HKCU \ Software и HKLM \ Software - это то, что нужно искать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...