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


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

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

9 56

9 ответов:

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

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

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

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

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

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

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

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

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

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

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

Так что - удачи. Есть десятки способов потерпеть неудачу.

вы можете использовать сценарий 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

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

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

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

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

раздел реестра HKEY_CURRENT_USER\программное обеспечение\Майкрософт\Windows в НТ\раздел CurrentVersion\AppCompatFlags\совместимость помощника\унимался