![如何自動取得電腦的“更新狀態”,如設定所示?](https://rvso.com/image/1642373/%E5%A6%82%E4%BD%95%E8%87%AA%E5%8B%95%E5%8F%96%E5%BE%97%E9%9B%BB%E8%85%A6%E7%9A%84%E2%80%9C%E6%9B%B4%E6%96%B0%E7%8B%80%E6%85%8B%E2%80%9D%EF%BC%8C%E5%A6%82%E8%A8%AD%E5%AE%9A%E6%89%80%E7%A4%BA%EF%BC%9F.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 更新狀態: 最後檢查: 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 的功能更新
答案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