如何使用PowerShell脚本查询Windows最新更新安装时间并实现更新逾期提醒?
PowerShell Windows更新超期提醒脚本解决方案
功能实现逻辑
- 调用CIM接口查询本地最后一次成功安装的Windows安全补丁时间,过滤预览版、病毒库更新类非系统补丁记录
- 计算最后更新时间与当前时间的差值,判断是否超过7天阈值
- 差值超阈值时,调用SMTP协议向指定用户发送提醒邮件
完整脚本代码
# --------------- 需手动修改的配置项 --------------- $smtpServer = "你的SMTP服务器地址" # 填公司内部SMTP服务器地址 $smtpPort = 25 # 常用端口为25/587,根据实际SMTP配置调整 $senderEmail = "update-alert@company.com" # 发件人邮箱地址 $receiverEmail = "user@company.com" # 收件人邮箱,需发送给多人时可配置为邮箱地址数组 $wsusServerName = "公司WSUS服务器地址" # 提醒文案中显示的WSUS服务器名称 $overdueDays = 7 # 超期阈值,按需求固定为7天 # ------------------------------------------------- # 获取最后一次成功安装的系统补丁时间 $lastUpdate = Get-CimInstance -ClassName Win32_QuickFixEngineering | Where-Object { $_.InstalledOn -ne $null -and $_.Description -notmatch "预览|Defender.*更新|病毒库" } | Sort-Object -Property InstalledOn -Descending | Select-Object -First 1 -ExpandProperty InstalledOn # 兼容无法通过QFE查询到更新记录的系统版本 if (-not $lastUpdate) { $regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\Results\Install" $lastUpdate = (Get-Item $regPath).GetValue("LastSuccessTime") if (-not $lastUpdate) { Write-Warning "未查询到系统更新记录,直接触发超期提醒" $daysSinceLastUpdate = $overdueDays + 1 } } else { # 计算距离当前的天数 $daysSinceLastUpdate = (Get-Date).Subtract($lastUpdate).TotalDays } # 判断是否超期,超期则发送提醒邮件 if ($daysSinceLastUpdate -gt $overdueDays) { $mailSubject = "系统更新超期提醒:请尽快连接WSUS安装最新补丁" $mailBody = @" 您好: 您的设备最后一次安装Windows系统更新的时间为 $($lastUpdate.ToString("yyyy年MM月dd日")),距今已超过 $overdueDays 天。 请您尽快将设备接入公司内网,连接 $wsusServerName 服务器获取并安装最新安全更新,避免设备存在安全风险。 如有操作问题请联系IT运维部门处理。 "@ # 如SMTP需要身份认证,请自行添加 -Credential 参数传入加密存储的凭据 Send-MailMessage -From $senderEmail -To $receiverEmail -Subject $mailSubject -Body $mailBody -SmtpServer $smtpServer -Port $smtpPort -Encoding UTF8 }
部署说明
- 脚本兼容PowerShell 5.1及以上版本,无需额外安装依赖组件
- 计划任务配置:触发时间设置为每月第二个周二(微软官方补丁日)之后一周的工作日,运行账户选择内置
SYSTEM账户即可,无需用户登录也能正常执行 - 敏感信息处理:如果SMTP需要身份认证,不要在脚本中明文存储密码,可使用
ConvertTo-SecureString将加密后的密码保存到本地授权路径,脚本运行时读取即可 - 如果SMTP服务器要求SSL连接,需要在
Send-MailMessage命令后添加-UseSsl参数 - 测试验证:首次部署前可以临时修改
$overdueDays为更小的值(比如0),手动运行脚本验证更新查询、邮件发送逻辑是否正常
内容的提问来源于stack exchange,提问作者AalHai
相关产品推荐
相关产品推荐

