Wie kann ich automatisch den „Update-Status“ eines Computers abrufen, der in den Einstellungen angezeigt wird?

Wie kann ich automatisch den „Update-Status“ eines Computers abrufen, der in den Einstellungen angezeigt wird?

Ich möchte das Update Statusautomatisch erhalten (wobei das Update Statusder Satz You're up to dateim Screenshot unten ist).

Bildbeschreibung hier eingeben

Ich habe herausgefunden, wie man den Last checkedZeitstempel in PowerShell erhält, und zwar mit:

$(New-Object -ComObject Microsoft.Update.AutoUpdate).Results.LastSearchSuccessDate;

Der Versuch, das herauszufinden, Update Statusist mir jedoch völlig schleierhaft. Ich bin mir nicht sicher, ob der Status selbst irgendwo gespeichert ist oder ob die Einstellungs-App den Status anhand der Anzahl der verfügbaren Updates bestimmt, aber ich habe keine Lösung gefunden, um den Status zu replizieren.

Weiß jemand, ob das möglich ist? Ich möchte die Installation der Updates nicht automatisch erzwingen, ich muss lediglich den Status abrufen.

Der Status ist normalerweise You're up to dateoder Updates available, aber ich glaube, es gibt auch andere Status wie Update Failed.

Bildbeschreibung hier eingeben

Bearbeiten:Der folgende Code scheint nicht das zu tun, was ich suche:

Bildbeschreibung hier eingeben

Antwort1

Verwenden Sie das Microsoft.Update.SessionObjekt, um nach zugewiesenen Software-Updates zu suchen, die nicht versteckt oder bereits installiert sind. Wenn keine gefunden werden, sind keine Updates vorhanden, andernfalls sind welche verfügbar:

$updateInfoMsg = "Windows Update Status: `n";

$UpdateSession = New-Object -ComObject Microsoft.Update.Session;
$UpdateSearcher = $UpdateSession.CreateupdateSearcher();
$Updates = @($UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0 and Type='Software'").Updates);
$Found = ($Updates | Select-Object -Expand Title);

If ($Found -eq $Null) {
    $updateInfoMsg += "Up to date";
} Else {
    $Found = ($Updates | Select-Object -Expand Title) -Join "`n";
    $updateInfoMsg += "Updates available:`n";
    $updateInfoMsg += $Found;
}

$updateInfoMsg;

Um dies auf einem Remotecomputer auszuführen, verwenden Sie Invoke-Command:

$server = "server";

<# Get Windows Update Info #>
$out += Invoke-Command -ComputerName $server -ScriptBlock {

    $updateInfoMsg = "Windows Update Status: `n";
    
    $UpdateSession = New-Object -ComObject Microsoft.Update.Session;
    $UpdateSearcher = $UpdateSession.CreateupdateSearcher();
    $Updates = @($UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0 and Type='Software'").Updates);
    $Found = ($Updates | Select-Object -Expand Title);
    
    If ($Found -eq $Null) {
        $updateInfoMsg += "Up to date";
    } Else {
        $Found = ($Updates | Select-Object -Expand Title) -Join "`n";
        $updateInfoMsg += "Updates available:`n";
        $updateInfoMsg += $Found;
    }

    Return $updateInfoMsg;
}
$out;

Wenn Sie dies außerdem auf einem Remote-Server ausführen müssen, der sich nicht in derselben Domäne befindet,folgen Sie meiner Antwort hier, um es als vertrauenswürdigen Host festzulegen

Hier ist eine Beispielausgabe des Skripts:

    computer1
    ----------
    Windows Update-Status:
    Zuletzt geprüft: 26.01.2021 13:40:39
    Auf dem Laufenden
    
    computer2
    ----------
    Windows Update-Status:
    Zuletzt geprüft: 26.01.2021 05:59:41
    Updates verfügbar:
    2020-10 Kumulatives Update für .NET Framework 3.5 und 4.8 für Windows 10 Version 2004 für x64 (KB4578968)
    Funktionsupdate auf Windows 10, Version 20H2

Antwort2

Fortsetzung meines Kommentars. Immer wenn Sie die Einstellungen öffnen und auf „Aktualisieren“ klicken, sucht Windows dynamisch nach Updates. Sie können dies selbst tun.

($WindowsUpdateInfo = $(New-Object -ComObject Microsoft.Update.AutoUpdate)) | 
Get-Member
# Results
<#
   TypeName: System.__ComObject#{4a2f5c31-cfd9-410e-b7fb-29a653973a0f}

Name               MemberType   Definition                                  
----               ----------   ----------                                  
DetectNow          Method       void DetectNow ()                           
EnableService      Method       void EnableService ()                       
Pause              Method       void Pause ()                               
Resume             Method       void Resume ()                              
ShowSettingsDialog Method       void ShowSettingsDialog ()                  
Results            Property     IAutomaticUpdatesResults Results () {get}   
ServiceEnabled     Property     bool ServiceEnabled () {get}                
Settings           Property     IAutomaticUpdatesSettings Settings () {get} 
MSDN               ScriptMethod System.Object MSDN(); 
#>

Basierend auf den Ergebnissen der Erkennung können Sie mithilfe der Logik jede gewünschte Nachricht ausgeben.

If ($WindowsUpdateInfo.DetectNow() -eq $Null)
{"You're up to date"}
Else 
{
    Write-Warning -Message "Updates available
    Last checked: $($WindowsUpdateInfo.Results)"
}

Eine ähnliche Sichtweise finden Sie auch unter:

https://michlstechblog.info/blog/windows-10-trigger-detecting-updates-from-command-line

verwandte Informationen