Bir grup için WSUS rapor onayları


9

Bir veya daha fazla diğer grup için onaylanmamış bilgisayar grubu A için onaylanmış güncelleştirmelerin WSUS raporunu oluşturmanın bir yolunu bulmaya çalışıyorum. Alternatif olarak, her güncellemenin ve her grubun onay durumunu listeleyen, ihtiyaç duyduğum bilgileri ayıklamak için işlenebilecek sekmeli bir rapor. WSUS'un kendisinde böyle bir rapor yok ya da en azından bulamadığım bir rapor yok gibi görünüyor, bu nedenle böyle bir rapor üretmek için bir komut dosyası çok hoş olurdu.


WSUS'niz hangi Windows sürümünü kullanıyor?
Nate

@Nate, bir Server 2008 R2 Standard 64 bit makinede çalışan WSUS 3.2.7600.226.
John Gardeniers

Sanırım sana bir çözümüm var, bana birkaç tane ver ve onaylayacağım
Nate

Yanıtlar:


8

Bu powershell betiği ilk isteğinizin aynısını yapar. Bir bilgisayar grubunu inceleyin ve bir veya daha fazla bilgisayar grubu için onaylanmamış güncellemeleri bulun.

Not Bunu bir WSUS sunucusunda veya WSUS Yönetici araçlarının yüklü olduğu bir makinede çalıştırmanız gerekir.

Yapılandırma

Set $targetComputerGroupBilgisayar Grubuna Eğer bir temel Set olarak kullanmak istediğiniz $CheckForMissingonlar için onaylanmıştır görmek istiyorum grubun veya grupların adlarına. Not: Katları yapmak için sadece koma ayırın ("Grup1, Grup2")

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

Tamamlandığında, aşağıdaki gibi bir çıktı elde edersiniz: resim açıklamasını buraya girin

Ekrana çıktı vermek yerine listeyi CSV'ye aktarmak istiyorsanız, alt kısmı aşağıdaki kodla değiştirin:

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

İşe yarıyor! Çıktının kesilmesini nasıl durduracağınızı biliyor musunuz? BTW, ödülü 9 saat daha veremem.
John Gardeniers

1
Kesme, powershell'in ekran için nasıl biçimlendirildiğinin bir fonksiyonudur. Cevabı, CSV dosyasına çıktı alma örneğiyle güncelledim, böylece tam değerlere sahip olabilirsiniz.
Nate

Mükemmel, çünkü CSV ihtiyaçlarım için çok uygun. Buradan en azından ne yaptığımı bildiğim Perl'e besleyebilirim. Çok takdir etmek.
John Gardeniers

7

Bir WSUS veritabanına "basitçe" bağlanabilir ve buna karşı sorgular çalıştırabilir:

  1. SQL Management Studio'yu yükseltilmiş ayrıcalıklarla başlatın.
  2. Windows Kimlik Doğrulaması\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query kullanarak bağlanın .

Bu tablolar sorunuzla ilgileniyor gibi görünüyor:

  • tbUpdate
    Tekli güncellemeler hakkında bilgi tutar

  • tbTargetGroup
    Tüm bilgisayar grupları hakkında bilgi tutar

  • tbDeployment
    Hangi bilgisayar grupları için hangi güncelleştirmelerin onaylandığı hakkında bilgi tutar

Bununla birlikte, vUpdateApprovalpeşinde olduğunuz bilgilerin çoğunu almak için zaten var olan görünümü kullanmak yararlı görünmektedir , çünkü bu görünüm zaten ActionIDsütunu tbDeploymentdiğer şeylerin yanı sıra çevirmektedir .

Ancak vUpdateApprovalgörünüm, güncellemeler için kolayca okunabilir başlıklar içermez. Başlıklar genellikle okunmaktadır tbLocalizedProperty. Bizim için daha kolay hale getirmek için, başka bir görünüm var: vUpdate.

Gerçekten ilk isteğinize uygun uygun sorgu oluşturmak için WSUS veritabanımızda uygun veri yok (ve körü körüne oluşturmak için yeterince emin değilim). İşte ikincil isteğiniz için bir yaklaşım. Eğer karışıklık yaratmazsam, tüm güncellemelerin bir listesini ve tüm gruplar için onay durumunu oluşturur.

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
;

Alman SBS'mizde bu çıktıyı üreten:

resim açıklamasını buraya girin

5 varsayılan grubu olan SBS için bu, ~ 26s içinde 121558 sonuç satırı üretir. Bu nedenle, sorgu ile oynamak istiyorsanız, SELECT TOP 1000test sırasında ilk satırı değiştirmeniz tavsiye edilebilir .

Ben de hepsini bir PowerShell betiği içine sarmak için zaman aldı:

# 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

Bu komut dosyasının SELECT TOP 10test sırasında kabuğunuzu taşmasını önlemek için sınırlama içerdiğini lütfen unutmayın .


Kesinlikle araştırılması gereken bir şey. Belki MS SQL Server ile etkileşim için bir Perl modülü vardır.
John Gardeniers

@JohnGardeniers: Sorguyu gerçekleştiren bir PowerShell betiği ekledim. Ne yazık ki, Perl bilgim daha da kötü :)
Der Hochstapler

Bu iyi bir başlangıç ​​noktası, ancak çıktının kesilmesini nasıl durduracağımı öğrenmem gerekecek.
John Gardeniers

@JohnGardeniers: PowerShell, döndürülen nesneleri varsayılan olarak bu şekilde görüntüler. Komut dosyasını myscript.ps1 | flfarklı (kesilmemiş) çıktılar almak için çalıştırabilirsiniz .
Der Hochstapler

Çabalarınız için sizi ödüllendirmeye karar verdim ama 24 saat beklemeniz gerekecek. Sistem hemen bir ödül vermeme izin vermiyor.
John Gardeniers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.