private/entraid/Get-EidConditionalAccessMfaPolicy.ps1
function Get-EidConditionalAccessMfaPolicy { <# .SYNOPSIS Get Entra conditional access policies that require MFA. .DESCRIPTION Return conditional access policies that require multi-factor authentication. .EXAMPLE Get-EidConditionalAccessMfaPolicy; #> [cmdletbinding()] [OutputType([PSCustomObject])] param ( ) begin { # Write to log. $customProgress = Write-CustomProgress -Activity $MyInvocation.MyCommand.Name -CurrentOperation ('Retrieving Entra conditional access policies that require MFA' -f $PolicyId); # Get all conditional access policies. $conditionalAccessPolicies = Get-EidConditionalAccessPolicy; # Object array to store policies that require multi-factor authentication. $result = @(); } process { # Foreach conditional access policy. foreach ($conditionalAccessPolicy in $conditionalAccessPolicies) { # If the conditional access policy is not enabled. if ('Enabled' -ne $conditionalAccessPolicy.State) { # Write to log. Write-CustomLog -Message ("Skipping conditional access policy '{0}', because it's not enabled" -f $conditionalAccessPolicy.DisplayName) -Level 'Verbose'; # Continue to the next conditional access policy. continue; } # If the conditional access does not require multi-factor authentication. if ($false -eq $conditionalAccessPolicy.Grant.RequireMfa -and $false -eq $conditionalAccessPolicy.Grant.RequireAuthenticationStrength) { # Write to log. Write-CustomLog -Message ("Skipping conditional access policy '{0}', because it do not require MFA" -f $conditionalAccessPolicy.DisplayName) -Level 'Verbose'; # Continue to the next conditional access policy. continue; } # If the conditional access dont include either all applications or "Office 365" and "Microsoft Admin Portals". if ($false -eq $conditionalAccessPolicy.TargetResources.IncludeAllApplications -and (($conditionalAccessPolicy.TargetResources.TargetedApplications).DisplayName -notcontains 'Office365' -or ($conditionalAccessPolicy.TargetResources.TargetedApplications).DisplayName -notcontains 'MicrosoftAdminPortals')) { # Write to log. Write-CustomLog -Message ("Skipping conditional access policy '{0}', because it do not target all or best-practice cloud applications" -f $conditionalAccessPolicy.DisplayName) -Level 'Verbose'; # Continue to the next conditional access policy. continue; } # If the conditional access policy does not target all network locations. if ($true -eq $conditionalAccessPolicy.Network.IsConfigured -and $false -eq $conditionalAccessPolicy.Network.IncludeAnyNetworkOrLocation) { # Write to log. Write-CustomLog -Message ("Skipping conditional access policy '{0}', because it do not target all network locations" -f $conditionalAccessPolicy.DisplayName) -Level 'Verbose'; # Continue to the next conditional access policy. continue; } # If the conditional access exclude one or more device platforms. if ($true -eq $conditionalAccessPolicy.Conditions.DevicePlatforms.IsConfigured -and $conditionalAccessPolicy.Conditions.DevicePlatforms.ExcludePlatform.Count -gt 0) { # Write to log. Write-CustomLog -Message ("Skipping conditional access policy '{0}', because it exclude one or more device platforms" -f $conditionalAccessPolicy.DisplayName) -Level 'Verbose'; # Continue to the next conditional access policy. continue; } # If the conditional access policy exclude one or more client app types. if ($true -eq $conditionalAccessPolicy.Conditions.ClientApps.IsConfigured -and $conditionalAccessPolicy.Conditions.ClientApps.ExcludedClientApps.Count -gt 0) { # Write to log. Write-CustomLog -Message ("Skipping conditional access policy '{0}', because it exclude one or more client app types" -f $conditionalAccessPolicy.DisplayName) -Level 'Verbose'; # Continue to the next conditional access policy. continue; } # If the conditional access have user risk condition configured. if ($true -eq $conditionalAccessPolicy.Conditions.UserRiskLevels.IsConfigured) { # Write to log. Write-CustomLog -Message ("Skipping conditional access policy '{0}', because it have user risk condition configured" -f $conditionalAccessPolicy.DisplayName) -Level 'Verbose'; # Continue to the next conditional access policy. continue; } # If the conditional access have sign-in risk condition configured. if ($true -eq $conditionalAccessPolicy.Conditions.SignInRiskLevels.IsConfigured) { # Write to log. Write-CustomLog -Message ("Skipping conditional access policy '{0}', because it have sign-in risk condition configured" -f $conditionalAccessPolicy.DisplayName) -Level 'Verbose'; # Continue to the next conditional access policy. continue; } # Add the conditional access policy to the object array. $result += $conditionalAccessPolicy; } } end { # Write to log. Write-CustomProgress @customProgress; # Return result. return $result; } } |