2023-10-06 17:57:48 +05:30
<#
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Name : Export Office 365 MFA status report
2024-05-24 15:42:59 +05:30
Description : This script exports Microsoft 365 MFA status report based on per-user MFA configuration
Version : 2.3
2023-10-06 17:57:48 +05:30
website : o365reports . com
Script Highlights :
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2024-05-24 15:42:59 +05:30
1 . Generates reports based on MFA status .
2 . Result can be filter ed based on Admin users .
3 . You can filter result to display Licensed users alone .
4 . You can filter result based on Sign-in Status ( SignIn allowed / denied ) .
5 . The script produces different output files based on MFA status .
6 . The script can be executed with MFA enabled account .
7 . Exports result to CSV file .
8 . Using the 'Admin Roles' column , you can find users with admin roles that are not protected with MFA . For example , you can find Global Admins without MFA .
9 . The script is scheduler friendly . i . e . , credentials can be passed as parameter instead of saving inside the script .
2023-10-06 17:57:48 +05:30
For detailed Script execution : https : / / o365reports . com / 2019 / 05 / 09 / export-office - 365 -users -mfa -status -csv
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
#>
Param
2019-11-01 15:00:50 +05:30
(
[ Parameter ( Mandatory = $false ) ]
[ switch ] $DisabledOnly ,
[ switch ] $EnabledOnly ,
[ switch ] $EnforcedOnly ,
[ switch ] $AdminOnly ,
[ switch ] $LicensedUserOnly ,
[ Nullable[boolean] ] $SignInAllowed = $null ,
2019-11-23 12:28:42 +05:30
[ string ] $UserName ,
2019-11-01 15:00:50 +05:30
[ string ] $Password
)
#Check for MSOnline module
2019-11-23 12:28:42 +05:30
$Modules = Get-Module -Name MSOnline -ListAvailable
2019-11-01 15:00:50 +05:30
if ( $Modules . count -eq 0 )
{
2019-11-23 12:28:42 +05:30
Write-Host Please install MSOnline module using below command : ` nInstall-Module MSOnline -ForegroundColor yellow
2019-11-01 15:00:50 +05:30
Exit
}
2019-11-23 12:28:42 +05:30
#Storing credential in script for scheduling purpose/ Passing credential as parameter
if ( ( $UserName -ne " " ) -and ( $Password -ne " " ) )
{
$SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force
$Credential = New-Object System . Management . Automation . PSCredential $UserName , $SecuredPassword
2019-11-01 15:00:50 +05:30
Connect-MsolService -Credential $credential
2019-11-23 12:28:42 +05:30
}
else
{
Connect-MsolService | Out-Null
}
$Result = " "
$Results = @ ( )
2019-11-01 15:00:50 +05:30
$UserCount = 0
$PrintedUser = 0
#Output file declaration
$ExportCSV = " .\MFADisabledUserReport_ $( ( Get-Date -format yyyy-MMM -dd -ddd ` hh-mm ` tt ) . ToString ( ) ) .csv "
$ExportCSVReport = " .\MFAEnabledUserReport_ $( ( Get-Date -format yyyy-MMM -dd -ddd ` hh-mm ` tt ) . ToString ( ) ) .csv "
#Loop through each user
Get-MsolUser -All | foreach {
$UserCount + +
$DisplayName = $_ . DisplayName
$Upn = $_ . UserPrincipalName
$MFAStatus = $_ . StrongAuthenticationRequirements . State
$MethodTypes = $_ . StrongAuthenticationMethods
2019-11-23 12:28:42 +05:30
$RolesAssigned = " "
2019-11-01 15:00:50 +05:30
Write-Progress -Activity " `n Processed user count: $UserCount " ` n " Currently Processing: $DisplayName "
if ( $_ . BlockCredential -eq " True " )
2019-11-23 12:28:42 +05:30
{
2019-11-01 15:00:50 +05:30
$SignInStatus = " False "
2019-12-04 12:43:55 +05:30
$SignInStat = " Denied "
2019-11-01 15:00:50 +05:30
}
else
{
$SignInStatus = " True "
2019-12-04 12:43:55 +05:30
$SignInStat = " Allowed "
2019-11-01 15:00:50 +05:30
}
2019-11-23 12:28:42 +05:30
2019-11-01 15:00:50 +05:30
#Filter result based on SignIn status
if ( ( $SignInAllowed -ne $null ) -and ( [ string ] $SignInAllowed -ne [ string ] $SignInStatus ) )
{
return
}
#Filter result based on License status
if ( ( $LicensedUserOnly . IsPresent ) -and ( $_ . IsLicensed -eq $False ) )
{
return
}
2019-12-04 12:43:55 +05:30
if ( $_ . IsLicensed -eq $true )
{
$LicenseStat = " Licensed "
}
else
{
$LicenseStat = " Unlicensed "
}
2019-11-01 15:00:50 +05:30
#Check for user's Admin role
$Roles = ( Get-MsolUserRole -UserPrincipalName $upn ) . Name
2019-11-23 12:28:42 +05:30
if ( $Roles . count -eq 0 )
{
$RolesAssigned = " No roles "
$IsAdmin = " False "
}
2019-11-01 15:00:50 +05:30
else
{
$IsAdmin = " True "
2019-11-23 12:28:42 +05:30
foreach ( $Role in $Roles )
{
$RolesAssigned = $RolesAssigned + $Role
if ( $Roles . indexof ( $role ) -lt ( ( $Roles . count ) -1 ) )
{
$RolesAssigned = $RolesAssigned + " , "
}
}
2019-11-01 15:00:50 +05:30
}
2019-11-23 12:28:42 +05:30
2019-11-01 15:00:50 +05:30
#Filter result based on Admin users
if ( ( $AdminOnly . IsPresent ) -and ( [ string ] $IsAdmin -eq " False " ) )
{
return
}
#Check for MFA enabled user
2024-05-24 15:42:59 +05:30
if ( ( $MFAStatus -ne $Null ) -and ( -Not ( $DisabledOnly . IsPresent ) ) )
2019-11-01 15:00:50 +05:30
{
#Filter result based on EnforcedOnly filter
2024-05-24 15:42:59 +05:30
if ( ( [ string ] $MFAStatus -eq " Enabled " ) -and ( $EnforcedOnly . IsPresent ) )
2019-11-23 12:28:42 +05:30
{
2019-11-01 15:00:50 +05:30
return
}
2019-11-23 12:28:42 +05:30
2019-11-01 15:00:50 +05:30
#Filter result based on EnabledOnly filter
if ( ( [ string ] $MFAStatus -eq " Enforced " ) -and ( $EnabledOnly . IsPresent ) )
2019-11-23 12:28:42 +05:30
{
2019-11-01 15:00:50 +05:30
return
}
$Methods = " "
$MethodTypes = " "
$MethodTypes = $_ . StrongAuthenticationMethods . MethodType
$DefaultMFAMethod = ( $_ . StrongAuthenticationMethods | where { $_ . IsDefault -eq " True " } ) . MethodType
$MFAPhone = $_ . StrongAuthenticationUserDetails . PhoneNumber
$MFAEmail = $_ . StrongAuthenticationUserDetails . Email
if ( $MFAPhone -eq $Null )
{ $MFAPhone = " - " }
if ( $MFAEmail -eq $Null )
{ $MFAEmail = " - " }
if ( $MethodTypes -ne $Null )
{
$ActivationStatus = " Yes "
foreach ( $MethodType in $MethodTypes )
{
if ( $Methods -ne " " )
{
$Methods = $Methods + " , "
}
$Methods = $Methods + $MethodType
}
}
else
2019-11-23 12:28:42 +05:30
{
2019-11-01 15:00:50 +05:30
$ActivationStatus = " No "
$Methods = " - "
$DefaultMFAMethod = " - "
$MFAPhone = " - "
$MFAEmail = " - "
}
#Print to output file
$PrintedUser + +
2019-12-04 12:43:55 +05:30
$Result = @ { 'DisplayName' = $DisplayName ; 'UserPrincipalName' = $upn ; 'MFAStatus' = $MFAStatus ; 'ActivationStatus' = $ActivationStatus ; 'DefaultMFAMethod' = $DefaultMFAMethod ; 'AllMFAMethods' = $Methods ; 'MFAPhone' = $MFAPhone ; 'MFAEmail' = $MFAEmail ; 'LicenseStatus' = $LicenseStat ; 'IsAdmin' = $IsAdmin ; 'AdminRoles' = $RolesAssigned ; 'SignInStatus' = $SigninStat }
2019-11-23 12:28:42 +05:30
$Results = New-Object PSObject -Property $Result
$Results | Select-Object DisplayName , UserPrincipalName , MFAStatus , ActivationStatus , DefaultMFAMethod , AllMFAMethods , MFAPhone , MFAEmail , LicenseStatus , IsAdmin , AdminRoles , SignInStatus | Export-Csv -Path $ExportCSVReport -Notype -Append
2019-11-01 15:00:50 +05:30
}
2019-11-23 12:28:42 +05:30
#Check for MFA disabled user
2019-11-01 15:00:50 +05:30
elseif ( ( $DisabledOnly . IsPresent ) -and ( $MFAStatus -eq $Null ) -and ( $_ . StrongAuthenticationMethods . MethodType -eq $Null ) )
{
$MFAStatus = " Disabled "
$Department = $_ . Department
if ( $Department -eq $Null )
{ $Department = " - " }
$PrintedUser + +
2019-12-04 12:43:55 +05:30
$Result = @ { 'DisplayName' = $DisplayName ; 'UserPrincipalName' = $upn ; 'Department' = $Department ; 'MFAStatus' = $MFAStatus ; 'LicenseStatus' = $LicenseStat ; 'IsAdmin' = $IsAdmin ; 'AdminRoles' = $RolesAssigned ; 'SignInStatus' = $SigninStat }
2019-11-23 12:28:42 +05:30
$Results = New-Object PSObject -Property $Result
$Results | Select-Object DisplayName , UserPrincipalName , Department , MFAStatus , LicenseStatus , IsAdmin , AdminRoles , SignInStatus | Export-Csv -Path $ExportCSV -Notype -Append
2019-11-01 15:00:50 +05:30
}
}
2019-11-23 12:28:42 +05:30
#Open output file after execution
2019-11-01 15:00:50 +05:30
Write-Host ` nScript executed successfully
2023-10-06 17:57:48 +05:30
2019-11-01 15:00:50 +05:30
if ( ( Test-Path -Path $ExportCSV ) -eq " True " )
{
2023-10-06 17:57:48 +05:30
Write-Host " MFA Disabled user report available in: " -NoNewline -ForegroundColor Yellow
Write-Host $ExportCSV ` n
2019-11-23 12:28:42 +05:30
$Prompt = New-Object -ComObject wscript . shell
$UserInput = $Prompt . popup ( " Do you want to open output file? " , `
0 , " Open Output File " , 4 )
If ( $UserInput -eq 6 )
{
Invoke-Item " $ExportCSV "
}
2019-11-01 15:00:50 +05:30
Write-Host Exported report has $PrintedUser users
}
elseif ( ( Test-Path -Path $ExportCSVReport ) -eq " True " )
{
2023-10-06 17:57:48 +05:30
Write-Host " "
Write-Host " MFA Enabled user report available in: " -NoNewline -ForegroundColor Yellow
Write-Host $ExportCSVReport ` n
2019-11-23 12:28:42 +05:30
$Prompt = New-Object -ComObject wscript . shell
$UserInput = $Prompt . popup ( " Do you want to open output file? " , `
0 , " Open Output File " , 4 )
If ( $UserInput -eq 6 )
{
Invoke-Item " $ExportCSVReport "
}
2023-10-06 17:57:48 +05:30
Write-Host Exported report has $PrintedUser users
Write-Host ` n ~ ~ Script prepared by AdminDroid Community ~ ~ ` n -ForegroundColor Green
Write-Host " ~~ Check out " -NoNewline -ForegroundColor Green ; Write-Host " admindroid.com " -ForegroundColor Yellow -NoNewline ; Write-Host " to get access to 1800+ Microsoft 365 reports. ~~ " -ForegroundColor Green ` n ` n
2019-11-01 15:00:50 +05:30
}
Else
{
2023-10-06 17:57:48 +05:30
Write-Host No user found that matches your criteria .
Write-Host ` n ~ ~ Script prepared by AdminDroid Community ~ ~ ` n -ForegroundColor Green
Write-Host " ~~ Check out " -NoNewline -ForegroundColor Green ; Write-Host " admindroid.com " -ForegroundColor Yellow -NoNewline ; Write-Host " to get access to 1800+ Microsoft 365 reports. ~~ " -ForegroundColor Green ` n ` n
2019-11-01 15:00:50 +05:30
}
2019-11-23 12:28:42 +05:30
#Clean up session
Get-PSSession | Remove-PSSession