Sao chép và dán tập lệnh mẫu này và sửa đổi khi cần thiết cho môi trường của bạn:
<# . TÓM TẮT Hiển thị trạng thái hiện tại của trình triển khai Khởi động An toàn.
.DESCRIPTION Cung cấp khả năng hiển thị trong thời gian thực về tiến độ triển khai: - Số sóng hiện tại và các thiết bị được nhắm mục tiêu - Các thiết bị được cập nhật so với đang chờ xử lý - Bộ chứa bị chặn đòi hỏi sự chú ý - Nhật ký hoạt động gần đây - Liên kết bảng điều khiển Chạy công cụ này bất cứ lúc nào để xem quá trình triển khai đang diễn ra như thế nào.
.PARAMETER ReportBasePath Đường dẫn đến báo cáo/thư mục tiểu bang được sử dụng bởi orchestrator
.PARAMETER ShowLog Hiển thị các mục nhật ký gần đây (50 dòng gần đây)
.PARAMETER ShowBlocked Hiển thị chi tiết về bộ chứa bị chặn
.PARAMETER ShowWaves Hiển thị lịch sử sóng với số lượng thiết bị
.PARAMETER Watch Liên tục làm mới trạng thái mỗi N giây
.PARAMETER OpenDashboard Mở bảng điều khiển HTML mới nhất trong trình duyệt
.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(Mandatory = $true)] [chuỗi]$ReportBasePath, [Parameter(Mandatory = $false)] [chuyển]$ShowLog, [Parameter(Mandatory = $false)] [switch]$ShowBlocked, [Parameter(Mandatory = $false)] [switch]$ShowWaves, [Parameter(Mandatory = $false)] [int]$Watch = 0, [Parameter(Mandatory = $false)] [chuyển]$OpenDashboard )
$ErrorActionPreference = "Stop" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Triển khai và Giám sát Mẫu"
# Note: This script has no dependencies on other scripts. # Đối với bộ công cụ hoàn chỉnh, tải về từ: $DownloadUrl -> $DownloadSubPage
# ============================================================================ # HÀM HELPER # ============================================================================
function ConvertTo-Hashtable { param([Parameter(ValueFromPipeline = $true)]$InputObject) quy trình { nếu ($null -eq $InputObject) { return @{} } if ($InputObject -is [System.Collections.IDictionary]) { return $InputObject } if ($InputObject -is [PSCustomObject]) { $hash = @{} foreach ($prop in $InputObject.PSObject.Properties) { $hash[$prop. Name] = ConvertTo-Hashtable $prop. Giá trị } trả lại $hash } if ($InputObject -is [System.Collections.IEnumerable] -and $InputObject -isnot [string]) { trả lại @($InputObject | ForEach-Object { ConvertTo-Hashtable $_ }) } trả lại $InputObject } }
function Show-Status { $stateDir = Join-Path $ReportBasePath "RolloutState" $rolloutStatePath = Join-Path $stateDir "RolloutState.json" $blockedBucketsPath = Join-Path $stateDir "BlockedBuckets.json" Xóa Máy chủ Write-Host "" Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host " TRẠNG THÁI TRIỂN KHAI KHỞI ĐỘNG AN TOÀN" -ForegroundColor Cyan Write-Host " $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Gray Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host "" # Kiểm tra xem tác vụ của dàn nhạc có đang chạy không $task = Get-ScheduledTask -TaskName "SecureBoot-Rollout-Orchestrator" -ErrorAction SilentlyContinue nếu ($task) { $taskState = $task. Bang $color = if ($taskState -eq "Đang chạy") { "Xanh lục" } elseif ($taskState -eq "Sẵn sàng") { "Vàng" } khác { "Đỏ" } Write-Host "Tác vụ đã lên lịch: " -NoNewline Write-Host $taskState -ForegroundColor $color } người khác { Write-Host "Tác vụ đã lên lịch: " -NoNewline Write-Host "Chưa Cài đặt" -ForegroundColor Gray } # Trạng thái triển khai tải if (-not (Test-Path $rolloutStatePath)) { Write-Host "" Write-Host "Không tìm thấy trạng thái triển khai nào. Orchestrator có thể chưa bắt đầu." -ForegroundColor Yellow Write-Host "State path: $rolloutStatePath" -ForegroundColor Gray Trở lại } $state = Get-Content $rolloutStatePath -Raw | ConvertFrom-Json | ConvertTo-Hashtable Write-Host "" Write-Host TIẾN ĐỘ TRIỂN KHAI" -ForegroundColor Yellow Write-Host ("-" * 40) $status = $state. Tình trạng $statusColor = switch ($status) { "Đã hoàn thành" { "Xanh lục" } "InProgress" { "Cyan" } "NotStarted" { "Gray" } { "Trắng" mặc định } } Write-Host "Trạng thái: " -NoNewline Write-Host $status -ForegroundColor $statusColor Write-Host "Current Wave: $($state. CurrentWave)" Write-Host "Tổng Đã nhắm mục tiêu: $($state. TotalDevicesTargeted)" Write-Host "Tổng số Cập nhật: $($state. TotalDevicesUpdated)" nếu ($state. Đã bắt đầuT) { Write-Host "Đã bắt đầu: $($state. StartedAt)" } nếu ($state. LastAggregation) { Write-Host "Kiểm tra Lần cuối: $($state. LastAggregation)" } nếu ($state. CompletedAt) { Write-Host "Đã hoàn thành: $($state. CompletedAt)" -ForegroundColor Green } # Hiển thị thanh tiến độ nếu ($state. TotalDevicesTargeted -gt 0) { $pct = if ($state. TotalDevicesUpdated -and $state. TotalDevicesTargeted) { [math]::Round(($state. TotalDevicesUpdated / $state. TotalDevicesTargeted) * 100, 1) } khác { 0 } Write-Host "" Write-Host "Tiến độ: " -NoNewline $barWidth = 40 $filled = [toán học]::Floor($barWidth * $pct / 100) Write-Host "[" -NoNewline Write-Host ("█" * $filled) -ForegroundColor Green -NoNewline Write-Host ("░" * ($barWidth - $filled)) -ForegroundColor DarkGray -NoNewline Write-Host "] $pct%" } # Tóm tắt bộ chứa bị chặn if (Test-Path $blockedBucketsPath) { $blocked = Get-Content $blockedBucketsPath -Raw | ConvertFrom-Json | ConvertTo-Hashtable nếu ($blocked. Đếm -gt 0) { Write-Host "" Write-Host "BLOCKED BUCKETS: " -NoNewline -ForegroundColor Red Write-Host "$($blocked. Count) xô cần chú ý" -ForegroundColor Red if ($ShowBlocked) { Write-Host "" foreach ($key in $blocked. Phím) { $info = $blocked[$key] Write-Host " ► $key" -ForegroundColor Red Write-Host " Lý do: $($info. Lý do)" -ForegroundColor Gray Write-Host " Device: $($info. FailedDevice)" -ForegroundColor Gray Write-Host " Since: $($info. BlockedAt)" -ForegroundColor Gray } } người khác { Write-Host " Chạy với -ShowBlocked để biết chi tiết" -ForegroundColor Gray } } } # Lịch sử sóng nếu ($ShowWaves -và $state. WaveHistory -và $state. WaveHistory.Count -gt 0) { Write-Host "" Write-Host "LỊCH SỬ SÓNG" -ForegroundColor Yellow Write-Host ("-" * 40) foreach ($wave in $state. WaveHistory) { Write-Host "Wave $($wave. WaveNumber): " -NoNewline -ForegroundColor Cyan Write-Host "$($wave. DeviceCount) devices" -NoNewline Write-Host " - $($wave. StartedAt)" -ForegroundColor Gray } } # Bảng điều khiển mới nhất $latestAggregation = Get-ChildItem -Path $ReportBasePath -Directory -Filter "Aggregation_*" -ErrorAction SilentlyContinue | Sort-Object -Giảm dần | Select-Object -1 đầu tiên if ($latestAggregation) { $dashboard = Get-ChildItem -Path $latestAggregation.FullName -Filter "*Dashboard*.html" -ErrorAction SilentlyContinue | Select-Object -1 đầu tiên nếu ($dashboard) { Write-Host "" Write-Host "BẢNG ĐIỀU KHIỂN MỚI NHẤT" -ForegroundColor Yellow Write-Host $dashboard. FullName -ForegroundColor Gray if ($OpenDashboard) { Start-Process $dashboard. Họ Tên } } } # Nhật ký gần đây if ($ShowLog) { $logFile = Get-ChildItem -Path $stateDir -Filter "Orchestrator_*.log" -ErrorAction SilentlyContinue | Sort-Object -Giảm dần | Select-Object -1 đầu tiên if ($logFile) { Write-Host "" Write-Host "RECENT LOG" -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 Yellow } elseif ($_ -match '\[OK\]') { Write-Host $_ -ForegroundColor Green } elseif ($_ -match '\[WAVE\]') { Write-Host $_ -ForegroundColor Cyan } người khác { Write-Host $_ -ForegroundColor Gray } } } } Write-Host "" Write-Host ("-" * 80) -ForegroundColor DarkGray if (-not $ShowLog -or -not $ShowWaves -or -not $ShowBlocked) { Write-Host "Tùy chọn: -ShowLog | -ShowWaves | -ShowBlocked | -OpenDashboard | -Watch 30" -ForegroundColor DarkGray } }
# ============================================================================ # MAIN # ============================================================================
if (-not (Test-Path $ReportBasePath)) { Write-Host "Không tìm thấy đường dẫn báo cáo: $ReportBasePath" -ForegroundColor Red thoát 1 }
if ($Watch -gt 0) { Write-Host "Đang xem trạng thái $Watch giây một lần. Nhấn Ctrl+C để dừng." -ForegroundColor Cyan trong khi ($true) { Hiển thị Trạng thái Start-Sleep -Giây $Watch } } người khác { Hiển thị Trạng thái }