Перейти к содержимому

Как найти программу и версию с помощью powershell

Надо проверить установленную версию fslogix на серверах rds

<#
.SYNOPSIS
    Скрипт для проверки версий указанных программ на серверах AD с фильтрацией по имени
.DESCRIPTION
    Ищет указанную программу в реестре удаленных серверов и возвращает информацию о версии
.PARAMETER NameFilter
    Фильтр имен серверов (например, "*hwrdsh*")
.PARAMETER SoftwareName
    Название программы для поиска (например, "Microsoft FSLogix Apps")
.EXAMPLE
    .\Get-SoftwareVersionOnServers.ps1 -NameFilter "*hwrdsh*" -SoftwareName "Microsoft FSLogix Apps"
#>

param (
    [string]$NameFilter = "*hwrdsh*",
    [string]$SoftwareName = "Microsoft FSLogix Apps"
)

# Импорт модуля ActiveDirectory
try {
    Import-Module ActiveDirectory -ErrorAction Stop
}
catch {
    Write-Host "Ошибка при импорте модуля ActiveDirectory: $_" -ForegroundColor Red
    exit 1
}

# Функция для получения информации о серверах
function Get-ServersFromAD {
    param (
        [string]$Filter
    )
    
    try {
        Write-Host "Поиск серверов с именем, содержащим: $Filter" -ForegroundColor Cyan
        $servers = Get-ADComputer -Filter { 
            OperatingSystem -like "*Server*" -and 
            Name -like $Filter -and 
            Enabled -eq $true 
        } | Select-Object -ExpandProperty Name
        
        if ($servers.Count -eq 0) {
            Write-Host "Серверы не найдены по указанному фильтру." -ForegroundColor Yellow
            return $null
        }
        
        Write-Host "Найдено серверов: $($servers.Count)" -ForegroundColor Green
        return $servers
    }
    catch {
        Write-Host "Ошибка при поиске серверов в AD: $_" -ForegroundColor Red
        return $null
    }
}

# Функция для проверки версии программы
function Get-SoftwareVersion {
    param (
        [string]$ComputerName,
        [string]$SoftwareName
    )
    
    $result = [PSCustomObject]@{
        ComputerName = $ComputerName
        SoftwareName = $SoftwareName
        Version = "Не проверено"
        Status = "Не проверено"
        LastChecked = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    }
    
    try {
        # Проверка доступности сервера
        if (-not (Test-Connection -ComputerName $ComputerName -Count 1 -Quiet -ErrorAction Stop)) {
            $result.Version = "N/A"
            $result.Status = "Недоступен"
            Write-Host "$ComputerName : Сервер недоступен" -ForegroundColor Yellow
            return $result
        }
        
        # Пути в реестре для проверки
        $regPaths = @(
            "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
            "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
        )
        
        $softwareFound = $false
        $softwareVersion = "Не установлен"
        
        $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $ComputerName)
        
        foreach ($regPath in $regPaths) {
            try {
                $regKey = $reg.OpenSubKey($regPath)
                if ($regKey) {
                    $subKeys = $regKey.GetSubKeyNames()
                    
                    foreach ($key in $subKeys) {
                        $subKey = $regKey.OpenSubKey($key)
                        $displayName = $subKey.GetValue("DisplayName")
                        
                        if ($displayName -and $displayName -like "*$SoftwareName*") {
                            $softwareVersion = $subKey.GetValue("DisplayVersion")
                            $softwareFound = $true
                            break
                        }
                    }
                }
                if ($softwareFound) { break }
            }
            catch {
                Write-Host "$ComputerName : Ошибка при доступе к реестру ($regPath): $_" -ForegroundColor Yellow
            }
        }
        
        $result.Version = $softwareVersion
        $result.Status = if ($softwareFound) { "Найдено" } else { "Не найдено" }
        
        Write-Host "$ComputerName : $SoftwareName - $softwareVersion" -ForegroundColor $(if ($softwareFound) { "Green" } else { "Yellow" })
        return $result
    }
    catch {
        $result.Version = "Ошибка"
        $result.Status = "Ошибка: $_"
        Write-Host "$ComputerName : Ошибка при проверке - $_" -ForegroundColor Red
        return $result
    }
}

# Основной процесс выполнения
$servers = Get-ServersFromAD -Filter $NameFilter

if (-not $servers) {
    exit
}

Write-Host "`nПоиск программы: $SoftwareName" -ForegroundColor Cyan
$results = @()

foreach ($server in $servers) {
    $results += Get-SoftwareVersion -ComputerName $server -SoftwareName $SoftwareName
}

# Вывод результатов
$results | Format-Table -AutoSize -Property ComputerName, SoftwareName, Version, Status, LastChecked

# Экспорт в CSV
$csvFileName = "SoftwareVersions_$($SoftwareName.Replace(' ','_'))_$($NameFilter.Replace('*','')).csv"
$results | Export-Csv -Path $csvFileName -NoTypeInformation -Encoding UTF8 -Delimiter ';'

Write-Host "`nРезультаты сохранены в файл: $csvFileName" -ForegroundColor Green

Как найти программу и версию с помощью powershell

Similar Posts:

Метки:

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

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

Яндекс.Метрика