Home / Blog / Cheat Sheets

Intermediate Cheat Sheets

Defender XDR Advanced Hunting Tables Cheat Sheet for MSP SOCs

The Defender XDR tables your analysts query most, the columns worth remembering, starter KQL and the multi tenant rules that keep MSP hunts fast and clean.

When an alert lands at 3am, the slowest part of triage is often working out which Defender XDR table holds the answer. This cheat sheet maps the advanced hunting tables your analysts use most, the columns worth remembering and starter KQL for each, plus the extra rules you need when one SOC queries many client tenants.

CoversEndpoint, email, identity, cloud app and alert tables
Use it forTriage, scoping and cross tenant indicator sweeps
Data windowUp to 30 days of raw data in advanced hunting
>

Scenario: A night shift analyst picks up a High severity alert for a suspicious process launched from Word on WS-114, a laptop in your client Northfield Housing's tenant. Before escalating, they need to know which user was involved, what actually ran, whether the same email reached other staff and whether the sender's infrastructure has touched any other client. Every one of those answers sits in a different table.

Match the question to the table

Advanced hunting groups its tables by the product that feeds them. If your analysts learn which family answers which question, they stop scrolling the schema pane and start querying. Print this grid for the shift wall or pin it in your runbook.

EndpointDevice tables from Defender for Endpoint: processes, network, files, registry, logons.
EmailEmail tables and UrlClickEvents from Defender for Office 365: delivery, URLs, attachments, clicks.
IdentityIdentityLogonEvents, IdentityDirectoryEvents and IdentityQueryEvents from Defender for Identity.
Entra sign insEntraIdSignInEvents and EntraIdSpnSignInEvents for user and service principal sign ins.
Cloud appsCloudAppEvents from Defender for Cloud Apps: Microsoft 365 and connected app activity.
AlertsAlertInfo and AlertEvidence: every alert from every Defender product, plus its entities.

Learn the endpoint tables and their key columns

Most triage starts on a device. These are the endpoint tables your team will open every shift, with the columns that answer the first questions in a ticket.

TableAnswersKey columns
DeviceProcessEventsWhat ran and what launched itFileName, ProcessCommandLine, InitiatingProcessFileName, AccountName, SHA256
DeviceNetworkEventsWhere a device connectedRemoteIP, RemotePort, RemoteUrl, InitiatingProcessFileName, ActionType
DeviceFileEventsFiles created, changed or deletedFileName, FolderPath, SHA256, ActionType, InitiatingProcessFileName
DeviceRegistryEventsRegistry changes, often persistenceRegistryKey, RegistryValueName, RegistryValueData, ActionType
DeviceLogonEventsWho logged on to a device and howAccountName, LogonType, RemoteIP, ActionType
DeviceEventsMixed events: antivirus, exploit protection, scheduled tasksActionType, AdditionalFields
DeviceInfoContext about the device itselfDeviceName, OSPlatform, MachineGroup, PublicIP

For the WS-114 alert, the first query is a simple parent and child process view for Office applications on that device.

Defender XDR advanced huntingKQL
DeviceProcessEvents
| where Timestamp > ago(7d)
| where DeviceName startswith "ws-114"
| where InitiatingProcessFileName in~ ("winword.exe", "excel.exe", "outlook.exe")
| project Timestamp, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA256
| order by Timestamp desc
+

Tip: DeviceName usually holds the fully qualified name, such as ws-114.northfield.local. Filtering with startswith on the short host name saves analysts from empty results when they paste the name from a ticket.

Know the email, identity and cloud app tables

Once you know what ran, the next question is how it arrived and who else is affected. These tables link through shared keys: NetworkMessageId joins the email tables, and AccountUpn or AccountObjectId joins identity and cloud activity.

TableAnswersKey columns
EmailEventsDelivery of each messageNetworkMessageId, SenderFromAddress, RecipientEmailAddress, Subject, DeliveryAction, ThreatTypes
EmailUrlInfoURLs found in messagesNetworkMessageId, Url, UrlDomain
EmailAttachmentInfoAttachments on messagesNetworkMessageId, FileName, SHA256
EmailPostDeliveryEventsActions after delivery, such as ZAPNetworkMessageId, Action, ActionType, ActionResult
UrlClickEventsSafe Links clicks in email, Teams and Office appsUrl, AccountUpn, ActionType, IsClickedThrough, NetworkMessageId
IdentityLogonEventsAuthentication seen by Defender for Identity and Defender for Cloud AppsAccountUpn, Protocol, LogonType, ActionType, DeviceName
EntraIdSignInEventsEntra interactive and non interactive sign ins (needs Entra ID P2)AccountUpn, IPAddress, ErrorCode, Application
CloudAppEventsActivity in Microsoft 365 and connected appsApplication, ActionType, AccountObjectId, IPAddress

This query follows a suspicious domain from delivery to click, so you can see who received the lure and who went through to the site.

Defender XDR advanced huntingKQL
let suspectDomain = "invoice-portal.example";
EmailUrlInfo
| where Timestamp > ago(7d)
| where UrlDomain == suspectDomain
| join kind=inner (
    EmailEvents
    | where Timestamp > ago(7d)
    | project NetworkMessageId, RecipientEmailAddress, Subject, DeliveryAction
) on NetworkMessageId
| join kind=leftouter (
    UrlClickEvents
    | where Timestamp > ago(7d)
    | project NetworkMessageId, ClickedBy = AccountUpn, ClickAction = ActionType, IsClickedThrough
) on NetworkMessageId
| project RecipientEmailAddress, Subject, DeliveryAction, ClickedBy, ClickAction, IsClickedThrough
!

Watch out: AADSignInEventsBeta and AADSpnSignInEventsBeta have been replaced by EntraIdSignInEvents and EntraIdSpnSignInEvents. Microsoft migrates custom detections automatically, but saved queries in your runbooks, workbooks and API scripts that still name the beta tables need updating by hand. Audit them across every client.

Start triage from AlertInfo and AlertEvidence

AlertInfo holds one row per alert, from every Defender product, with title, severity and source. AlertEvidence holds one row per entity attached to an alert: devices, users, IP addresses, files and mailboxes. Join them on AlertId and you get a quick scoping view for the handover sheet.

Defender XDR advanced huntingKQL
AlertInfo
| where Timestamp > ago(24h)
| where Severity in ("High", "Medium")
| project AlertId, Title, Severity, ServiceSource
| join kind=inner (
    AlertEvidence
    | where Timestamp > ago(24h)
    | project AlertId, DeviceName, AccountUpn, RemoteIP
) on AlertId
| summarize Devices = make_set_if(DeviceName, isnotempty(DeviceName), 10),
            Users = make_set_if(AccountUpn, isnotempty(AccountUpn), 10),
            IPs = make_set_if(RemoteIP, isnotempty(RemoteIP), 10)
    by AlertId, Title, Severity, ServiceSource
| order by Severity asc
i

Note: AlertEvidence also has an EvidenceRole column. Entities marked Impacted are the ones the alert is about, while Related entities add context. Ask analysts to lead with Impacted entities in client updates so the client sees the affected user or device first.

Sweep every client tenant for one indicator

When one client's incident produces a solid indicator, the obvious next question is whether any other client has seen it. Microsoft Defender multitenant management lets your analysts run advanced hunting across many tenants at once: load a query, open the tenant scope selector, pick the tenants and run it. Each result row carries a TenantId column so you can tell clients apart.

Defender multitenant advanced huntingKQL
let badIp = "203.0.113.45";
let badHash = "4f2a9c1e7b3d5a6f4f2a9c1e7b3d5a6f4f2a9c1e7b3d5a6f4f2a9c1e7b3d5a6f";
union
    (DeviceNetworkEvents
    | where Timestamp > ago(7d)
    | where RemoteIP == badIp
    | project Timestamp, DeviceName, Source = "Network", Detail = strcat(InitiatingProcessFileName, " to ", RemoteIP, ":", RemotePort)),
    (DeviceFileEvents
    | where Timestamp > ago(7d)
    | where SHA256 == badHash
    | project Timestamp, DeviceName, Source = "File", Detail = FolderPath)
| order by Timestamp desc

Three limits are worth putting in your playbook before analysts rely on this view:

  • Result cap: multitenant queries return at most 50,000 records in total, and each tenant's share is 50,000 divided by the number of tenants queried. Broad queries across 40 clients quietly truncate, so filter on the indicator first.
  • Sentinel data: each tenant's primary Sentinel workspace onboarded to the Defender portal can be queried alongside XDR data. Querying a secondary workspace in another tenant still needs Azure Lighthouse and the workspace() operator.
  • Access: analysts only see tenants they have been granted roles in, so an empty result for one client might mean missing access rather than a clean estate.
  • Record which tenants were in scope and when the sweep ran.
  • Raise a ticket under each affected client, never one shared ticket.
  • Never paste one client's results or tenant name into another client's ticket or report.
  • Note any tenants you could not query and why, so the next shift can finish the sweep.
  • Tell the originating client only that their indicator was checked, not who else matched.

Avoid the mistakes that waste a shift

These are the errors that most often turn a five minute query into an hour of confusion. Build the fixes into your query templates and peer reviews.

Truncated cross tenant results

High
What it looks like

A sweep finds nothing for some clients because the per tenant share of 50,000 records filled up with noise.

Fix

Filter on the indicator early, project only the columns you need and split very large client lists into groups.

Looking past the data window

Medium
What it looks like

An analyst searches 90 days back in advanced hunting and assumes an empty result means no activity.

Fix

Advanced hunting keeps up to 30 days of raw data. Use the client's Sentinel workspace or longer retention for older events, and say which source you used in the ticket.

Wrong time column

Medium
What it looks like

Queries copied between the Defender portal and a Sentinel workspace fail or filter on the wrong field.

Fix

Use Timestamp for Defender XDR tables in advanced hunting and TimeGenerated for Sentinel tables. Label each template with where it runs.

Unparsed AdditionalFields

Medium
What it looks like

Analysts string search AdditionalFields in DeviceEvents and miss or mismatch values.

Fix

Parse it first with parse_json(AdditionalFields), then extract the named field, for example tostring(parse_json(AdditionalFields).TaskName).

Key takeaways

  1. Teach analysts the table families first: Device, Email, Identity, Entra sign ins, CloudAppEvents and Alert tables.
  2. Start triage with AlertInfo joined to AlertEvidence on AlertId, then pivot into the product tables.
  3. Use NetworkMessageId to join email tables and follow a lure from delivery to click.
  4. Replace any remaining AADSignInEventsBeta references with EntraIdSignInEvents in runbooks and scripts.
  5. Multitenant hunting is powerful but capped at 50,000 records shared across tenants, so filter tightly and record scope per client.

A cheat sheet only helps if it matches how your team works. Copy these queries into your own template library, add the client names and device naming patterns you see every day, and review it at each quarterly tuning session so new tables and renamed columns never catch the night shift out.

Written by Stacey, SOC Manager, MSP

Keep going

More in Cheat Sheets