private/tests/Test-Assessment.21817.ps1

<#
.SYNOPSIS

#>


function Test-Assessment-21817 {
    [CmdletBinding()]
    param()

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

    $activity = "Checking Global Administrator role activation triggers an approval workflow"
    Write-ZtProgress -Activity $activity -Status "Getting policy"

    Write-ZtProgress -Activity $activity -Status "Getting PIM policy assignments for Global Administrator role"

    # Query retrieves the associated PIM role management policy assignments for Global Administrator role
    $sqlPolicyAssignments = @"
SELECT
    rmp.id as policyAssignmentId,
    rmp.roleDefinitionId,
    rmp.scopeId,
    rmp.scopeType,
    rmp.policyId
FROM main."RoleManagementPolicyAssignment" rmp
WHERE rmp.roleDefinitionId = '62e90394-69f5-4237-9190-012177145e10'
    AND rmp.scopeId = '/'
    AND rmp.scopeType = 'DirectoryRole';
"@


    $resultsPolicyAssignments = Invoke-DatabaseQuery -Database $Database -Sql $sqlPolicyAssignments

    $tableRows = ""

    if ($resultsPolicyAssignments -and $resultsPolicyAssignments.policyId) {
        Write-ZtProgress -Activity $activity -Status "Checking approval requirements for Global Administrator role"

        # Get the approval rule for the Global Administrator role policy
        $approvalRule = Invoke-ZtGraphRequest -RelativeUri "policies/roleManagementPolicies/$($resultsPolicyAssignments.policyId)/rules/Approval_EndUser_Assignment" -ApiVersion 'v1.0'

        # Check if approval is required and has approvers
        if ($approvalRule.setting.isApprovalRequired -eq $true) {
            $approverCount = 0
            foreach ($stage in $approvalRule.setting.approvalStages) {
                $approverCount += ($stage.primaryApprovers | Measure-Object).Count
            }

            if ($approverCount -gt 0) {
                $result = $true
                $testResultMarkdown = "✅ **Pass**: Approval required with $approverCount primary approver(s) configured.`n`n%TestResult%"
                $tableRows += "| Yes | $($approvalRule.setting.approvalStages[0].primaryApprovers.description -join ', ') | $($approvalRule.setting.approvalStages[0].escalationApprovers.description -join ', ') |`n"
            }
            else {
                $result = $false
                $testResultMarkdown = "❌ **Fail**: Approval required but no approvers configured.`n`n%TestResult%"
                $tableRows += "| Yes | None | None |`n"
            }
        }
        else {
            $result = $false
            $testResultMarkdown = "❌ **Fail**: Approval not required for Global Administrator role activation.`n`n%TestResult%"
            $tableRows += "| No | N/A | N/A |`n"
        }
    }
    else {
        $result = $false
        $testResultMarkdown = "❌ **Fail**: No PIM policy found for Global Administrator role.`n`n%TestResult%"
        $tableRows += "| N/A | N/A | N/A |`n"
    }

    $passed = $result


    # Build the detailed sections of the markdown

    # Define variables to insert into the format string
    $reportTitle = "Global Administrator role activation and approval workflow"


    # Create a here-string with format placeholders {0}, {1}, etc.
    $formatTemplate = @'

## {0}


| Approval Required | Primary Approvers | Escalation Approvers |
| :---------------- | :---------------- | :------------------- |
{1}

'@


    # Format the template by replacing placeholders with values
    $mdInfo = $formatTemplate -f $reportTitle, $tableRows

    # Replace the placeholder with the detailed information
    $testResultMarkdown = $testResultMarkdown -replace "%TestResult%", $mdInfo

    $params = @{
        TestId             = '21817'
        Title              = "Global Administrator role activation triggers an approval workflow"
        UserImpact         = 'Low'
        Risk               = 'High'
        ImplementationCost = 'Medium'
        AppliesTo          = 'Identity'
        Tag                = 'Identity'
        Status             = $passed
        Result             = $testResultMarkdown
    }

    Add-ZtTestResultDetail @params
}