tests/Test-Assessment.24550.ps1


<#
.SYNOPSIS

#>




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

    #region Helper Functions
    function Test-PolicyAssignment {
        [CmdletBinding()]
        param(
            [Parameter(Mandatory = $false)]
            [array]$Policies
        )

        # Return false if $Policies is null or empty
        if (-not $Policies) {
            return $false
        }

        # Check if at least one policy has assignments
        $assignedPolicies = $Policies | Where-Object {
            $_.PSObject.Properties.Match("assignments") -and $_.assignments -and $_.assignments.Count -gt 0
        }

        return $assignedPolicies.Count -gt 0
    }
    #endregion Helper Functions

    #region Data Collection
    Write-PSFMessage '🟦 Start' -Tag Test -Level VeryVerbose

    $activity = "Checking Windows BitLocker policy is configured and assigned"
    Write-ZtProgress -Activity $activity -Status "Getting policy"

    # Retrieve device configuration profiles in Intune
    $windowsPolicies_Uri = "deviceManagement/configurationPolicies?`$filter=platforms has 'windows10'&`$expand=assignments,settings"
    $windowsPolicies = Invoke-ZtGraphRequest -RelativeUri $windowsPolicies_Uri -ApiVersion beta

    # Filter policies to include only those related to Windows BitLocker settings
    $windowsBitLockerPolicies = @()
    foreach ($windowsPolicy in $windowsPolicies) {
        $validSettingValues = @('device_vendor_msft_bitlocker_requiredeviceencryption_1')

        # Get all setting values from the policy (handle both single values and arrays)
        $policySettingValues = $windowsPolicy.settings.settinginstance.choicesettingvalue.value

        # Convert to array if it's a single value to ensure consistent handling
        if ($policySettingValues -isnot [array]) {
            $policySettingValues = @($policySettingValues)
        }

        # Check if any of the policy's setting values match our valid setting values
        $hasValidSetting = $false
        foreach ($settingValues in $policySettingValues) {
            if ($validSettingValues -contains $settingValues) {
                $hasValidSetting = $true
                break
            }
        }

        if ($hasValidSetting) {
            $windowsBitLockerPolicies += $windowsPolicy
        }
    }

    #endregion Data Collection

    #region Assessment Logic
    $passed = $false
    $testResultMarkdown = ""

    # Test Windows BitLocker policy assignments
    $passed = Test-PolicyAssignment -Policies $windowsBitLockerPolicies

    if ($passed) {
        $testResultMarkdown = "At least one Windows BitLocker policy is configured and assigned.`n`n%TestResult%"
    }
    else {
        $testResultMarkdown = "No Windows BitLocker policy is configured or assigned.`n`n%TestResult%"
    }
    #endregion Assessment Logic

    #region Report Generation
    # Build the detailed sections of the markdown

    # Define variables to insert into the format string
    $reportTitle = "Windows BitLocker Policies"
    $tableRows = ""
    $mdInfo = ""

    if ($windowsBitLockerPolicies.Count -gt 0) {
        # Create a here-string with format placeholders {0}, {1}, etc.
        $formatTemplate = @'

## {0}

| Policy Name | Status | Assignment Target |
| :---------- | :----- | :---------------- |
{1}

'@


        foreach ($policy in $windowsBitLockerPolicies) {

            $policyName = $policy.Name
            $portalLink = 'https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/configuration'

            if ($policy.assignments -and $policy.assignments.Count -gt 0) {
                $status = "✅ Assigned"
            }
            else {
                $status = "❌ Not assigned"
            }

            # Get assignment details for this specific policy
            $assignmentTarget = "None"

            if ($policy.assignments -and $policy.assignments.Count -gt 0) {
                $assignmentTarget = Get-PolicyAssignmentTarget -Assignments $policy.assignments
            }

            $tableRows += @"
| [$(Get-SafeMarkdown($policyName))]($portalLink) | $status | $assignmentTarget |`n
"@

        }

        # 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
    #endregion Report Generation

    $params = @{
        TestId = '24550'
        Title  = 'Windows BitLocker policy is configured and assigned'
        Status = $passed
        Result = $testResultMarkdown
    }

    Add-ZtTestResultDetail @params
}