Функция получения установленного ПО с версиями на удаленных компьютерах. Метод писал не самостоятельно, лишь немного исправил для своих нужд.
Оригинал: https://serverfault.com/questions/1111419/how-to-get-a-complete-list-of-all-installed-software-via-powershell
Эта функция предназначена для получения списка установленных программ на компьютерах в сети. Она принимает два параметра: $ComputerName (список имён компьютеров, по умолчанию имя текущего компьютера) и $NameRegex (регулярное выражение для фильтрации списка установленных программ).
Внутри функции создаётся пустой массив $soft_table для хранения информации об установленных программах. Затем для каждого компьютера из списка $ComputerName функция пытается получить список установленных программ, пройдя по ключам реестра. Если доступ к ключу не удалось получить, функция переходит к следующему компьютеру. Для каждой найденной программы проверяется, соответствует ли её DisplayName заданному регулярному выражению. Если да, то создаётся объект $rowtmp с информацией о программе и добавляется в массив $soft_table.
В конце функция возвращает массив $soft_table, содержащий информацию об установленных программах на всех указанных компьютерах, соответствующих заданному фильтру.
function Get-InstalledApps {
param (
[Parameter(ValueFromPipeline=$true)]
[string[]]$ComputerName = $env:COMPUTERNAME,
[string]$NameRegex = ''
)
$soft_table = @()
foreach ($comp in $ComputerName) {
$keys = '','\Wow6432Node'
foreach ($key in $keys) {
try {
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $comp)
$apps = $reg.OpenSubKey("SOFTWARE$key\Microsoft\Windows\CurrentVersion\Uninstall").GetSubKeyNames()
}
catch
{
continue
}
foreach ($app in $apps)
{
$program = $reg.OpenSubKey("SOFTWARE$key\Microsoft\Windows\CurrentVersion\Uninstall\$app")
$name = $program.GetValue('DisplayName')
if ($name -and $name -match $NameRegex)
{
$rowtmp = "" | Select-Object ComputerName,DisplayName,DisplayVersion,Publisher,InstallDate,UninstallString,Bits,Path
$rowtmp.ComputerName = $comp
$rowtmp.DisplayName = $name
$rowtmp.DisplayVersion = $program.GetValue('DisplayVersion')
$rowtmp.Publisher = $program.GetValue('Publisher')
$rowtmp.InstallDate = $program.GetValue('InstallDate')
$rowtmp.UninstallString = $program.GetValue('UninstallString')
$rowtmp.Bits =$(if ($key -eq '\Wow6432Node') {'64'} else {'32'})
$rowtmp.Path =$program.name
$soft_table += $rowtmp
}
}
}
}
return $soft_table
}