Работа с программами установки программного обеспечения

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

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

Для программного обеспечения, установленного с помощью пакета установщика, установщик Windows можно найти с помощью Win32Reg_AddRemovePrograms или классов Win32_Product . Однако оба из них имеют проблемы. Win32Reg_AddRemovePrograms доступен только в том случае, если вы используете System Center Configuration Manager (SCCM). И класс Win32_Product может быть медленным и имеет побочные эффекты.

Внимание

Класс Win32_Product не оптимизирован для запросов. Если выполняются запросы, использующие фильтры с подстановочными знаками, то WMI будет использовать поставщика MSI для перечисления всех установленных продуктов, а затем последовательно проанализирует весь список с применением фильтра. При этом также инициируется проверка согласованности установленных пакетов для проверки и исправления установки. Проверка выполняется медленно и может привести к ошибкам в журнале событий. Подробные сведения см. в статье базы знаний 974524.

В этой статье представлен альтернативный метод поиска установленного программного обеспечения.

Запрос раздела реестра "Удаление" для поиска установленного программного обеспечения

Так как большинство стандартных приложений регистрируют программу удаления в Windows, с ними можно работать локально, в реестре Windows. Не существует гарантированного способа найти все приложения в системе. Однако можно найти все программы со списками, отображаемыми в разделе "Добавление или удаление программ " в следующем разделе реестра:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.

Мы можем найти количество установленных приложений, подсчитывая количество разделов реестра:

$UninstallPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
(Get-ChildItem -Path $UninstallPath).Count
459

Мы можем искать этот список приложений дальше с помощью различных методов. Чтобы отобразить значения значений реестра в разделах реестра Uninstall, используйте GetValue() метод разделов реестра. Значение метода является записью реестра. Например, чтобы найти отображаемые имена приложений в Uninstall ключе, используйте следующую команду:

Get-ChildItem -Path $UninstallPath |
    ForEach-Object -Process { $_.GetValue('DisplayName') } |
    Sort-Object

Примечание.

Нет никакой гарантии, что значения DisplayName уникальны.

Следующий пример создает выходные данные, аналогичные классу Win32Reg_AddRemovePrograms :

Get-ChildItem $UninstallPath |
    ForEach-Object {
        $ProdID = ($_.Name -split '\\')[-1]
        Get-ItemProperty -Path "$UninstallPath\$ProdID" -ea SilentlyContinue |
        Select-Object -Property DisplayName, InstallDate, @{n='ProdID'; e={$ProdID}}, Publisher, DisplayVersion
} | Select-Object -First 3

Для краткости в этом примере используется Select-Object ограничение количества возвращаемых элементов до трех.

DisplayName    : 7-Zip 22.01 (x64)
InstallDate    :
ProdID         : 7-Zip
Publisher      : Igor Pavlov
DisplayVersion : 22.01

DisplayName    : AutoHotkey 1.1.33.10
InstallDate    :
ProdID         : AutoHotkey
Publisher      : Lexikos
DisplayVersion : 1.1.33.10

DisplayName    : Beyond Compare 4.4.6
InstallDate    : 20230310
ProdID         : BeyondCompare4_is1
Publisher      : Scooter Software
DisplayVersion : 4.4.6.27483