Skip to content

Service Accounts Disguised as Users

The question it answers: Which user accounts behave like service accounts - script-only sign-ins, old passwords, no MFA?

Scanners, sync tools and old integrations often run as ordinary user accounts: a password that never changes, excluded from MFA, signing in only from scripts. They are prime targets for password spray and never show up in the service principal reports. Accounts that sign in only non-interactively and have no MFA protection are listed first.

Where in the appEntra ID › Identity Hygiene › Disguised Service Accounts
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 (sign-in activity).
Report id (API and MCP)entra.security.disguised-service-accounts
ColumnKeyType
AccountDisplayNameLink
ScoreScoreStatus
SignalsSignalsText
Last interactiveLastInteractiveDate
Last non-interactiveLastNonInteractiveDate
Password age (days)PasswordAgeDaysText
LicensedLicensedYesNo
UPNUserPrincipalNameText

Licence: Microsoft Entra ID P1 (sign-in activity).

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

PermissionAPIWhat it allowsNote
User.Read.AllMicrosoft GraphRead all users’ full profiles
User-LifeCycleInfo.Read.AllMicrosoft GraphRead all users’ lifecycle information
AuditLog.Read.AllMicrosoft GraphRead all audit log data
UserAuthenticationMethod.Read.AllMicrosoft GraphRead all users’ authentication methods
Policy.Read.AllMicrosoft GraphRead your organization’s policies
Data sources it reads
  • GET /v1.0/users (passwordPolicies, lastPasswordChangeDateTime)
  • GET /v1.0/users?$select=signInActivity
  • GET /v1.0/reports/authenticationMethods/userRegistrationDetails
  • GET /v1.0/identity/conditionalAccess/policies
GET /ir-api/v1/reports/entra.security.disguised-service-accounts?size=100

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