設定に表示されるコンピューターの「更新ステータス」を自動的に取得するにはどうすればよいですか?

設定に表示されるコンピューターの「更新ステータス」を自動的に取得するにはどうすればよいですか?

を自動的に取得したいと思いますUpdate Status( は、以下のスクリーンショットのUpdate Status文です)。You're up to date

ここに画像の説明を入力してください

Last checkedPowerShell でタイムスタンプを取得する方法を見つけました:

$(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 アップデートのステータス:
    最終確認日: 2021/01/26 13:40:39
    最新の
    
    コンピュータ2
    ----------
    Windows アップデートのステータス:
    最終確認日: 2021/01/26 05:59:41
    利用可能なアップデート:
    2020-10 x64 用 Windows 10 バージョン 2004 用 .NET Framework 3.5 および 4.8 の累積更新プログラム (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

関連情報