EntraMap Documentation

THE OPERATOR'S HANDBOOK / 0.6.0

Understand every click.

From your first relationship map to a documented change review. Every control, its effect, and the evidence you need to interpret the result.

24 chapters116 controls13 screenshots
EntraMap reads Microsoft Graph. It does not change assignments, migrate content or delete groups. Results describe collected evidence within the visible scan coverage.
01

Start in 5 minutes

#

EntraMap has two workspaces. Relationship map explores one object and its relationships. Change Planner compares saved group evidence across a replacement or a later verification scan. This guide covers the 0.6.0 interface, including controls that appear only after an object is selected.

Try the app before connecting a tenant: the interactive tutorial and three planner labs use synthetic data. The tutorial graph is intentionally small and some actions simulate a result. Demo labels, counts and coverage are examples, not a promise about your tenant.

  1. Open Relationship map. Choose Start tutorial without sign-in, select User, type engin and open the tutorial result. Click a linked group, inspect its details and fit the graph.
  2. For live data, use Sign in with Microsoft on entramap.com. Select your organization account and complete the organization’s normal consent requirements. Check the displayed identity before searching.
  3. Select User, Group, Device, App or CA Policy, enter at least two characters and choose a result. Click a node for details; double-click a supported object to make it the new root.
  4. For a group, inspect Impact, including access limitations, before interpreting an empty result. Load impact graph for a visual projection, or Compare maps for the difference from the standard map.
  5. Open Change Planner. Try Application replacement, expand its changed finding, then select Demo: lost visibility. Unknown demonstrates why an unreadable domain cannot count as resolved.
Synthetic user relationship graph with insights, toolbar and Linked Objects
The relationship workspace with a five-node tutorial graph. Open image for full size ↗
Back to top ↑
03

Sign-in, consent & sessions

#

Microsoft sign-in runs in a popup. The app requests delegated Microsoft Graph scopes and operates as the signed-in account. Both granted permissions and the account’s roles, licenses and workload availability can limit visibility.

Start from the canonical public domain. A callback URL is single-use: do not bookmark or replay it. The hosting alias redirects entry pages to the configured callback domain so the session cookie survives the round trip.

On the relationship map, four idle minutes open a 60-second warning, with automatic sign-out at five idle minutes. Mouse, keyboard, scroll or touch activity resets it. This client-side warning is separate from the server session lifetime (60 minutes by default). Planner does not have the map’s idle-warning overlay.

EntraMap sign-in overlay with Microsoft sign-in and tutorial entry
Sign-in and the five introductory tabs. Guest view. Open image for full size ↗

Sign in (header icon) #

Opens the sign-in overlay when signed out. Live search remains unavailable until authentication succeeds.

Sign in with Microsoft #

Starts the Microsoft account chooser in a popup. Allow the EntraMap popup if your browser blocks it. Complete authentication yourself and wait for the original app window to update.

Sign In #

Shows Microsoft sign-in and the public tutorial entry.

Features #

Shows the overview of mapping, impact, exports, permissions and session features.

How To Use #

Shows the short six-step introduction; this handbook contains the detailed reference.

API Permissions #

Shows all 18 requested Graph scopes. Expand a permission for its purpose; viewing a row does not grant it.

Changelog #

Shows the release history rendered from the repository’s LOG.md.

Sign out #

Ends the EntraMap session and returns to the sign-in page. Your Microsoft browser sign-in may remain active, and saved files are not deleted. To use another account, sign out and select it in a new sign-in.

Disconnect tenant #

Opens a confirmation dialog. Confirming clears EntraMap local/session storage and server session/token context, then signs out. This does not revoke the app’s tenant consent or delete directory objects.

Cancel (disconnect dialog) #

Closes the confirmation without disconnecting. Clicking the backdrop also dismisses it.

Disconnect (confirmation) #

Performs the disconnect. Locally saved tutorial progress, impact filter preferences and checklists on this origin are cleared. Future sign-in requests consent again.

Back to top ↑
05

Graph, toolbar & operational insights

#

Nodes represent objects; labelled edges describe observed relationships. The legend identifies types. Included scope and Excluded scope distinguish Conditional Access group targeting. These are references, not a simulation of an actual sign-in.

Operational insights summarize the loaded graph: nodes, devices, explicitly unmanaged devices, explicitly non-compliant devices, CA policies and apps, plus operating-system counts. Missing device flags are not counted as explicit false values. Counts do not describe your entire tenant.

The impact map projects findings from the group impact analysis. It can show dependency resources absent from direct relationship traversal. Explain mode identifies these projected nodes; a dependency is not automatically a navigable directory object.

Synthetic user relationship graph with insights, toolbar and Linked Objects
The relationship workspace with a five-node tutorial graph. Open image for full size ↗
Group impact graph with severity, domain, Explain and preset chips
Impact filters change the view, not the underlying evidence. Open image for full size ↗

Click a node #

Selects the object, highlights its neighborhood, opens details and updates Linked Objects. Clicking an empty graph area clears selection focus.

Double-click a node #

Re-roots the map for a supported User, Group, Device, Intune App, Enterprise App or CA Policy. Synthetic all-users/all-devices targets and impact-only resources do not have ordinary object drilldowns.

Pan / zoom / drag #

Drag empty canvas to pan, use the mouse wheel or trackpad to zoom, and drag a node to reposition it. This changes only the view. Fit and Recalculate layout recover a readable arrangement.

Fit graph #

The four-arrows toolbar icon fits the graph into the available viewport. It does not request fresh Graph data.

Recalculate layout #

The circular-arrow layout icon recomputes node positions. It does not refresh directory data.

Reload from Microsoft Graph #

The refresh-arrows icon reloads the current object/context with fresh Graph reads. Available after a map is loaded. A read can still reflect Microsoft propagation delays.

Deep refresh: 3x reload with short pauses #

The stacked-layers icon reloads the context three times with 1.8-second pauses between rounds. Refresh controls are disabled while it runs. It is still read-only and does not guarantee immediate propagation.

Export current graph as JSON #

The file-export icon downloads the entire last loaded graph, node/edge counts and export timestamp. It is not restricted by impact display filters.

Export current filtered graph view #

The filter icon exports Cytoscape-visible nodes/edges plus root, map mode and impact-filter context. Faded risk-focus nodes remain visible and can still be exported; this is not a redaction tool.

Unmanaged devices #

Focuses devices whose collected isManaged flag is false, plus connected context, and fades other objects. If none match, a message is shown.

Non-compliant devices #

Focuses devices whose collected isCompliant flag is false and fades other objects. Validate the device’s current posture in its management system.

Reset focus #

Removes risk-focus fading and fits the graph again. It does not clear impact severity/domain filters.

Back to top ↑
06

Object details & Linked Objects

#

The details pane displays properties returned for the selected object. Missing data may be omitted or shown with a placeholder; a blank property is not proof of absence. User/group photos can fall back to icons.

User: UPN, email, job title, department, company, office, city/country, mobile, account state, creation/password-change dates, last sign-in when returned, object ID. Group: description, type flags, dynamic membership rule/state and object ID.

Device: operating system/version, display name, trust type, managed/compliant flags, device ID and directory object ID. App/Enterprise App: publisher, type, description, application ID where returned and object ID. CA Policy: enabled/disabled/report-only state, included/excluded group counts, application scope, platforms, required grant controls, AND/OR operator and ID.

The Linked Objects rail lists neighbors of the selected object, grouped by type, with relationship labels and counts. It lists the currently loaded graph, not every possible tenant relationship.

The detail pane has a fixed width in this release; its internal content scrolls. Close it to reclaim graph space.

Synthetic group detail panel with actions and linked objects
Group metadata, action buttons and linked-object navigation. Open image for full size ↗

Details #

For groups, displays metadata instead of the impact analysis.

Impact #

For groups, loads and displays deletion-impact evidence, coverage and remediation checklist. It does not delete the group.

Close details (×) #

Hides the detail pane so the graph has more room. Select a node to open it again.

Copy object ID #

Copies the selected object’s directory ID to the clipboard, with a success/error toast. The ID can identify sensitive tenant context. Tutorial IDs are synthetic and do not resolve in your tenant.

Open in Entra portal #

Opens the generated administrative deep link in a new tab for supported types (Intune objects may use Intune administration). It is shown only when a portal URL can be built. Any changes you make in the admin portal are outside EntraMap.

Linked Object chip #

Selects that neighbor, opens its details and fits its local graph neighborhood. This selection differs from a double-click drilldown, which requests a new graph.

Reset (Linked Objects) #

Returns selection to the root object of the currently loaded graph and resets its neighborhood focus. It does not return to an earlier map root.

Back to top ↑
07

Group impact & remediation

#

Impact summarizes blockers, warnings, domains with hits, checked domains, risk score, coverage and confidence. The executive summary and top evidence are a triage aid. A “No blocking dependencies found” result applies only to the collected scope.

Risk score is capped at 100: 25 per blocker + 10 per warning + 5 per incomplete domain. Caution has a minimum score of 15. A blocker yields Blocked; warnings or incomplete domains yield Caution; otherwise the label is Review complete. This is a heuristic, not a probability.

Coverage is the percentage of domains whose collection status is ok. “Complete within scope” still means bounded API collection. Review every access limitation, including errors and scan limits. A low risk score with incomplete coverage cannot establish that deletion is safe.

Each populated domain shows up to three sample findings, an owner suggestion, remediation guidance and checklist steps. Export the evidence for the full finding list. The suggested owner is a team role, not a looked-up responsible person.

Checklist progress is stored in this browser’s local storage per group. Checking a task records your review only: it performs no Graph change and is not shared approval. After actual administrative changes, run a fresh scan or use Change Planner verification.

Group impact summary with risk and coverage in the tutorial
Read risk alongside coverage. Tutorial values are illustrative. Open image for full size ↗
Per-domain remediation checklist and open-action controls
Checkboxes record local progress; they do not perform remediation. Open image for full size ↗

Impact finding #

Click a sample finding to focus the matching resource in the current graph when available. A finding absent from that graph may require Load impact graph.

Remediation checkbox #

Marks a local review step complete and updates per-domain and overall progress. Completed checklists show “Checklist complete — verify with a fresh scan”.

Reset checklist #

Clears saved checklist progress for the selected group and unchecks its steps. It does not undo any administrative changes.

Only open actions #

Hides completed domain cards in the checklist area. Untick it to see them again.

Load standard graph #

Loads the group’s ordinary relationship map (members, owners, scope and assignments supported by that engine).

Load impact graph #

Loads a group-rooted projection of collected impact findings, exposing severity/domain filters and Explain mode.

Export impact report #

Downloads the group impact result as JSON. Live impact exports request fresh evidence, so their timestamp/result can differ from an earlier visible panel.

Export impact CSV #

Downloads flat finding rows for spreadsheet review, including domain, status, severity and resource information. Read coverage separately; a CSV row count is not a coverage guarantee.

Export impact TXT #

Downloads a plain-text group impact summary for tickets or handover.

Export impact HTML #

Downloads a formatted, human-readable impact report suitable for review and browser printing. It is different from a Planner change dossier.

Back to top ↑
08

Impact graph filters & presets

#

These controls appear only on an impact graph. The active domain, severity choices and Explain setting are saved in browser local storage. A domain filter that does not exist in the next loaded graph is reset to All. Filters change presentation, not scan coverage or the underlying report.

Group impact graph with severity, domain, Explain and preset chips
Impact filters change the view, not the underlying evidence. Open image for full size ↗

Blocker #

Toggles blocker findings in the impact graph. At least one severity remains selected.

Warning #

Toggles warning findings in the impact graph. Hidden findings still exist in full reports.

All (impact domains) #

Shows findings from all available domains, subject to the severity filters.

Domain chip #

Shows findings for the chosen domain. Available chips depend on findings in this graph.

Explain #

Toggles projection explanations in node details: domain, severity, impact type and the fact that the node came from Group Impact.

CAB #

Sets all domains, both severities and Explain on for a broad review view. It does not create a change ticket or approve anything.

Security #

Selects Conditional Access when present, otherwise Directory Roles when present, otherwise all domains; enables blockers only and Explain.

Reset (impact presets) #

Restores all domains, blocker + warning and Explain on, and saves that preference.

Back to top ↑
09

Compare standard & impact maps

#

Map Compare compares two projections of one group: the standard relationship graph and impact graph. It is not a historical comparison and does not compare source and replacement groups. Use Change Planner for those questions.

Metrics show node/edge totals, overlaps and standard-only/impact-only edges. Three lists show standard-only nodes, impact-only nodes and overlapping nodes. Top relation deltas summarize differences in edge labels. The “Ready” badge means comparison output is ready, not that a group is safe to remove.

The tutorial screenshot uses the simplified demo comparison. Live comparisons additionally show metrics and Type, Search and Sort controls described below.

Standard versus impact map comparison in the tutorial
Map Compare compares projections of one group, not two snapshots. Open image for full size ↗

Compare maps #

Builds both map projections for the selected group and displays their differences in the detail panel.

Type (Map Compare) #

Filters the three node lists to an object type. Metrics remain whole-map totals.

Sort (Map Compare) #

Orders node lists by descending impact score (then label) or Label A–Z.

Open standard graph #

Switches back from comparison to the standard group graph.

Open impact graph #

Switches from comparison to the projected impact graph.

Export compare JSON #

Downloads map totals, filters, full and filtered node sets and top edge deltas. This file is not a Planner snapshot.

Export compare CSV #

Downloads spreadsheet rows from the filtered comparison lists with section, label, ID, type, severity, score and domain context.

Back to top ↑
10

All 20 impact domains

#

Each domain carries its own collection status and evidence. The planner compares resource references and selected semantic fields: impact, appRoleId, assignment, disabledPlans, directoryScopeId, appScopeId and state. Evidence timestamps/endpoints help trace a finding; they are not themselves assignment equivalence.

“Settings” below means collected reference settings can be compared in replacement mode. “Manual” means replacement rows require manual_review even when both collections succeeded. Verification can still describe observed changes, but never migrates the resource.

Domain / keyCollected dependency and review meaningReplacement
Conditional Access / conditional_accessGroup inclusion/exclusion references in policy scope. Check policy state and conditions; matching references do not predict effective sign-in results.Settings
Intune apps / intune_appsMobile app group assignments: intent, include/exclude target, filters and assignment settings.Settings
Device configurations / intune_device_configurationsDevice configuration profile assignments.Settings
Settings catalog / intune_settings_catalogSettings catalog policy assignments; availability depends on endpoint/workload access.Settings
Administrative templates / intune_admin_templatesGroup policy configuration assignments.Settings
Compliance / intune_complianceDevice compliance policy assignments, not measured endpoint compliance outcomes.Settings
App protection / intune_app_protectionManaged app protection policy targeting.Settings
App configuration / intune_app_configurationManaged-device / managed-app configuration policy assignments.Settings
Scripts & remediations / intune_scripts_bundleDevice management scripts and health/remediation script targeting. Review workload execution separately.Settings
Enrollment / intune_enrollment_bundleAutopilot and enrollment configuration assignment references.Settings
Windows 365 / cloud_pc_bundleCloud PC provisioning/user-setting assignments. License and endpoint visibility can limit collection.Settings
Enterprise applications / enterprise_appsService-principal app role assignments. Matching application IDs alone is insufficient; appRoleId matters.Settings
Directory roles / iam_rolesDirectory role assignments with role and scope context. Review privileges and scope, not just names.Settings
PIM / pim_rolesPrivileged role eligibility and related schedule references. Recreate/review governance separately.Manual
Administrative units / administrative_unitsAdministrative unit membership/scope references; assess delegated administration boundaries.Manual
Group nesting / group_nestingParent/child group references. Nested membership does not automatically convey enterprise-app assignment.Manual
Licensing / group_licensingAssigned SKU references and disabled service plans. Runtime license processing and conflicts require separate validation.Settings
Entitlement management / entitlement_managementAccess package/governance references collected for the group. Review policies and lifecycle rules.Manual
M365 workloads / m365_workloadsBacking Teams, SharePoint, drives and Planner signals for a Microsoft 365 group. Replacement does not move workspace content.Manual
Exchange / exchange_workloadsGroup mailbox/calendar signals within available Graph access. Mail-enabled non-M365 groups require Exchange admin review.Manual
Back to top ↑
11

Plan a group change

#

The planner has a Source group (baseline) and a Comparison group or later source scan. It collects fresh impact evidence and up to 10,000 direct member IDs. It requires no write permission and performs no migration or removal.

Capturing a new baseline clears the previous comparison/report. A failed new capture invalidates the stale scan for that slot so it cannot be mistaken for fresh evidence. Busy actions disable controls while a request runs; large tenants may take several minutes.

Each scan summary shows its group name, SYNTHETIC LAB or LIVE TENANT SCAN, capture timestamp, snapshot ID and readable-domain ratio. The UUID in this summary is the snapshot ID; the group object ID is the resolved input and is also preserved inside the saved snapshot.

  1. Sign in from Relationship map, then open Change Planner. Search a source group or paste its directory object ID. Choose Capture baseline and Save baseline.
  2. Find a different proposed replacement group. Choose Scan replacement. Confirm both names, IDs, timestamps and coverage summaries.
  3. Choose Compare replacement assignments and select Compare evidence. Inspect changed, missing, additional, unknown and manual-review rows, direct members and coverage limitations.
  4. Export a dossier for review. Carry out approved changes separately in the relevant Microsoft administration tools.
  5. Keep/import the original baseline, select Re-scan source, then Compare evidence in verification mode. Expand the results and verify remaining limitations.
Application replacement community lab in Change Planner
Source and comparison snapshot controls using the public application-replacement lab. Open image for full size ↗

Source group field #

Enter a source name (at least two characters for lookup) or paste its exact UUID object ID. A name must be resolved through a search result before capture.

Source / replacement search result #

Displays a group name and ID; select it to populate that side. Search alone does not capture evidence.

Capture baseline #

Freshly scans the source group and direct members. Replaces the baseline and clears the old comparison. Requires a valid ID and a signed-in session.

Replacement group field #

Enter or resolve the proposed replacement’s ID. The replacement must be a different group in the same tenant.

Scan replacement #

Freshly scans the target group for comparison against the baseline. Select replacement mode for this pair.

Re-scan source #

Freshly scans the baseline group again and selects verification mode. It uses the captured baseline group ID, not a different replacement typed in the target field.

Comparison mode #

Choose Compare replacement assignments for different groups or Verify changes to the source group for a later scan of the same group. Changing mode clears the previous report.

Compare evidence #

Validates both signed snapshots and calculates the report for the selected mode. Identical snapshots, wrong groups, expired/modified files or incompatible versions are rejected.

Back to top ↑
12

Three public community labs

#

Labs replace the current planner workspace with synthetic source/replacement evidence and immediately show a comparison. Save any live snapshots before choosing a lab. Demo and live snapshots cannot be mixed.

Each lab includes one deliberate settings change, a later scan with the reference removed and a later scan with visibility lost. This makes changed, removed and unknown reproducible without a tenant. Demo comparisons do not validate your live tenant.

Application replacement community lab in Change Planner
Source and comparison snapshot controls using the public application-replacement lab. Open image for full size ↗
Lost-visibility lab with unknown result and coverage limitation
An unreadable later scan does not establish removal. Open image for full size ↗

Application replacement #

Loads two groups referencing the same enterprise app but different app roles. Expect changed.

CA exception review #

Loads a policy that includes the source but excludes the comparison group. Expect changed because scope meaning differs.

Intune targeting #

Loads an app assignment that changes from required to available. Expect changed.

Demo: verify removal #

Uses the lab’s later scan of the source with its reference absent. Both domain reads succeed, so the result is removed.

Demo: lost visibility #

Uses a later scan with incomplete domain access. The result is unknown, with a coverage limitation, even when no later finding was returned.

Back to top ↑
13

Read every comparison result

#

The report title identifies replacement readiness or changes to the source. Status counts count resource rows, not members or all assignments in the tenant. “Collected references reviewed” is not deletion approval.

Coverage limitations are listed even when neither scan produced findings. Direct member comparison is available only when both membership collections succeeded: Shared is an intersection count; Only before / Only after contain direct member IDs. Matching membership does not establish effective access.

Expanded changed finding showing before and after assignment evidence
Same resource, different app roles: inspect the actual evidence. Open image for full size ↗
Lost-visibility lab with unknown result and coverage limitation
An unreadable later scan does not establish removal. Open image for full size ↗

All findings / Needs attention / Unknown / incomplete #

Filters displayed finding rows. Needs attention excludes equivalent and removed; unchanged remains visible. Unknown or incomplete shows unknown rows. Coverage limitations and overall counts remain visible.

Finding disclosure row #

Expands/collapses the source group → domain → resource path and baseline/comparison raw evidence. Inspect appRoleId, assignment intent, filters, state and scope where applicable.

Inspect membership differences #

Expands direct-member differences when available. This is ID-based evidence, not a transitive membership or effective-access computation.

ResultMeaningMode
equivalentBoth readable scans contain matching collected semantic settings for this resource.Replacement
missingSource reference exists but target reference does not, with both domain reads complete.Replacement
additionalTarget has a reference absent from the source. Extra access still needs review.Replacement
manual_reviewThis domain’s replacement semantics require human review; do not treat matching resource IDs as equivalence.Replacement
changedThe same resource has different collected settings. Expand both sides.Both
unknownAt least one domain collection is incomplete, unavailable or not scanned. Absence is not proven.Both
removedA source reference is absent in the later readable source scan. It does not prove a successful migration.Verification
addedThe later source scan contains a reference absent from baseline.Verification
unchangedThe resource’s collected settings match across the two source observations.Verification
Back to top ↑
14

Save, import & protect snapshots

#

Snapshots live in page memory. Refreshing, closing or leaving the planner clears them. Save both sides explicitly before leaving. A saved snapshot contains group and tenant/account identifiers, direct member IDs, settings and collection evidence.

The server signs snapshots and validates their contents, issuing deployment, tenant and account when comparing/exporting. Acceptance lasts 24 hours. Import performs structural checks first; successful import alone does not establish server acceptance. Use the original unmodified JSON.

Each import is limited to 4 MB; the server request limit is 8 MB. The same scope and scan version are required. Verification requires a different snapshot ID and later capturedAt for the same group. An invalid import leaves the current slot intact.

A JSON dossier contains the exact before/after signed envelopes, but the whole dossier is not a snapshot import file. Graph JSON, map-compare JSON and pseudonymized reports are also not snapshot files. Save baseline/comparison is the supported way to obtain an importable file.

Save baseline #

Downloads the original signed baseline envelope. Keep it intact for later verification using the same account and tenant within 24 hours.

Import baseline #

Opens a JSON file picker for a saved original baseline. Invalid JSON or unsupported structure/size produces an error.

Save comparison scan #

Downloads the signed replacement or later-source snapshot currently in the comparison slot.

Import comparison #

Loads an original signed comparison snapshot into the comparison slot. Choose a compatible comparison mode before comparing.

Back to top ↑
15

Every export format

#

Export timestamps and scan timestamps have different meanings. Graph exports describe the loaded view, impact exports can perform fresh collection, and Planner dossiers compare the exact selected snapshots. Keep coverage with the evidence when sharing.

The application triggers browser downloads; your browser determines whether they save automatically, prompt or are blocked. Check its downloads list. If a download is missing, allow downloads for the site and retry. A toast by itself does not verify that a file was saved.

Pseudonymize exports is available for Planner dossiers only. Other exports can include names, object IDs and tenant evidence. Pseudonymization removes raw identifiers/evidence, but contextual counts and statuses can still be sensitive to your organization.

Export JSON dossier #

Produces the calculated report plus exact before/after signed snapshots, unless pseudonymization is enabled. Useful for preserving the comparison inputs and machine-readable evidence.

Export HTML dossier #

Produces a readable table, coverage limitations, membership comparison and expandable assignment evidence. Open the saved file in a browser; expand evidence before printing if you need it on paper.

Pseudonymize exports #

Omits raw snapshots, names, IDs, endpoints and evidence from subsequent Planner exports. Keeps counts, statuses, generic notes and anonymous Object labels. Does not alter the on-screen report or snapshot save files, and cannot be imported for verification.

ExportScopeImportable as Planner snapshot?
Graph JSONEntire last loaded graph + timestamp/countsNo
Filtered view JSONVisible graph + context/filter settings; faded nodes remainNo
Impact JSON / CSV / TXT / HTMLGroup dependency analysis, not two-snapshot change historyNo
Map Compare JSON / CSVStandard vs impact projections of one groupNo
Save baseline / Save comparisonOriginal signed single-scan envelopeYes, subject to server validation
Planner JSON dossierReport and exact two input envelopesNot as a whole dossier
Planner HTML dossierHuman-readable change reportNo
Pseudonymized dossierReduced report without raw evidence/snapshotsNo
Back to top ↑
16

All four interactive tutorials

#

Tutorials replace live map interactions with fixed synthetic objects while active. Progress is saved locally in the browser and completed levels receive a checkmark. You can choose any level; God Mode is a tutorial name, not elevated tenant access.

Basic (8 steps): User → search engin → open identity → linked group → copy ID → rail Reset → Fit → graph JSON.

Advanced (10 steps): Group → search tier0 → open group → Impact → impact export → impact graph → Compare maps → open impact from compare → compare JSON → compare CSV.

Expert (12 steps): Group → tier0 → open group → Details → Impact → impact map → unmanaged → non-compliant → reset focus → filtered export → compare → fit.

God Mode (13 steps): Device → win11 → open endpoint → copy ID → reset layout → App → portal → open app → copy ID → CA Policy → mfa → open policy → fit. The tutorial app is a synthetic teaching object; live App search is Intune app search.

The coach highlights the expected target and displays What this does / Why it matters. Waiting for action means the expected interaction has not completed. Tutorial exports may be simulated with a toast, so use live or planner-lab exports to test actual files.

Basic tutorial coach highlighting the next action
Four levels teach the map controls without changing tenant data. Open image for full size ↗

Start tutorial without sign-in #

Hides the sign-in overlay and starts Basic with synthetic data. No tenant connection is needed.

Start Interactive Tutorial #

Opens the level chooser. Choose a level to start/restart that walkthrough.

1. Basic #

Starts this level from its first step using synthetic data. Completed level markers reflect local browser progress.

2. Advanced #

Starts this level from its first step using synthetic data. Completed level markers reflect local browser progress.

3. Expert #

Starts this level from its first step using synthetic data. Completed level markers reflect local browser progress.

4. God Mode #

Starts this level from its first step using synthetic data. Completed level markers reflect local browser progress.

Back (tutorial) #

Moves to the previous coach step; disabled at the beginning. It does not reverse directory actions (tutorials make none).

Next / Waiting for action #

Next advances a step when available. Action-driven steps disable this button and wait for the requested control interaction instead.

Find it ✨ #

Brings the current target into view when it is outside the visible area. If the target is still loading, wait for it or restore the expected step context.

Stop / Stop tutorial #

Ends the tutorial. A guest returns to the sign-in experience; signed-in users can return to live operations.

Back to top ↑
17

Permissions & availability checks

#

All 18 scopes below are requested as delegated permissions in this release. Consent is handled by Microsoft and your organization’s policy. EntraMap’s read-only Graph calls do not require you to grant write scopes.

Permission checks probe representative endpoints. OK means that probe succeeded; it does not guarantee every domain/sub-endpoint is available. Missing, Not licensed and Not applicable have different meanings. Domain-specific scan coverage remains the evidence for a particular scan.

Requested delegated permissions expanded in the sign-in screen
Each permission row explains its purpose. Expanding it grants nothing. Open image for full size ↗

Permission name / chevron #

In API Permissions, expand/collapse each requested scope to read why it is used. This is explanatory content; it does not grant consent.

Refresh permissions #

From API Permissions Incomplete, starts a fresh delegated consent request. Your organization may require an administrator to approve it. Re-scan after consent changes.

Continue anyway #

Closes the warning and remembers the skip preference locally. Features continue with available visibility; missing access is not fixed or treated as complete.

Disconnect & Sign out #

Clears local/session preferences and disconnects the EntraMap session from the permissions warning. It does not revoke tenant consent.

Delegated scopePurpose
User.ReadReads the signed-in user's basic profile to establish session identity.
User.Read.AllReads full user profiles tenant-wide for user lookup, pivoting, and enriched relationship details.
User.ReadBasic.AllReads basic user info across the tenant for user search and mapping.
Group.Read.AllReads groups, memberships, ownership, nesting, and group license relationships.
Device.Read.AllReads tenant devices for device graph coverage and risk context.
DeviceManagementManagedDevices.Read.AllReads Intune managed device records and posture details used in impact and compliance context.
Application.Read.AllReads enterprise apps and service principals for app relationship mapping.
DeviceManagementApps.Read.AllReads Intune app assignments to detect group dependencies before deletion.
DeviceManagementConfiguration.Read.AllReads Intune device configurations, settings catalog, administrative templates, and compliance policies.
DeviceManagementServiceConfig.Read.AllReads Autopilot profiles and enrollment configurations for group-impact dependency detection.
CloudPC.Read.AllReads Windows 365 Cloud PC policies and assignments to surface cloud desktop dependencies.
Policy.Read.AllReads Conditional Access policy definitions and targeting scope.
RoleManagement.Read.DirectoryReads Entra role assignments and privileged role relationships.
AdministrativeUnit.Read.AllReads administrative units and scoped memberships to detect delegated admin boundaries.
EntitlementManagement.Read.AllReads access package policies to find entitlement dependencies for groups.
Team.ReadBasic.AllReads Teams metadata linked to Microsoft 365 groups.
Sites.Read.AllReads SharePoint site metadata to detect workload dependencies.
Directory.Read.AllReads broader directory objects including administrative unit scope references.
Back to top ↑
18

Coverage, freshness & data limits

#

A graph is a bounded exploration, not an exhaustive tenant inventory. A group impact scan covers the 20 implemented domains, subject to permission, workload, endpoint, paging and resource limits. Public tutorials show simplified coverage, not production completeness.

Ordinary Graph results may be cached for five minutes. Map reload and Planner captures request fresh reads. Freshness bypasses EntraMap’s cache, not Microsoft’s replication delay. Separate requests are observations over time, not an atomic transaction.

Statuses: ok means collection completed within the implemented scope; partial means some collection failed or was truncated; no_permission means access was denied; not_licensed means the API reported unavailable licensed functionality; error means collection failed; not_scanned is a comparison placeholder when a domain is absent. Read the accompanying reason and evidence. Workload non-applicability may be recorded separately from an ok domain status.

A reached collection limit or failed later page is incomplete coverage. Empty data from an unreadable domain is never evidence of removal. Resource 404s may mean no backing workload, but a failed collection is a limitation.

Enterprise app group assignments do not flow through nested group membership. Conditional Access needs actual sign-in context to evaluate. Intune has workload-specific applicability rules. Dynamic/synchronized groups require source-system review. Microsoft 365 group replacement does not migrate Teams, SharePoint, mailbox or Planner content.

Configured scan limit in 0.6.0Maximum
Conditional Access policies400
Intune apps1,200
Intune policies per collection1,200
Intune assignments per policy / per app100
Teams channels / site drives / Planner plans200 per collection
Planner direct members10,000
Snapshot file / comparison request4 MB / 8 MB
Snapshot acceptance window24 hours
Back to top ↑
19

Troubleshooting

#

Start with the exact message, app version, selected mode and scan timestamps. Preserve originals before retrying. Do not post tokens, signed live snapshots or tenant evidence in a public issue.

SymptomNext action
State mismatch. Please try again.Close the old callback. Start a new sign-in from https://entramap.com in the same browser. Do not replay an old callback. If persistent, the operator should check canonical REDIRECT_URI, stable secret and session storage across workers.
Popup blocked / sign-in never finishesAllow the EntraMap sign-in popup; retry from the original page. If needed navigate directly to /auth/signin on the same origin.
Sign in required / session expiredSign in again with the intended account. For Planner, save available snapshots before navigating; compare them using the original account/tenant within their validity window.
No resultsCheck object type and spelling, use at least two characters, and inspect permissions. App searches Intune apps. Planner also accepts a known group UUID.
No matching nodes visibleThe current graph has no explicit false unmanaged/compliance flags matching that focus. Load another relevant object or reset focus.
Empty or very small impact mapCheck severity/domain filters and press Reset in impact presets. Inspect coverage and the full report; no visible nodes does not establish no dependencies.
Missing / not licensed / partial / errorRead the domain reason. Consent, account roles, licenses and workload/API availability are independent. Restore visibility with your administrator, then capture fresh evidence.
Long scan / disabled controlsWait for the in-progress scan. Large tenants can take minutes. Leaving or refreshing loses page-memory snapshots; save them before starting long work when possible.
Same group rejected in replacement modeChoose a different target group, or use verification mode with a later source scan.
Verification requires a later scanUse Re-scan source after baseline. Do not compare a snapshot against itself or place an earlier scan in the comparison slot.
Modified / invalid / expired snapshotUse an original unedited Save baseline/comparison JSON from this deployment, younger than 24 hours. Capture fresh evidence after signing-key rotation or expiry.
Another account or tenantSign in with the account and tenant that captured the originals; do not edit IDs in the file.
Wrong scope/version or demo/live mixCapture a compatible new pair. Keep both scans on the same scan version and data mode.
Import rejected / too largeUse a single original snapshot JSON under 4 MB. A dossier, graph export or pseudonymized file cannot be imported as a snapshot.
Export toast but no fileCheck browser downloads and site download permissions. The browser may block generated downloads. Retry in a standard browser if an embedded browser does not save them.
Checklist complete but findings remainChecklists track local review; they do not alter the tenant. Apply approved changes separately and collect fresh evidence.
Data differs after a recent changeAllow for Microsoft propagation and scans collected at different times. Compare timestamps, use fresh reload/re-scan, then validate in the workload’s admin tool.
Back to top ↑
20

Session data, browser storage & privacy

#

Live Graph requests run through the server using the signed-in session. Server-side sessions contain identity and an encrypted token-cache blob. A stable FLASK_SECRET_KEY is needed to keep sessions/signatures usable; operators must protect both the secret and session storage.

The browser holds the loaded map and planner workspace. Local storage holds tutorial progress, impact filter profile, group checklist state and the permission-warning skip preference. These are browser/origin-local, not shared workflow records. Disconnect clears local/session storage on the app’s origin.

Planner snapshots and dossiers saved to disk persist independently of sign-out. Treat them according to your organization’s handling rules. Pseudonymize applies only to Planner report exports, not saved snapshots, live UI, map exports or impact exports.

The documentation is public and performs no Graph requests. Screenshots here were captured from actual built-in synthetic tutorial/lab screens. No live tenant screenshots are published.

Back to top ↑
21

Self-hosting & operator reference

#

The repository is the source of truth for deployment-specific settings. This page describes the 0.6.0 implementation. Use a stable HTTPS public origin with REDIRECT_URI ending /auth/callback, and configure the identical Web redirect URI in the Microsoft app registration.

For production, protect CLIENT_SECRET and FLASK_SECRET_KEY in your hosting configuration. Keep the Flask secret identical across workers. Filesystem sessions on ephemeral container storage can disappear during restart; multi-instance deployments need a shared session backend such as the supported Redis option.

The repository’s GitHub Actions validates Python regressions, frontend DOM tests and an HTTP smoke check before deploying main to Azure App Service. A successful deployment event can precede worker activation; verify public health/version and a fresh session after the new worker is serving.

Local development: install requirements.txt, set CLIENT_ID / CLIENT_SECRET / FLASK_SECRET_KEY and a local redirect URI, then run python app.py. Default port is 5000. Run python -m unittest discover -s tests -v and npm ci --prefix tests/frontend --ignore-scripts followed by npm test --prefix tests/frontend.

SettingPurpose / default
CLIENT_ID / CLIENT_SECRETMicrosoft confidential-client registration credentials; required by configuration validation.
REDIRECT_URIExact callback URL. HTTPS canonical entry redirects use its origin.
FLASK_SECRET_KEYStable session/signature/encryption secret; random fallback is unsuitable for persistent production sessions.
FLASK_DEBUG / PORTDebug defaults false; local port defaults 5000.
SESSION_TYPEfilesystem by default; redis supported.
SESSION_FILE_DIR / REDIS_URLSession directory defaults to OS temp/entramap_flask_session; Redis URL required for Redis mode.
SESSION_TTL_MINUTES60 by default; separate from map idle timer.
SESSION_COOKIE_NAMEentramap_session by default.
SESSION_COOKIE_SECUREDefaults true for an HTTPS REDIRECT_URI; cookies are HttpOnly and SameSite=Lax.
APPLICATIONINSIGHTS_CONNECTION_STRING / APPINSIGHTS_INSTRUMENTATIONKEYOptional telemetry configuration. Enable supported Azure Monitor dependencies to use it.
APPLICATIONINSIGHTS_ENABLE_LOGGINGOptional logging integration; defaults true.
Back to top ↑
22

HTTP endpoints & evidence formats

#

These are application endpoints, not a separately versioned public API service. Live reads require the browser’s EntraMap session. Never expose session cookies or tokens in scripts, URLs or issue reports. The public labs and docs work without tenant access.

Planner POST requests use JSON plus X-EntraMap-Request: planner. Comparison/export validate signed inputs and ownership for live data. A missing header or invalid envelope yields 400; live scans without authentication yield 401. The supported user workflow is the planner UI.

A signed snapshot envelope has data and signature. Data includes schemaVersion, scanVersion, id, tenantId, ownerId, demo, capturedAt, scope and result. Result contains group, summary, domains and direct membership. Preserve every field exactly. Editing data invalidates its signature.

Method / routePurpose
GET /docs, /docs/Public handbook.
GET /, /plannerMap/sign-in shell and planner workspace.
GET /api/healthPublic health/version signal.
GET /api/meCurrent signed-in identity context.
GET /api/search?type=…&q=…Authenticated typed object lookup.
GET /api/map/{type}/{id}User, group, device, app, enterprise_app or ca_policy map.
GET /api/map/group/{id}/impact or /compareGroup impact projection or standard/impact comparison.
GET /api/impact/group/{id}Structured group impact evidence. Append /txt or /html for those report formats.
GET /api/details/{type}/{id}Object metadata.
GET /api/photo/user/{id}, /api/photo/group/{id}Authenticated object imagery when available.
GET /api/permission-checkAuthenticated representative permission probes.
GET /api/debug/group-impact/{id}Authenticated diagnostic summary for the group-impact implementation.
GET /api/planner/demo/{name}Signed synthetic lab inputs: application, conditional-access, intune.
POST /api/planner/scanFresh group scan; body includes groupId.
POST /api/planner/compareBody includes before/after signed envelopes and mode (replacement or verification).
POST /api/planner/exportSame pair/mode plus format (json or html) and pseudonymize boolean.
GET /auth/signin, /auth/callback, /auth/signout, /auth/disconnectSession/authentication lifecycle; callbacks must come from a fresh initiated flow.
Back to top ↑
23

Keyboard, accessibility & hidden extra

#

Use Tab/Shift+Tab to reach focusable controls, Enter to activate buttons/links, Space for checkboxes and arrow keys for native select options. Escape in the map search clears results. Native disclosure rows in Planner open with Enter/Space. Graph canvas manipulation also uses pointer gestures.

Toolbar icons have hover titles; the reference above gives their names. The graph is a visual investigation tool: use the linked-object rail, detail text and exported evidence when a canvas relationship is hard to inspect. Do not rely on node color alone; read types, labels and scope text.

The signed-in relationship map includes a small Asteroids easter egg: enter Up Up Down Down Left Right Left Right B A, without long pauses. While signed out it shows a playful refusal instead. The game has no tenant permissions or Graph actions.

Asteroids keyboard controls #

Left/Right rotates, Up thrusts and Space shoots. The panel shows score, lives and a boss indicator when applicable.

Close (Asteroids) #

Closes the mini-game and returns the panel to ordinary map use.

Back to top ↑
24

Using this documentation

#

Chapters and controls have stable fragment links so you can share a precise explanation. The complete handbook is server-rendered and readable without JavaScript. Search, automatic index sorting and the print button use JavaScript; browser Find and Print remain available without it.

Clear search (×) #

Clears the query, restores all chapters and returns focus to the search field.

Chapter link / # permalink #

Navigates to a chapter or specific control. Opening an indexed link restores its chapter if search had hidden it.

All controls A–Z #

Jumps to the full control index. Select any entry for its explanation.

Screenshot / Open image for full size #

Opens the actual screenshot image in a separate browser tab. Browser zoom can enlarge details; return to the guide using its original tab.

Print / Save as PDF #

Opens the browser print dialog. Print styling includes every chapter even if a search is active. Choose a printer or Save as PDF in your browser.

Back to top ↑ / Skip to documentation #

Returns to the main content start; the keyboard-only skip link bypasses navigation.

Back to top ↑

All controls A–Z

Exact labels and named interactions. Follow a link for location, behavior and limitations. Search above filters chapters; this index remains available.