WSUS报告批准的组


9

我正在尝试找到一种方法来创建WSUS报告,该报告包含已为计算机A组批准但尚未为一个或多个其他组批准的更新。或者,可以使用表格报告列出每个更新和每个组的批准状态,以便可以对其进行处理以提取我需要的内容。WSUS本身似乎没有这样的报告,或者至少没有我可以找到的报告,因此非常欢迎编写此类报告的脚本。


您的WSUS在哪个版本的Windows上运行?
Nate

@Nate,它是在Server 2008 R2 Standard 64位计算机上运行的WSUS 3.2.7600.226。
John Gardeniers 2013年

我想我有一个适合您的解决方案,请给我一些,我确认
Nate

Answers:


8

该powershell脚本完全可以执行您的初始请求。检查一台计算机组,并查找未经批准用于一个或多个其他计算机组的更新。

注意您将需要在WSUS服务器或安装了WSUS Admin工具的计算机上运行此程序。

组态

设置$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

1
截断是Powershell如何格式化屏幕的功能。我以输出到CSV文件的示例更新了答案,以便您可以获取完整的值。
Nate

太好了,因为CSV非常适合我的需求。从这里,我可以将其提供给Perl,至少我知道我在做什么。非常感激。
John Gardeniers 2013年

7

一个人可以“简单地” 连接到WSUS数据库并对它运行查询:

  1. 以提升的特权启动SQL Management Studio。
  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上产生以下输出:

在此处输入图片说明

对于具有5个默认组的SBS,这将在约26s内产生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限制,以避免在测试期间淹没您的外壳。


这当然是要调查的东西。也许有一个Perl模块可以与MS SQL Server进行交互。
John Gardeniers 2013年

@JohnGardeniers:我添加了执行查询的PowerShell脚本。不幸的是,我的Perl知识更糟:)
Der Hochstapler 2013年

这是一个很好的起点,但我必须找出如何停止截断输出的方法。
John Gardeniers

@JohnGardeniers:这就是PowerShell默认情况下显示返回对象的方式。您可以像运行脚本一样myscript.ps1 | fl获得不同的(非截断的)输出。
Der Hochstapler

我已决定奖励您的努力,但您必须等待24小时。系统不允许我立即授予赏金。
John Gardeniers 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.