_original/WorkloadManager.ps1
|
# ============================================================ # WorkloadManager.ps1 v4.5 # Autor: Dante / SafeAutentic # # Controla WorkloadsSessionHost.exe en Copilot+ PCs # Cada PID nuevo recibe 60 segundos de vida y luego se mata # Compatible con Click to Do - Windows 11 24H2 / 25H2 # AMD Ryzen AI / Intel Lunar Lake / Snapdragon X # ============================================================ $TIMER_VIDA = 60 # segundos de vida por cada PID $INTERVALO_LOOP = 6 # frecuencia de escaneo en segundos New-EventLog -LogName Application -Source "WorkloadManager" -ErrorAction SilentlyContinue function Write-WM ($msg, $id = 1000) { Write-EventLog -LogName Application -Source "WorkloadManager" ` -EventId $id -EntryType Information -Message $msg -ErrorAction SilentlyContinue } $pidTimers = New-Object System.Collections.Generic.Dictionary"[string,datetime]" Write-WM "WorkloadManager v4.5 iniciado. Timer: ${TIMER_VIDA}s / Intervalo: ${INTERVALO_LOOP}s" 1001 while ($true) { try { Start-Sleep -Seconds $INTERVALO_LOOP $ahora = Get-Date $rawProcs = @(Get-Process WorkloadsSessionHost -ErrorAction SilentlyContinue) $pidActivos = $rawProcs | ForEach-Object { "$($_.Id)" } # Limpiar PIDs que ya murieron solos $muertos = @($pidTimers.Keys | Where-Object { $pidActivos -notcontains $_ }) foreach ($p in $muertos) { $pidTimers.Remove($p) } # Registrar nuevos y matar vencidos en un solo recorrido foreach ($p in $pidActivos) { if (-not $pidTimers.ContainsKey($p)) { $pidTimers[$p] = $ahora Write-WM "PID $p detectado. Timer: ${TIMER_VIDA}s" 1002 } elseif (($ahora - $pidTimers[$p]).TotalSeconds -ge $TIMER_VIDA) { try { $proc = Get-Process -Id ([int]$p) -ErrorAction Stop $mb = [math]::Round($proc.WorkingSet64 / 1MB) Stop-Process -Id ([int]$p) -Force -ErrorAction Stop Write-WM "PID $p terminado tras ${TIMER_VIDA}s (${mb}MB liberados)" 1003 } catch {} $pidTimers.Remove($p) } } } catch { Write-WM "Error en ciclo: $_" 9001 Start-Sleep -Seconds 5 } } |