private/tests/Test-St0002AppsNotUsedInLast90Days.ps1


<#
.SYNOPSIS
    Checks if there are inactive apps not signed in over 90 days
#>


function Test-St0002AppsNotUsedInLast90Days {
    [CmdletBinding()]
    param(
        $Database
    )

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

    $activity = "Checking inactive apps"
    Write-ZtProgress -Activity $activity -Status "Starting"

    $sql = @"
select app.id, app."displayName", spSignIns."lastSignInActivity"."lastSignInDateTime" as lastSignInDateTime, app."createdDateTime"
from main."Application" as app
    left join main."ServicePrincipalSignIn" as spSignIns
    on app.appid = spSignIns."appId"
where datediff('day', try_cast(spSignIns."lastSignInActivity"."lastSignInDateTime" as date), today()) > 90
order by spSignIns."lastSignInActivity"."lastSignInDateTime" desc
"@


    $results = Invoke-DatabaseQuery -Database $Database -Sql $sql

    $appCount =  $results.Count
    Write-PSFMessage "AppCount: $appCount" -Level Debug -Tag Test
    $passed = ($appCount -eq 0)

    if ($passed) {
        $testResultMarkdown += "No stale apps were detected in the tenant. ✅"
    }
    else {
        $testResultMarkdown += "This tenant has $appCount apps that haven't been signed into for more than 90 days. ❌`n`n%TestResult%"
    }

    #TODO: Make user names clickable
    $mdInfo = "## Stale applications`n`n"
    $mdInfo += "| Application | Date created | Last sign in |`n"
    $mdInfo += "| :--- | :--- | :--- |`n"
    foreach ($app in $results) {
        $portalLink = "https://entra.microsoft.com/#view/Microsoft_AAD_UsersAndTenants/UserProfileMenuBlade/~/AdministrativeRole/userId/{0}" -f $app.id
        $mdInfo += "| [$(Get-SafeMarkdown($app.displayName))]($portalLink) | $($app.createdDateTime) | $($app.lastSignInDateTime) |`n"
    }

    $testResultMarkdown = $testResultMarkdown -replace "%TestResult%", $mdInfo

    Add-ZtTestResultDetail -TestId 'ST0002' -Title 'Inactive apps not signed in over 90 days' `
        -UserImpact Medium -Risk Medium -ImplementationCost Low `
        -AppliesTo Identity -Tag Application `
        -Status $passed -Result $testResultMarkdown
}