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

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

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

在此处输入图片描述

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

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

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

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

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

在此处输入图片描述

编辑:以下代码似乎不能满足我的需求:

在此处输入图片描述

答案1

使用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;

为了在远程计算机上运行它,请使用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;

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

以下是该脚本的示例输出:

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

答案2

继续我的评论。每当您启动“设置”并单击“更新”时,Windows 都会动态检查更新。您可以自己执行此操作。

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

根据检测结果,您可以使用逻辑来输出您选择的任何消息。

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

类似观点另见:

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

相关内容