Phê duyệt báo cáo WSUS cho một nhóm


9

Tôi đang cố gắng tìm cách tạo báo cáo WSUS về các bản cập nhật đã được phê duyệt cho nhóm máy tính A chưa được phê duyệt cho một hoặc nhiều nhóm khác. Ngoài ra, một báo cáo dạng bảng liệt kê trạng thái phê duyệt cho từng bản cập nhật và từng nhóm, để nó có thể được xử lý để trích xuất những gì tôi cần. Dường như không có một báo cáo nào như vậy trong chính WSUS, hoặc ít nhất không phải là một báo cáo tôi có thể tìm thấy, do đó, một kịch bản để tạo ra một báo cáo như vậy sẽ được hoan nghênh nhất.


WSUS của bạn đang chạy phiên bản windows nào?
Nate

@Nate, đó là WSUS 3.2.7600.226 chạy trên máy 64 bit tiêu chuẩn Server 2008 R2.
John Gardeniers

Tôi nghĩ rằng tôi có một giải pháp cho bạn, cho tôi một ít và tôi sẽ xác nhận
Nate

Câu trả lời:


8

Kịch bản powershell này thực hiện chính xác những gì yêu cầu ban đầu của bạn. Kiểm tra một nhóm máy tính và tìm các bản cập nhật không được phê duyệt cho một hoặc nhiều nhóm máy tính khác.

Lưu ý Bạn sẽ cần chạy cái này trên máy chủ WSUS hoặc máy có cài đặt công cụ Quản trị WSUS.

Cấu hình

Đặt $targetComputerGroupthành Nhóm máy tính mà bạn muốn sử dụng làm đường cơ sở Đặt $CheckForMissingthành tên của nhóm hoặc nhóm bạn muốn xem nếu chúng đã được phê duyệt. Lưu ý: Để thực hiện bội số, chỉ cần hôn mê riêng biệt ("Nhóm1, Nhóm2")

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

Khi hoàn thành, bạn sẽ có đầu ra như: nhập mô tả hình ảnh ở đây

Nếu thay vì xuất ra màn hình, bạn muốn xuất danh sách sang CSV thay thế phần dưới cùng bằng mã sau:

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

Nó hoạt động! Bạn có biết làm thế nào để ngăn chặn đầu ra bị cắt ngắn? BTW, tôi không thể thưởng tiền thưởng trong 9 giờ nữa.
John Gardeniers

1
Cắt ngắn là một chức năng về cách định dạng powershell cho màn hình. Tôi đã cập nhật câu trả lời với một ví dụ về việc xuất ra tệp CSV để bạn có thể có các giá trị hoàn chỉnh.
Nate

Tuyệt vời, vì CSV rất phù hợp với nhu cầu của tôi. Từ đây tôi có thể đưa nó đến Perl, nơi ít nhất tôi biết mình đang làm gì. Nhiều đánh giá cao.
John Gardeniers

7

Người ta có thể "đơn giản" kết nối với cơ sở dữ liệu WSUS và chạy các truy vấn đối với nó:

  1. Bắt đầu SQL Management Studio với các đặc quyền nâng cao.
  2. Kết nối với \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\querysử dụng Windows xác thực .

Những bảng này dường như được quan tâm về câu hỏi của bạn:

  • tbUpdate
    Giữ thông tin về các bản cập nhật duy nhất

  • tbTargetGroup
    Giữ thông tin về tất cả các nhóm máy tính

  • tbDeployment
    Giữ thông tin về những cập nhật đã được phê duyệt cho nhóm máy tính nào

Tuy nhiên, có vẻ có lợi khi sử dụng chế độ xem đã có sẵn vUpdateApprovalđể truy xuất hầu hết thông tin mà bạn đang theo dõi, vì chế độ xem này đã dịch ActionIDcột từ tbDeploymentnhững thứ khác.

Các vUpdateApprovalquan điểm, tuy nhiên, không bao gồm bất kỳ danh hiệu dễ dàng có thể đọc được các bản cập nhật. Các tiêu đề thường được đọc từ tbLocalizedProperty. Để giúp chúng tôi dễ dàng hơn, có một góc nhìn khác : vUpdate.

Tôi thực sự không có dữ liệu phù hợp trong cơ sở dữ liệu WSUS của chúng tôi để xây dựng truy vấn phù hợp phù hợp với yêu cầu đầu tiên của bạn (và tôi không đủ tự tin để xây dựng nó một cách mù quáng). Vì vậy, đây là một cách tiếp cận cho yêu cầu thứ cấp của bạn. Nếu tôi không làm hỏng, nó sẽ tạo một danh sách tất cả các cập nhật và trạng thái phê duyệt cho tất cả các nhóm.

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
;

Sản phẩm này tạo ra sản phẩm này trên SBS Đức của chúng tôi:

nhập mô tả hình ảnh ở đây

Đối với SBS của chúng tôi với 5 nhóm mặc định, điều này tạo ra 121558 hàng kết quả trong ~ 26 giây. Vì vậy, nếu bạn muốn chơi xung quanh với truy vấn, có thể nên thay đổi dòng đầu tiên thành SELECT TOP 1000trong khi thử nghiệm.

Tôi cũng đã dành thời gian để gói tất cả vào tập lệnh 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

Xin lưu ý rằng tập lệnh này bao gồm các SELECT TOP 10giới hạn để tránh làm ngập vỏ của bạn trong quá trình thử nghiệm.


Đó chắc chắn là một cái gì đó để điều tra. Có thể có một mô-đun Perl để tương tác với MS SQL Server.
John Gardeniers

@JohnGardeniers: Tôi đã thêm một tập lệnh PowerShell thực hiện truy vấn. Đáng buồn thay, kiến ​​thức Perl của tôi thậm chí còn tồi tệ hơn :)
Der Hochstapler

Đó là một điểm khởi đầu tốt nhưng tôi sẽ phải tìm ra cách ngăn chặn đầu ra bị cắt ngắn.
John Gardeniers

@JohnGardeniers: Đó chỉ là cách PowerShell hiển thị các đối tượng được trả về theo mặc định. Bạn có thể chạy tập lệnh như thế nào myscript.ps1 | flđể có được đầu ra khác nhau (không bị cắt cụt).
Der Hochstapler

Tôi đã quyết định thưởng cho bạn vì nỗ lực của bạn nhưng bạn sẽ phải chờ 24 giờ. Hệ thống sẽ không cho phép tôi thưởng tiền thưởng ngay lập tức.
John Gardeniers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.