AzureM365
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 runs through the ACQI discovery orchestrator and writes its rows into a dedicated results view. From there, conflicts, dependencies, and readiness scores feed the deal-wide consolidation layer.
/discovered/azure-infrastructure Outputs
Each module emits a normalised CSV keyed by entity ID with readiness and risk scores, evidence-source counts, and last-seen timestamps. The exact column set varies by module — the app's results view shows the live schema.