如何用KQL查询指定用户整月登录/登出活动数据?
解决KQL获取指定用户整月每日登录登出记录的问题
原查询的核心问题
- 时间范围限制:
endofday(ago(15h))会把数据截断到昨日结束,导致无法获取整月其他日期的数据。 - 分组逻辑错误:原
summarize按LogonTypeName, Account, Activity分组,会把多天的同类型事件合并成一条,丢失每日维度的信息。 - 冗余处理:重复
extend timestamp没有实际作用,且保留了不需要的EventID 4625(登录失败)。
调整后的查询方案
方案1:获取每日所有登录登出明细记录
适合需要查看每一次登录/登出具体时间的审计场景:
SecurityEvent | where TimeGenerated between (startofmonth(now()) .. endofmonth(now())) // 获取当月完整数据 | where EventID in (4624, 4634) // 仅保留登录成功(4624)、登出(4634)事件 | where TargetUserName contains "Johnsmith" | extend 操作类型 = case( EventID == 4624, "登录成功", EventID == 4634, "登出", "未知操作" ) | extend 日期 = startofday(TimeGenerated) // 提取事件所属日期 | project 日期, 操作类型, 事件时间=TimeGenerated, LogonTypeName, TargetUserName, Activity | sort by 日期 desc, 事件时间 desc
方案2:获取每日首次登录、最后登出的汇总记录
适合需要快速查看每日登录登出时间范围的审计场景:
SecurityEvent | where TimeGenerated between (startofmonth(now()) .. endofmonth(now())) | where EventID in (4624, 4634) | where TargetUserName contains "Johnsmith" | extend 操作类型 = case( EventID == 4624, "登录成功", EventID == 4634, "登出", "未知操作" ) | summarize 事件时间=case( 操作类型 == "登录成功", min(TimeGenerated), 操作类型 == "登出", max(TimeGenerated) ) by 日期=startofday(TimeGenerated), 操作类型, TargetUserName | sort by 日期 desc
关键调整说明
- 时间范围优化:用
startofmonth(now()) .. endofmonth(now())精准获取当月所有数据,若需要过去30天可替换为startofday(ago(30d)) .. now()。 - 事件类型映射:通过
case函数把EventID转换成易读的操作类型,避免直接查看数字ID的混淆。 - 按日期分组:新增
日期=startofday(TimeGenerated)作为分组键,确保每日数据独立统计,不会跨天合并。 - 冗余清理:移除不必要的
EventID 4625,聚焦登录登出核心事件。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

