Mit wenigen Zeilen PowerShell lesen Sie direkt aus der Configuration-Manager-Datenbank aus, wie weit eine Tasksequenz auf einem bestimmten Client ist – ideal für Helpdesk und Automatisierung.
Wie ist der aktuelle Stand der Betriebssystembereitstellung auf Rechner XY? Die Konsole beantwortet das, aber nur mit einigen Klicks. Für Helpdesk-Tools, Skripte oder Dashboards ist eine direkte Abfrage praktischer. Das folgende Skript liest den Deployment-Status einer bestimmten Tasksequenz für einen bestimmten Client direkt aus der Configuration-Manager-Datenbank.
Voraussetzungen
Die Abfrage läuft direkt gegen die Site-Datenbank. Der ausführende Benutzer benötigt daher mindestens die Rolle db_datareader auf der ConfigMgr-Datenbank. Abgefragt werden ausschließlich die von Microsoft unterstützten SQL-Views (v_...), nicht die Basistabellen.
Das Skript
param (
[Parameter(Mandatory)] [string]$ClientName,
[Parameter(Mandatory)] [string]$TSName,
[Parameter(Mandatory)] [string]$CollectionName,
[Parameter(Mandatory)] [string]$DBServer,
[Parameter(Mandatory)] [string]$DBName
)
$query = @"
SELECT ai.PackageName AS [Task Sequence],
ai.AdvertisementID AS [Deployment ID],
ai.CollectionName AS [Collection],
sys.Name0 AS [Computer Name],
cas.LastStateName AS [Status],
cas.LastStatusTime AS [Time]
FROM v_ClientAdvertisementStatus cas
JOIN v_R_System sys ON sys.ResourceID = cas.ResourceID
JOIN v_AdvertisementInfo ai ON ai.AdvertisementID = cas.AdvertisementID
WHERE ai.PackageName = @TSName
AND ai.CollectionName = @CollectionName
AND sys.Name0 = @ClientName
AND cas.LastStatusTime IS NOT NULL
ORDER BY cas.LastStatusTime DESC
"@
$connection = New-Object System.Data.SqlClient.SqlConnection(
"Server=$DBServer;Database=$DBName;Integrated Security=SSPI;")
try {
$connection.Open()
$cmd = $connection.CreateCommand()
$cmd.CommandText = $query
[void]$cmd.Parameters.AddWithValue('@TSName', $TSName)
[void]$cmd.Parameters.AddWithValue('@CollectionName', $CollectionName)
[void]$cmd.Parameters.AddWithValue('@ClientName', $ClientName)
$table = New-Object System.Data.DataTable
$table.Load($cmd.ExecuteReader())
$table | Format-Table -AutoSize
}
catch {
Write-Error "Abfrage fehlgeschlagen: $_"
}
finally {
$connection.Close()
}
Gegenüber der ursprünglichen Community-Version verwendet das Skript SQL-Parameter statt Zeichenketten-Verkettung. Das verhindert SQL-Injection, falls das Skript später etwa hinter einem Helpdesk-Portal hängt, und vermeidet Probleme mit Hochkommas in Namen.
Aufruf
.\Get-TSDeploymentStatus.ps1 -ClientName PC0815 -TSName "Windows 11 23H2" `
-CollectionName "OSD - Rollout Welle 1" -DBServer SQL01 -DBName CM_P01
Die Statuswerte verstehen
| Status | Bedeutung |
|---|---|
| Accepted | Die Bereitstellung wurde empfangen, der Download startet in Kürze. |
| Accepted – No Further Status | Bisher kein neuer Status gemeldet. |
| Running | Die Tasksequenz läuft. |
| Succeeded | Erfolgreich abgeschlossen. |
| Failed | Fehlgeschlagen – Details liefern smsts.log und die Statusmeldungen. |
| No Status | Client nicht online oder Problem mit dem ConfigMgr-Agent. |
Heute
Die Views v_ClientAdvertisementStatus, v_AdvertisementInfo und v_R_System existieren auch in Configuration Manager Current Branch. Alternativ bietet das ConfigMgr-PowerShell-Modul mit Get-CMDeploymentStatus bzw. die AdminService-REST-API einen Weg ohne direkten Datenbankzugriff – für neue Lösungen ist der AdminService die zukunftssichere Wahl.