![設定に表示されるコンピューターの「更新ステータス」を自動的に取得するにはどうすればよいですか?](https://rvso.com/image/1642373/%E8%A8%AD%E5%AE%9A%E3%81%AB%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E3%80%8C%E6%9B%B4%E6%96%B0%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%80%8D%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
を自動的に取得したいと思います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 アップデートのステータス: 最終確認日: 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