하나 이상의 다른 그룹에 대해 승인되지 않은 컴퓨터 그룹 A에 대해 승인 된 업데이트에 대한 WSUS 보고서를 작성하는 방법을 찾고 있습니다. 또는 각 업데이트 및 각 그룹의 승인 상태를 나열하는 표 형식의 보고서로 처리하여 필요한 정보를 추출 할 수 있습니다. WSUS 자체에는 그러한 보고서가 없거나 적어도 찾을 수있는 보고서가 없으므로 그러한 보고서를 작성하는 스크립트가 가장 환영받을 것입니다.
하나 이상의 다른 그룹에 대해 승인되지 않은 컴퓨터 그룹 A에 대해 승인 된 업데이트에 대한 WSUS 보고서를 작성하는 방법을 찾고 있습니다. 또는 각 업데이트 및 각 그룹의 승인 상태를 나열하는 표 형식의 보고서로 처리하여 필요한 정보를 추출 할 수 있습니다. WSUS 자체에는 그러한 보고서가 없거나 적어도 찾을 수있는 보고서가 없으므로 그러한 보고서를 작성하는 스크립트가 가장 환영받을 것입니다.
답변:
이 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"
WSUS 데이터베이스에 "간단하게" 연결하고 이에 대한 쿼리를 실행할 수 있습니다.
\\.\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
테스트 중에 쉘이 넘치지 않도록 하는 제한 사항 이 포함되어 있습니다.
myscript.ps1 | fl
다른 (잘라 내지 않은) 출력을 얻기 위해 스크립트를 실행할 수 있습니다 .