Azure Sentinel工作簿KQL查询异常:登录日志时间区分不符
问题排查与修正方案
问题1:工作时间查询未显示周五数据
核心原因
- 原查询中
make-series的时间轴基于UTC时区的ago(30d)到now(),但数据时间是转换后的美国东部时间,时区不匹配导致周五数据可能被排除在时间轴之外。 dayofweek(Time) between (1d .. 5d)的timespan范围判断虽可行,但不如整数判断直观,且可能隐含类型转换问题。
修正后查询
SecurityEvent | extend LocalTime = datetime_utc_to_local(TimeGenerated, 'America/New_York') | where EventID == 4624 | where TargetUserName in ('XXX', 'XXX', 'XXX', 'XXX', 'XXX', 'XXX', 'XXX', 'XXX') // 用整数判断周一至周五(周日=0,周一=1...周五=5) | where toint(dayofweek(LocalTime)) between (1 .. 5) // 筛选美国东部时间5:00-19:00的记录 | where hourofday(LocalTime) between (5 .. 19) // 按本地自然日截断时间,确保聚合维度统一 | extend Day = startofday(LocalTime) | summarize EventCount = count() by Day, TargetUserName // 基于美国东部时间生成连续30天的时间轴,补充无数据日期的0值 | make-series EventCount = sum(EventCount) default = 0 on Day from startofday(datetime_utc_to_local(ago(30d), 'America/New_York')) to startofday(datetime_utc_to_local(now(), 'America/New_York')) step 1d by TargetUserName | render barchart
问题2:非工作时间查询返回工作时间记录、日期识别错误
核心原因
- 日期识别错误:
dayofweek(Time)/1d会返回浮点数,toint()转换时可能因精度丢失导致索引偏移(比如5d/1d被计算为4.999999999,转int后变成4,对应数组中的Thursday而非Friday)。 - 逻辑与效率问题:原查询先转换时区再过滤核心条件,增加了不必要的计算量;且条件判断的精度问题导致误判工作时间记录。
修正后查询
let WeekDays = dynamic(["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]); SecurityEvent // 先过滤核心条件,减少后续计算量 | where EventID == 4624 | where TargetUserName in ('XXX', 'XXX', 'XXX', 'XXX', 'XXX', 'XXX', 'XXX', 'XXX') | extend LocalTime = datetime_utc_to_local(TimeGenerated, 'America/New_York') // 直接用dayofweek的整数结果作为数组索引,避免精度问题 | extend WeekDay = WeekDays[toint(dayofweek(LocalTime))] // 非工作时间逻辑:非工作日 或 工作日但不在5-19点范围内 | where (toint(dayofweek(LocalTime)) !between (1 .. 5)) or (hourofday(LocalTime) !between (5 .. 19)) // 按需返回字段,如需去重则保留summarize,否则直接project | project TargetUserName, WeekDay, LocalTime, Computer // summarize by TargetUserName, WeekDay, LocalTime, Computer
内容的提问来源于stack exchange,提问作者Tyler Gray
相关产品推荐
相关产品推荐

