การอนุมัติรายงาน WSUS สำหรับกลุ่ม


9

ฉันกำลังพยายามหาวิธีในการสร้างรายงาน WSUS ของการปรับปรุงที่ได้รับการอนุมัติสำหรับกลุ่มคอมพิวเตอร์ A ที่ไม่ได้รับการอนุมัติสำหรับกลุ่มอื่นอย่างน้อยหนึ่งกลุ่ม อีกทางหนึ่งคือรายงานแบบตารางที่แสดงสถานะการอนุมัติสำหรับการอัพเดทแต่ละครั้งและแต่ละกลุ่มเพื่อให้สามารถประมวลผลเพื่อแยกสิ่งที่ฉันต้องการ ดูเหมือนว่าจะไม่มีรายงานดังกล่าวใน WSUS เองหรืออย่างน้อยก็ไม่มีใครสามารถค้นหาได้ดังนั้นสคริปต์ในการจัดทำรายงานดังกล่าวจะได้รับการต้อนรับมากที่สุด


WSUS ของคุณใช้ Windows รุ่นใดอยู่
เนท

@ เนทมันคือ WSUS 3.2.7600.226 ที่ทำงานบนเครื่อง Server 2008 R2 Standard 64 บิต
John Gardeniers

ฉันคิดว่าฉันมีวิธีแก้ปัญหาสำหรับคุณให้ฉันสักสองสามข้อและฉันจะยืนยัน
เนท

คำตอบ:


8

สคริปต์ PowerShell นี้ทำสิ่งที่คำขอเริ่มต้นของคุณคือ ตรวจสอบกลุ่มคอมพิวเตอร์หนึ่งกลุ่มและค้นหาการปรับปรุงที่ไม่ได้รับการอนุมัติสำหรับกลุ่มคอมพิวเตอร์อื่นกลุ่มใดกลุ่มหนึ่งหรือหลายกลุ่ม

หมายเหตุคุณจะต้องเรียกใช้สิ่งนี้บนเซิร์ฟเวอร์ WSUS หรือเครื่องที่ติดตั้งเครื่องมือการดูแลระบบ WSUS

องค์ประกอบ

ตั้ง$targetComputerGroupเป็นกลุ่มคอมพิวเตอร์ที่คุณต้องการใช้เป็นพื้นฐานตั้ง$CheckForMissingเป็นชื่อของกลุ่มหรือกลุ่มที่คุณต้องการดูว่าพวกเขาได้รับการอนุมัติหรือไม่ หมายเหตุ: ในการทำทวีคูณเพียงแค่แยก coma ("กลุ่ม 1, กลุ่ม 2")

$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"

มันได้ผล! คุณรู้วิธีหยุดเอาต์พุตไม่ให้ถูกตัดทอนหรือไม่? BTW ฉันไม่สามารถให้รางวัลเงินรางวัลได้อีก 9 ชั่วโมง
John Gardeniers

1
การตัดปลายเป็นฟังก์ชั่นของรูปแบบ PowerShell สำหรับหน้าจอ ฉันอัปเดตคำตอบด้วยตัวอย่างของการแสดงผลเป็นไฟล์ CSV เพื่อให้คุณสามารถมีค่าสมบูรณ์
เนท

เยี่ยมมากเพราะ CSV เหมาะกับความต้องการของฉันมาก จากตรงนี้ฉันสามารถให้อาหารกับ Perl อย่างน้อยฉันก็รู้ว่าฉันทำอะไรอยู่ ชื่นชมมาก
John Gardeniers

7

หนึ่งสามารถ "เพียงแค่" เชื่อมต่อกับฐานข้อมูล WSUSและเรียกใช้แบบสอบถามกับมัน:

  1. เริ่ม Studio การจัดการ SQL ด้วยสิทธิ์ที่ยกระดับ
  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 ใน ~ 26s ดังนั้นหากคุณต้องการเล่นกับคำค้นหาอาจแนะนำให้เปลี่ยนบรรทัดแรกเป็น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
John Gardeniers

@JohnGardeniers: ฉันเพิ่มสคริปต์ PowerShell ที่ดำเนินการค้นหา น่าเศร้าที่ความรู้ Perl ของฉันคือเลวร้ายยิ่ง :)
Der Hochstapler

นั่นเป็นจุดเริ่มต้นที่ดี แต่ฉันจะต้องหาวิธีหยุดผลลัพธ์ที่ถูกตัดทอน
John Gardeniers

@JohnGardeniers: นั่นเป็นเพียงวิธีที่ PowerShell แสดงวัตถุที่ส่งคืนตามค่าเริ่มต้น คุณสามารถเรียกใช้สคริปต์ที่ต้องการmyscript.ps1 | flรับเอาท์พุทที่แตกต่างกัน
Der Hochstapler

ฉันตัดสินใจที่จะให้รางวัลแก่คุณสำหรับความพยายามของคุณ แต่คุณจะต้องรอ 24 ชั่วโมง ระบบจะไม่อนุญาตให้ฉันให้รางวัลรางวัลทันที
John Gardeniers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.