private/entraid/Get-EidConditionalAccessPolicyGrant.ps1
function Get-EidConditionalAccessPolicyGrant { <# .SYNOPSIS Get Entra conditional access policy grants. .DESCRIPTION Get grants from a conditional access policy (e.g. MFA, compliant device, etc.). .PARAMETER PolicyId Guid format such as "0ee5b3dc-f9ce-4414-b93b-aea03ef7e108" (without quotes). .EXAMPLE Get-EidConditionalAccessPolicyGrant -PolicyId "0ee5b3dc-f9ce-4414-b93b-aea03ef7e108"; #> [cmdletbinding()] [OutputType([PSCustomObject])] param ( # Policy ID. [Parameter(Mandatory = $true, Position = 0, ValueFromPipelineByPropertyName = $true)] [ValidateNotNullOrEmpty()] [ValidateScript({ Test-Guid -InputObject $_ })] [string]$PolicyId ) begin { # Write to log. $customProgress = Write-CustomProgress -Activity $MyInvocation.MyCommand.Name -CurrentOperation ('Retrieving Entra conditional access policy grants for policy ({0})' -f $PolicyId); # Get conditional access policy by id. $entraConditionalAccessPolicy = Get-EntraConditionalAccessPolicy ` -PolicyId $PolicyId ` -ErrorAction SilentlyContinue; # If policy is null. if ($null -eq $entraConditionalAccessPolicy) { # Write to log. Write-CustomLog -Message ("No conditional access policy found with ID '{0}'" -f $PolicyId) -Level 'Verbose'; # Throw exception. throw "No conditional access policy found with ID '$PolicyId'"; } # Get grant controls. $grantControls = $entraConditionalAccessPolicy.GrantControls; # Create custom object. $result = [PSCustomObject]@{ 'BlockAccess' = $false; 'GrantAccess' = $false; 'RequireMfa' = $false; 'RequireAuthenticationStrength' = $false; 'AuthenticationStrength' = [PSCustomObject]@{ 'RegularMFA' = $false; 'PasswordlessMFA' = $false; 'PhishResistantMFA' = $false; }; 'RequireDeviceCompliance' = $false; 'RequireHybridAzureADJoinedDevice' = $false; 'RequireAppProtectionPolicy' = $false; 'RequireAllControls' = $false; 'RequireOneOfControls' = $false; }; } process { # If MFA is required. if ($grantControls.BuiltInControls -contains 'mfa') { # Set RequireMfa to true. $result.RequireMfa = $true; } # If authentication strength MFA is required. if ($grantControls.AuthenticationStrength.Id -eq '00000000-0000-0000-0000-000000000002') { # Set RequireAuthenticationStrength to true. $result.RequireAuthenticationStrength = $true; # Set RegularMFA to true. $result.AuthenticationStrength.RegularMFA = $true; } # If authentication strength passwordless MFA is required. if ($grantControls.AuthenticationStrength.Id -eq '00000000-0000-0000-0000-000000000003') { # Set RequireAuthenticationStrength to true. $result.RequireAuthenticationStrength = $true; # Set passwordless MFA to true. $result.AuthenticationStrength.PasswordlessMFA = $true; } # If authentication strength phish resistant MFA is required. if ($grantControls.AuthenticationStrength.Id -eq '00000000-0000-0000-0000-000000000004') { # Set RequireAuthenticationStrength to true. $result.RequireAuthenticationStrength = $true; # Set PhishResistantMFA to true. $result.AuthenticationStrength.PhishResistantMFA = $true; } # If device compliance is required. if ($grantControls.BuiltInControls -contains 'compliantDevice') { # Set RequireDeviceCompliance to true. $result.RequireDeviceCompliance = $true; } # If hybrid Azure AD joined device is required. if ($grantControls.BuiltInControls -contains 'domainJoinedDevice') { # Set RequireHybridAzureADJoinedDevice to true. $result.RequireHybridAzureADJoinedDevice = $true; } # If app protection policy is required. if ($grantControls.BuiltInControls -contains 'compliantApplication') { # Set RequireAppProtectionPolicy to true. $result.RequireAppProtectionPolicy = $true; } # If only one control is required. if ($grantControls.Operator -eq 'OR') { # Set RequireOneOfControls to true. $result.RequireOneOfControls = $true; } # If all controls are required. if ($grantControls.Operator -eq 'AND') { # Set RequireAllControls to true. $result.RequireAllControls = $true; } } end { # Write to log. Write-CustomProgress @customProgress; # Return result. return $result; } } |