tests/Test-Assessment.21849.ps1

<#
.SYNOPSIS
    Checks if Smart lockout duration is set to a minimum of 60 seconds.
#>


function Test-Assessment-21849{
    [ZtTest(
        Category = 'Access control',
        ImplementationCost = 'Low',
        Pillar = 'Identity',
        RiskLevel = 'Medium',
        SfiPillar = 'Protect identities and secrets',
        TenantType = ('Workforce','External'),
        TestId = 21849,
        Title = 'Smart lockout duration is set to a minimum of 60',
        UserImpact = 'Low'
    )]
    [CmdletBinding()]
    param()

    Write-PSFMessage '🟦 Start' -Tag Test -Level VeryVerbose

    $activity = 'Checking Smart lockout duration is set to a minimum of 60'
    Write-ZtProgress -Activity $activity -Status 'Getting password rule settings'

    # Get the password rule settings
    $groupSettings = Invoke-ZtGraphRequest -RelativeUri 'Settings' -ApiVersion beta
    $passwordRuleSettings = $groupSettings | Where-Object { $_.displayName -eq 'Password Rule Settings' }

    $passed = $true
    $testResultMarkdown = ""

    $portalLink = 'https://entra.microsoft.com/#view/Microsoft_AAD_IAM/AuthenticationMethodsMenuBlade/~/PasswordProtection/fromNav/'

    if ($null -eq $passwordRuleSettings) {
        $passed = $true

        $mdInfo = "`n## Smart Lockout Settings`n`n"
        $mdInfo += "| Setting | Value |`n"
        $mdInfo += "| :---- | :---- |`n"
        $mdInfo += "| [Lockout Duration (seconds)]($portalLink) | 60 (Default) |`n"

        $testResultMarkdown = "Smart Lockout duration is configured to 60 seconds or higher.$mdInfo"
    }
    else {
        # Get the detailed settings for the Password Rule Settings group
        Write-ZtProgress -Activity $activity -Status 'Checking lockout duration setting'

        $lockoutDurationSetting = $passwordRuleSettings.values | Where-Object { $_.name -eq 'LockoutDurationInSeconds' }

        if ($null -eq $lockoutDurationSetting) {
            $passed = $true

            $mdInfo = "`n## Smart Lockout Settings`n`n"
            $mdInfo += "| Setting | Value |`n"
            $mdInfo += "| :---- | :---- |`n"
            $mdInfo += "| [Lockout Duration (seconds)]($portalLink) | 60 (Default) |`n"

            $testResultMarkdown = "Smart Lockout duration is configured to 60 seconds or higher.$mdInfo"
        }
        else {
            $lockoutDuration = [int]$lockoutDurationSetting.value

            $mdInfo = "`n## Smart Lockout Settings`n`n"
            $mdInfo += "| Setting | Value |`n"
            $mdInfo += "| :---- | :---- |`n"
            $mdInfo += "| [Lockout Duration (seconds)]($portalLink) | $lockoutDuration |`n"

            if ($lockoutDuration -ge 60) {
                $passed = $true
                $testResultMarkdown = "Smart Lockout duration is configured to 60 seconds or higher.$mdInfo"
            }
            else {
                $passed = $false
                $testResultMarkdown = "Smart Lockout duration is configured below 60 seconds.$mdInfo"
            }
        }
    }

    $params = @{
        TestId = '21849'
        Status = $passed
        Result = $testResultMarkdown
    }
    Add-ZtTestResultDetail @params
}