Copie e cole este script de exemplo e modifique conforme necessário para o seu ambiente:
<# . SYNOPSIS Mostra o estado atual do orquestrador de implementação de Arranque Seguro.
.DESCRIPTION Fornece visibilidade em tempo real sobre o progresso da implementação: - Número de onda atual e dispositivos visados - Dispositivos atualizados vs. pendentes - Registos bloqueados que requerem atenção - Registo de atividades recentes - Ligação do dashboard Execute-o em qualquer altura para ver como a implementação está a progredir.
.PARAMETER ReportBasePath Caminho para o diretório de relatório/estado utilizado pelo orquestrador
.PARAMETER ShowLog Apresentar entradas de registo recentes (últimas 50 linhas)
.PARAMETER ShowBlocked Mostrar detalhes de registos bloqueados
.PARAMETER ShowWaves Mostrar histórico de ondas com contagens de dispositivos
.PARAMETER Watch Atualizar continuamente o estado a cada N segundos
.PARAMETER OpenDashboard Abrir o dashboard HTML mais recente no browser
.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( [Parameter(Mandatory = $true)] [string]$ReportBasePath, [Parameter(Mandatory = $false)] [switch]$ShowLog, [Parameter(Mandatory = $false)] [switch]$ShowBlocked, [Parameter(Mandatory = $false)] [switch]$ShowWaves, [Parameter(Mandatory = $false)] [int]$Watch = 0, [Parameter(Mandatory = $false)] [switch]$OpenDashboard )
$ErrorActionPreference = "Stop" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Exemplos de Implementação e Monitorização"
# Note: This script has no dependencies on other scripts. # Para o conjunto de ferramentas completo, transfira a partir de: $DownloadUrl -> $DownloadSubPage
# ============================================================================ # FUNÇÕES AUXILIARES # ============================================================================
function ConvertTo-Hashtable { parâmetro([Parameter(ValueFromPipeline = $true)]$InputObject) processo { if ($null -eq $InputObject) { return @{} } if ($InputObject -is [System.Collections.IDictionary]) { return $InputObject } if ($InputObject -is [PSCustomObject]) { $hash = @{} foreach ($prop em $InputObject.PSObject.Properties) { $hash[$prop. Nome] = 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" Limpar Anfitrião Write-Host "" Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host " SECURE BOOT ROLLOUT STATUS" -ForegroundColor Cyan Write-Host " $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Gray Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host "" # Verifique se a tarefa do orquestrador está em execução $task = Get-ScheduledTask -TaskName "SecureBoot-Rollout-Orchestrator" -ErrorAction SilentlyContinue se ($task) { $taskState = $task. Estado $color = se ($taskState -eq "Running") { "Green" } elseif ($taskState -eq "Ready") { "Yellow" } else { "Red" } Write-Host "Tarefa Agendada: " -NoNewline Write-Host $taskState -ForegroundColor $color } senão { Write-Host "Tarefa Agendada: " -NoNewline Write-Host "Não Instalado" -Primeiro PlanoColor Cinzento } # Estado de implementação de carga if (-not (Test-Path $rolloutStatePath)) { Write-Host "" Write-Host "Não foi encontrado nenhum estado de implementação. O Orchestrator pode ainda não ter começado." -Primeiro PlanoColor Amarelo Write-Host "State path: $rolloutStatePath" -ForegroundColor Gray devolver } $state = Get-Content $rolloutStatePath -Raw | ConvertFrom-Json | ConvertTo-Hashtable Write-Host "" Write-Host "PROGRESSO DA IMPLEMENTAÇÃO" -Primeiro PlanoColor Amarelo Write-Host ("-" * 40) $status = $state. Estado $statusColor = parâmetro ($status) { "Concluído" { "Verde" } "InProgress" { "Cyan" } "NotStarted" { "Gray" } predefinição { "Branco" } } Write-Host "Estado: " -NoNewline Write-Host $status -ForegroundColor $statusColor Write-Host "Onda Atual: $($state. CurrentWave)" Write-Host "Total Direcionado: $($state. TotalDevicesTargeted)" Write-Host "Total Atualizado: $($state. TotalDevicesUpdated)" if ($state. StartedAt) { Write-Host "Iniciado: $($state. StartedAt)" } if ($state. LastAggregation) { Write-Host "Última Verificação: $($state. LastAggregation)" } if ($state. CompletedAt) { Write-Host "Concluído: $($state. CompletedAt)" -ForegroundColor Green } # Mostrar barra de progresso if ($state. TotalDevicesTargeted -gt 0) { $pct = se ($state. TotalDevicesUpdated -and $state. TotalDevicesTargeted) { [matemática]::Round(($state. TotalDevicesUpdated/$state. TotalDevicesTargeted) * 100, 1) } senão { 0 } Write-Host "" Write-Host "Progresso: " -NoNewline $barWidth = 40 $filled = [matemática]::Floor($barWidth * $pct / 100) Write-Host "[" -NoNewline Write-Host ("█" * $filled) -Primeiro PlanoColor Verde -NoNewline Write-Host ("░" * ($barWidth - $filled)) -ForegroundColor DarkGray -NoNewline Write-Host "] $pct%" } # Resumo de registos bloqueados if (Test-Path $blockedBucketsPath) { $blocked = Get-Content $blockedBucketsPath -Raw | ConvertFrom-Json | ConvertTo-Hashtable if ($blocked. Contagem -gt 0) { Write-Host "" Write-Host "REGISTOS BLOQUEADOS: " -NoNewline -ForegroundColor Vermelho Write-Host "$($blocked. Contagem) os registos precisam de atenção" -Primeiro PlanoColor Vermelho se ($ShowBlocked) { Write-Host "" foreach ($key no $blocked. Chaves) { $info = $blocked[$key] Write-Host " ► $key" -ForegroundColor Vermelho Write-Host " Razão: $($info. Razão)" -ForegroundColor Gray Write-Host " Dispositivo: $($info. FailedDevice)" -ForegroundColor Gray Write-Host " Desde: $($info. BlockedAt)" -ForegroundColor Gray } } senão { Write-Host " Executar com -ShowBlocked para obter detalhes" -ForegroundColor Gray } } } # Histórico de ondas se ($ShowWaves -e $state. WaveHistory e $state. WaveHistory.Count -gt 0) { Write-Host "" Write-Host "WAVE HISTORY" -ForegroundColor Yellow Write-Host ("-" * 40) foreach ($wave no $state. WaveHistory) { Write-Host "Wave $($wave. WaveNumber): " -NoNewline -ForegroundColor Cyan Write-Host "$($wave. Dispositivos DeviceCount) " -NoNewline Write-Host " - $($wave. StartedAt)" -ForegroundColor Gray } } # Dashboard mais recente $latestAggregation = Get-ChildItem -Path $ReportBasePath -Directory -Filter "Aggregation_*" -ErrorAction SilentlyContinue | Sort-Object Nome -Descendente | Select-Object -Primeiro 1 se ($latestAggregation) { $dashboard = Get-ChildItem -Path $latestAggregation.FullName -Filter "*Dashboard*.html" -ErrorAction SilentlyContinue | Select-Object -Primeiro 1 se ($dashboard) { Write-Host "" Write-Host "DASHBOARD MAIS RECENTE" -Primeiro PlanoColor Amarelo Write-Host $dashboard. FullName -ForegroundColor Gray se ($OpenDashboard) { Start-Process $dashboard. Nome Completo } } } # Registo recente se ($ShowLog) { $logFile = Get-ChildItem -Path $stateDir -Filter "Orchestrator_*.log" -ErrorAction SilentlyContinue | Sort-Object Nome -Descendente | Select-Object -Primeiro 1 se ($logFile) { Write-Host "" Write-Host "REGISTO RECENTE" -Primeiro PlanoColor Amarelo Write-Host ("-" * 40) Get-Content $logFile.FullName -Tail 20 | ForEach-Object { if ($_ -match '\[ERROR\]') { Write-Host $_ -ForegroundColor Vermelho } elseif ($_ -match '\[WARN\]') { Write-Host $_ -ForegroundColor Amarelo } elseif ($_ -match '\[OK\]') { Write-Host $_ -ForegroundColor Green } elseif ($_ -match '\[WAVE\]') { Write-Host $_ -ForegroundColor Cyan } senão { Write-Host $_ -ForegroundColor Gray } } } } Write-Host "" Write-Host ("-" * 80) -ForegroundColor DarkGray if (-not $ShowLog -or -not $ShowWaves -or -not $ShowBlocked) { Write-Host "Opções: -ShowLog | -ShowWaves | -ShowBlocked | -OpenDashboard | -Watch 30" -ForegroundColor DarkGray } }
# ============================================================================ N.º PRINCIPAL # ============================================================================
if (-not (Test-Path $ReportBasePath)) { Write-Host "Caminho do relatório não encontrado: $ReportBasePath" -Primeiro PlanoColor Vermelho sair 1 }
if ($Watch -gt 0) { Write-Host "Ver o estado a cada $Watch segundos. Prima Ctrl+C para parar." -Primeiro PlanoColor Cyan while ($true) { Show-Status Start-Sleep -Segundos $Watch } } senão { Show-Status }