グループのWSUSレポート承認


9

コンピューターグループAで承認されているが、他の1つ以上のグループでは承認されていない更新のWSUSレポートを作成する方法を探しています。または、各更新と各グループの承認ステータスをリストする表形式のレポート。これにより、必要なものを抽出するために処理できます。WSUS自体にはそのようなレポートはないようで、少なくとも1つは見つかりません。そのため、そのようなレポートを作成するスクリプトは大歓迎です。


WSUSを実行しているWindowsのバージョンは?
2013年

@Nate、それはWSUS 3.2.7600.226で、Server 2008 R2 Standard 64ビットマシンで実行されています。
John Gardeniers、2013年

私はあなたのための解決策を持っていると思います、いくつか私に与えてください、そして私は確認します
ネイト

回答:


8

このPowerShellスクリプトは、最初のリクエストとまったく同じです。1つのcomputerGroupを調べて、1つまたは複数の他のコンピューターグループに対して承認されていない更新を見つけます。

注これは、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時間は獲得できません。
John Gardeniers、2013年

1
切り捨ては、Powershellが画面用にフォーマットする方法の関数です。完全な値が得られるように、CSVファイルに出力する例を使用して回答を更新しました。
ネイト

CSVは私のニーズに非常に適しているので、すばらしいです。ここから私はそれをPerlにフィードすることができます。とても有難い。
John Gardeniers 2013年

7

WSUSデータベースに「簡単に」接続して、それに対してクエリを実行できます

  1. 管理者特権でSQL Management Studioを起動します。
  2. Windows認証\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query使用して接続します

これらの表はあなたの質問に関して興味があるようです:

  • 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でこの出力が生成されます。

ここに画像の説明を入力してください

5つのデフォルトグループを持つSBSの場合、これは〜26秒で121558の結果行を生成します。したがって、クエリをいじりたい場合は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テスト中のシェルのフラッディングを回避するための制限が含まれていることに注意してください。


それは確かに調査すべきものです。たぶん、MS SQL Serverと対話するためのPerlモジュールがあるかもしれません。
John Gardeniers 2013年

@JohnGardeniers:クエリを実行するPowerShellスクリプトを追加しました。悲しいことに、私のPerlの知識はさらに悪くなっています:)
Der Hochstapler 2013年

これは良い出発点ですが、出力が切り捨てられるのを防ぐ方法を見つける必要があります。
John Gardeniers

@JohnGardeniers:PowerShellがデフォルトで返されたオブジェクトを表示する方法です。myscript.ps1 | fl別の(切り捨てられていない)出力を取得するようなスクリプトを実行できます。
Der Hochstapler 2013年

あなたの努力に対して報酬を与えることにしましたが、24時間待つ必要があります。このシステムでは、賞金をすぐに授与することはできません。
John Gardeniers 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.