Nützliches PowerShell-Skript: Sicherheitsinformationen der MFA-Methoden in Microsoft Entra/Identitäten als CSV speichern
Oktober 18, 2023
Die Verwaltung von Multi-Faktor-Authentifizierung (MFA) in Microsoft Entra ID (früher Azure AD) ist entscheidend für die Sicherheit in Ihrem Unternehmen. Ein wichtiger Aspekt dabei ist der Überblick über die eingerichteten MFA-Methoden aller Benutzer. Mit einem PowerShell-Skript können Sie diese Informationen effizient auslesen und als CSV-Datei speichern, um sie später zu analysieren oder zu dokumentieren.
Mit einem solchen Skript können Sie:
- Alle Benutzer und deren MFA-Methoden auflisten: Erhalten Sie eine vollständige Übersicht über die in Microsoft Entra eingerichteten Sicherheitsinformationen.
- Datenexport in CSV: Speichern Sie die Informationen als CSV-Datei, um sie in Excel oder anderen Tools weiterzuverarbeiten.
- Einfache Verwaltung und Analyse: Nutzen Sie die CSV-Datei, um Sicherheitslücken zu identifizieren oder die Konformität mit Unternehmensrichtlinien zu prüfen.
Dieses Skript ist besonders nützlich für IT-Administratoren, die die Sicherheit ihrer Microsoft Entra-Umgebung optimieren und sicherstellen möchten, dass alle Benutzer ordnungsgemäß geschützt sind.
Führen Sie das PowerShell-Skript aus und behalten Sie die Kontrolle über die Sicherheitskonfigurationen Ihrer Benutzer – eine unverzichtbare Maßnahme in der heutigen, von Cyberbedrohungen geprägten Welt.
Param
(
[Parameter(Mandatory = $false)]
[switch]$CreateSession,
[switch]$MFAEnabled,
[switch]$MFADisabled,
[switch]$LicensedUsersOnly,
[switch]$SignInAllowedUsersOnly
)
Function Connect_MgGraph
{
#Check for module installation
$Module=Get-Module -Name microsoft.graph -ListAvailable
if($Module.count -eq 0)
{
Write-Host Microsoft Graph PowerShell SDK is not available -ForegroundColor yellow
$Confirm= Read-Host Are you sure you want to install module? [Y] Yes [N] No
if($Confirm -match "[yY]")
{
Write-host "Installing Microsoft Graph PowerShell module..."
Install-Module Microsoft.Graph -Repository PSGallery -Scope CurrentUser -AllowClobber -Force
}
else
{
Write-Host "Microsoft Graph PowerShell module is required to run this script. Please install module using Install-Module Microsoft.Graph cmdlet."
Exit
}
}
#Disconnect Existing MgGraph session
if($CreateSession.IsPresent)
{
Disconnect-MgGraph
}
#Connecting to MgGraph beta
Select-MgProfile -Name beta
Write-Host Connecting to Microsoft Graph...
Connect-MgGraph -Scopes "User.Read.All","UserAuthenticationMethod.Read.All"
}
Connect_MgGraph
if((Get-MgContext) -ne "")
{
Write-Host Connected to Microsoft Graph PowerShell using (Get-MgContext).Account account -ForegroundColor Yellow
}
$ProcessedUserCount=0
$ExportCount=0
#Set output file
$ExportCSV=".\MfaStatusReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
$Result=""
$Results=@()
#Get all users
Get-MgUser -All -Filter "UserType eq 'Member'" | foreach {
$ProcessedUserCount++
$Name= $_.DisplayName
$UPN=$_.UserPrincipalName
$Department=$_.Department
if($_.AccountEnabled -eq $true)
{
$SigninStatus="Allowed"
}
else
{
$SigninStatus="Blocked"
}
if(($_.AssignedLicenses).Count -ne 0)
{
$LicenseStatus="Licensed"
}
else
{
$LicenseStatus="Unlicensed"
}
$Is3rdPartyAuthenticatorUsed="False"
$MFAPhone="-"
$MicrosoftAuthenticatorDevice="-"
Write-Progress -Activity "`n Processed users count: $ProcessedUserCount "`n" Currently processing user: $Name"
[array]$MFAData=Get-MgUserAuthenticationMethod -UserId $UPN
$AuthenticationMethod=@()
$AdditionalDetails=@()
foreach($MFA in $MFAData)
{
Switch ($MFA.AdditionalProperties["@odata.type"])
{
"#microsoft.graph.passwordAuthenticationMethod"
{
$AuthMethod = 'PasswordAuthentication'
$AuthMethodDetails = $MFA.AdditionalProperties["displayName"]
}
"#microsoft.graph.microsoftAuthenticatorAuthenticationMethod"
{ # Microsoft Authenticator App
$AuthMethod = 'AuthenticatorApp'
$AuthMethodDetails = $MFA.AdditionalProperties["displayName"]
$MicrosoftAuthenticatorDevice=$MFA.AdditionalProperties["displayName"]
}
"#microsoft.graph.phoneAuthenticationMethod"
{ # Phone authentication
$AuthMethod = 'PhoneAuthentication'
$AuthMethodDetails = $MFA.AdditionalProperties["phoneType", "phoneNumber"] -join ' '
$MFAPhone=$MFA.AdditionalProperties["phoneNumber"]
}
"#microsoft.graph.fido2AuthenticationMethod"
{ # FIDO2 key
$AuthMethod = 'Fido2'
$AuthMethodDetails = $MFA.AdditionalProperties["model"]
}
"#microsoft.graph.windowsHelloForBusinessAuthenticationMethod"
{ # Windows Hello
$AuthMethod = 'WindowsHelloForBusiness'
$AuthMethodDetails = $MFA.AdditionalProperties["displayName"]
}
"#microsoft.graph.emailAuthenticationMethod"
{ # Email Authentication
$AuthMethod = 'EmailAuthentication'
$AuthMethodDetails = $MFA.AdditionalProperties["emailAddress"]
}
"microsoft.graph.temporaryAccessPassAuthenticationMethod"
{ # Temporary Access pass
$AuthMethod = 'TemporaryAccessPass'
$AuthMethodDetails = 'Access pass lifetime (minutes): ' + $MFA.AdditionalProperties["lifetimeInMinutes"]
}
"#microsoft.graph.passwordlessMicrosoftAuthenticatorAuthenticationMethod"
{ # Passwordless
$AuthMethod = 'PasswordlessMSAuthenticator'
$AuthMethodDetails = $MFA.AdditionalProperties["displayName"]
}
"#microsoft.graph.softwareOathAuthenticationMethod"
{
$AuthMethod = 'SoftwareOath'
$Is3rdPartyAuthenticatorUsed="True"
}
}
$AuthenticationMethod +=$AuthMethod
if($AuthMethodDetails -ne $null)
{
$AdditionalDetails +="$AuthMethod : $AuthMethodDetails"
}
}
#To remove duplicate authentication methods
$AuthenticationMethod =$AuthenticationMethod | Sort-Object | Get-Unique
$AuthenticationMethods= $AuthenticationMethod -join ","
$AdditionalDetail=$AdditionalDetails -join ", "
$Print=1
#Determine MFA status
[array]$StrongMFAMethods=("Fido2","PhoneAuthentication","PasswordlessMSAuthenticator","AuthenticatorApp","WindowsHelloForBusiness")
$MFAStatus="Disabled"
foreach($StrongMFAMethod in $StrongMFAMethods)
{
if($AuthenticationMethod -contains $StrongMFAMethod)
{
$MFAStatus="Strong"
break
}
}
if(($MFAStatus -ne "Strong") -and ($AuthenticationMethod -contains "SoftwareOath"))
{
$MFAStatus="Weak"
}
#Filter result based on MFA status
if($MFADisabled.IsPresent -and $MFAStatus -ne "Disabled")
{
$Print=0
}
if($MFAEnabled.IsPresent -and $MFAStatus -eq "Disabled")
{
$Print=0
}
#Filter result based on license status
if($LicensedUsersOnly.IsPresent -and ($LicenseStatus -eq "Unlicensed"))
{
$Print=0
}
#Filter result based on signin status
if($SignInAllowedUsersOnly.IsPresent -and ($SigninStatus -eq "Blocked"))
{
$Print=0
}
if($Print -eq 1)
{
$ExportCount++
$Result=@{'Name'=$Name;'UPN'=$UPN;'Department'=$Department;'License Status'=$LicenseStatus;'SignIn Status'=$SigninStatus;'Authentication Methods'=$AuthenticationMethods;'MFA Status'=$MFAStatus;'MFA Phone'=$MFAPhone;'Microsoft Authenticator Configured Device'=$MicrosoftAuthenticatorDevice;'Is 3rd-Party Authenticator Used'=$Is3rdPartyAuthenticatorUsed;'Additional Details'=$AdditionalDetail}
$Results= New-Object PSObject -Property $Result
$Results | Select-Object Name,UPN,Department,'License Status','SignIn Status','Authentication Methods','MFA Status','MFA Phone','Microsoft Authenticator Configured Device','Is 3rd-Party Authenticator Used','Additional Details' | Export-Csv -Path $ExportCSV -Notype -Append
}
}
if((Test-Path -Path $ExportCSV) -eq "True")
{
Write-Host `nThe output file contains $ExportCount users.
Write-Host `nThe Output file available in the current working directory with name: $ExportCSV -ForegroundColor Green
Write-Host `n"For more Microsoft 365 PowerShell scripts, visit: https://o365reports.com"
$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"
}
}
else
{
Write-Host No users found
}