AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 463573
Accepted
John Gardeniers
John Gardeniers
Asked: 2013-01-07 18:41:07 +0800 CST2013-01-07 18:41:07 +0800 CST 2013-01-07 18:41:07 +0800 CST

WSUS 报告对组的批准

  • 772

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

wsus
  • 2 2 个回答
  • 12146 Views

2 个回答

  • Voted
  1. Best Answer
    Nate
    2013-01-10T16:36:04+08:002013-01-10T16:36:04+08:00

    这个 powershell 脚本完全符合您最初的要求。检查一个计算机组并找到未批准一个或多个其他计算机组的更新。

    注意 您将需要在 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"
    
    • 8
  2. Oliver Salzburg
    2013-01-10T03:53:06+08:002013-01-10T03:53:06+08:00

    可以“简单地”连接到 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,这会在 ~26 秒内生成 121558 个结果行。因此,如果您想尝试查询,建议将第一行更改为SELECT TOP 1000while testing。

    我还花时间将其全部打包到一个 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避免在测试期间淹没您的 shell 的限制。

    • 7

相关问题

  • SBS 2008 上的 IIS 7 - 日志记录变得混乱

  • SMS 2003 和 WSUS 在同一台服务器上?

  • Sonicwall 和 Windows 更新

  • Microsoft Office 更新无法安装

  • Windows Server Update Services (WSUS) 4.0 最想要的功能 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve