WSUS报告批准为一个小组

我正在试图find一种方法来创build已经批准用于计算机组A的未经一个或多个其他组批准的更新的WSUS报告。 或者,也可以使用表格式报告,列出每个更新和每个组的审批状态,以便处理它以提取我所需的内容。 WSUS本身并没有这样的报告,至less也不是我能find的报告,所以编写这样的报告的脚本将是非常受欢迎的。

这个powershell脚本正是你最初的要求。 检查一个计算机组并查找未被批准用于一个或多个其他计算机组的更新。

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

组态

$targetComputerGroup设置$targetComputerGroup想要用作基线的计算机组将$CheckForMissing设置$CheckForMissing要validation的组或组的名称。 注意:要做多倍只是昏迷分离(“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,则用下面的代码replace底部:

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

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

  1. 用提升的权限启动SQL Management Studio。
  2. 使用Windows身份validation连接到\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query

这些表格似乎对您的问题感兴趣:

  • tbUpdate
    保存有关单个更新的信息

  • tbTargetGroup
    掌握有关所有计算机组的信息

  • tbDeployment
    保存有关哪些计算机组已被批准的更新的信息

但是,利用已经存在的视图vUpdateApproval检索大部分后面的信息似乎是有益的,因为此视图已经从tbDeployment翻译了ActionID列等等。

但是, vUpdateApproval视图不包含任何易于阅读的更新标题。 标题通常从tbLocalizedProperty读取。 为了使我们更容易,还有另一种看法: vUpdate

在WSUS数据库中我没有真正的数据来构build适合您的第一个请求的适当查询(而且我没有足够的信心去盲目地构build它)。 所以这里是你的第二个要求的方法。 如果我没有搞砸,它会产生所有组的所有更新和批准状态的列表。

 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,这产生121558个结果行,大约在26s。 所以,如果你想玩弄查询,可能build议在testing的时候把第一行改成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限制,以避免在testing过程中泛滥。