Скопіюйте та вставте цей зразок сценарію та змініть його за потреби для свого середовища:
<# . ПІДСУМОК Відображення поточного стану оркестратора розгортання безпечного завантаження.
.DESCRIPTION Забезпечує видимість перебігу розгортання в реальному часі: – номер поточної хвилі та цільові пристрої; – пристрої, які оновлюються та очікують - Заблоковані блоки потребують уваги – журнал останніх дій; - Посилання на приладну дошку Запустіть цю програму в будь-який час, щоб дізнатися, як виконується розгортання.
.PARAMETER ReportBasePath Шлях до каталогу звіту або стану, що використовується в orchestrator
.PARAMETER ShowLog Відображення останніх записів журналу (останні 50 рядків)
.PARAMETER ShowBlocked Відображення відомостей про заблоковані блоки
.PARAMETER ShowWaves Відображення журналу хвиль із лічильниками пристроїв
.PARAMETER Watch Безперервне оновлення стану кожні N секунд
.PARAMETER OpenDashboard Відкриття останньої приладної дошки HTML у браузері
.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)] [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 = "Зразки розгортання та моніторингу"
# Note: This script has no dependencies on other scripts. # Щоб отримати повний набір інструментів, завантажте з: $DownloadUrl -> $DownloadSubPage
# ============================================================================ # HELPER FUNCTIONS # ============================================================================
function ConvertTo-Hashtable { param([Parameter(ValueFromPipeline = $true)]$InputObject) процес { якщо ($null -eq $InputObject) { return @{} } якщо ($InputObject -це [System.Collections.IDictionary]) { return $InputObject } якщо ($InputObject -це [PSCustomObject]) { $hash = @{} foreach ($prop in $InputObject.PSObject.Properties) { $hash[$prop. Name] = ConvertTo-Hashtable $prop. Значення } (}) повернути $hash } (}) якщо ($InputObject -це [System.Collections.IEnumerable] -and $InputObject -isnot [string]) { return @($InputObject | ForEach-Object { ConvertTo-Hashtable $_ }) } (}) повернути $InputObject } (}) }
function Show-Status { $stateDir = Join-Path $ReportBasePath "RolloutState" $rolloutStatePath = Join-Path $stateDir "RolloutState.json" $blockedBucketsPath = Join-Path $stateDir "BlockedBuckets.json" Очистити хост Write-Host "" Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host "СТАН РОЗГОРТАННЯ БЕЗПЕЧНОГО ЗАВАНТАЖЕННЯ" -ForegroundColor Cyan Write-Host " $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Gray Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host "" # Перевірка виконання завдання orchestrator $task = Get-ScheduledTask -TaskName "SecureBoot-Rollout-Orchestrator" -ErrorAction SilentlyContinue якщо ($task) { $taskState = $task. Держави $color = if ($taskState -eq "Running") { "Green" } elseif ($taskState -eq "Ready") { "Yellow" } else { "Red" } Write-Host "Заплановане завдання: " -NoNewline Write-Host $taskState -foregroundColor $color } інакше { Write-Host "Заплановане завдання: " -NoNewline Write-Host "Не інстальовано" -ForegroundColor Gray } (}) # Стан розгортання завантаження якщо (-not (test-path $rolloutStatePath)) { Write-Host "" Write-Host "Стан розгортання не знайдено. Orchestrator, можливо, ще не запущено." -ForegroundColor Yellow Write-Host "Шлях стану: $rolloutStatePath" -ForegroundColor Gray Повернутися } (}) $state = Get-Content $rolloutStatePath -Raw | ConvertFrom-Json | Перетворити на геш-таблицю Write-Host "" Write-Host "ПЕРЕБІГ РОЗГОРТАННЯ" -ForegroundColor Yellow Write-Host ("-" * 40) $status = $state. Статус $statusColor = перемикач ($status) { "Завершено" { "Зелений" } "InProgress" { "Блакитний" } "Непочато" { "Сірий" } за замовчуванням { "Білий" } } (}) Write-Host "Стан: " -NoNewline Write-Host $status –$statusColor колір переднього плану Write-Host "Поточна хвиля: $ ($state. CurrentWave)" Write-Host "Загальна кількість цільових об'єктів: $($state. TotalDevicesTargeted)" Write-Host "Усього оновлено: $($state. TotalDevicesUpdated)" якщо ($state. StartedAt) { Write-Host "Розпочато: $($state. StartedAt)" (Початок роботи)" } (}) якщо ($state. Остання агрегація) { Write-Host "Остання перевірка: $($state. LastAggregation)" } (}) якщо ($state. CompletedAt) { Write-Host "Завершено: $($state. CompletedAt)" -ForegroundColor Green } (}) # Показати панель перебігу якщо ($state. TotalDevicesTargeted -gt 0) { $pct = якщо ($state. TotalDevicesUpdated – і $state. TotalDevicesTargeted) { [math]::Round(($state. TotalDevicesUpdated / $state. TotalDevicesTargeted) * 100, 1) } ще { 0 } Write-Host "" Write-Host "Прогрес: " -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%" } (}) # Зведення блоків заблокованих блоків якщо ($blockedBucketsPath тестового шляху) { $blocked = Get-Content $blockedBucketsPath -Raw | ConvertFrom-Json | Перетворити на геш-таблицю якщо ($blocked. Кількість -gt 0) { Write-Host "" Write-Host "ЗАБЛОКОВАНІ БЛОКИ: " -NoNewline -ForegroundColor Red Write-Host "$($blocked. Кількість) блоки потребують уваги" -ForegroundColor Red якщо ($ShowBlocked) { Write-Host "" ($key в $blocked. Клавіші) { $info = $blocked[$key] Write-Host " ► $key" -ForegroundColor Red Write-Host " Причина: $($info. Reason)" -ForegroundColor Gray Write-Host " Пристрій: $($info. FailedDevice)" -ForegroundColor Gray Write-Host " З: $($info. BlockedAt)" -ForegroundColor Gray } (}) } інакше { Write-Host " Виконати з -ShowBlocked для отримання додаткових відомостей" -ForegroundColor Gray } (}) } (}) } (}) # Журнал хвиль якщо ($ShowWaves -та $state. WaveHistory - і $state. WaveHistory.Count -gt 0) { Write-Host "" Write-Host "WAVE HISTORY" -ForegroundColor Yellow Write-Host ("-" * 40) ($wave в $state. WaveHistory) { Write-Host "Хвиля $($wave. WaveNumber): " -NoNewline - ForegroundColor Cyan Write-Host "$($wave. DeviceCount) devices" -NoNewline Write-Host " – $($wave. StartedAt)" -ForegroundColor Gray } (}) } (}) # Остання приладна дошка $latestAggregation = Get-ChildItem -Path $ReportBasePath -Directory - Filter "Aggregation_*" -ErrorAction SilentlyContinue | ім'я Sort-Object –за спаданням | Select-Object –Перший 1 якщо ($latestAggregation) { $dashboard = Get-ChildItem -Path $latestAggregation.FullName -filter "*Dashboard*.html" -ErrorAction SilentlyContinue | Select-Object –Перший 1 якщо ($dashboard) { Write-Host "" Write-Host "ОСТАННЯ ПРИЛАДНА ДОШКА" -ForegroundColor Yellow Write-Host $dashboard. FullName – колір переднього плану із сірим кольором якщо ($OpenDashboard) { Start-Process $dashboard. Повне ім'я } (}) } (}) } (}) # Останні журнали якщо ($ShowLog) { $logFile = Get-ChildItem -Path $stateDir -Filter "Orchestrator_*.log" -ErrorAction SilentlyContinue | ім'я Sort-Object –за спаданням | Select-Object –Перший 1 якщо ($logFile) { Write-Host "" Write-Host "RECENT LOG" -ForegroundColor Yellow Write-Host ("-" * 40) Get-Content $logFile.FullName -Tail 20 | ForEach-Object { якщо ($_ – збігається з '\[ERROR\]') { Write-Host $_ - Червоний колір переднього плану } elseif ($_ - match '\[WARN\]') { Write-Host $_ - Колір переднього плану Жовтий } elseif ($_ - match '\[OK\]') { Write-Host $_ - Зелений колір переднього плану } elseif ($_ - match '\[WAVE\]') { Write-Host $_ - Блакитний колір переднього плану } інакше { Write-Host $_ -ForegroundColor Gray } (}) } (}) } (}) } (}) Write-Host "" Write-Host ("-" * 80) -ForegroundColor DarkGray якщо (-не $ShowLog -або -not $ShowWaves -або -not $ShowBlocked) { Write-Host "Параметри: -ShowLog | -ShowWaves | -Показати заблоковано | -OpenDashboard | -Watch 30" -ForegroundColor DarkGray } (}) }
# ============================================================================ # ОСНОВНЕ # ============================================================================
if (-not (Test-Path $ReportBasePath)) { Write-Host "Шлях звіту не знайдено: $ReportBasePath" -Червоний колір переднього плану вихід 1 }
if ($Watch -gt 0) { Write-Host "Перегляд стану кожні $Watch секунд. Натисніть клавіші Ctrl+C, щоб зупинити. -ForegroundColor Cyan в той час як ($true) { Показати стан Start-Sleep –секунди $Watch } (}) } інакше { Показати стан }