Checks/Azure/Test-EntraPolicyGuestInviteOnlyForAdminRole.ps1

function Test-EntraPolicyGuestInviteOnlyForAdminRole {
    <#
    .SYNOPSIS
        Tests if guest invitations are restricted to admin roles.

    .DESCRIPTION
        This check verifies that the authorization policy setting 'allowInvitesFrom'
        is set to 'adminsAndGuestInviters' or 'none', restricting who can invite
        guest users to the organization.

        Valid values for allowInvitesFrom:
        - none: No one can invite guests
        - adminsAndGuestInviters: Only admins and users with Guest Inviter role
        - adminsGuestInvitersAndAllMembers: All members and above
        - everyone: Anyone including guests

    .PARAMETER CheckMetadata
        Hashtable containing check metadata including id and severity.

    .EXAMPLE
        Test-EntraPolicyGuestInviteOnlyForAdminRoles -CheckMetadata $metadata
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    param(
        [Parameter(Mandatory)]
        [hashtable]$CheckMetadata
    )

    $ErrorActionPreference = 'Stop'

    # Check if Authorization Policy data is available
    if (-not $script:EntraService.AuthorizationPolicy) {
        $findingParams = @{
            CheckMetadata  = $CheckMetadata
            Status         = 'SKIPPED'
            StatusExtended = 'Unable to retrieve authorization policy - missing permissions'
            ResourceId     = 'N/A'
            ResourceName   = 'Authorization Policy'
        }
        New-CIEMFinding @findingParams
    }
    else {
        # Authorization policy can be returned as an array, get the first item
        $authPolicy = if ($script:EntraService.AuthorizationPolicy -is [array]) {
            $script:EntraService.AuthorizationPolicy | Select-Object -First 1
        }
        else {
            $script:EntraService.AuthorizationPolicy
        }

        # Check the allowInvitesFrom setting
        $allowInvitesFrom = $authPolicy.allowInvitesFrom

        # Acceptable values are 'none' or 'adminsAndGuestInviters'
        $acceptableValues = @('none', 'adminsAndGuestInviters')

        if ($allowInvitesFrom -in $acceptableValues) {
            $findingParams = @{
                CheckMetadata  = $CheckMetadata
                Status         = 'PASS'
                StatusExtended = "Guest invite restrictions are properly configured. Current setting: '$allowInvitesFrom' - only users with admin roles can invite guest users."
                ResourceId     = $authPolicy.id
                ResourceName   = 'Authorization Policy'
            }
            New-CIEMFinding @findingParams
        }
        else {
            $findingParams = @{
                CheckMetadata  = $CheckMetadata
                Status         = 'FAIL'
                StatusExtended = "Guest invite restrictions are too permissive. Current setting: '$allowInvitesFrom'. Should be 'adminsAndGuestInviters' or 'none' to restrict guest invitations to admin roles only."
                ResourceId     = $authPolicy.id
                ResourceName   = 'Authorization Policy'
            }
            New-CIEMFinding @findingParams
        }
    }
}