SaveMyCert
Log in
5 of 5 free questions left today·for 10 a day
Perform threat hunting

Detecting Threats with Microsoft Defender XDR for SC-200: Advanced Hunting Tables, KQL, Threat Analytics, Hunting Graphs and Sentinel Graph

20 min readSC-200 · Perform threat huntingUpdated

Detecting threats with Microsoft Defender XDR means hunting proactively in the Defender portal: choosing the right advanced hunting table, writing Kusto Query Language (KQL) that finds attacker behaviour efficiently, acting on the results, reading threat analytics reports against your own exposure, and following relationships between entities with hunting graphs, blast radius and Microsoft Sentinel graph. For SC-200 the skill is precise choice: the table that records the activity in question, the operator or join flavor that returns exactly the rows a requirement asks for, the columns an action needs, and the graph tool that fits the starting point and the lifetime the analysts need.

What you’ll learn
  • Choose the advanced hunting table that records a given endpoint, email, identity, alert or cloud-app activity
  • Write KQL filters, aggregations and joins that return exactly the rows a hunt requires, at low cost
  • Identify a single process instance and its parent despite process ID reuse
  • Work within advanced hunting limits, enrich results with FileProfile, share queries and take actions on results
  • Interpret threat analytics dashboards and reports, including exposure, recommended actions and permissions
  • Use hunting graph scenarios and blast radius to see paths between entities and to critical assets
  • Analyze entity relationships with the exposure graph tables in KQL and with Sentinel custom graphs in GQL

What is advanced hunting in Microsoft Defender XDR?

Advanced hunting is the query-based threat-hunting tool in the Microsoft Defender portal: you write Kusto Query Language (KQL) against a shared schema of Defender XDR tables to find threats that no alert has flagged yet. The same page runs queries over endpoint, email, identity, cloud-app and alert data, and, when a Microsoft Sentinel workspace is onboarded to the Defender portal, over that workspace's tables as well.

Two ways to build a query. Guided mode is a query builder for people new to KQL or who prefer menus: you choose a data domain, add conditions from drop-down lists and run it. Advanced mode is the KQL editor for writing queries from scratch. Both read the same data.

Limits that shape every query.

LimitWhat happensWhat to do
30 days of native Defender XDR dataOlder events are not returnedOnboard a Sentinel workspace and set the analytics-tier retention of the supported Defender XDR tables there; advanced hunting then follows that retention
100,000 rows per result setExtra rows are droppedFilter or summarize earlier
64 MB result sizeThe portal returns as many records as fit and marks the results partial, even well under the row limitProject only the columns you need; drop wide dynamic columns such as AdditionalFields
10-minute timeoutThat one query failsNarrow the time range, filter early
Tenant CPU allocation, refreshed every 15 minutesOnce the tenant uses all of it, every new query is blocked until the next cycleFind the heavy queries in the Query resources report and optimize them

Custom detection rules run under their own quotas, so manual hunting that exhausts the CPU cycle doesn't pause them. Data that lives only in the Sentinel data lake tier is not queryable from advanced hunting; moving a table to the data lake does not extend the hunting window.

Everything is UTC. All advanced hunting data is stored in UTC and queries must be written in UTC. The portal converts results to the time zone in your settings, so a local time copied from the screen into a datetime() literal points at the wrong hour unless you convert it first.

Which Defender for Endpoint table should a query use?

Pick the endpoint table by the activity you are looking for: process launches in DeviceProcessEvents, file activity in DeviceFileEvents, registry changes in DeviceRegistryEvents, DLL loads in DeviceImageLoadEvents, connections in DeviceNetworkEvents, sign-ins in DeviceLogonEvents, and miscellaneous security-control events in DeviceEvents. Each table is written by the Defender for Endpoint sensor on the device, so it records the activity however it was triggered.

TableOne row per…Useful columns
DeviceProcessEventsProcess created, with its arguments and parentFileName, ProcessCommandLine, InitiatingProcess*
DeviceFileEventsFile created, modified, renamed or deletedFileName, FolderPath, SHA1, SHA256
DeviceRegistryEventsRegistry key or value created, modified or deleted (ActionType such as RegistryValueSet)RegistryKey, RegistryValueName, RegistryValueData
DeviceImageLoadEventsDLL loaded by a processFileName, FolderPath, InitiatingProcess*
DeviceNetworkEventsNetwork connection and related eventRemoteIP, RemotePort, RemoteUrl, InitiatingProcess*
DeviceLogonEventsSign-in on the device, local or domain accountAccountName, LogonType, ActionType
DeviceEventsMiscellaneous security-control events (exploit protection, antivirus, and others)ActionType, AdditionalFields
DeviceInfo / DeviceNetworkInfoPeriodic snapshot of the device / its network adapter configurationOSPlatform, OSVersion / IPAddresses, MacAddress

Two distinctions come up often. First, the event beats the tool: a script that creates a scheduled task or changes a service through API calls never starts a separate command-line tool, so a hunt built on one tool's command lines misses it, while the table that records the resulting change (registry, file or process) sees it whatever made the change. Second, DeviceLogonEvents is collected on the device itself, so it sees local-account sign-ins; its LogonType tells session types apart, for example RemoteInteractive for Remote Desktop and Network for access such as a file share. In general, a network table records connections and a logon table records authentication; a connection to a remote-access port proves traffic reached the service, not that anyone signed in.

Which email, identity, alert and cloud-app tables answer which questions?

Outside the endpoint, pick the table by the object: email delivery and its parts in the Email* tables, Safe Links clicks in UrlClickEvents, on-premises Active Directory activity in the Identity* tables, detections in AlertInfo and AlertEvidence, and activity inside Microsoft 365 and other cloud apps in CloudAppEvents.

TableHoldsJoins on
EmailEventsEach message's delivery: sender, recipient, direction, verdicts, latest delivery locationNetworkMessageId
EmailAttachmentInfoAttachments of each message, with SHA256NetworkMessageId, SHA256
EmailUrlInfoURLs contained in each messageNetworkMessageId
UrlClickEventsEach Safe Links click: user, URL, whether it was allowed or blockedNetworkMessageId
EmailPostDeliveryEventsEach action after delivery, such as a zero-hour auto purge (ZAP) or manual remediation, with action, trigger, result and timeNetworkMessageId
IdentityLogonEventsAuthentication against Active Directory (Kerberos, NTLM) seen by Defender for Identity on domain controllers, including failuresAccountSid, AccountUpn
IdentityQueryEventsReads of AD objects: LDAP, SAMR and DNS queriesAccount, device
IdentityDirectoryEventsChanges on domain controllers, such as group membership updates, with who made themAccount
IdentityInfoAccount attributes: Department, JobTitle, AccountObjectId, OnPremSidAccount identifiers
AlertInfo / AlertEvidenceAlerts from all Defender products with Severity / the entities tied to each alert (files with hashes, devices, accounts)AlertId
CloudAppEventsActivity in Microsoft 365 and other connected cloud apps: inbox rules, sharing, admin actionsAccountObjectId

Near-twins to keep apart. IdentityQueryEvents is someone reading a group; IdentityDirectoryEvents is someone changing it. IdentityLogonEvents comes from domain controllers, so it covers every workstation that authenticates against AD but cannot see local-account sign-ins; DeviceLogonEvents is the reverse and needs the device onboarded to Defender for Endpoint. IdentityInfo describes accounts rather than events, so it is what you join to when a hunt filters on an attribute such as department. Microsoft Entra ID cloud sign-ins have their own tables: EntraIdSignInEvents holds interactive and non-interactive user sign-ins, and EntraIdSpnSignInEvents holds sign-ins by service principals and managed identities; neither records on-premises AD authentication or local device sign-ins. EmailEvents reflects where a message finally sits, but only EmailPostDeliveryEvents gives each removal as its own row.

Typical joins. Email to endpoint goes through the file hash: EmailAttachmentInfo and DeviceFileEvents both carry SHA256, which links every message to every device that saved the attachment. Alerts to their files go through AlertId. Mail-flow tables join to each other on NetworkMessageId.

Which KQL operators matter most for hunting?

The operators that decide most hunting queries are the string comparisons (which differ in case sensitivity and index use), the parent/child column choice, and summarize with the right aggregation.

String operators

OperatorMatchesCaseRelative cost (guidance)
== / inExact value / any value in a listSensitiveLow
=~ / in~Exact value / any value in a listInsensitiveLow
hasA whole term, using the term indexInsensitiveLow
containsAny substring, inside any wordInsensitiveHigh (can't use the term index)
has_cs, contains_csAs aboveSensitiveFaster than the insensitive form
startswithA prefixInsensitiveMedium
matches regexA regular expressionAs writtenHighest

Microsoft's guidance: prefer has over contains when you are looking for a full term; use case-insensitive matches (=~, in~) for file names and command lines because their capitalisation varies; and identify known tools by FileName rather than by searching the command line. Very short terms aren't indexed, so has gains little on them. A prefix or substring match is broader than it looks: startswith "cert" also returns certreq.exe and certmgr.exe alongside certutil.exe, so when the requirement names specific binaries, match those names exactly. The cost column is relative guidance drawn from how each operator uses the term index; Microsoft does not publish a ranking.

Parent and child columns

Each DeviceProcessEvents row describes a process being created. FileName and ProcessCommandLine belong to the new process; the InitiatingProcess* columns belong to the process that started it; InitiatingProcessParent* columns go one generation further up. So "Word started PowerShell" filters InitiatingProcessFileName for winword.exe and FileName for powershell.exe. The same InitiatingProcess* columns appear in the file, registry, network and image-load tables to name the process behind each event.

summarize

AggregationReturns
count()Number of rows (every event)
dcount(col)Number of distinct values, such as different devices or remote IPs
arg_max(Timestamp, *)The whole newest row per group (arg_min the oldest)
max(col)Only the highest value, not the rest of the row
make_set(col)The distinct values as an array
by bin(Timestamp, 1h)Groups into time buckets, for charts

Pick the measure from the wording: "how many different devices per hour" is dcount(DeviceId) by bin(Timestamp, 1h), because count() lets one noisy device dominate. For snapshot tables such as DeviceInfo, which get many records a day, summarize arg_max(Timestamp, *) by DeviceId gives the latest state of each device.

An example that combines these choices, listing hosts that connected to many different SMB targets:

DeviceNetworkEvents
| where Timestamp > ago(1d)
| where RemotePort == 445
| summarize Targets = dcount(RemoteIP)
    by DeviceId, InitiatingProcessId, InitiatingProcessCreationTime
| where Targets > 20

How do you identify one exact process instance?

A process ID alone does not identify a process, because operating systems reuse IDs; identify an instance by device + process ID + process creation time, or on Windows by the unique process ID columns when they are populated.

  • ProcessUniqueId / InitiatingProcessUniqueId. On Windows, Defender for Endpoint adds a unique ID for each process. To find the children of one exact parent, match the child's InitiatingProcessUniqueId to the parent's ProcessUniqueId. Matching InitiatingProcessId to ProcessId can link unrelated processes that happened to get the same ID.
  • When the unique ID is empty (for example on devices or platforms that don't populate it), group or join on DeviceId (or DeviceName), the process ID and its creation time, such as InitiatingProcessId, InitiatingProcessCreationTime. The creation time separates two runs that reused an ID; grouping on an empty unique ID collapses unrelated processes into one blank group.
  • Columns that don't work as an identity. FileName can't separate two runs of the same binary, and Timestamp is per event, so grouping on it splits one process into one row per event.

How do joins work, and how do you keep them cheap?

A KQL join without a kind uses innerunique, which keeps only one left-side row per key value before matching; to keep every matching left row, specify kind=inner. This is the most common surprise in hunting joins: if several left rows share a key, such as five sign-ins from the same IP address, innerunique keeps just one of them.

FlavorReturns
innerunique (default)One arbitrary left row per key, matched to every right row with that key
innerEvery combination of matching left and right rows
leftouterEvery left row, with right columns empty where nothing matches
leftsemiLeft rows that have a match, left columns only
leftantiLeft rows that have no match
rightantiRight rows that have no match

Baselines use leftanti. Put recent events on the left and a distinct list of values seen earlier on the right; leftanti keeps only what is new:

let Known = DeviceImageLoadEvents
    | where Timestamp between (ago(14d) .. ago(1d))
    | distinct SHA256;
DeviceImageLoadEvents
| where Timestamp > ago(1d)
| join kind=leftanti Known on SHA256

Microsoft's join guidance for advanced hunting:

  • Put the smaller table on the left, so fewer records are matched.
  • Apply time filters to both sides before the join, not after it, so fewer records are checked.
  • Project only the columns you need before joining.
  • Use hint.strategy = broadcast when the left table is small and the right is large.

The flavor decides which rows come back; the four practices above decide how fast. Pick the flavor from the requirement first, then optimize.

How do you enrich, share and act on hunting results?

Advanced hunting can enrich results with built-in functions, save queries for others, and act directly on result rows through Take actions, provided the results contain the identifier columns each action needs.

Enrichment functions

  • invoke FileProfile(x, y) adds file intelligence: GlobalPrevalence, GlobalFirstSeen, GlobalLastSeen, Signer, Issuer, SignatureState, IsExecutable, ThreatName and ProfileAvailability. x is the hash column (SHA1, SHA256, InitiatingProcessSHA1 or InitiatingProcessSHA256; MD5 is not accepted) and y the number of records to enrich, from 1 to 1,000 with a default of 100. Rows beyond the limit come back unenriched, with an empty ProfileAvailability. The Global* columns describe the file across Microsoft's worldwide telemetry, while any count you compute from your own tables describes only your tenant.
  • DeviceFromIP() returns the devices that were assigned an IP address at a given time, and AssignedIPAddresses() the addresses a device had, which helps when logs name only an IP.

Saving and sharing queries

OptionWho sees it
Save as → Shared queriesEveryone in the organization, in the Queries tab
Save as → My queriesOnly you
Share linkAnyone with advanced hunting access in the tenant whom you send the link to; it opens the query in the editor
Community queriesEveryone; queries contributed to Microsoft's public GitHub repository and reviewed before publication

A query can also be turned into a custom detection rule that runs on a schedule; building and tuning those rules belongs to the detections topic of the exam.

Take actions on results

The Take actions wizard only offers an action when the selected rows contain the columns it needs:

ActionRequired columns
Device actions (isolate, collect investigation package, antivirus scan, start investigation, restrict app execution)DeviceId
Quarantine fileA hash column (SHA1, InitiatingProcessSHA1, SHA256 or InitiatingProcessSHA256) and DeviceId
Disable user, Reset user authenticationA SID column such as AccountSid, InitiatingProcessAccountSid, RequestAccountSid or OnPremSid
Any action on a Microsoft Entra identityAccountObjectId
Email actions (move to a folder, delete)Include the message and recipient identifiers (NetworkMessageId, RecipientEmailAddress), as Microsoft's example query does; Delete email is documented as requiring EmailDirection and SenderFromAddress

A hybrid account synced from Active Directory to Entra ID is both kinds of identity, so results for it need both AccountSid and AccountObjectId. Soft delete from advanced hunting can also remove the sender's copy from Sent Items for internal and outbound messages; that works from EmailEvents and EmailPostDeliveryEvents results. Every action taken is recorded in the Action center history.

How do you interpret threat analytics in Defender XDR?

Threat analytics is Microsoft's library of threat reports in the Defender portal, each one tying a tracked threat (an actor, campaign, technique or vulnerability) to the alerts, incidents, exposed devices and recommended mitigations in your own tenant.

The dashboard

SectionRanks threats by
Latest threatsRecently published or updated reports
High-impact threatsThe most active and resolved alerts in your organization
Highest exposure threatsExposure level: how severe the threat's associated vulnerabilities are, combined with how many of your devices could be exploited

Threat tags (such as ransomware, phishing, vulnerability or activity group) filter the list by theme; they don't rank anything. A separate Category filter narrows by report type, such as Actor profiles or OSINT, with counters at the top of the page showing how many reports of each type exist. Besides Microsoft's own reports, the library surfaces OSINT articles: open-source intelligence that Microsoft links to its tracked threats, shown alongside the Microsoft-authored analysis. The list also shows Misconfigured devices (devices where the threat's linked recommended actions aren't turned on) and Vulnerable devices (devices running software with the threat's linked vulnerabilities). Not available means researchers haven't linked any recommendations or vulnerabilities to the threat, so there is nothing to count; 0 means the count was calculated and no device qualifies.

Inside a report

  • Overview: a summary with charts of impact and exposure.
  • Analyst report: Microsoft's full write-up, including every mitigation, whether or not Secure Score tracks it.
  • Related incidents: incidents in your tenant linked to the threat.
  • Impacted assets: devices, users, mailboxes, apps and cloud resources with active or resolved alerts linked to the threat.
  • Endpoints exposure: from Defender Vulnerability Management data and regardless of alerts, an exposure level calculated from the severity of the vulnerabilities and misconfigurations the threat exploits and the number of devices with those weaknesses, plus the deployment status of the relevant security updates.
  • Recommended actions: a checklist with status, limited to recommendations that Microsoft Secure Score tracks; other advice is only in the analyst report.
  • Indicators (preview): indicators of compromise for the threat, updated by Microsoft researchers in real time, with expired IOCs kept for reference. Only verified customers can see this tab, so a tenant must be verified before analysts get access.

Reading the evidence together. The impact tabs (Related incidents, Impacted assets) are driven by alerts; the exposure tabs are driven by vulnerability and configuration data. They answer different questions, "has this threat touched us?" versus "could it?", so a report can show one without the other, and each points to a different response: investigate what was hit, or remediate the weakness before it is used.

Permissions, links and notifications

  • With Defender XDR unified RBAC, Security data basics (read) lets a user view reports, related incidents and alerts, and impacted assets. Exposure data and recommended actions also need Vulnerability management (read) and Exposure Management (read). Each product's data appears only for users with that product's licence and role.
  • When you create a custom detection rule, you can link it to a threat analytics report. Its incidents then appear in the report's Related incidents tab and show the report, as Microsoft's own detections do.
  • Email notifications for threat analytics updates tell people who aren't in the portal daily when reports are published or updated. They are configured separately from alert notifications.

How do hunting graphs and blast radius work?

The hunting graph draws entities and their relationships as an interactive map from advanced hunting, using predefined scenarios that need no KQL; blast radius applies the same graph to an incident to show what a compromised entity could reach next. Both are powered by Microsoft Sentinel graph.

Prerequisites. Besides an advanced hunting role, the tenant must be onboarded to the Microsoft Sentinel data lake (which provisions Sentinel graph), and users need at least read-only access in Microsoft Security Exposure Management. For tenants already on the data lake, the hunting graph and blast radius are provisioned automatically; there is no job or rule to set up.

Predefined scenarios

Each scenario is a prebuilt query that asks for specific inputs, or none:

ScenarioShows
Entity relationship mapDirect connections of any single entity you choose, in both directions
Paths between two entitiesRoutes from a source entity to a target you name
Attack paths to critical assetPaths that lead to a critical asset you supply
Potential data exfiltration by deviceFrom a source device, the storage accounts it can access
Users with access to sensitive dataFrom a storage account, the users who can reach it
Choke points to SQL data storesThe nodes that appear on the most paths where identities hold permissions on SQL data stores, so hardening one cuts many routes
Critical identities with storage accessPrivileged identities that have access to storage
Least privilege accessSynced users who hold privileged cloud permissions
Paths to sensitive identitiesActive Directory permission paths leading to sensitive identities

Choose by the direction of the question: from a device outward (exfiltration by device) or from data inward (users with access), and whether you can name a target (paths between two entities, attack paths) or not. Filters then refine the graph, for example Show only the shortest paths, node filters on properties such as internet exposure, and an Edge direction filter (Incoming, Outgoing or Both); Incoming on an entity relationship map keeps only the relationships that point into the chosen entity.

Blast radius

In the Defender incident graph, blast radius shows both the current impact of a breach and the possible next paths from a compromised entity, such as a user or device, to critical assets, in the same view as the incident's evidence. The hunting graph's attack path scenario can show similar paths, but it runs separately in advanced hunting from a target you choose.

How do you analyze entity relationships with Sentinel graph?

Microsoft Sentinel graph models security data as nodes (entities) and edges (relationships); you analyze it with KQL in advanced hunting through the exposure graph tables, or with Graph Query Language (GQL) on custom graphs that you build from data lake data.

Exposure graph tables in advanced hunting

Exposure Management computes a graph of assets, identities and their standing relationships, including device criticality. Advanced hunting exposes it as two tables: ExposureGraphNodes (each entity, with NodeId, NodeLabel, the dynamic Categories array and NodeProperties) and ExposureGraphEdges (each relationship, with SourceNodeId, TargetNodeId and EdgeLabel). Use them when the question is about who can reach what; logon and inventory tables only record events and entities, not computed access paths.

KQL's graph operators query them: make-graph builds a graph whose edges run from SourceNodeId to TargetNodeId, and graph-match describes a pattern. In a pattern, -[e]-> is exactly one hop in the stored direction, -[e*1..3]-> a chain of one to three hops, <-[e]- the reverse direction, and -[e]- either direction.

let UsersAndVMs = ExposureGraphNodes
| where set_has_element(Categories, "identity")
    or set_has_element(Categories, "virtual_machine");
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId
    with UsersAndVMs on NodeId
| graph-match (User)-[e]->(VM)
    where set_has_element(User.Categories, "identity")
      and set_has_element(VM.Categories, "virtual_machine")
    project UserIds = User.EntityIds, Relation = e.EdgeLabel,
      VmIds = VM.EntityIds

Filtering dynamic arrays. Categories and NodeProperties are indexed. has uses that index but matches a term, so has "data" also matches a longer category containing the term. set_has_element() checks for the exact element but doesn't use the index (nor do isempty and isnotnull). Microsoft's guidance is to combine them: has for speed, then set_has_element for precision.

Custom graphs (preview)

Custom graphs model your own entities and relationships from data in the Sentinel data lake, including non-Microsoft logs. You author them in Jupyter notebooks provided by the Microsoft Sentinel extension for Visual Studio Code (PySpark with a graph library), then make them available to others:

How it is builtLifetimeFits
Interactive notebook sessionTemporary; gone when the session endsExploring and prototyping
On-demand graph jobBuilt once, kept for 30 daysA fixed investigation over data that won't change, without paying for rebuilds
Scheduled graph jobRebuilt on a refresh scheduleA graph that must always be available and pick up new data

Once a job materializes a graph, analysts open it on the Graphs page under Microsoft Sentinel in the Defender portal, view its schema, visualize results and query it with GQL. KQL, including make-graph and graph-match, runs in advanced hunting and on data lake tables, not on that page. Sentinel's own hunting queries, KQL jobs, summary rules and notebook hunting with the Sentinel MCP Server belong to the sibling topic on hunting in the Sentinel platform.

Tip. Questions on this topic are short SOC scenarios in Microsoft Defender XDR where the analyst must pick an advanced hunting table, a KQL filter, aggregation or join, a set of result columns, a threat analytics section or a graph tool that meets a stated requirement. Many show a short KQL query to complete or fix, and the options are usually valid KQL that differ in one detail: case sensitivity, term versus substring matching, join flavor, count versus distinct count, or which process columns describe the parent. Expect near-twin tables (IdentityQueryEvents versus IdentityDirectoryEvents, DeviceLogonEvents versus IdentityLogonEvents, EmailEvents versus EmailPostDeliveryEvents), documented limits (the 30-day window, result size, CPU cycles, FileProfile record counts, UTC), and Select TWO items about Take actions columns, threat analytics permissions and hunting graph prerequisites. Graph items hinge on the starting point and inputs of each predefined scenario and on how long each kind of custom graph lasts.

Key takeaways
  • Pick the table by the event: DeviceProcessEvents for launches, DeviceRegistryEvents for registry writes, DeviceLogonEvents for device sign-ins (including local accounts), IdentityLogonEvents for AD authentication on domain controllers.
  • IdentityQueryEvents is reading AD objects; IdentityDirectoryEvents is changing them; IdentityInfo holds account attributes such as Department.
  • Prefer has over contains for whole terms, and =~ / in~ for file names whose case varies; _cs operators are case-sensitive.
  • A join without kind is innerunique and drops duplicate left rows; use kind=inner to keep them, leftanti for 'never seen before' baselines, smaller table left and time filters on both sides.
  • FileName and ProcessCommandLine are the new process; InitiatingProcess* is its parent; identify an instance by ProcessUniqueId, or by device + process ID + creation time.
  • Advanced hunting covers 30 days of native data (longer via onboarded Sentinel analytics-tier retention, never the data lake tier), works in UTC, and caps results by rows, 64 MB and a tenant CPU cycle.
  • Take actions needs identifier columns: DeviceId for devices, a hash plus DeviceId for quarantine, a SID and/or AccountObjectId for users, the message and recipient identifiers for email actions, plus EmailDirection and SenderFromAddress for Delete email.
  • In threat analytics, Impacted assets is driven by alerts, Endpoints exposure by vulnerabilities and misconfigurations (with update deployment status), and Recommended actions lists only Secure Score-tracked items.
  • Hunting graph and blast radius need the Sentinel data lake and Exposure Management read access; custom graphs live for a session, 30 days (on-demand job) or on a refresh schedule, and are queried with GQL.

Frequently asked questions

What is the difference between has and contains in KQL?

has matches a whole term and uses the term index, so it is fast; contains matches any substring inside a word and cannot use the index, so it is slower. Both are case-insensitive. Use has when you are looking for a complete word such as a tool name, and contains only when you genuinely need partial matches.

Why does a KQL join return fewer rows than expected?

A join without a kind uses the innerunique flavor, which keeps only one left-side row for each key value before matching. If several left rows share a key, such as many emails with the same attachment hash, all but one are dropped. Specifying join kind=inner keeps every matching left row.

How far back can advanced hunting in Microsoft Defender XDR query?

Advanced hunting queries up to 30 days of native Defender XDR data. If a Microsoft Sentinel workspace is onboarded to the Defender portal and receives the supported Defender XDR tables, advanced hunting follows the analytics-tier retention set for those tables in the workspace. Data held only in the Sentinel data lake tier is not queryable from advanced hunting.

Which columns does Take actions need in advanced hunting?

Device actions need DeviceId. Quarantine file needs a hash column (SHA1, SHA256 or their InitiatingProcess versions) plus DeviceId. Disable user and Reset user authentication need a SID column such as AccountSid, and actions on Microsoft Entra identities need AccountObjectId. For email actions, include the message and recipient identifiers (NetworkMessageId, RecipientEmailAddress) as Microsoft's example does; Delete email is documented as requiring EmailDirection and SenderFromAddress.

What does Highest exposure threats mean in threat analytics?

Highest exposure threats ranks threats by exposure level, which combines how severe the vulnerabilities associated with each threat are with how many of your devices could be exploited through them. It is different from High-impact threats, which ranks threats by the number of active and resolved alerts in your organization.

Why does the Recommended actions tab in a threat analytics report list fewer mitigations than the analyst report?

The Recommended actions checklist shows only recommendations that Microsoft Secure Score tracks, with their implementation status. Mitigations that Secure Score doesn't track, such as some mail-flow or process advice, are described only in the Analyst report tab, so analysts should read both.

What do I need to use the hunting graph and blast radius in Microsoft Defender?

The tenant must be onboarded to the Microsoft Sentinel data lake, which provisions Sentinel graph, and users need at least read-only access in Microsoft Security Exposure Management alongside their advanced hunting permissions. For tenants that already have the data lake, the hunting graph and blast radius are provisioned automatically.

How are Microsoft Sentinel custom graphs built and queried?

Custom graphs (in preview) are authored in Jupyter notebooks in the Microsoft Sentinel extension for Visual Studio Code from data lake data. A graph built in an interactive session is temporary; an on-demand graph job keeps it for 30 days, and a scheduled graph job rebuilds it on a refresh schedule. Materialized graphs are queried with Graph Query Language (GQL) on the Graphs page in the Defender portal.

Source

This lesson covers the "Perform threat hunting" domain of the official SC-200 exam guide. Vendors revise their guides — check the source for the current version.

Test yourself on this topic
Practice now

Sign up free to mark lessons complete, bookmark topics and track your exam readiness.

Spotted a mistake in this lesson?