Azure + Microsoft 365
Microsoft 365 / Entra ID discovery - users, groups, group members, Teams,
What it does
Authenticates to Microsoft Graph (handled by DiscoveryBase / Start-DiscoveryModule using the service-principal credentials in $Configuration) and pages across ~7 Graph endpoint groups, writing CSVs that the EntraID/M365 discovered view (useEntraIDM365DiscoveredLogic.ts) reads back: AzureDiscovery_Users.csv AzureDiscovery_Groups.csv AzureDiscovery_GroupMembers.csv AzureDiscovery_GroupOwners.csv (groupΓåöowner edges) AzureDiscovery_UserLicenses.csv (userΓåöSKU edges) AzureDiscovery_MicrosoftTeams.csv AzureDiscovery_SharePointSites.csv AzureDiscovery_Applications.csv AzureDiscovery_AppApiPermissions.csv (appΓåöAPI permission edges) AzureDiscovery_DirectoryRoles.csv AzureDiscovery_DirectoryRoleMembers.csv (roleΓåömember edges) EntraTenantProfile.csv (single row) EntraTenantStatistics.csv (single row, derived) Column names are PascalCase. Pipe '|' is the multi-value separator (Owners, OwnerIds, SampleMembers, MemberIds, GroupMemberships, GroupMembershipIds, AssignedLicenses, VerifiedDomains, TechnicalNotificationMails, Members, Tags, RequiredResourceAppIds; ProxyAddresses / OtherMails / BusinessPhones use ';'). Stable relationship anchors: - Users.ManagerId -> manager ObjectId (_ParentAnchorID) - Users.GroupMembershipIds -> group ObjectIds (join to Groups.Id) - Users.OnPremisesImmutableId -> hybrid identity match key - GroupMembers.ManagerId / ObjectId (groupId|memberId) -> group - GroupOwners.ManagerId / ObjectId (groupId|ownerId) -> group - UserLicenses.ManagerId / ObjectId (userId|skuId) -> user - AppApiPermissions.ManagerId / ObjectId (appId|resourceAppId|perm) -> app - DirectoryRoleMembers.ManagerId / ObjectId (roleId|memberId) -> role - TenantId on every entity row for multi-tenant migration matching No credentials -> Start-DiscoveryModule throws -> [ERROR_ENVELOPE] AUTH_FAILURE -> exit 1 (the view shows an error banner, never a frozen spinner). Empty tenant collections stay honest EMPTY (no invented rows).
How the app exposes it
The module feeds into the ACQI app's dedicated results view. From there, conflicts, dependencies, and readiness scores roll up into the deal workspace.
/discovered/azure-infrastructure Outputs
Each module produces a CSV with readiness and risk scores, evidence-source counts, and last-seen timestamps. The exact columns vary by module — the app's results view shows the live schema.