Checking MFA status in Microsoft Entra ID comes down to two complementary approaches: the User registration details report in the Entra admin center for quick, visual per-user status, and the Microsoft Graph PowerShell SDK for bulk, exportable reporting across every account in the tenant. The admin center view shows the Multifactor authentication capable, Default multifactor authentication method, and Methods registered columns, which is enough for spot checks and filtering. For hundreds or thousands of users, you connect Microsoft Graph with the UserAuthenticationMethod.Read.All scope and enumerate each account's registered methods with Get-MgUserAuthenticationMethod. This tutorial walks through both paths, then builds a reusable script that exports a CSV report and calculates your MFA compliance rate. Every step here is read-only - you are reporting on configuration, not changing anyone's authentication methods.
Before you start
What you will learn
- You will learn how to check the multifactor authentication (MFA) status of individual users and your entire tenant in Microsoft Entra ID, using both the admin center GUI and the Microsoft Graph PowerShell SDK. You will also generate and analyze a complete compliance report.
- Knowing which accounts are MFA-capable is fundamental to closing identity attack surface and meeting security baselines. A clear, exportable view of registered authentication methods lets you spot unprotected and email-only accounts before they become an incident.
Requirements
- You need administrative access to the Microsoft Entra admin center (https://entra.microsoft.com) and, for the PowerShell path, a workstation where you can install the Microsoft Graph PowerShell SDK and sign in interactively.
- Authentication Administrator
- Global Administrator
Good to know
- About 30-45 minutes to work through all steps; the tenant-wide script itself can take 10-30 minutes to run on tenants with 1000+ users.
- Steps use the Microsoft Entra admin center (entra.microsoft.com) and the Microsoft.Graph PowerShell SDK. Requires an account with Authentication Administrator or Global Administrator privileges.
- This tutorial is read-only. Every step queries and reports on existing MFA registration data - it does not add, remove, or change any user's authentication methods, Conditional Access policies, or account settings. You can run it safely in production.
Quick answer
To check a single user or a small set, open entra.microsoft.com, go to Protection > Authentication methods > User registration details, and read the Multifactor authentication capable column. For all users at once, connect the Microsoft Graph PowerShell SDK with the UserAuthenticationMethod.Read.All scope and enumerate methods per user, then export to CSV.
Microsoft Entra admin center > Protection > Authentication methods > User registration detailsStep-by-step tutorial
5 stepsView MFA status in the Microsoft Entra admin center
See real-time per-user MFA registration status through the graphical interface.
Microsoft Entra admin center > Protection > Authentication methods > User registration detailsOpen a browser and go to https://entra.microsoft.com. Sign in with an account that holds the Authentication Administrator or Global Administrator role.
In the left navigation pane, expand Protection and select Authentication methods. Then click User registration details to open the registration dashboard.
Read the key columns for each user:
- Multifactor authentication capable - whether the user has at least one method that satisfies MFA.
- Default multifactor authentication method - the method used first at sign-in.
- Methods registered - every authentication method the user has enrolled.
Use the filter controls at the top of the table to narrow the list - for example, by MFA-capable status, a specific method, or user role.
This view reflects registration state, not whether MFA was actually enforced or used at last sign-in. Data can lag behind recent registration changes by a short interval. The Authentication Administrator role is the least-privileged role that grants this view.
Install and connect the Microsoft Graph PowerShell SDK
Prepare PowerShell for bulk MFA reporting and connect with the correct read scopes.
Open PowerShell as Administrator and install the required modules from the PowerShell Gallery:
After installation, import the modules for the current session, then connect to Microsoft Graph requesting the scopes needed to read users and authentication methods. A browser window opens for interactive sign-in - authenticate with an administrative account and consent to the requested permissions.
# Install (run once, elevated)
Install-Module Microsoft.Graph -Repository PSGallery -Force
# Import for this session
Import-Module Microsoft.Graph.Authentication
Import-Module Microsoft.Graph.Users
Import-Module Microsoft.Graph.Reports
# Connect with read scopes
Connect-MgGraph -Scopes "User.Read.All", "UserAuthenticationMethod.Read.All", "AuditLog.Read.All"
# Confirm the session
Get-MgContextInstalling the full Microsoft.Graph meta-module pulls in Microsoft.Graph.Authentication, Microsoft.Graph.Users, and Microsoft.Graph.Reports, so separate installs of the sub-modules are optional. On first connection an admin may need to consent to the delegated permissions on behalf of the tenant. All scopes here are read-only.
Query MFA status for a single user
Verify your permissions and understand the authentication method data structure before scaling up.
Retrieve every authentication method registered for one user by their UPN or object ID:
To isolate a specific method type, filter on the @odata.type value inside AdditionalProperties - for example phone or Microsoft Authenticator methods.
To explore the full data structure, save the output to a variable and expand every property with Format-List.
# All methods for one user
Get-MgUserAuthenticationMethod -UserId "user@yourdomain.com"
# Only phone methods
Get-MgUserAuthenticationMethod -UserId "user@yourdomain.com" |
Where-Object {$_.AdditionalProperties["@odata.type"] -eq "#microsoft.graph.phoneAuthenticationMethod"}
# Only Microsoft Authenticator app registrations
Get-MgUserAuthenticationMethod -UserId "user@yourdomain.com" |
Where-Object {$_.AdditionalProperties["@odata.type"] -eq "#microsoft.graph.microsoftAuthenticatorAuthenticationMethod"}
# Inspect the full structure
$userMethods = Get-MgUserAuthenticationMethod -UserId "user@yourdomain.com"
$userMethods | Format-List *Replace user@yourdomain.com with a real UPN or object ID. An empty result means the user has no registered methods or your session lacks the UserAuthenticationMethod.Read.All scope - recheck Get-MgContext. Every account has an implicit password method, which is not counted as MFA.
Generate a tenant-wide MFA report with a PowerShell script
Produce a CSV of MFA capability and registered methods for every user in the tenant.
Create a script file named Get-MFAStatus.ps1 that enumerates all users, reads each user's authentication methods, classifies them by @odata.type, flags whether the account is MFA-capable, derives a default method, and exports the results to CSV with summary statistics.
Save the script, then run it, optionally overriding the export path.
# Get-MFAStatus.ps1
param(
[string]$ExportPath = "C:\Reports\MFA-Status-Report-$(Get-Date -Format 'yyyy-MM-dd-HHmm').csv"
)
Import-Module Microsoft.Graph.Authentication
Import-Module Microsoft.Graph.Users
Import-Module Microsoft.Graph.Reports
Connect-MgGraph -Scopes "User.Read.All", "UserAuthenticationMethod.Read.All", "AuditLog.Read.All"
$results = @()
$users = Get-MgUser -All -Property DisplayName,UserPrincipalName,Id,AccountEnabled,CreatedDateTime
Write-Host "Processing $($users.Count) users..." -ForegroundColor Yellow
foreach ($user in $users) {
Write-Progress -Activity "Processing Users" -Status "Checking $($user.DisplayName)" -PercentComplete (($results.Count / $users.Count) * 100)
try {
$authMethods = Get-MgUserAuthenticationMethod -UserId $user.Id -ErrorAction SilentlyContinue
$mfaCapable = $false; $registeredMethods = @(); $defaultMethod = "None"; $strongMethods = 0
foreach ($method in $authMethods) {
switch ($method.AdditionalProperties["@odata.type"]) {
"#microsoft.graph.microsoftAuthenticatorAuthenticationMethod" { $registeredMethods += "Microsoft Authenticator"; $mfaCapable = $true; $strongMethods++ }
"#microsoft.graph.phoneAuthenticationMethod" { $registeredMethods += "Phone"; $mfaCapable = $true; $strongMethods++ }
"#microsoft.graph.emailAuthenticationMethod" { $registeredMethods += "Email" }
"#microsoft.graph.fido2AuthenticationMethod" { $registeredMethods += "FIDO2 Security Key"; $mfaCapable = $true; $strongMethods++ }
"#microsoft.graph.softwareOathAuthenticationMethod" { $registeredMethods += "Software OATH Token"; $mfaCapable = $true; $strongMethods++ }
"#microsoft.graph.windowsHelloForBusinessAuthenticationMethod" { $registeredMethods += "Windows Hello for Business"; $mfaCapable = $true; $strongMethods++ }
}
}
if ($registeredMethods -contains "Microsoft Authenticator") { $defaultMethod = "Microsoft Authenticator" }
elseif ($registeredMethods -contains "FIDO2 Security Key") { $defaultMethod = "FIDO2 Security Key" }
elseif ($registeredMethods -contains "Phone") { $defaultMethod = "Phone" }
$results += [PSCustomObject]@{
DisplayName=$user.DisplayName; UserPrincipalName=$user.UserPrincipalName; AccountEnabled=$user.AccountEnabled
MFACapable=$mfaCapable; StrongMethodCount=$strongMethods; DefaultMFAMethod=$defaultMethod
RegisteredMethods=($registeredMethods -join "; "); MethodCount=$registeredMethods.Count
UserCreated=$user.CreatedDateTime; ProcessedDate=(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
}
} catch { Write-Warning "Failed to process $($user.DisplayName): $($_.Exception.Message)" }
}
$exportDir = Split-Path $ExportPath -Parent
if (!(Test-Path $exportDir)) { New-Item -ItemType Directory -Path $exportDir -Force | Out-Null }
$results | Export-Csv -Path $ExportPath -NoTypeInformation -Encoding UTF8
Write-Host "MFA capable: $(($results | Where-Object {$_.MFACapable -eq $true}).Count) / $($results.Count)" -ForegroundColor Green
Disconnect-MgGraph
# Run it:
# .\Get-MFAStatus.ps1 -ExportPath "C:\Reports\MFA-Report.csv"For large tenants (1000+ users) the per-user loop can take 10-30 minutes because it makes one Graph call per user; run it during off-hours. The default $ExportPath writes to C:\Reports\ - change it if that folder is unavailable. Temporary Access Pass is intentionally not counted as durable MFA capability here.
Analyze the report and identify compliance gaps
Interpret the results to find users without strong MFA and calculate a compliance rate.
Re-import the CSV you generated, then filter it to surface risk. First list active users who are not MFA-capable, then flag users whose only method is email, and finally calculate the compliance percentage across active accounts.
Export a focused priority list of accounts that need remediation so you can hand it to the team responsible for follow-up.
$mfaReport = Import-Csv -Path "C:\Reports\MFA-Report.csv"
# Active users without MFA capability
$nonMFAUsers = $mfaReport | Where-Object {$_.MFACapable -eq "False" -and $_.AccountEnabled -eq "True"}
$nonMFAUsers | Select-Object DisplayName, UserPrincipalName, RegisteredMethods | Format-Table -AutoSize
# Users with only email registered
$emailOnlyUsers = $mfaReport | Where-Object {$_.RegisteredMethods -eq "Email" -and $_.AccountEnabled -eq "True"}
$emailOnlyUsers | Select-Object DisplayName, UserPrincipalName | Format-Table -AutoSize
# Compliance percentage across active users
$totalActiveUsers = ($mfaReport | Where-Object {$_.AccountEnabled -eq "True"}).Count
$mfaCapableUsers = ($mfaReport | Where-Object {$_.MFACapable -eq "True" -and $_.AccountEnabled -eq "True"}).Count
$compliancePercentage = [math]::Round(($mfaCapableUsers / $totalActiveUsers) * 100, 2)
Write-Host "Compliance rate: $compliancePercentage% ($mfaCapableUsers / $totalActiveUsers active users)"
# Priority action list
$priorityUsers = $mfaReport | Where-Object {
$_.AccountEnabled -eq "True" -and ($_.MFACapable -eq "False" -or $_.RegisteredMethods -eq "Email")
} | Select-Object DisplayName, UserPrincipalName, RegisteredMethods, UserCreated
$priorityUsers | Export-Csv -Path "C:\Reports\MFA-Priority-Actions.csv" -NoTypeInformationCSV columns import as strings, so compare against "True"/"False" (quoted) rather than boolean $true/$false. To track adoption over time, schedule the report script as a recurring Windows Scheduled Task and compare the compliance rate month over month.
How to Read Your MFA Status Results
Once you have followed the admin center view, the single-user query, and the tenant-wide script, you will have three consistent signals for the same underlying data: the Multifactor authentication capable column in User registration details, the authentication-method objects returned by Get-MgUserAuthenticationMethod, and the MFACapable / RegisteredMethods columns in your exported CSV.
The key thing to interpret is capability versus enforcement. A user marked Multifactor authentication capable (or MFACapable = True) has at least one registered method that Entra ID can use for a strong second factor - such as Microsoft Authenticator, a phone method, a FIDO2 security key, a software OATH token, or Windows Hello for Business. It does not by itself prove that MFA is being enforced at sign-in; enforcement depends on your Conditional Access or security-defaults configuration. Methods like Email and Temporary Access Pass appear in Methods registered but do not, on their own, make a user MFA-capable - treat email-only users as a gap, not as covered.
Work from the summary numbers down: read the compliance rate first, then drill into the priority list of enabled accounts that are non-capable or email-only. Ignore disabled accounts (AccountEnabled = False) when calculating your true exposure, since they cannot sign in.
- A healthy tenant shows most enabled accounts with MFACapable = True and a strong default method (Microsoft Authenticator or FIDO2), a compliance rate at or near your target, and only disabled or service-style accounts appearing without strong methods.
- Enabled, active users show MFACapable = False, RegisteredMethods = Email only, or an empty method list. A low compliance rate or a growing priority-action list indicates registration gaps that need remediation before MFA enforcement.
- Ideal state - the user has at least one strong second factor and is ready for MFA enforcement.
- Email is not a strong factor, so the account is not MFA-capable and belongs on the priority-action list.
- An empty Get-MgUserAuthenticationMethod result usually means the user has registered nothing yet - or that the session lacks UserAuthenticationMethod.Read.All.
- Read this first to gauge overall exposure before investigating individual accounts.
Troubleshooting
Connect-MgGraph fails or prompts for consent you cannot grant
Cause: The signed-in account lacks the delegated scopes (User.Read.All, UserAuthenticationMethod.Read.All, AuditLog.Read.All) or an admin has not consented to them for the Microsoft Graph PowerShell app in the tenant.
Sign in with an account that holds Global Administrator or a role that can grant admin consent, then re-run Connect-MgGraph -Scopes "User.Read.All", "UserAuthenticationMethod.Read.All", "AuditLog.Read.All" and approve the consent prompt. Confirm the granted scopes afterwards with Get-MgContext.
Get-MgUserAuthenticationMethod returns an empty result for a user
Cause: Either the user genuinely has no authentication methods registered, or the current session is missing the UserAuthenticationMethod.Read.All scope.
Run Get-MgContext and verify UserAuthenticationMethod.Read.All is listed under Scopes. If it is missing, reconnect with the full scope set. If the scope is present and the result is still empty, the user has no MFA methods registered and should be added to your remediation list.
The tenant-wide script runs for a very long time or appears to hang
Cause: Get-MFAStatus.ps1 makes a Graph call per user, so runtime scales with tenant size - large tenants (1000+ users) can take 10-30 minutes.
Let the Write-Progress bar confirm the script is still processing, and run it during off-hours. For repeat runs, schedule it as a Windows Task rather than running interactively.
Compliance filters in the analysis step return zero rows
Cause: CSV values are imported as strings, so boolean comparisons like -eq $true silently fail; the columns actually contain the text "True" and "False".
Compare against string literals when filtering imported CSV data, e.g. Where-Object {$_.MFACapable -eq "False" -and $_.AccountEnabled -eq "True"}, exactly as shown in the analysis script.
Module install fails with a repository or execution policy error
Cause: PowerShell is not running elevated, the PSGallery repository is untrusted, or the execution policy blocks module import.
Open PowerShell as Administrator and run the Install-Module Microsoft.Graph -Repository PSGallery -Force commands. If prompted about an untrusted repository, confirm the install, and set an appropriate execution policy for the session if the script is blocked.
Frequently asked questions
What admin role do I need to check MFA status in Microsoft Entra ID?
You need an account with Authentication Administrator or Global Administrator privileges to view User registration details in the Microsoft Entra admin center. The same roles provide the rights needed to consent to the Graph scopes used for PowerShell reporting.
How do I check MFA status for all users at once?
For a tenant-wide view, run the Get-MFAStatus.ps1 script, which enumerates every user with Get-MgUser -All, evaluates each user's authentication methods, and exports the results to CSV. In the GUI, the User registration details table under Protection > Authentication methods lists all users and their MFA-capable status.
Which Microsoft Graph PowerShell permissions are required to read authentication methods?
Connect with the scopes User.Read.All, UserAuthenticationMethod.Read.All, and AuditLog.Read.All. The UserAuthenticationMethod.Read.All scope is specifically what allows Get-MgUserAuthenticationMethod to return each user's registered methods.
What does the 'Multifactor authentication capable' column mean in User registration details?
It indicates that the user has at least one authentication method registered that can satisfy an MFA requirement, such as Microsoft Authenticator, a phone method, FIDO2, or a software OATH token. A green checkmark in this column identifies users who can complete MFA.
Why does Get-MgUserAuthenticationMethod return an empty result for a user?
An empty result usually means the user has no authentication methods registered, or your session lacks the UserAuthenticationMethod.Read.All scope. Verify your scopes with Get-MgContext before concluding that the user has no MFA configured.
How can I export a Microsoft Entra ID MFA report to CSV?
Run Get-MFAStatus.ps1 with the -ExportPath parameter, for example .\Get-MFAStatus.ps1 -ExportPath "C:\Reports\MFA-Report.csv". The script builds a result object per user and writes it out with Export-Csv -NoTypeInformation -Encoding UTF8.






