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 }  

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.