Aprovações de relatório do WSUS para um grupo

9

Estou tentando encontrar uma maneira de criar um relatório do WSUS de atualizações aprovadas para o grupo de computadores A que não foram aprovadas para um ou mais outros grupos. Como alternativa, um relatório tabular que lista o status de aprovação para cada atualização e cada grupo, para que possa ser processado para extrair o que eu preciso. Não parece haver um relatório como esse no próprio WSUS, ou pelo menos nenhum que eu possa encontrar, portanto, um script para produzir um relatório desse tipo seria muito bem-vindo.

    
por John Gardeniers 07.01.2013 / 03:41

2 respostas

8

Este script do PowerShell faz exatamente o que o seu pedido inicial foi. Examine um grupo de computadores e encontre atualizações não aprovadas para um ou vários outros grupos de computadores.

Observação Você precisará executar isso em um servidor WSUS ou em uma máquina que tenha as ferramentas de administração do WSUS instaladas.

Configuração

Defina $targetComputerGroup como o Grupo de computadores que você deseja usar como linha de base Defina $CheckForMissing com os nomes do grupo ou grupos que você deseja ver para os quais foram aprovados. Nota: Para fazer múltiplos apenas coma seperate ("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
            }
        }
    }
}

Quando concluído, você terá uma saída como:

Se,emvezdeenviarparaatelaquevocêdesejaexportaralistaparaumarquivoCSV,substituaaparteinferiorpeloseguintecódigo:

$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"
    
por 10.01.2013 / 01:36
7

Pode-se "simplesmente" conectar-se ao banco de dados do WSUS e executar consultas em relação a ele:

  1. Inicie o SQL Management Studio com privilégios elevados.
  2. Conecte-se a \.\pipe\MSSQL$MICROSOFT##SSEE\sql\query usando Autenticação do Windows .

Estas tabelas parecem ser de interesse em relação à sua pergunta:

  • tbUpdate em Mantém informações sobre atualizações únicas

  • tbTargetGroup em Contém informações sobre todos os grupos de computadores

  • tbDeployment em Mantém informações sobre quais atualizações foram aprovadas para quais grupos de computadores

No entanto, parece benéfico utilizar a visualização já existente vUpdateApproval para recuperar a maior parte das informações que você procura, pois essa visualização já traduz a coluna ActionID de tbDeployment entre outras coisas.

A exibição vUpdateApproval , no entanto, não inclui nenhum título de fácil leitura para atualizações. Os títulos geralmente são lidos de tbLocalizedProperty . Para facilitar, temos outra visão: vUpdate .

Eu realmente não tenho os dados corretos em nosso banco de dados do WSUS para construir a consulta apropriada que atenda ao seu primeiro pedido (e não estou confiante o suficiente para construí-lo cegamente). Então aqui está uma abordagem para o seu pedido secundário. Se não atrapalhei, produz uma lista de todas as atualizações e o estado de aprovação de todos os grupos.

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
;

Que produz essa saída em nosso SBS alemão:

ParaonossoSBScomseus5grupospadrão,issoproduz121558linhasderesultadoem~26s.Portanto,sevocêquiserbrincarcomaconsulta,podeseraconselhávelalteraraprimeiralinhaparaSELECTTOP1000duranteoteste.

EutambémaproveiteiparacolocartudoemumscriptdoPowerShell:

#Wheretoconnectto$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

Por favor, note que este script inclui a limitação SELECT TOP 10 para evitar inundar o seu shell durante o teste.

    
por 09.01.2013 / 12:53

Tags