如何使用PowerShell查询所有已安装Windows更新的名称、KB编号等完整信息
PowerShell 获取含CVE、严重等级的已安装Windows更新方案
旧方案失效原因
Get-HotFix、wmic qfe list、Win32_QuickFixEngineering类仅返回QFE(快速修复工程)类更新,不会覆盖累积更新、Office更新、驱动更新等全量更新,因此仅能返回KB编号字段- 注册表
Component Based Servicing\Packages路径仅记录组件服务相关的更新包,无法覆盖所有系统更新条目 - 原搜索脚本使用
IsPresent=1作为查询条件,会包含安装失败、待卸载的非生效更新,无法精准匹配已安装生效的更新,也未做字段映射处理
完整实现脚本
# 初始化Windows更新会话 $updateSession = New-Object -ComObject Microsoft.Update.Session $updateSearcher = $updateSession.CreateUpdateSearcher() # 精准搜索所有已安装生效的更新 $searchResult = $updateSearcher.Search("IsInstalled=1") $allInstalledUpdates = $searchResult.Updates # 提取所需字段并格式化输出 $outputList = foreach ($update in $allInstalledUpdates) { # 处理KB编号,一个更新可能对应多个KB $kbNum = $update.KBArticleIDs -join "、" # 处理CVE编号,非安全更新无该字段 $cveList = $update.CveIDs -join "、" # 映射严重等级为可读文本 $severityMap = @{ 0 = "未指定" 1 = "低危" 2 = "中危" 3 = "高危" 4 = "严重" } $severity = $severityMap[[int]$update.MsrcSeverity] ?? "无安全评级" [PSCustomObject]@{ "更新名称" = $update.Title "KB编号" = if ($kbNum) { $kbNum } else { "无KB编号" } "CVE ID" = if ($cveList) { $cveList } else { "无关联CVE" } "严重等级" = $severity } } # 控制台输出结果,如需导出到文件可追加 | Export-Csv -Path "C:\更新列表.csv" -Encoding UTF8 -NoTypeInformation $outputList | Format-Table -AutoSize
注意事项
- 运行脚本需要管理员权限,否则会无法读取部分系统级更新的属性
- 功能性更新、驱动更新本身不关联CVE和安全评级,对应字段返回默认值属于正常情况
- 如需查询更新历史(含安装失败、已卸载的更新),可将搜索条件替换为
"IsPresent=1"
内容的提问来源于stack exchange,提问作者Vitalia Kontanistova
相关产品推荐
相关产品推荐

