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 } |