KQL技术咨询:如何合并查询检测新建组后添加成员操作
解决方案:检测新建组后添加用户/所有者的KQL查询
要实现这个需求,核心是将「新建组」和「添加成员/所有者」的事件通过组ID关联,同时过滤出组创建后一段时间内的添加操作(避免匹配到旧组的操作)。以下是修正后的查询:
// 第一步:提取新建组的核心事件信息 let group_creation_events = AuditLogs | where OperationName has "Add Group" | extend GroupId = tostring(TargetResources[0].id) | extend GroupName = tostring(TargetResources[0].displayName) | extend GroupCreationTime = TimeGenerated | extend CreatorUPN = tostring(parse_json(tostring(InitiatedBy.user)).userPrincipalName) | extend CreatorIP = tostring(parse_json(tostring(InitiatedBy.user)).ipAddress) | project GroupId, GroupName, GroupCreationTime, CreatorUPN, CreatorIP; // 第二步:提取添加成员/所有者的核心事件信息 let group_member_add_events = AuditLogs | where OperationName in ('Add member to group', 'Add owner to group') | where Identity != "Microsoft Teams Services" | extend GroupId = tostring(TargetResources[0].id) | extend AddedUserUPN = tostring(TargetResources[2].displayName) | extend AddedUserId = tostring(TargetResources[2].id) | extend AddOperationTime = TimeGenerated | extend OperatorUPN = tostring(parse_json(tostring(InitiatedBy.user)).userPrincipalName) | extend OperatorIP = tostring(parse_json(tostring(InitiatedBy.user)).ipAddress) | extend OperationType = OperationName | project GroupId, AddedUserUPN, AddedUserId, AddOperationTime, OperatorUPN, OperatorIP, OperationType; // 第三步:关联两组数据,筛选组创建后指定时间内的添加操作 group_creation_events | join kind=inner (group_member_add_events) on GroupId | where AddOperationTime between (GroupCreationTime .. GroupCreationTime + 1h) // 可调整时间窗口,如30m、2h | project GroupName, GroupId, GroupCreationTime, CreatorUPN, CreatorIP, OperationType, AddedUserUPN, AddedUserId, AddOperationTime, OperatorUPN, OperatorIP | sort by GroupCreationTime desc
关键细节说明:
- 用组ID关联而非组名:组名可能存在重复,
GroupId(对象ID)是唯一标识,关联结果更准确。 - 时间窗口过滤:通过时间范围限制,确保只匹配组创建后短时间内的添加操作,避免误关联历史组的操作,时长可按需调整。
- 拆分数据集:用
let语句拆分两个事件集,逻辑更清晰,后续修改维护更方便。 - 精简字段:只保留分析所需的关键信息,避免冗余字段干扰结果查看。
内容的提问来源于stack exchange,提问作者DB67
相关产品推荐
相关产品推荐

