Подтвердить что ты не робот

Обнаружение установленных программ через реестр

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

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

4b9b3361

Ответ 1

Пользовательские настройки должны быть записаны в 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 приходит на ум). В этом направлении нет реального предела того, что пользователь может запустить, если это не предотвращено политиками системы.

Ответ 2

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Если это в HKCU, тогда вы должны понимать, что HKEY_CURRENT_USER действительно означает "Текущий пользователь". У других пользователей есть свои записи HKCU и их собственное установленное программное обеспечение. Вы не можете это найти. Чтение каждого куста HKEY_USERS является катастрофой в корпоративных сетях с профилями роуминга. Вы действительно не хотите получать 1000 учетных записей из своего удаленного офиса [US | China | Europe].

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

Итак - удачи. Есть доводы для неудач.

Ответ 5

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

Ответ 6

Вы можете использовать PowerShell script для просмотра регистров и получения установленных сведений о программе. script ниже будет генерировать файл с полным списком установленных программ. Сохраните его с расширением ".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

Ответ 7

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

Ответ 8

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

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