# intune-bench-recover.ps1 — aggressive recovery for constantly-rebooting devices. # # Use when a device from the OLD bench script is stuck restarting (sysprep silently failed # but state\complete was marked, so the device is shipping a half-baked image AND Windows # Update / sysprep flags keep firing reboots). This script: # 1. Cancels any pending shutdown # 2. Stops the services that drive auto-restart (wuauserv, UsoSvc, WaaSMedicSvc) # 3. Unregisters leftover bench scheduled tasks # 4. Wipes C:\ProgramData\TTS so the new bench script will run from scratch # 5. Reports the recovery to MKL (/p/reports) # 6. Chains into the latest bench-prep on /p # # Stage on /c. Run on a stuck device: # Shift+F10 -> powershell -> irm mkl.techtoschool.com/c | iex [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $ErrorActionPreference = 'Continue' Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force -ErrorAction SilentlyContinue $serial = try { (Get-CimInstance Win32_BIOS).SerialNumber } catch { 'unknown' } $model = try { (Get-CimInstance Win32_ComputerSystem).Model } catch { 'unknown' } Write-Host '' Write-Host '=================================================================' Write-Host " TTS bench RECOVERY - $serial ($model)" Write-Host '=================================================================' # ── 1. Cancel pending shutdown + stop services that drive auto-restart ── Write-Host '[1/4] Suppressing restart triggers...' & shutdown /a 2>&1 | Out-Null foreach ($svc in 'wuauserv','UsoSvc','WaaSMedicSvc') { try { Stop-Service $svc -Force -ErrorAction Stop Write-Host " [ok] Stopped $svc" } catch { Write-Host " [skip] $svc - $($_.Exception.Message)" } } # ── 2. Remove leftover scheduled tasks from old runs ───────────────────── Write-Host '[2/4] Removing leftover bench scheduled tasks...' foreach ($tn in 'RondoutPrep','RondoutRecovery') { $t = Get-ScheduledTask -TaskName $tn -ErrorAction SilentlyContinue if ($t) { try { Unregister-ScheduledTask -TaskName $tn -Confirm:$false -ErrorAction Stop Write-Host " [ok] Unregistered $tn" } catch { Write-Host " [WARN] Failed to unregister ${tn}: $_" } } else { Write-Host " [skip] $tn not present" } } # ── 3. Wipe TTS state directory (state markers, bootstrap, log) ────────── Write-Host '[3/4] Wiping TTS state directory...' if (Test-Path 'C:\ProgramData\TTS') { try { Remove-Item -Path 'C:\ProgramData\TTS' -Recurse -Force -ErrorAction Stop Write-Host ' [ok] Removed C:\ProgramData\TTS' } catch { Write-Host " [WARN] Removal failed: $_" } } else { Write-Host ' [skip] C:\ProgramData\TTS not present' } # ── 4. Report recovery to MKL ──────────────────────────────────────────── Write-Host '[4/4] Reporting recovery to MKL...' try { $payload = @{ hostname = "rondout-recover:$serial" data = "Recovery on $serial ($model). Services stopped (wuauserv/UsoSvc/WaaSMedicSvc), tasks removed, state cleared. Chaining to /p." } | ConvertTo-Json -Compress Invoke-RestMethod -Uri 'https://mkl.techtoschool.com/p/report' ` -Method POST -ContentType 'application/json' -Body $payload -TimeoutSec 30 | Out-Null Write-Host ' [ok] Recovery reported' } catch { Write-Host " [WARN] Recovery report POST failed: $_" } Write-Host '' Write-Host '=================================================================' Write-Host ' Recovery complete. Launching bench-prep from /p ...' Write-Host '=================================================================' Write-Host '' Start-Sleep -Seconds 2 # ── 5. Chain into the new bench-prep on /p ─────────────────────────────── irm https://mkl.techtoschool.com/p | iex