Skip to content

Inactive Enterprise Apps & Stale Service Principals

The question it answers: Which enterprise apps have not signed in for 90 days or more, and which of them still hold valid credentials?

Apps that nobody signs in to any more but that still hold permissions - and often a valid secret or certificate - are free persistence for an attacker. Apps with active credentials and no recent sign-in are listed first.

Where in the appEntra ID › Security › Inactive Enterprise Apps
WorkloadEntra ID
KindTable
DataBuilt from the tenant data IntensiveReports keeps in memory and refreshes in the background, so it opens at once.
LicenceMicrosoft Entra ID P1 for service principal sign-in activity.
Report id (API and MCP)entra.security.inactive-apps
ColumnKeyType
AppDisplayNameLink
ActivityActivityStateStatus
Last sign-inLastSignInDate
Last app-onlyLastAppOnlySignInDate
Last delegatedLastDelegatedSignInDate
Valid credentialsActiveCredentialCountText
OriginOriginText
App IDAppIdText
FilterKey (API)On when the page opens
Only inactive appsinactiveYes
Only apps registered in this tenantownNo

Licence: Microsoft Entra ID P1 for service principal sign-in activity.

Application permissions on the IntensiveReports app registration (all permissions):

PermissionAPIWhat it allowsNote
Application.Read.AllMicrosoft GraphRead all applications
AuditLog.Read.AllMicrosoft GraphRead all audit log data
Data sources it reads
  • GET /v1.0/servicePrincipals
  • GET /beta/reports/servicePrincipalSignInActivities
  • GET /v1.0/applications + /servicePrincipals (credentials, shared with App Credential Expiry)
GET /ir-api/v1/reports/entra.security.inactive-apps?size=100
GET /ir-api/v1/reports/entra.security.inactive-apps?filter=inactive

An AI assistant reads it with the MCP tool get_report and the id entra.security.inactive-apps. The client needs the Read grant for Entra ID. See Using the API.