Detecting Threats with Microsoft Defender XDR for SC-200: Advanced Hunting Tables, KQL, Threat Analytics, Hunting Graphs and Sentinel Graph
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.
On this page10 sections
- What is advanced hunting in Microsoft Defender XDR?
- Which Defender for Endpoint table should a query use?
- Which email, identity, alert and cloud-app tables answer which questions?
- Which KQL operators matter most for hunting?
- How do you identify one exact process instance?
- How do joins work, and how do you keep them cheap?
- How do you enrich, share and act on hunting results?
- How do you interpret threat analytics in Defender XDR?
- How do hunting graphs and blast radius work?
- How do you analyze entity relationships with Sentinel graph?
- 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.
| Limit | What happens | What to do |
|---|---|---|
| 30 days of native Defender XDR data | Older events are not returned | Onboard 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 set | Extra rows are dropped | Filter or summarize earlier |
| 64 MB result size | The portal returns as many records as fit and marks the results partial, even well under the row limit | Project only the columns you need; drop wide dynamic columns such as AdditionalFields |
| 10-minute timeout | That one query fails | Narrow the time range, filter early |
| Tenant CPU allocation, refreshed every 15 minutes | Once the tenant uses all of it, every new query is blocked until the next cycle | Find 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.
| Table | One row per… | Useful columns |
|---|---|---|
| DeviceProcessEvents | Process created, with its arguments and parent | FileName, ProcessCommandLine, InitiatingProcess* |
| DeviceFileEvents | File created, modified, renamed or deleted | FileName, FolderPath, SHA1, SHA256 |
| DeviceRegistryEvents | Registry key or value created, modified or deleted (ActionType such as RegistryValueSet) | RegistryKey, RegistryValueName, RegistryValueData |
| DeviceImageLoadEvents | DLL loaded by a process | FileName, FolderPath, InitiatingProcess* |
| DeviceNetworkEvents | Network connection and related event | RemoteIP, RemotePort, RemoteUrl, InitiatingProcess* |
| DeviceLogonEvents | Sign-in on the device, local or domain account | AccountName, LogonType, ActionType |
| DeviceEvents | Miscellaneous security-control events (exploit protection, antivirus, and others) | ActionType, AdditionalFields |
| DeviceInfo / DeviceNetworkInfo | Periodic snapshot of the device / its network adapter configuration | OSPlatform, 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.
| Table | Holds | Joins on |
|---|---|---|
| EmailEvents | Each message's delivery: sender, recipient, direction, verdicts, latest delivery location | NetworkMessageId |
| EmailAttachmentInfo | Attachments of each message, with SHA256 | NetworkMessageId, SHA256 |
| EmailUrlInfo | URLs contained in each message | NetworkMessageId |
| UrlClickEvents | Each Safe Links click: user, URL, whether it was allowed or blocked | NetworkMessageId |
| EmailPostDeliveryEvents | Each action after delivery, such as a zero-hour auto purge (ZAP) or manual remediation, with action, trigger, result and time | NetworkMessageId |
| IdentityLogonEvents | Authentication against Active Directory (Kerberos, NTLM) seen by Defender for Identity on domain controllers, including failures | AccountSid, AccountUpn |
| IdentityQueryEvents | Reads of AD objects: LDAP, SAMR and DNS queries | Account, device |
| IdentityDirectoryEvents | Changes on domain controllers, such as group membership updates, with who made them | Account |
| IdentityInfo | Account attributes: Department, JobTitle, AccountObjectId, OnPremSid | Account identifiers |
| AlertInfo / AlertEvidence | Alerts from all Defender products with Severity / the entities tied to each alert (files with hashes, devices, accounts) | AlertId |
| CloudAppEvents | Activity in Microsoft 365 and other connected cloud apps: inbox rules, sharing, admin actions | AccountObjectId |
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
| Operator | Matches | Case | Relative cost (guidance) |
|---|---|---|---|
== / in | Exact value / any value in a list | Sensitive | Low |
=~ / in~ | Exact value / any value in a list | Insensitive | Low |
has | A whole term, using the term index | Insensitive | Low |
contains | Any substring, inside any word | Insensitive | High (can't use the term index) |
has_cs, contains_cs | As above | Sensitive | Faster than the insensitive form |
startswith | A prefix | Insensitive | Medium |
matches regex | A regular expression | As written | Highest |
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
| Aggregation | Returns |
|---|---|
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 > 20How 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 asInitiatingProcessId, 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.
| Flavor | Returns |
|---|---|
| innerunique (default) | One arbitrary left row per key, matched to every right row with that key |
| inner | Every combination of matching left and right rows |
| leftouter | Every left row, with right columns empty where nothing matches |
| leftsemi | Left rows that have a match, left columns only |
| leftanti | Left rows that have no match |
| rightanti | Right 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 SHA256Microsoft'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 = broadcastwhen 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 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
| Section | Ranks threats by |
|---|---|
| Latest threats | Recently published or updated reports |
| High-impact threats | The most active and resolved alerts in your organization |
| Highest exposure threats | Exposure 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:
| Scenario | Shows |
|---|---|
| Entity relationship map | Direct connections of any single entity you choose, in both directions |
| Paths between two entities | Routes from a source entity to a target you name |
| Attack paths to critical asset | Paths that lead to a critical asset you supply |
| Potential data exfiltration by device | From a source device, the storage accounts it can access |
| Users with access to sensitive data | From a storage account, the users who can reach it |
| Choke points to SQL data stores | The 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 access | Privileged identities that have access to storage |
| Least privilege access | Synced users who hold privileged cloud permissions |
| Paths to sensitive identities | Active 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.EntityIdsFiltering 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 built | Lifetime | Fits |
|---|---|---|
| Interactive notebook session | Temporary; gone when the session ends | Exploring and prototyping |
| On-demand graph job | Built once, kept for 30 days | A fixed investigation over data that won't change, without paying for rebuilds |
| Scheduled graph job | Rebuilt on a refresh schedule | A 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.
- 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.
- Microsoft SC-200 study guide — Microsoft Learn
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.