Можно «просто» подключиться к базе данных WSUS и выполнить запросы к ней:
- Запустите SQL Management Studio с повышенными привилегиями.
- Подключитесь к
\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query
использованию Windows Authentication .
Эти таблицы, кажется, представляют интерес для вашего вопроса:
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
ограничение, позволяющее избежать затопления вашей оболочки во время тестирования.