首页 > 解决方案 > 使用 KQL 'let' 在同一个表中组合两个查询

问题描述

我正在尝试学习 KQL,并有一个查询,我想从 Windows 事件代码 4624(登录)和 4634(注销)中获取 2 个值,并将它们返回给我仍在尝试构建的不同场景。

但主要是我希望能够返回表中的值(打印或项目?)

let login = SecurityEvent 
| where TimeGenerated > ago(1h)
| where EventID == '4624'
| project loginTime = TimeGenerated;
let logout = SecurityEvent 
| where TimeGenerated > ago(1h)
| where EventID == '4634'
| project logoutTime = TimeGenerated;
print login

我得到的错误是“'project' operator: Failed to resolve scalar expression named 'login'”

我希望看到的是:

loginTime           | logoutTime
----------------------------------------------
01/02/2021 18:46:30 | 01/02/2021 18:45:45
01/02/2021 18:47:30 | 01/02/2021 18:47:45
01/02/2021 18:48:30 | 01/02/2021 18:48:45

加入会更好吗?它在同一张表中(SecurityEvent),所以我认为可以这样做吗?

数据集来自 MS 提供的 Azure 门户:https ://portal.azure.com/#blade/Microsoft_Azure_Monitoring_Logs/DemoLogsBlade

谢谢您的帮助!

标签: letkql

解决方案


问题是“登录”是一种表类型,但print需要一个标量类型。

let login = SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID == '4624'
| project loginTime = TimeGenerated;
let logout = SecurityEvent 
| where TimeGenerated > ago(1h)
| where EventID == '4634'
| project logoutTime = TimeGenerated;
print toscalar (login)

至于你想要得到的结果,我认为这可能是你需要的:

更新以提高清晰度/性能

let login = SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID == '4624'
| project TargetLogonId, loginTime = TimeGenerated;
let logout = SecurityEvent 
| where TimeGenerated > ago(1h)
| where EventID == '4634'
| project TargetLogonId, logoutTime = TimeGenerated;
login
| join kind=leftouter logout on TargetLogonId
| project loginTime, logoutTime

推荐阅读