¿Cómo puedo obtener automáticamente el "Estado de actualización" de una computadora, como se muestra en la Configuración?

¿Cómo puedo obtener automáticamente el "Estado de actualización" de una computadora, como se muestra en la Configuración?

Me gustaría obtener Update Statusautomáticamente ( Update Statussiendo la oración You're up to dateen la captura de pantalla a continuación).

ingrese la descripción de la imagen aquí

Descubrí cómo obtener la Last checkedmarca de tiempo en PowerShell usando:

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

Sin embargo, intentar encontrarlo Update Statusse me escapa por completo. No estoy seguro de si el estado en sí está almacenado en algún lugar o si la aplicación de configuración determina el estado en función de la cantidad de actualizaciones disponibles, pero no he encontrado una solución para replicar el estado.

¿Alguien sabe si esto es posible lograrlo? No busco forzar la instalación automática de las actualizaciones, solo necesito obtener el estado.

El estado suele ser You're up to dateo Updates available, pero creo que hay otros estados como Update Failed.

ingrese la descripción de la imagen aquí

Editar:El siguiente código no parece hacer lo que estoy buscando:

ingrese la descripción de la imagen aquí

Respuesta1

Utilice el Microsoft.Update.Sessionobjeto para buscar actualizaciones de software asignadas que no estén ocultas o ya instaladas. Si no se encuentra ninguna, no hay actualizaciones; en caso contrario, hay algunas disponibles:

$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;

Para ejecutar esto en una computadora remota, use 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;

Además, si necesita ejecutar esto en un servidor remoto que no está en el mismo dominio,sigue mi respuesta aquí para configurarlo como un host confiable

Aquí hay un ejemplo de salida del script:

    computadora1
    ----------
    Estado de actualización de Windows:
    Última consulta: 26/01/2021 13:40:39
    A hoy
    
    computadora2
    ----------
    Estado de actualización de Windows:
    Última consulta: 26/01/2021 05:59:41
    Actualizaciones disponibles:
    Actualización acumulativa 2020-10 para .NET Framework 3.5 y 4.8 para Windows 10 versión 2004 para x64 (KB4578968)
    Actualización de funciones a Windows 10, versión 20H2

Respuesta2

Continuando con mi comentario. Cada vez que activas Configuración y haces clic en Actualizar. Windows busca actualizaciones dinámicamente. Puede hacerlo usted mismo.

($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(); 
#>

Según los resultados de la detección, puede utilizar la lógica para escupir el mensaje que elija.

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

Véase también para una toma similar:

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

información relacionada