我希望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 年 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