private/entra/Get-EntraConditionalAccessPolicyMfa.ps1
function Get-EntraConditionalAccessPolicyMfa { <# .SYNOPSIS Get one or more Entra conditional access policies that require MFA. .DESCRIPTION Return list of policies that require multi-factor authentication. .EXAMPLE Get-EntraConditionalAccessPolicyMfa; #> [cmdletbinding()] [OutputType([System.Array])] param ( [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [ValidateScript({ Test-Guid -InputObject $_ })] [string]$Id ) BEGIN { # Write to log. $customProgress = Write-CustomProgress -Activity $MyInvocation.MyCommand.Name -CurrentOperation 'Get Microsoft Entra conditional access policies that require MFA'; # If Id is not null. if (-not [string]::IsNullOrEmpty($Id)) { # Get conditional access policy. $conditionalAccessPolicies = Get-EntraConditionalAccessPolicy -PolicyId $Id -ErrorAction SilentlyContinue; } else { # Get conditional access policies. $conditionalAccessPolicies = Get-EntraConditionalAccessPolicy; } # Result object. $policies = @(); } PROCESS { # Write to log. Write-CustomLog -Message ('Found {0} conditional access policies' -f $conditionalAccessPolicies.Count) -Level 'Verbose'; # Foreach conditional access policy. foreach ($conditionalAccessPolicy in $conditionalAccessPolicies) { # Booleans. [bool]$requireMfa = $false; [bool]$requireAuthenticationStrength = $false; [bool]$includeAllApps = $false; # If policy requires MFA. if ('mfa' -in $conditionalAccessPolicy.GrantControls.BuiltInControls) { # Set to true. $requireMfa = $true; # Write to log. Write-CustomLog -Message ("Conditional access policy '{0}' requires multi-factor authentication" -f $conditionalAccessPolicy.Id) -Level 'Verbose'; } # Get authentication strengths. $authenticationStengths = $conditionalAccessPolicy.GrantControls.AuthenticationStrength; # Foreach authentication strength. foreach ($authenticationStength in $authenticationStengths) { # If there is at least one allowed combination. if ($authenticationStength.AllowedCombinations.Count -gt 0) { # Set to true. $requireAuthenticationStrength = $true; # Write to log. Write-CustomLog -Message ("Conditional access policy '{0}' requires authentication strength using '{1}'" -f $conditionalAccessPolicy.Id, $authenticationStength.DisplayName) -Level 'Verbose'; } } # If policy targets all apps. if ('All' -in $conditionalAccessPolicy.Conditions.Applications.IncludeApplications -and 'All' -notin $conditionalAccessPolicy.Conditions.Applications.ExcludeApplications) { # Set to true. $includeAllApps = $true; } # Array to store apps. $apps = @(); # Foreach app in included. foreach ($includedApp in $conditionalAccessPolicy.Conditions.Applications.IncludeApplications) { # If application is not in excluded. if ($includedApp -notin $conditionalAccessPolicy.Conditions.Applications.ExcludeApplications) { # Add to array. $apps += $includedApp; } } # Determine if the policy require MFA. if ($true -eq $requireMfa -or $true -eq $requireAuthenticationStrength) { # Object to store the policy. $policy = [PSCustomObject]@{ Id = $conditionalAccessPolicy.Id; Name = $conditionalAccessPolicy.DisplayName; State = $conditionalAccessPolicy.State; MFA = $requireMfa; AuthenticationStrength = $requireAuthenticationStrength; AllApps = $includeAllApps; Apps = $apps; }; # Add to result. $policies += $policy; } } } END { # Write to log. Write-CustomProgress @customProgress; # Return result. return $policies; } } |