Можна "просто" підключитися до бази даних WSUS і запустити запити проти неї:
- Запустіть SQL Management Studio з підвищеними привілеями.
- Підключіться до
\\.\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 рядків результатів за ~ 26 с. Отже, якщо ви хочете пограти із запитом, можливо, буде доцільним змінити перший рядок під 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
обмеження, щоб уникнути затоплення вашої оболонки під час тестування.