Investigating AlertEvidence in Microsoft Defender XDR
AlertEvidence records the entities connected to Microsoft Defender XDR alerts, including users, devices, files, URLs, IP addresses, mailboxes and other evidence objects.
This table helps defenders move from an alert title into the actual evidence behind the detection, showing which accounts, endpoints, files and network indicators were involved.
In this lesson, you will learn how to use AlertEvidence to investigate supporting alert entities, pivot from alerts to evidence, and connect detections back to real Microsoft Defender XDR telemetry.
Lesson overview
Learn how AlertEvidence helps defenders identify the users, devices, files, URLs and other entities connected to Defender XDR alerts.
Why AlertEvidence matters
Investigation scenario
Step 1 — Review recent alert evidence
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
AlertEvidence | where Timestamp > ago(7d) | project Timestamp, AlertId, EntityType, EvidenceRole, AccountName, DeviceName, RemoteUrl, RemoteIP, FileName, SHA256 | order by Timestamp desc
Step 2 — Focus on one AlertId
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
let TargetAlertId = "replace-with-alert-id"; AlertEvidence | where Timestamp > ago(30d) | where AlertId == TargetAlertId | project Timestamp, EntityType, EvidenceRole, AccountName, DeviceName, RemoteUrl, RemoteIP, FileName | order by Timestamp asc
Step 3 — Summarise evidence entity types
- 1
- 2
- 3
- 4
- 5
- 6
- 7
AlertEvidence | where Timestamp > ago(30d) | summarize EvidenceCount = count() by EntityType, EvidenceRole | order by EvidenceCount desc
Step 4 — Find users repeatedly appearing in alerts
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
AlertEvidence | where Timestamp > ago(30d) | where isnotempty(AccountName) | summarize AlertCount = dcount(AlertId), EvidenceCount = count() by AccountName | order by AlertCount desc
Step 5 — Review files, URLs and IP addresses
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
AlertEvidence | where Timestamp > ago(30d) | where isnotempty(RemoteUrl) or isnotempty(RemoteIP) or isnotempty(SHA256) | project Timestamp, AlertId, EntityType, RemoteUrl, RemoteIP, FileName, SHA256 | order by Timestamp desc
Step 6 — Join AlertInfo to AlertEvidence
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
AlertInfo | where Timestamp > ago(7d) | project AlertId, AlertTime = Timestamp, Title, Severity, Category | join kind=leftouter ( AlertEvidence | where Timestamp > ago(7d) | project AlertId, EntityType, EvidenceRole, AccountName, DeviceName, RemoteUrl ) on AlertId | order by AlertTime desc
