È possibile "semplicemente" connettersi al database WSUS ed eseguire query su di esso:
- Avviare SQL Management Studio con privilegi elevati.
- Connettiti
\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query
utilizzando l' autenticazione di Windows .
Queste tabelle sembrano essere di interesse riguardo alla tua domanda:
tbUpdate
Contiene informazioni su singoli aggiornamenti
tbTargetGroup
Contiene informazioni su tutti i gruppi di computer
tbDeployment
Contiene informazioni su quali aggiornamenti sono stati approvati per quali gruppi di computer
Tuttavia, sembra utile utilizzare la vista già esistente vUpdateApproval
per recuperare la maggior parte delle informazioni che stai cercando, poiché questa vista traduce già la ActionID
colonna tbDeployment
tra le altre cose.
La vUpdateApproval
vista, tuttavia, non include titoli facilmente leggibili per gli aggiornamenti. I titoli vengono solitamente letti da tbLocalizedProperty
. Per rendere più facile per noi, c'è un'altra vista: vUpdate
.
Non ho davvero i dati corretti nel nostro database WSUS per costruire la query corretta che si adatterebbe alla tua prima richiesta (e non sono abbastanza sicuro da costruirlo ciecamente). Quindi ecco un approccio per la tua richiesta secondaria. Se non ho sbagliato, produce un elenco di tutti gli aggiornamenti e lo stato di approvazione per tutti i gruppi.
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
;
Che produce questo output sul nostro SBS tedesco:
Per il nostro SBS con i suoi 5 gruppi predefiniti, questo produce 121558 righe di risultati in ~ 26 secondi. Pertanto, se si desidera giocare con la query, potrebbe essere consigliabile modificare la prima riga SELECT TOP 1000
durante il test.
Mi sono anche preso il tempo di avvolgere tutto in uno script di 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
Si noti che questo script include la SELECT TOP 10
limitazione per evitare di inondare la shell durante il test.