Salin dan tempelkan contoh skrip ini dan ubah sesuai kebutuhan untuk lingkungan Anda:
<# . SINOPSIS Memperlihatkan status saat ini dari orkestrator peluncuran Boot Aman.
.DESCRIPTION Menyediakan visibilitas real-time ke kemajuan peluncuran: - Nomor gelombang saat ini dan perangkat yang ditargetkan - Perangkat diperbarui vs tertunda - Ember yang diblokir memerlukan perhatian - Log aktivitas terakhir - Link dasbor Jalankan ini kapan saja untuk melihat kemajuan peluncuran.
.PARAMETER ReportBasePath Jalur ke direktori laporan/status yang digunakan oleh orkestrator
.PARAMETER ShowLog Menampilkan entri log terbaru (50 baris terakhir)
.PARAMETER ShowBlocked Memperlihatkan detail wadah yang diblokir
.PARAMETER ShowWaves Memperlihatkan riwayat gelombang dengan jumlah perangkat
.PARAMETER Watch Status refresh terus menerus setiap N detik
.PARAMETER OpenDashboard Membuka dasbor HTML terbaru di 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()] param( [Parameter(Wajib = $true)] [string]$ReportBasePath, [Parameter(Wajib = $false)] [sakelar]$ShowLog, [Parameter(Wajib = $false)] [sakelar]$ShowBlocked, [Parameter(Wajib = $false)] [sakelar]$ShowWaves, [Parameter(Wajib = $false)] [int]$Watch = 0, [Parameter(Wajib = $false)] [sakelar]$OpenDashboard )
$ErrorActionPreference = "Stop" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Sampel Penyebaran dan Pemantauan"
# Note: This script has no dependencies on other scripts. # Untuk peralatan lengkap, unduh dari: $DownloadUrl -> $DownloadSubPage
# ============================================================================ # FUNGSI HELPER # ============================================================================
function ConvertTo-Hashtable { param([Parameter(ValueFromPipeline = $true)]$InputObject) proses { if ($null -eq $InputObject) { return @{} } if ($InputObject -is [System.Collections.IDictionary]) { return $InputObject } if ($InputObject -is [PSCustomObject]) { $hash = @{} foreach ($prop di $InputObject.PSObject.Properties) { $hash[$prop. Nama] = ConvertTo-Hashtable $prop. Nilai } $hash pengembalian } if ($InputObject -is [System.Collections.IEnumerable] -and $InputObject -isnot [string]) { return @($InputObject | ForEach-Object { ConvertTo-Hashtable $_ }) } $InputObject pengembalian } }
function Show-Status { $stateDir = Join-Path $ReportBasePath "RolloutState" $rolloutStatePath = Join-Path $stateDir "RolloutState.json" $blockedBucketsPath = Join-Path $stateDir "BlockedBuckets.json" Clear-Host Write-Host "" Write-Host ("=" * 80) -ForegroundColor Sian Write-Host " STATUS PELUNCURAN BOOT AMAN" -ForegroundColor Sian Write-Host " $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Gray Write-Host ("=" * 80) -ForegroundColor Sian Write-Host "" # Periksa apakah tugas orkestrator sedang berjalan $task = Get-ScheduledTask -TaskName "SecureBoot-Rollout-Orchestrator" -ErrorAction SilentlyContinue if ($task) { $taskState = $task. Negara $color = if ($taskState -eq "Running") { "Green" } elseif ($taskState -eq "Ready") { "Yellow" } else { "Red" } Write-Host "Tugas Terjadwal: " -NoNewline Write-Host $taskState -ForegroundColor $color } lain { Write-Host "Tugas Terjadwal: " -NoNewline Write-Host "Tidak Terinstal" -ForegroundColor Gray } # Muat status peluncuran if (-not (Test-Path $rolloutStatePath)) { Write-Host "" Write-Host "Tidak ditemukan status peluncuran. Orkestrator mungkin belum dimulai." -ForegroundColor Yellow Write-Host "Jalur negara: $rolloutStatePath" -ForegroundColor Gray Kembali } $state = Get-Content $rolloutStatePath -Raw | ConvertFrom-Json | ConvertTo-Hashtable Write-Host "" Write-Host "KEMAJUAN PELUNCURAN" -ForegroundColor Yellow Write-Host ("-" * 40) $status = $state. Status $statusColor = sakelar ($status) { "Selesai" { "Hijau" } "InProgress" { "Cyan" } "NotStarted" { "Gray" } default { "White" } } Write-Host "Status: " -NoNewline Write-Host $status -ForegroundColor $statusColor Write-Host "Current Wave: $($state. CurrentWave)" Write-Host "Total Ditargetkan: $($state. TotalDevicesTargeted)" Write-Host "Total Diperbarui: $($state. TotalDevicesUpdated)" jika ($state. StartedAt) { Write-Host "Mulai: $($state. StartedAt)" } jika ($state. LastAggregation) { Write-Host "Pemeriksaan Terakhir: $($state. LastAggregation)" } jika ($state. CompletedAt) { Write-Host "Selesai: $($state. CompletedAt)" -ForegroundColor Green } # Tampilkan bilah kemajuan jika ($state. TotalDevicesTargeted -gt 0) { $pct = jika ($state. TotalDevicesUpdated -dan $state. TotalDevicesTargeted) { [matematika]::Round(($state. TotalDevicesUpdated / $state. TotalDevicesTargeted) * 100, 1) } lagi { 0 } Write-Host "" Write-Host "Kemajuan: " -NoNewline $barWidth = 40 $filled = [matematika]::Floor($barWidth * $pct / 100) Write-Host "[" -NoNewline Write-Host ("█" * $filled) -Hijau ForegroundColor -NoNewline Write-Host ("░" * ($barWidth - $filled)) -Warna Latar Depan DarkGray -NoNewline Write-Host "] $pct%" } # Ringkasan wadah yang diblokir if (Test-Path $blockedBucketsPath) { $blocked = Get-Content $blockedBucketsPath -Raw | ConvertFrom-Json | ConvertTo-Hashtable jika ($blocked. Hitung -gt 0) { Write-Host "" Write-Host "BUCKET YANG DIBLOKIR: " -NoNewline -ForegroundColor Red Write-Host "$($blocked. Hitung) ember perlu diperhatikan" -ForegroundColor Red if ($ShowBlocked) { Write-Host "" ($key di $blocked. Tombol) { $info = $blocked[$key] Write-Host " ► $key" -ForegroundColor Merah Write-Host " Alasan: $($info. Alasan)" -ForegroundColor Gray Write-Host " Perangkat: $($info. FailedDevice)" -ForegroundColor Gray Write-Host " Sejak: $($info. BlockedAt)" -ForegroundColor Gray } } lain { Write-Host " Jalankan dengan -ShowBlocked untuk detail" -ForegroundColor Gray } } } # Riwayat gelombang jika ($ShowWaves -dan $state. WaveHistory -dan $state. WaveHistory.Count -gt 0) { Write-Host "" Write-Host "WAVE HISTORY" -ForegroundColor Yellow Write-Host ("-" * 40) ($wave di $state. WaveHistory) { Write-Host "Wave $($wave. WaveNumber): " -NoNewline -ForegroundColor Cyan Write-Host "$($wave. DeviceCount) perangkat" -NoNewline Write-Host " - $($wave. StartedAt)" -ForegroundColor Gray } } # Dasbor terbaru $latestAggregation = Get-ChildItem -Path $ReportBasePath -Directory -Filter "Aggregation_*" -ErrorAction SilentContinue | Nama Sort-Object -Turun | Select-Object -1 Pertama if ($latestAggregation) { $dashboard = Get-ChildItem -Path $latestAggregation.FullName -Filter "*Dashboard*.html" -ErrorAction SilentlyContinue | Select-Object -1 Pertama if ($dashboard) { Write-Host "" Write-Host "DASBOR TERBARU" -ForegroundColor Yellow Write-Host $dashboard. FullName -ForegroundColor Gray if ($OpenDashboard) { Start-Process $dashboard. Nama Lengkap } } } # Log terbaru if ($ShowLog) { $logFile = Get-ChildItem -Path $stateDir -Filter "Orchestrator_*.log" -ErrorAction SilentLyContinue | nama Sort-Object -Turun | Select-Object -1 Pertama if ($logFile) { Write-Host "" Write-Host "LOG TERBARU" -ForegroundColor Yellow Write-Host ("-" * 40) Get-Content $logFile.FullName -Tail 20 | ForEach-Object { if ($_ -match '\[ERROR\]') { Write-Host $_ -Warna Latar Depan Merah } elseif ($_ -match '\[WARN\]') { Write-Host $_ -ForegroundColor Yellow } elseif ($_ -match '\[OK\]') { Write-Host $_ -ForegroundColor Hijau } elseif ($_ -match '\[WAVE\]') { Write-Host $_ -ForegroundColor Cyan } lain { Write-Host $_ -Warna Latar Depan Abu-abu } } } } Write-Host "" Write-Host ("-" * 80) -ForegroundColor DarkGray if (-not $ShowLog -or -not $ShowWaves -or -not $ShowBlocked) { Write-Host "Opsi: -ShowLog | -ShowWaves | -ShowBlocked | -OpenDashboard | -Watch 30" -ForegroundColor DarkGray } }
# ============================================================================ # MAIN # ============================================================================
if (-not (Test-Path $ReportBasePath)) { Write-Host "Jalur laporan tidak ditemukan: $ReportBasePath" -ForegroundColor Red keluar 1 }
if ($Watch -gt 0) { Write-Host "Menonton status setiap $Watch detik. Tekan Ctrl+C untuk menghentikan." -ForegroundColor Cyan sementara ($true) { Status-Peragaan Start-Sleep -Detik $Watch } } lain { Status-Peragaan }