Как автоматически получить «Состояние обновления» компьютера, как показано в настройках?

Как автоматически получить «Состояние обновления» компьютера, как показано в настройках?

Я хотел бы получить 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 dateили Updates 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:
    Последняя проверка: 26.01.2021 13:40:39
    До настоящего времени
    
    компьютер2
    ----------
    Состояние обновления Windows:
    Последняя проверка: 26.01.2021 05:59:41
    Доступны обновления:
    Накопительное обновление 2020-10 для .NET Framework 3.5 и 4.8 для Windows 10 версии 2004 для x64 (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

Связанный контент