如何自动获取计算机的“更新状态”,如设置中所示?

Tyl*_*r N 6 windows windows-update powershell

我想自动获取Update Status(即下面屏幕截图中的Update Status句子)。You're up to date

在此输入图像描述

我发现如何Last checked使用以下命令在 PowerShell 中获取时间戳:

$(New-Object -ComObject Microsoft.Update.AutoUpdate).Results.LastSearchSuccessDate;
Run Code Online (Sandbox Code Playgroud)

然而,试图找到Update Status是完全无法实现的。我不确定状态本身是否存储在某处,或者设置应用程序是否根据可用更新的数量确定状态,但我还没有找到复制状态的解决方案。

有谁知道这是否可以实现?我不希望自动强制安装更新,我只需要获取状态。

状态通常是You're up to dateUpdates available,但我相信还有其他状态,例如Update Failed

在此输入图像描述

编辑:以下代码似乎没有达到我的要求:

在此输入图像描述

Tyl*_*r N 3

使用该Microsoft.Update.Session对象搜索已分配、未隐藏或已安装的软件更新。如果没有找到,则没有更新,否则有一些可用:

$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;
Run Code Online (Sandbox Code Playgroud)

为了在远程计算机上运行它,请使用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;
Run Code Online (Sandbox Code Playgroud)

此外,如果您需要在不在同一域的远程服务器上运行此程序,请按照我的回答将其设置为受信任的主机

以下是脚本的输出示例:

    电脑1
    ----------
    Windows 更新状态:
    最后检查: 01/26/2021 13:40:39
    最新
    
    计算机2
    ----------
    Windows 更新状态:
    最后检查: 01/26/2021 05:59:41
    可用更新:
    适用于 x64 的 Windows 10 版本 2004 的 .NET Framework 3.5 和 4.8 2020 年 10 累积更新 (KB4578968)
    Windows 10 版本 20H2 的功能更新