WSUS melaporkan persetujuan untuk grup

9

Saya mencoba menemukan cara untuk membuat laporan WSUS tentang pembaruan yang telah disetujui untuk grup komputer A yang belum disetujui untuk satu atau lebih grup lain. Atau, laporan tabular yang mencantumkan status persetujuan untuk setiap pembaruan dan setiap grup, sehingga dapat diproses untuk mengekstrak apa yang saya butuhkan. Tampaknya tidak ada laporan seperti itu di WSUS itu sendiri, atau setidaknya tidak ada yang bisa saya temukan, jadi skrip untuk menghasilkan laporan seperti itu akan sangat disambut.

John Gardeniers
sumber
Windows versi mana yang menjalankan WSUS Anda?
Nate
@Nate, ini WSUS 3.2.7600.226 berjalan pada mesin Server 2008 R2 Standard 64 bit.
John Gardeniers
Saya pikir saya punya solusi untuk Anda, beri saya beberapa dan saya akan konfirmasi
Nate

Jawaban:

8

Skrip PowerShell ini melakukan persis seperti apa permintaan awal Anda. Periksa satu computerGroup dan temukan pembaruan yang tidak disetujui untuk satu atau beberapa grup komputer lainnya.

Catatan Anda harus menjalankan ini pada server WSUS atau mesin yang memiliki alat Admin WSUS diinstal.

Konfigurasi

Setel $targetComputerGroupke Grup Komputer yang ingin Anda gunakan sebagai garis dasar. Setel $CheckForMissingke nama-nama grup atau grup yang ingin Anda lihat apakah sudah disetujui. Catatan: Untuk melakukan beberapa koma hanya terpisah ("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
            }
        }
    }
}

Ketika Selesai Anda akan memiliki output keluaran seperti: masukkan deskripsi gambar di sini

Jika alih-alih menampilkan ke layar Anda ingin mengekspor daftar ke CSV ganti bagian bawah dengan kode berikut:

   $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"
Nate
sumber
Berhasil! Apakah Anda tahu cara menghentikan keluaran agar tidak terpotong? BTW, saya tidak bisa memberi hadiah untuk 9 jam lagi.
John Gardeniers
1
Pemotongan adalah fungsi dari cara memformat format untuk layar. Saya memperbarui jawaban dengan contoh keluaran ke file CSV sehingga Anda dapat memiliki nilai lengkap.
Nate
Luar biasa, karena CSV sangat cocok untuk kebutuhan saya. Dari sini saya bisa memasukkannya ke Perl, di mana setidaknya saya tahu apa yang saya lakukan. Sangat dihargai.
John Gardeniers
7

Seseorang dapat "cukup" terhubung ke database WSUS dan menjalankan query terhadapnya:

  1. Mulai SQL Management Studio dengan hak yang lebih tinggi.
  2. Terhubung ke \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\querymenggunakan Otentikasi Windows .

Tabel ini tampaknya menarik tentang pertanyaan Anda:

  • tbUpdate
    Menyimpan informasi tentang pembaruan tunggal

  • tbTargetGroup
    Menyimpan informasi tentang semua grup komputer

  • tbDeployment
    Menyimpan informasi tentang pembaruan apa yang telah disetujui untuk grup komputer mana

Namun, tampaknya bermanfaat untuk menggunakan tampilan yang sudah ada vUpdateApprovaluntuk mengambil sebagian besar informasi yang Anda cari, karena tampilan ini sudah menerjemahkan ActionIDkolom dari tbDeploymentantara lain.

The vUpdateApprovalpandangan, bagaimanapun, tidak termasuk judul mudah dibaca untuk update. Judul biasanya dibaca tbLocalizedProperty. Untuk membuatnya lebih mudah bagi kita, ada pandangan lain: vUpdate.

Saya tidak benar-benar memiliki data yang tepat di basis data WSUS kami untuk membuat kueri yang tepat yang sesuai dengan permintaan pertama Anda (dan saya tidak cukup percaya diri untuk membuatnya secara membabi buta). Jadi, inilah pendekatan untuk permintaan sekunder Anda. Jika saya tidak mengacaukannya, itu menghasilkan daftar semua pembaruan dan status persetujuan untuk semua grup.

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
;

Yang menghasilkan output ini di SBS Jerman kami:

masukkan deskripsi gambar di sini

Untuk SBS kami dengan 5 grup standarnya, ini menghasilkan baris hasil 1.21558 dalam ~ 26d. Jadi, jika Anda ingin bermain-main dengan kueri, mungkin disarankan untuk mengubah baris pertama SELECT TOP 1000saat pengujian.

Saya juga meluangkan waktu untuk membungkus semuanya menjadi skrip 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

Harap perhatikan bahwa skrip ini menyertakan SELECT TOP 10batasan untuk menghindari membanjiri shell Anda selama pengujian.

Der Hochstapler
sumber
Pasti sesuatu untuk diselidiki. Mungkin ada modul Perl untuk berinteraksi dengan MS SQL Server.
John Gardeniers
@JohnGardeniers: Saya menambahkan skrip PowerShell yang melakukan kueri. Sedihnya, pengetahuan Perl saya bahkan lebih buruk :)
Der Hochstapler
Itu adalah titik awal yang baik tetapi saya harus mencari tahu cara menghentikan output yang terpotong.
John Gardeniers
@ JohnGardeniers: Begitulah PowerShell menampilkan objek yang dikembalikan secara default. Anda dapat menjalankan skrip seperti myscript.ps1 | fluntuk mendapatkan hasil (non-terpotong) yang berbeda.
Der Hochstapler
Saya telah memutuskan untuk menghargai Anda atas upaya Anda tetapi Anda harus menunggu 24 jam. Sistem tidak akan memungkinkan saya untuk memberikan hadiah segera.
John Gardeniers