หนึ่งสามารถ "เพียงแค่" เชื่อมต่อกับฐานข้อมูล WSUSและเรียกใช้แบบสอบถามกับมัน:
- เริ่ม Studio การจัดการ SQL ด้วยสิทธิ์ที่ยกระดับ
- เชื่อมต่อกับ
\\.\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 เยอรมันของเรา:
สำหรับ SBS ของเราที่มี 5 กลุ่มเริ่มต้นสิ่งนี้จะสร้างแถวผลลัพธ์ 121558 ใน ~ 26s ดังนั้นหากคุณต้องการเล่นกับคำค้นหาอาจแนะนำให้เปลี่ยนบรรทัดแรกเป็น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
ข้อ จำกัด เพื่อหลีกเลี่ยงน้ำท่วมเปลือกของคุณในระหว่างการทดสอบ