Można „po prostu” połączyć się z bazą danych WSUS i uruchomić na niej zapytania:
- Uruchom SQL Management Studio z podwyższonymi uprawnieniami.
- Połącz się
\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query
przy użyciu uwierzytelniania systemu Windows .
Te tabele wydają się być interesujące w odniesieniu do twojego pytania:
tbUpdate
Przechowuje informacje o pojedynczych aktualizacjach
tbTargetGroup
Przechowuje informacje o wszystkich grupach komputerów
tbDeployment
Przechowuje informacje o tym, jakie aktualizacje zostały zatwierdzone dla których grup komputerów
Wydaje się jednak, że korzystne jest wykorzystanie już istniejącego widoku vUpdateApproval
do odzyskania większości poszukiwanych informacji, ponieważ widok ten tłumaczy między innymi ActionID
kolumnę tbDeployment
.
vUpdateApproval
Widok, jednak nie zawiera żadnych czytelnych tytułów aktualizacji. Tytuły są zwykle odczytywane z tbLocalizedProperty
. Aby ułatwić nam, że jest inny widok: vUpdate
.
Naprawdę nie mam odpowiednich danych w naszej bazie danych WSUS, aby zbudować odpowiednie zapytanie, które pasowałoby do twojego pierwszego żądania (i nie jestem wystarczająco pewny, aby je skonstruować na ślepo). Oto podejście do drugiego żądania. Jeśli się nie zepsułem, wyświetla listę wszystkich aktualizacji i stan zatwierdzenia dla wszystkich grup.
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
;
Który produkuje ten wynik w naszym niemieckim SBS:
W przypadku naszego SBS z 5 domyślnymi grupami daje to 121558 wierszy wyników w ~ 26 sekund. Tak więc, jeśli chcesz pobawić się zapytaniem, może być wskazana zmiana pierwszej linii na SELECT TOP 1000
podczas testowania.
Poświęciłem też czas na podsumowanie tego wszystkiego w skrypcie 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
Pamiętaj, że ten skrypt zawiera SELECT TOP 10
ograniczenie, aby uniknąć zalania powłoki podczas testowania.