private/core/Test-ZtLanguageMode.ps1

function Test-ZtLanguageMode {
    <#
    .SYNOPSIS
        Validates that PowerShell is running in Full Language Mode.
 
    .DESCRIPTION
        Validates that PowerShell is running in Full Language Mode.
        Constrained Language Mode (enforced by AppLocker or WDAC policies) is not supported
        because PSFramework runspace workers will refuse to execute untrusted script blocks.
 
        Checks both the module's own session state (for real WDAC/AppLocker CLM)
        and the global session state via the runspace proxy (for manual CLM testing).
 
    .EXAMPLE
        PS C:\> Test-ZtLanguageMode
 
        Returns $true if running in Full Language Mode, $false otherwise.
    #>

    [CmdletBinding()]
    [OutputType([bool])]
    param ()

    $fullLanguage = [System.Management.Automation.PSLanguageMode]::FullLanguage

    # Check 1: Module's own language mode (works in real WDAC/AppLocker CLM where the module loads in CLM)
    $languageMode = $ExecutionContext.SessionState.LanguageMode
    if ($languageMode -ne $fullLanguage) {
        Write-ZtLanguageModeError -LanguageMode $languageMode
        return $false
    }

    # Check 2: Global session state language mode (catches manual CLM testing where module was imported in FLM)
    try {
        $globalLanguageMode = [runspace]::DefaultRunspace.SessionStateProxy.GetVariable('ExecutionContext').SessionState.LanguageMode
        if ($globalLanguageMode -ne $fullLanguage) {
            Write-ZtLanguageModeError -LanguageMode $globalLanguageMode
            return $false
        }
    }
    catch {
        # If we can't read the global language mode, assume it's not FullLanguage
        Write-ZtLanguageModeError -LanguageMode ([System.Management.Automation.PSLanguageMode]::ConstrainedLanguage)
        return $false
    }

    return $true
}