Осторожно! При использовании класса WMI Win32_Product
, который делают вопрос и предыдущие 2 ответа, для этой цели не рекомендуется.
В двух словах: использование Win32_Product равно , а не безвредному запросу, поскольку он имеет побочные эффекты. Цитируя Microsoft, «[Это] ... инициирует проверку согласованности установленных пакетов, проверяя и восстанавливая установки». (выделение мое)
Ссылки:
Так что же является лучшим (более безопасным) решением?
Марк Картер, пишущий гостевую колонку в блоге Hey, Scripting Guy! , занимает первый залп, предоставляя пользовательскую функцию PowerShell, и в моей системе он возвратил только вдвое меньше записей, чем Win32_Product призывание. Также много кода (около трех десятков строк). Однако в комментариях к своему посту knutkj предлагает гораздо более короткую версию, которая делает то же самое:
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
Get-ItemProperty |
Sort-Object -Property DisplayName |
Select-Object -Property DisplayName, DisplayVersion, InstallLocation
Но, как я уже сказал, он делает то же самое: не предоставляет полный список. Но это только начало.
Позже в комментариях Ник У сообщил, что на самом деле существует 3 интересующих пути реестра, хотя не все могут присутствовать в каждой системе. Кроме того, при рассмотрении этих трех путей необходимо выполнить дополнительную фильтрацию.
Комбинируя оба из них, добавив еще несколько полей вывода и сделав код безопасным для работы в строгом режиме, я пришел к этому простому решению:
function Get-InstalledPrograms()
{
$regLocations = (
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\",
"HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\",
"HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
)
Get-ChildItem ($regLocations | Where { Test-Path $_ } ) |
Get-ItemProperty |
Where {
( (Get-Member -InputObject $_ -Name DisplayName) -and $_.DisplayName -ne $Null) -and
(!(Get-Member -InputObject $_ -Name SystemComponent) -or $_.SystemComponent -ne "1") -and
(!(Get-Member -InputObject $_ -Name ParentKeyName) -or $_.ParentKeyName -eq $Null)
} |
Sort DisplayName |
Select DisplayName, DisplayVersion, Publisher, InstallLocation, InstallDate, URLInfoAbout
}