You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Defender漏洞统计KQL查询默认显示0值?

解决KQL查询显示所有设备(含无漏洞设备)的问题

你的核心问题是默认的join是内连接(inner join),只会保留两边表中都有匹配数据的设备,导致无漏洞的设备被过滤。要显示所有设备,需改用左外连接(leftouter join),并确保无漏洞时统计值为0。

修改后的查询

// 先筛选目标设备作为主表
DeviceInfo
| where MachineGroup contains "example"
// 左外连接漏洞表,保留所有主表设备
| join kind=leftouter DeviceTvmSoftwareVulnerabilities on DeviceId
// 按设备分组统计去重后的漏洞数量
| summarize 
    CVEServerCritical = dcount_if(CveId, SoftwareName contains "server" and VulnerabilitySeverityLevel == "Critical"),
    CVEServerHigh = dcount_if(CveId, SoftwareName contains "server" and VulnerabilitySeverityLevel == "High")
    by DeviceName
// 确保无漏洞时数值显示为0(dcount_if无匹配时默认返回0,此步可省略,但显式处理更稳妥)
| project DeviceName, CVEServerCritical = coalesce(CVEServerCritical, 0), CVEServerHigh = coalesce(CVEServerHigh, 0)

关键修改点说明

  1. 改用kind=leftouter连接:强制保留DeviceInfo中所有符合筛选条件的设备,即使DeviceTvmSoftwareVulnerabilities中没有对应漏洞记录。
  2. 使用dcount_if替代make_set_if + array_length:更高效地直接统计符合条件的去重CVE数量,无匹配时默认返回0,无需额外处理数组长度。
  3. coalesce兜底(可选):确保极端情况下(如CveId为null时)数值显示为0,增强查询鲁棒性。

若坚持使用原逻辑(make_set_if)的修改版本

如果你想保留原有的make_set逻辑,也可以调整为:

DeviceInfo
| where MachineGroup contains "example"
| join kind=leftouter DeviceTvmSoftwareVulnerabilities on DeviceId
| summarize 
    ['Critical Severity Vulnerabilities'] = make_set_if(CveId, SoftwareName contains "server" and VulnerabilitySeverityLevel == "Critical"),
    ['High Severity Vulnerabilities'] = make_set_if(CveId, SoftwareName contains "server" and VulnerabilitySeverityLevel == "High")
    by DeviceName
| project 
    DeviceName, 
    CVEServerCritical = array_length(['Critical Severity Vulnerabilities']),
    CVEServerHigh = array_length(['High Severity Vulnerabilities'])

无漏洞设备的make_set_if会返回空数组,array_length计算结果为0,符合需求。

内容的提问来源于stack exchange,提问作者Brown Lightning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:41:01