Programmatische Überprüfung des Patch-Bereitstellungsstatus mittels C# und der WUA-API

ACE SRE 60 Zuverlässigkeitspunkte
2026-05-12T14:14:56.7266667+00:00

Wir müssen eine benutzerdefinierte Überwachungslösung entwickeln, die mit dem nativen Patch-Lebenszyklus des Betriebssystems interagiert. Welche Syntax oder API-Implementierung in C# ist erforderlich, um den Windows Update-Agenten asynchron abzufragen und zwischen aktiven Hintergrundübertragungen, Paketen, die auf die Bereitstellung warten, und solchen, die einen Neustart des Systems erfordern, zu unterscheiden?

Windows für Unternehmen | Windows Server | Geräte und Bereitstellung | Installieren von Windows-Updates, -Funktionen oder -Rollen
0 Kommentare Keine Kommentare

1 Antwort

Sortieren nach: Am hilfreichsten
  1. Tan Vu 2,665 Zuverlässigkeitspunkte Unabhängiger Berater
    2026-05-12T14:54:44.7166667+00:00

    Hallo SRE,

    Hier ist die genaue Vorgehensweise und Syntax, um diese Anforderungen asynchron abzufragen und die Zustände sauber zu trennen.

    1. Voraussetzung: COM-Referenz hinzufügen

    Bevor Sie den Code ausführen können, müssen Sie eine Referenz auf die wuapi.dll (Windows Update Agent API) in Ihr Projekt einfügen:

    In Visual Studio: Rechtsklick auf Abhängigkeiten/Verweise -> COM -> Suchen nach "WUAPI 2.0 Type Library" und hinzufügen.

    1. C#-Implementierung

    Die WUA API bietet zwar eigene asynchrone Methoden (BeginSearch / EndSearch), in modernem C# ist es jedoch wesentlich sauberer und robuster, die synchronen Aufrufe in einen Task.Run zu kapseln, um die asynchrone Ausführung (async/await) zu gewährleisten, ohne den Hauptthread zu blockieren.

    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using WUApiLib; // Namespace der COM-Referenz
    public class UpdateStatusReport
    {
        public bool SystemRebootRequired { get; set; }
        public List<string> ActiveOrPendingDownloads { get; set; } = new List<string>();
        public List<string> WaitingForDeployment { get; set; } = new List<string>();
    }
    public class WindowsUpdateMonitor
    {
        /// <summary>
        /// Fragt den Windows Update Agenten asynchron ab.
        /// </summary>
        public async Task<UpdateStatusReport> CheckUpdateLifecycleAsync()
        {
            return await Task.Run(() =>
            {
                var report = new UpdateStatusReport();
                
                // Instanziiere die Update-Session
                UpdateSession session = new UpdateSession();
                // --- 1. NEUSTART-STATUS PRÜFEN ---
                // Prüft, ob das System aufgrund eines vorherigen Updates einen Neustart benötigt
                ISystemInformation sysInfo = session.CreateUpdateSystemInformation();
                report.SystemRebootRequired = sysInfo.RebootRequired;
                // --- 2. UPDATES SUCHEN ---
                IUpdateSearcher searcher = session.CreateUpdateSearcher();
                
                // Best Practice für Monitoring: Online = false fragt nur den lokalen WUA-Cache ab.
                // Das ist wesentlich schneller und erzeugt keinen Netzwerktraffic. 
                // Setzen Sie es auf true, wenn Sie zwingend gegen den WSUS/Microsoft-Server prüfen wollen.
                searcher.Online = false;
                // Such-Syntax: Finde alle Updates, die nicht installiert und nicht versteckt sind.
                ISearchResult searchResult = searcher.Search("IsInstalled=0 and IsHidden=0");
                foreach (IUpdate update in searchResult.Updates)
                {
                    // --- 3. ZUSTÄNDE DIFFERENZIEREN ---
                    if (update.IsDownloaded)
                    {
                        // Paket liegt fertig im SoftwareDistribution-Ordner und wartet auf die Installation
                        report.WaitingForDeployment.Add(update.Title);
                    }
                    else
                    {
                        // Paket ist bekannt, aber noch nicht (vollständig) lokal vorhanden.
                        report.ActiveOrPendingDownloads.Add(update.Title);
                    }
                }
                return report;
            });
        }
    }
    
    1. Wichtige architektonische Details zur Unterscheidung

    Pakete, die einen Neustart erfordern:

    Sobald ein Update installiert ist und einen Neustart erfordert, verschwindet es aus der Suche IsInstalled=0. Daher ist es der sicherste und global gültige Weg, session.CreateUpdateSystemInformation().RebootRequired abzufragen. Dies deckt das gesamte Betriebssystem ab, nicht nur isolierte Update-Objekte.

    Pakete, die auf Bereitstellung warten:

    Dies wird über die Eigenschaft update.IsDownloaded == true (in Kombination mit der Suchabfrage IsInstalled=0) ermittelt. Das Paket liegt installationsbereit im Cache.

    War diese Antwort hilfreich?

    0 Kommentare Keine Kommentare

Ihre Antwort

Antworten können von Fragestellenden als „Angenommen“ und von Moderierenden als „Empfohlen“ gekennzeichnet werden, wodurch Benutzende wissen, dass diese Antwort das Problem des Fragestellenden gelöst hat.