그룹에 대한 WSUS 보고서 승인


9

하나 이상의 다른 그룹에 대해 승인되지 않은 컴퓨터 그룹 A에 대해 승인 된 업데이트에 대한 WSUS 보고서를 작성하는 방법을 찾고 있습니다. 또는 각 업데이트 및 각 그룹의 승인 상태를 나열하는 표 형식의 보고서로 처리하여 필요한 정보를 추출 할 수 있습니다. WSUS 자체에는 그러한 보고서가 없거나 적어도 찾을 수있는 보고서가 없으므로 그러한 보고서를 작성하는 스크립트가 가장 환영받을 것입니다.


WSUS가 어떤 버전의 창에서 실행되고 있습니까?
Nate

@Nate, Server 2008 R2 Standard 64 비트 컴퓨터에서 실행되는 WSUS 3.2.7600.226입니다.
John Gardeniers

나는 당신을위한 해결책이 있다고 생각합니다. 몇 가지를 주시면 확인하겠습니다.
Nate

답변:


8

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

효과가있다! 출력이 잘리지 않도록하는 방법을 알고 있습니까? BTW, 나는 9 시간 동안 현상금을 수여 할 수 없습니다.
John Gardeniers

1
잘림은 화면에 대한 Powershell 형식의 기능입니다. CSV 파일로 출력하는 예제로 답변을 업데이트하여 완전한 값을 얻을 수 있습니다.
Nate

CSV는 내 요구에 매우 적합하므로 우수합니다. 여기에서 나는 적어도 내가하고있는 일을 알고있는 Perl에 그것을 공급할 수 있습니다. 매우 감사.
John Gardeniers

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

@JohnGardeniers : 쿼리를 수행하는 PowerShell 스크립트를 추가했습니다. 슬프게도, 나의 Perl 지식은 훨씬 더 나쁘다 :)
Der Hochstapler

좋은 출발점이지만 출력이 잘리는 것을 멈추는 방법을 찾아야합니다.
John Gardeniers 2012 년

@JohnGardeniers : PowerShell이 ​​기본적으로 반환 된 개체를 표시하는 방식입니다. myscript.ps1 | fl다른 (잘라 내지 않은) 출력을 얻기 위해 스크립트를 실행할 수 있습니다 .
Der Hochstapler

나는 당신의 노력에 대해 당신에게 보상하기로 결정했지만 당신은 24 시간을 기다려야합니다. 이 시스템은 현상금을 즉시 수여 할 수 없습니다.
John Gardeniers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.