Copie y pegue este script de ejemplo y modifíquelo según sea necesario para su entorno:
<# . SINOOPSIS Muestra el estado actual del organizador de la implementación de arranque seguro.
.DESCRIPTION Proporciona visibilidad en tiempo real del progreso de la implementación: - Número de onda actual y dispositivos dirigidos - Dispositivos actualizados frente a pendientes - Cubos bloqueados que requieren atención - Registro de actividad reciente - Vínculo Panel Ejecute esto en cualquier momento para ver cómo avanza la implementación.
.PARAMETER ReportBasePath Ruta de acceso al directorio de informe/estado usado por el organizador
.PARAMETER ShowLog Mostrar entradas de registro recientes (últimas 50 líneas)
.PARAMETER ShowBlocked Mostrar detalles de cubos bloqueados
.PARAMETER ShowWaves Mostrar el historial de ondas con el recuento de dispositivos
.PARAMETER Watch Actualizar continuamente el estado cada N segundos
.PARAMETER OpenDashboard Abrir el panel HTML más reciente en el explorador
.EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath "C:\SecureBootReports"
.EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath "C:\SecureBootReports" -Watch 30
.EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath "C:\SecureBootReports" -OpenDashboard #>
[CmdletBinding()] parámetro( [Parámetro(Obligatorio = $true)] [cadena]$ReportBasePath, [Parámetro(Obligatorio = $false)] [conmutador]$ShowLog, [Parámetro(Obligatorio = $false)] [conmutador]$ShowBlocked, [Parámetro(Obligatorio = $false)] [conmutador]$ShowWaves, [Parámetro(Obligatorio = $false)] [int]$Watch = 0, [Parámetro(Obligatorio = $false)] [conmutador]$OpenDashboard )
$ErrorActionPreference = "Stop" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Ejemplos de implementación y supervisión"
# Note: This script has no dependencies on other scripts. # Para el conjunto de herramientas completo, descarga desde: $DownloadUrl -> $DownloadSubPage
# ============================================================================ # FUNCIONES AUXILIARES # ============================================================================
function ConvertTo-Hashtable { parámetro([Parámetro(ValorFromPipeline = $true)]$InputObject) proceso { if ($null -eq $InputObject) { return @{} } if ($InputObject -is [System.Collections.IDictionary]) { return $InputObject } if ($InputObject -is [PSCustomObject]) { $hash = @{} foreach ($prop en $InputObject.PSObject.Properties) { $hash[$prop. Name] = ConvertTo-Hashtable $prop. Valor } devolver $hash } if ($InputObject -is [System.Collections.IEnumerable] -and $InputObject -isnot [string]) { return @($InputObject | ForEach-Object { ConvertTo-Hashtable $_ }) } devolver $InputObject } }
function Show-Status { $stateDir = Join-Path $ReportBasePath "RolloutState" $rolloutStatePath = Join-Path $stateDir "RolloutState.json" $blockedBucketsPath = Join-Path $stateDir "BlockedBuckets.json" Borrar host Write-Host "" Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host "ESTADO DE IMPLEMENTACIÓN DE ARRANQUE SEGURO" -ForegroundColor Cyan Write-Host " $(Get-Date -Format 'aaaa-MM-dd HH:mm:ss')" -ForegroundColor Gray Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host "" # Comprueba si la tarea del organizador se está ejecutando $task = Get-ScheduledTask -TaskName "SecureBoot-Rollout-Orchestrator" -ErrorAction SilentlyContinue if ($task) { $taskState = $task. Estado $color = if ($taskState -eq "Running") { "Green" } elseif ($taskState -eq "Ready") { "Yellow" } else { "Red" } Write-Host "Tarea programada:" -NoNewline Write-Host $taskState $color -ForegroundColor } else { Write-Host "Tarea programada:" -NoNewline Write-Host "No instalado" -ForegroundColor Gray } # Estado de implementación de carga if (-not (Test-Path $rolloutStatePath)) { Write-Host "" Write-Host "No se encontró ningún estado de implementación. Es posible que el organizador aún no se haya iniciado". -ForegroundColor Yellow Write-Host "Ruta de acceso de estado: $rolloutStatePath" -ForegroundColor Gray devolución } $state = Get-Content $rolloutStatePath -Raw | ConvertFrom-Json | ConvertTo-Hashtable Write-Host "" Write-Host "PROGRESO DE IMPLEMENTACIÓN" -ForegroundColor Yellow Write-Host ("-" * 40) $status = $state. Estado $statusColor = conmutador ($status) { "Completado" { "Verde" } "InProgress" { "Cyan" } "NotStarted" { "Gray" } predeterminado { "Blanco" } } Write-Host "Estado: " -NoNewline Write-Host $status $statusColor -ForegroundColor Write-Host "Ola actual: $($state. CurrentWave)" Write-Host "Total dirigido: $($state. TotalDevicesTargeted)" Write-Host "Total actualizado: $($state. TotalDevicesUpdated)" si ($state. StartedAt) { Write-Host "Iniciado: $($state. StartedAt)" } si ($state. Último agregador) { Write-Host "Último cheque: $($state. Último agregador)" } si ($state. CompletedAt) { Write-Host "Completado: $($state. CompletedAt)" -ForegroundColor verde } # Mostrar la barra de progreso si ($state. TotalDevicesTargeted -gt 0) { $pct = if ($state. TotalDevicesUpdated y $state. TotalDevicesTargeted) { [matemáticas]::Redondo(($state. TotalDevicesUpdated/$state. TotalDevicesTargeted) * 100, 1) } else { 0 } Write-Host "" Write-Host "Progreso: " -NoNewline $barWidth = 40 $filled = [math]::Floor($barWidth * $pct/100) Write-Host "[" -NoNewline Write-Host ("█" * $filled) -ForegroundColor green -NoNewline Write-Host ("░" * ($barWidth - $filled)) -ForegroundColor DarkGray -NoNewline Write-Host "] $pct%" } # Resumen de cubos bloqueados if ($blockedBucketsPath ruta de prueba) { $blocked = Get-Content $blockedBucketsPath -Raw | ConvertFrom-Json | ConvertTo-Hashtable if ($blocked. Contar -gt 0) { Write-Host "" Write-Host "CUBOS BLOQUEADOS:" -NoNewline -ForegroundColor Red Write-Host "$($blocked. Contar) cubos requieren atención" -ForegroundColor Red if ($ShowBlocked) { Write-Host "" foreach ($key en $blocked. Teclas) { $info = $blocked[$key] Write-Host " ") $key" -ForegroundColor Red Write-Host " Motivo: $($info. Reason)" -ForegroundColor Gray Write-Host " Dispositivo: $($info. FailedDevice)" -ForegroundColor Gray Write-Host " Desde: $($info. BlockedAt)" -ForegroundColor Gray } } else { Write-Host " Ejecutar con -ShowBlocked para obtener detalles" -ForegroundColor Gray } } } # Historial de olas si ($ShowWaves y $state. WaveHistory y $state. WaveHistory.Count -gt 0) { Write-Host "" Write-Host "HISTORIAL DE OLAS" -ForegroundColor Yellow Write-Host ("-" * 40) foreach ($wave en $state. WaveHistory) { Write-Host "Onda $($wave. WaveNumber): " -NoNewline -ForegroundColor Cyan Write-Host "$($wave. DeviceCount) devices" -NoNewline Write-Host " - $($wave. StartedAt)" -ForegroundColor Gray } } # Panel más reciente $latestAggregation = Get-ChildItem -Path $ReportBasePath -Directory -Filter "Aggregation_*" -ErrorAction SilentlyContinue | Sort-Object Nombre -Descendente | Select-Object -Primero 1 if ($latestAggregation) { $dashboard = Get-ChildItem -Path $latestAggregation.FullName -Filter "*Dashboard*.html" -ErrorAction SilentlyContinue | Select-Object - Primeros 1 if ($dashboard) { Write-Host "" Write-Host "PANEL MÁS RECIENTE" -ForegroundColor Yellow Write-Host $dashboard. FullName -ForegroundColor Gray if ($OpenDashboard) { Start-Process $dashboard. Nombre completo } } } Registro reciente de # if ($ShowLog) { $logFile = Get-ChildItem -Path $stateDir -Filter "Orchestrator_*.log" -ErrorAction SilentlyContinue | nombre Sort-Object -descendente | Select-Object - Primeros 1 if ($logFile) { Write-Host "" Write-Host "REGISTRO RECIENTE" -ForegroundColor Yellow Write-Host ("-" * 40) Get-Content $logFile.FullName -Tail 20 | ForEach-Object { if ($_ -match '\[ERROR\]') { Write-Host $_ -ForegroundColor Red } elseif ($_ -match '\[WARN\]') { Write-Host $_ -ForegroundColor Amarillo } elseif ($_ -match '\[OK\]') { Write-Host $_ -ForegroundColor verde } elseif ($_ -match '\[WAVE\]') { Write-Host $_ -ForegroundColor Cyan } else { Write-Host $_ -ForegroundColor Gray } } } } Write-Host "" Write-Host ("-" * 80) -ForegroundColor DarkGray if (-not $ShowLog -or -not $ShowWaves -or -not $ShowBlocked) { Write-Host "Opciones: -ShowLog | -ShowWaves | -ShowBlocked | -OpenDashboard | -Watch 30" -ForegroundColor DarkGray } }
# ============================================================================ # MAIN # ============================================================================
if (-not (Test-Path $ReportBasePath)) { Write-Host "Ruta del informe no encontrada: $ReportBasePath" -ForegroundColor Red salir 1 }
if ($Watch -gt 0) { Write-Host "Viendo el estado cada $Watch segundos. Presione Ctrl+C para detenerse". -ForegroundColor Cyan while ($true) { Mostrar estado Start-Sleep -Seconds $Watch } } else { Mostrar estado }