Pode-se "simplesmente" conectar-se ao banco de dados do WSUS e executar consultas nele:
- Inicie o SQL Management Studio com privilégios elevados.
- Conecte-se
\\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query
usando a autenticação do Windows .
Estas tabelas parecem ser interessantes em relação à sua pergunta:
tbUpdate
Contém informações sobre atualizações únicas
tbTargetGroup
Contém informações sobre todos os grupos de computadores
tbDeployment
Contém informações sobre quais atualizações foram aprovadas para quais grupos de computadores
No entanto, parece benéfico utilizar a visualização já existente vUpdateApproval
para recuperar a maioria das informações que você procura, pois essa visualização já traduz a ActionID
coluna tbDeployment
entre outras coisas.
A vUpdateApproval
exibição, no entanto, não inclui títulos de fácil leitura para atualizações. Os títulos são geralmente lidos tbLocalizedProperty
. Para tornar mais fácil para nós, há um outro ponto de vista: vUpdate
.
Eu realmente não tenho os dados adequados em nosso banco de dados do WSUS para construir a consulta adequada que se encaixaria na sua primeira solicitação (e não tenho confiança suficiente para construí-la às cegas). Então, aqui está uma abordagem para sua solicitação secundária. Se eu não errei, ele produzirá uma lista de todas as atualizações e o estado de aprovação de todos os grupos.
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
;
O que produz essa saída no nosso SBS alemão:
Para o nosso SBS com seus 5 grupos padrão, isso produz 121558 linhas de resultado em ~ 26s. Portanto, se você quiser brincar com a consulta, pode ser aconselhável alterar a primeira linha para SELECT TOP 1000
durante o teste.
Também reservei um tempo para agrupar tudo em um script do 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
Observe que este script inclui a SELECT TOP 10
limitação para evitar inundar seu shell durante o teste.