PowerShell – Список обновлений WSUS, необходимых для каждого клиента

Вопрос или проблема

Мне нужно предоставить ежемесячный отчет нашему клиенту, в котором будет перечислено обновления, необходимые для каждого сервера Windows в нашей среде. Идеально, если отчет будет перечислять обновления за месяц и серверы в моей среде, которым они нужны.

Мои знания PowerShell ограничены, но я нашел несколько скриптов (см. ниже) и немного изменил их, чтобы извлечь обновления и цели, но я не могу понять, как объединить эту информацию в один скрипт, который показывает, какие конкретные обновления нужны каждому серверу:

$wsus = Get-WsusServer -Name "<server-name>" -PortNumber 8530

$wsus.GetComputerTargets()

$updates = $wsus.GetUpdates() | where {$_.CreationDate -gt (Get-Date).addMonths(-1) }

# Проходим через каждое обновление, выводим некоторую информацию

$results = ForEach ($update in $updates) {

$update.Title

$update.Description

$update.CreationDate

}

$results | Out-File C:\Temp\results.txt

## Выбираем всех клиентов WSUS, экспортируем в файл

$serverlist = ForEach ($server in $wsus.GetComputerTargets()) {

$server.FullDomainName
$server.OSDescription
}

$serverlist | Out-File C:\Temp\servers.txt

Буду признателен за любые предложения или советы, спасибо!

Я потратил некоторое время на поиск, варианты ужасные, очевидно, что MS нужно решить эту проблему.

Я использовал приведенное ниже, что довольно сложно, скопируйте все для использования, включая блоки до “endregion send email”:

Благодарность https://github.com/proxb/WSUSReport/blob/master/WSUSReport.ps1 за основной скрипт, у меня были трудности в том, чтобы включить количество необходимых обновлений сервера.

Я добавил в строку 275 или после сортировки по Computername в разделе “#Failed Installations”:


#Needed Count
$computerscope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
$updatescope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
$GroupNeededHash=@{}
$ComputerUpdatesNeeded = $wsus.GetSummariesPerComputerTarget($updatescope,$computerscope) | Select @{L='ComputerTarget';E={($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).FullDomainName}}, `
@{L='NeededCount';E={($_.DownloadedCount + $_.NotInstalledCount)}} | Where-Object { $_.NeededCount -ne '0' }| Sort NeededCount -Descending | ForEach {
}

а затем в строку 538 или после “#endregion Failed Update Install”:

    #region Needed Update Install
    $Pre = @"
        <div style="margin: 0px auto; BACKGROUND-COLOR:RED;Color:Black;font-weight:bold;FONT-SIZE: 14pt;">
            Необходимые установки обновлений по компьютерам
        </div>

"@
    $Body = $wsus.GetSummariesPerComputerTarget($updatescope,$computerscope) | Select @{L='ComputerTarget';E={($wsus.GetComputerTarget([guid]$_.ComputerTargetId)).FullDomainName}}, `
    @{L='NeededCount';E={($_.DownloadedCount + $_.NotInstalledCount)}} | Where-Object { $_.NeededCount -gt '4' }| Sort NeededCount -Descending | ConvertTo-Html -Fragment | Out-String | Set-AlternatingCSSClass -CSSEvenClass 'even' -CssOddClass 'odd'

    $Post = "<br>"
    $htmlFragment += $Pre,$Body,$Post
    #endregion Needed Update Install

Ответ или решение

PowerShell: Список необходимых обновлений WSUS для каждого клиента

В качестве IT-эксперта, я понимаю, что создание отчета по необходимым обновлениям для серверов Windows является важной задачей, особенно когда вам нужно предоставить эту информацию вашему клиенту ежемесячно. Ниже я подробно опишу, как объединить информацию о необходимых обновлениях для каждого сервера в едином PowerShell-скрипте.

1. Установка соединения с сервером WSUS

Сначала создайте подключение к вашему серверу WSUS, используя следующий код:

$wsus = Get-WsusServer -Name "<server-name>" -PortNumber 8530

2. Получение необходимых обновлений за последний месяц

Затем получите обновления, созданные за последний месяц:

$updates = $wsus.GetUpdates() | Where-Object { $_.CreationDate -gt (Get-Date).AddMonths(-1) }

3. Получение списка клиентов WSUS

Теперь получите список всех компьютеров (клиентов), зарегистрированных на вашем сервере WSUS:

$clients = $wsus.GetComputerTargets()

4. Составление отчета о необходимых обновлениях для каждого сервера

На следующем этапе объедините информацию о каждом клиенте и необходимых обновлениях. Мы будем использовать цикл ForEach, чтобы пройтись по каждому клиенту и собрать данные о необходимых для него обновлениях:

$report = @()

foreach ($client in $clients) {
    $neededUpdates = @()

    foreach ($update in $updates) {
        $updateInfo = $wsus.GetUpdateStatus([$client.Id]) 
        if ($updateInfo["NotInstalledCount"] -gt 0) { 
            $neededUpdates += $update.Title
        }
    }

    if ($neededUpdates.Count -gt 0) {
        $report += [PSCustomObject]@{
            ComputerName = $client.FullDomainName
            OSDescription = $client.OSDescription
            NeededUpdates = $neededUpdates -join "; "
        }
    }
}

5. Экспорт отчета в файл

Наконец, экспортируйте собранный отчет в файл, чтобы передать его клиенту:

$report | Export-Csv -Path "C:\Temp\WSUS_Report.csv" -NoTypeInformation

Заключение

Теперь у вас есть скрипт PowerShell, который собирает необходимые обновления для каждого клиента WSUS и экспортирует этот отчет в формате CSV. Вы можете настроить путь к файлу и формат вывода в соответствии с вашими предпочтениями. Этот подход позволяет вам легко предоставлять актуальную информацию о состоянии обновлений в вашей среде, что, безусловно, будет полезно для вашего клиента.

Если у вас возникнут дополнительные вопросы или потребуется помощь в настройке скрипта, не стесняйтесь обращаться!

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

Капча загружается...