如何让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)
关键修改点说明
- 改用
kind=leftouter连接:强制保留DeviceInfo中所有符合筛选条件的设备,即使DeviceTvmSoftwareVulnerabilities中没有对应漏洞记录。 - 使用
dcount_if替代make_set_if + array_length:更高效地直接统计符合条件的去重CVE数量,无匹配时默认返回0,无需额外处理数组长度。 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
相关产品推荐
相关产品推荐

