Private/New-TechCareRestorePoint.ps1

function New-TechCareRestorePoint {
    <#
    .SYNOPSIS
        Crea un punto de restauracion del sistema.
    .DESCRIPTION
        Aisla la unica llamada del modulo a la API de restauracion del sistema, de
        modo que el orquestador se pueda probar sin tocar el equipo.

        Usa Checkpoint-Computer cuando existe (Windows PowerShell 5.1) y cae a la
        clase WMI SystemRestore cuando no, porque PowerShell 7 no incluye ese
        cmdlet: sin la alternativa, una pasada con -Apply bajo pwsh aplicaria
        cambios sin punto de retorno.

        Nunca lanza: devuelve Created en falso con el motivo, para que el
        orquestador decida si sigue o se detiene.
    #>

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')]
    [OutputType([pscustomobject])]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$Description
    )

    $result = [pscustomobject]@{ Created = $false; Method = 'none'; Message = '' }

    if (-not (Test-TechCarePlatform)) {
        $result.Message = 'La restauracion del sistema solo existe en Windows.'
        return $result
    }
    if (-not $PSCmdlet.ShouldProcess('Sistema', 'Crear punto de restauracion')) {
        $result.Message = 'Vista previa: no se creo punto de restauracion.'
        return $result
    }

    try {
        # Si la proteccion esta apagada en el volumen del sistema, cualquier
        # intento de punto de restauracion falla; activarla es inocuo si ya lo esta.
        Enable-ComputerRestore -Drive ($env:SystemDrive + '\') -ErrorAction SilentlyContinue

        if ($null -ne (Get-Command -Name 'Checkpoint-Computer' -ErrorAction SilentlyContinue)) {
            Checkpoint-Computer -Description $Description -RestorePointType 'MODIFY_SETTINGS' -ErrorAction Stop
            $result.Method = 'Checkpoint-Computer'
            $result.Created = $true
        } else {
            # RestorePointType 12 es MODIFY_SETTINGS y EventType 100 es
            # BEGIN_SYSTEM_CHANGE, los mismos valores que usa Checkpoint-Computer.
            $cim = Invoke-CimMethod -Namespace 'root/default' -ClassName 'SystemRestore' `
                -MethodName 'CreateRestorePoint' `
                -Arguments @{
                    Description      = $Description
                    RestorePointType = [uint32]12
                    EventType        = [uint32]100
                } -ErrorAction Stop
            $result.Method = 'WMI SystemRestore'
            if ($cim.ReturnValue -eq 0) {
                $result.Created = $true
            } else {
                $result.Message = 'SystemRestore::CreateRestorePoint devolvio ' + $cim.ReturnValue
            }
        }
    } catch {
        # Windows solo permite un punto de restauracion cada 24 horas, asi que
        # este fallo es frecuente y no implica que el sistema este roto.
        $result.Message = $_.Exception.Message
    }

    return $result
}