Функция получения установленного ПО

Функция получения установленного ПО с версиями на удаленных компьютерах. Метод писал не самостоятельно, лишь немного исправил для своих нужд.
Оригинал: 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
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *