Skip to content

Security reports

Identity-security coverage from the Graph reports API. The registration report is not a CSV: it returns a JSON collection of UserRegistrationDetails, one entry per user, that you query directly.

flowchart LR
    A["reports.authentication_methods.user_registration_details"] --> B["UserRegistrationDetails per user"]
    B --> C1["MFA registered"]
    B --> C2["SSPR registered"]
    B --> C3["Passwordless capable"]
    B --> C4["Admin without MFA"]

MFA status

Tenant-wide MFA / SSPR / passwordless coverage, the count of admins without MFA, and a listing of users who have not registered MFA (or all users with --all).

details = client.reports.authentication_methods.user_registration_details.get().execute_query()
without_mfa = [d for d in details if not d.is_mfa_registered]

Use --admins-only to focus on privileged accounts — the highest-value gap.

Needs Reports.Read.All (or AuditLog.Read.All).