Схвалення звітів WSUS для групи


9

Я намагаюся знайти спосіб створити звіт WSUS про оновлення, затверджені для комп’ютерної групи А, які не були затверджені для однієї або декількох інших груп. Крім того, табличний звіт, у якому перераховано стан затвердження для кожного оновлення та кожної групи, щоб його можна було обробити, щоб отримати те, що мені потрібно. У самому WSUS такого звіту не існує, або принаймні не одного, якого я можу знайти, тож сценарій для створення такого звіту був би дуже вітається.


На якій версії Windows працює ваш WSUS?
Нейт

@Nate, WSUS 3.2.7600.226 працює на 64-розрядній машині Server 2008 R2 Standard.
Джон Гарденєр

Думаю, у вас є рішення для вас, дайте мені кілька, і я підтверджу
Нейт

Відповіді:


8

Цей скрипт повноважень робить саме те, що було у вашому початковому запиті. Вивчіть одну комп'ютерну групу та знайдіть оновлення, не схвалені для однієї чи кількох інших комп'ютерних груп.

Примітка. Вам потрібно запустити це на сервері WSUS або на машині, на якій встановлені інструменти адміністратора WSUS.

Конфігурація

Встановіть $targetComputerGroupКомп'ютерна група, яку ви хочете використовувати як базову лінію. Встановіть $CheckForMissingназви групи або груп, для яких ви хочете побачити, чи вони були схвалені. Примітка. Щоб зробити кратні просто кома окремо ("Group1, Group2")

$serverName="localhost"
$targetComputerGroup="BaselineGroup"
$checkForMissing="MissingGroup1,MissingGroup2"

[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus=[Microsoft.UpdateServices.Administration.AdminProxy]::getUpdateServer($serverName,$false)
$computerGroup=$wsus.GetComputerTargetGroups()|ForEach-Object -Process {if ($_.Name -eq $targetComputerGroup) {$_}}
$UpdateScope=New-Object Microsoft.UpdateServices.Administration.UpdateScope
$UpdateScope.ApprovedStates="Any"
$updateScope.ApprovedComputerTargetGroups.Add($computerGroup)
$Approvals = $wsus.GetUpdateApprovals($UpdateScope)

#At this point we have all of the updates assigned to the $targetComputerGroup

$report= @()
write-host "Querying for all Updates approved for $targetComputerGroup"

foreach ($Approval in $approvals) {
   $record=""|Select-Object ComputerGroup,UpdateName, UpdateID
   $record.ComputerGroup=$wsus.GetComputerTargetGroup($Approval.ComputerTargetGroupID).Name
   $record.UpdateName=$wsus.GetUpdate($Approval.UpdateID).Title
   $record.UpdateID=$wsus.GetUpdate($Approval.UpdateID).ID.UpdateID
   $report +=$record
   }

#Now group the results by UpdateName
$GR=$report|group -Property UpdateName

$CheckForMissing=$CheckForMissing.Split(",")

 foreach ($entry in $gr) {
    $groups=@()
    foreach ($g in $entry.Group) {
        $groups += $g.ComputerGroup
        }
    foreach ($missing in $checkForMissing) {
        if ($groups -Contains $missing) {}
        else{
            New-Object PSObject -Property @{
            Name = $entry.Name
            UpdateID = $entry.Group[0].UpdateID
            GroupMissing = $missing
            }
        }
    }
}

Після завершення ви отримаєте такий вихід, як: введіть тут опис зображення

Якщо замість виведення на екран, ви хочете експортувати список до CSV, замініть нижню частину наступним кодом:

   $CheckForMissing=$CheckForMissing.Split(",")
   $CSVdata=@()
     foreach ($entry in $gr) {
        $groups=@()
        foreach ($g in $entry.Group) {
            $groups += $g.ComputerGroup
            }
        foreach ($missing in $checkForMissing) {
            if ($groups -Contains $missing) {}
            else{
                $CSVdata += New-Object PSObject -Property @{
                Name = $entry.Name
                UpdateID = $entry.Group[0].UpdateID
                GroupMissing = $missing
                }
            }
        }
    }
 $CSVdata|Export-Csv "FILENAME.CSV"

Це працює! Чи знаєте ви, як не допустити скорочення виходу? До речі, я не можу присуджувати суму ще 9 годин.
Джон Гарденєр

1
Укорочення - це функція того, як формат оболонки формується для екрана. Я оновив відповідь на прикладі виведення у файл CSV, щоб ви могли мати повні значення.
Нейт

Відмінно, оскільки CSV дуже підходить для моїх потреб. Звідси я можу подати його до Perl, де я принаймні знаю, що роблю. Цінується.
Джон Гарденєр

7

Можна "просто" підключитися до бази даних WSUS і запустити запити проти неї:

  1. Запустіть SQL Management Studio з підвищеними привілеями.
  2. Підключіться до \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\queryвикористання автентифікації Windows .

Ці таблиці, схоже, цікавлять ваше питання:

  • tbUpdate
    Зберігає інформацію про одиночні оновлення

  • tbTargetGroup
    Зберігає інформацію про всі комп'ютерні групи

  • tbDeployment
    Зберігає інформацію про те, які оновлення затверджені для яких комп’ютерних груп

Однак, здається, вигідно використовувати вже існуючий вигляд, vUpdateApprovalщоб отримати більшу частину інформації, яку ви шукаєте, оскільки цей погляд вже перекладає ActionIDстовпець tbDeploymentсеред іншого.

Однак vUpdateApprovalпредставлення не включає будь-які легко читаються заголовки для оновлень. Назви, як правило, читаються з tbLocalizedProperty. Для того, щоб зробити його простіше для нас, є ще один вид: vUpdate.

Я дійсно не маю належних даних у нашій базі даних WSUS, щоб створити належний запит, який би відповідав вашому першому запиту (і я не впевнений, щоб його скласти наосліп). Тож ось підхід до вашого вторинного запиту. Якщо я не заплутався, він створює список усіх оновлень та стан затвердження для всіх груп.

SELECT
    aUpdate.UpdateId,
    aUpdate.DefaultTitle,
    aGroup.Name as GroupName,
    aApproval.Action as Action
FROM
    PUBLIC_VIEWS.vUpdate AS aUpdate INNER JOIN
    PUBLIC_VIEWS.vUpdateApproval AS aApproval ON aUpdate.UpdateId = aApproval.UpdateId LEFT JOIN
    dbo.tbTargetGroup as aGroup ON aGroup.TargetGroupID = aApproval.ComputerTargetGroupId
;

Що виробляє цей вихід на нашій німецькій SBS:

введіть тут опис зображення

Для нашого SBS з його 5 груп за замовчуванням це створює 121558 рядків результатів за ~ 26 с. Отже, якщо ви хочете пограти із запитом, можливо, буде доцільним змінити перший рядок під SELECT TOP 1000час тестування.

Я також взяв час, щоб все це перетворити на сценарій PowerShell:

# Where to connect to
$dataSource        = "\\.\pipe\MSSQL`$MICROSOFT##SSEE\sql\query"
$connectionTimeout = 30

# The query we want to perform against the WSUS database
$query = @"
    SELECT TOP 10
        aUpdate.UpdateId,
        aUpdate.DefaultTitle,
        aGroup.Name as GroupName,
        aApproval.Action as Action
    FROM
        PUBLIC_VIEWS.vUpdate AS aUpdate INNER JOIN
        PUBLIC_VIEWS.vUpdateApproval AS aApproval ON aUpdate.UpdateId = aApproval.UpdateId LEFT JOIN
        dbo.tbTargetGroup as aGroup ON aGroup.TargetGroupID = aApproval.ComputerTargetGroupId
"@
$queryTimeout = 120

# Construct the connection string
$connectionString = "Data Source={0};Integrated Security=True;Connect Timeout={1};Database=SUSDB" -f $dataSource,$connectionTimeout

# Open the connection to the SQL server
$connection = New-Object System.Data.SqlClient.SQLConnection
$connection.ConnectionString = $connectionString
$connection.Open()

# Construct our SQL command
$sqlCommand = New-Object system.Data.SqlClient.SqlCommand( $query, $connection )
$sqlCommand.CommandTimeout = $queryTimeout

# Retrieve the data from the server
$dataSet     = New-Object system.Data.DataSet
$dataAdapter = New-Object system.Data.SqlClient.SqlDataAdapter( $sqlCommand )
[void]$dataAdapter.fill( $dataSet )

# Clean up
$connection.Close()

# Output result
$dataSet.Tables

Зверніть увагу, що цей сценарій включає SELECT TOP 10обмеження, щоб уникнути затоплення вашої оболонки під час тестування.


Це, безумовно, щось для дослідження. Можливо, є модуль Perl для взаємодії з MS SQL Server.
Джон Гарденєр

@JohnGardeniers: я додав сценарій PowerShell, який виконує запит. На жаль, мої знання Perl ще гірші :)
Der Hochstapler

Це хороша відправна точка, але мені доведеться з’ясувати, як зупинити обрізання виводу.
Джон Гарденєр

@JohnGardeniers: саме так PowerShell відображає повернені об'єкти за замовчуванням. Ви можете запустити сценарій, як, myscript.ps1 | flщоб отримати інший (не усічений) вихід.
Der Hochstapler

Я вирішив нагородити вас за ваші зусилля, але вам доведеться почекати 24 години. Система не дозволить мені одразу вручити винагороду.
Джон Гарденєр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.