需求:编写KQL查询统计Windows安全事件日志中含指定文本的列及次数
KQL查询:统计各字段中指定文本的出现次数
通用实现方案
以下KQL查询可自动遍历表中所有字段,统计指定文本在每个字段中的出现次数,无需手动列出所有列:
// 替换为目标查找文本 let TargetText = "mouse"; // 替换为你的目标表名 YourTableName | extend AllColumns = pack_all() // 将每行所有字段打包为键值对集合 | mv-apply ColumnName, Value = bag_unpack(AllColumns) on ( project ColumnName, Value = tostring(Value) // 统一转换为字符串,避免类型不兼容 | where Value == TargetText // 精确匹配目标文本;如需包含匹配,替换为 Value contains TargetText ) | summarize Occurrences = count() by ColumnName | sort by Occurrences desc // 按出现次数降序排列
示例验证
针对你提供的SampleTable,执行以下查询:
let TargetText = "mouse"; SampleTable | extend AllColumns = pack_all() | mv-apply ColumnName, Value = bag_unpack(AllColumns) on ( project ColumnName, Value = tostring(Value) | where Value == TargetText ) | summarize Occurrences = count() by ColumnName | sort by Occurrences desc
将得到预期结果:
ColumnName | Occurrences -----------|------------ col_3 | 2 col_1 | 1
Windows SecurityEvents日志场景适配
针对Azure Sentinel中SecurityEvents日志查找计算机名存储字段的需求,调整表名和目标值即可,同时可根据实际需求选择匹配规则:
// 替换为目标计算机名 let TargetComputer = "YOUR_TARGET_COMPUTER_NAME"; SecurityEvents | where TimeGenerated between (ago(7d) and now()) // 添加时间过滤优化性能 | extend AllFields = pack_all() | mv-apply FieldName, FieldValue = bag_unpack(AllFields) on ( project FieldName, FieldValue = tostring(FieldValue) | where FieldValue contains TargetComputer // 包含匹配,适配字段中嵌入计算机名的场景 // 如需精确匹配,替换为:| where FieldValue == TargetComputer ) | summarize OccurrenceCount = count() by FieldName | sort by OccurrenceCount desc
注意事项
- 区分大小写匹配:将
contains替换为contains_cs,精确匹配时用==(区分大小写)或==~(不区分大小写) - 大型数据集优化:务必添加时间范围过滤(如
TimeGenerated),避免查询性能瓶颈 - 类型兼容处理:
tostring()确保所有字段值转为字符串,避免数值、布尔等非字符串类型导致的匹配失败
内容的提问来源于stack exchange,提问作者JLospinoso
相关产品推荐
相关产品推荐

