Detect-SecureBootCA2023SCCM.ps1

<#PSScriptInfo
.VERSION 1.0.0
.GUID 7f2b1f8c-9b66-4c8f-8e4a-12d4b9f0c3a1
.AUTHOR Mert Efe Kanlikilic
.COMPANYNAME mertefekanlikilic.com
.COPYRIGHT (c) 2026 Mert Efe Kanlikilic. All rights reserved.
.TAGS SecureBoot Windows11 SCCM ConfigMgr ConfigurationManager ComplianceBaseline SecureBootCertificate UEFI
.LICENSEURI https://github.com/kanlikilicmertefe
.PROJECTURI https://mertefekanlikilic.com
.ICONURI
.EXTERNALMODULEDEPENDENCIES
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
Initial release for SCCM / Configuration Manager Configuration Item discovery.
#>


<#
.SYNOPSIS
    Detects Secure Boot CA 2023 servicing state for SCCM / Configuration Manager Compliance Baselines.
 
.DESCRIPTION
    This discovery script evaluates the Secure Boot CA 2023 certificate update status on Windows 11 devices.
    It reads UEFI servicing registry values and returns a single string output suitable for SCCM CI rules.
 
    Possible return values:
        Compliant
        PendingRemediation
        PendingRestart
        ManualReview
        NotApplicable
 
    Recommended SCCM CI configuration:
        Setting type : Script
        Data type : String
        Rule : Equals "Compliant"
 
.NOTES
    Author : Mert Efe Kanlikilic
    Website : https://mertefekanlikilic.com
    Run as : SYSTEM
    Host : 64-bit Windows PowerShell
 
    This script intentionally outputs only one value.
    Do not add logging or additional Write-Output statements when using it in SCCM.
#>


# --- Script starts here ---

$ServicingKey = "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing"

# Check Secure Boot availability
try {
    $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop
}
catch {
    Write-Output "NotApplicable"
    return
}

if (-not $secureBootEnabled) {
    Write-Output "NotApplicable"
    return
}

# Read UEFI servicing registry values
try {
    $servicingState = Get-ItemProperty -Path $ServicingKey -ErrorAction Stop
    $status  = [string]$servicingState.UEFICA2023Status
    $capable = [int]$servicingState.WindowsUEFICA2023Capable
}
catch {
    Write-Output "PendingRemediation"
    return
}

# Evaluate state
switch ($status) {
    "Updated" {
        if ($capable -eq 2) {
            Write-Output "Compliant"
        }
        else {
            Write-Output "ManualReview"
        }
        return
    }

    "InProgress" {
        Write-Output "PendingRestart"
        return
    }

    "NotStarted" {
        Write-Output "PendingRemediation"
        return
    }

    default {
        Write-Output "ManualReview"
        return
    }
}