Skopiuj i wklej ten przykładowy skrypt i zmodyfikuj go zgodnie z potrzebami środowiska:
<# . STRESZCZENIE Wdraża pakiet aranżacji bezpiecznego rozruchu jako zadanie zaplanowane w systemie Windows.
.DESCRIPTION Tworzy zaplanowane zadanie, które uruchamia aranżacji nieprzerwanie w tle.Zadanie jest uruchamiane z zasadami obejścia wykonywania, więc nie są wyświetlane monity o zabezpieczenia. Aranżator: - Ankieta dotycząca aktualizacji urządzenia w określonym interwale - Automatycznie generuj fale i wdrażaj obiekty GPO - Kontynuuj do momentu zaktualizowania wszystkich kwalifikujących się urządzeń Monitorowanie postępu przy użyciu: Get-SecureBootRolloutStatus.ps1
.PARAMETER AggregationInputPath Ścieżka UNC do danych urządzenia JSON (z gpo wykrywania)
.PARAMETER ReportBasePath Ścieżka lokalna dla raportów i plików województwo
.PARAMETER TargetOU OU do połączenia obiektów GPO (opcjonalnie — domyślnie do katalogu głównego domeny)
.PARAMETER PollIntervalMinutes Minuty między sprawdzaniem stanu. Wartość domyślna: 30
.PARAMETER UseWinCS Użyj wincs (system konfiguracji systemu Windows) zamiast AvailableUpdatesPolicy GPO.Po włączeniu wdraża WinCsFlags.exe zaplanowane zadanie w punktach końcowych zamiast w obiektach zasad grupy rejestru.
.PARAMETER WinCSKey Klucz WinCS do konfiguracji bezpiecznego rozruchu. Domyślne: F33E0C8E002
.PARAMETER ServiceAccount Konto do uruchomienia zadania. Domyślne: SYSTEM W przypadku operacji na domenach użyj konta usługi administratora domeny.
.PARAMETER ScriptPath Ścieżka do skryptu aranżacji. Domyślne: Ten sam folder co ten skrypt.
.PARAMETER Uninstall Usuwanie zaplanowanego zadania
.EXAMPLE .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" -ServiceAccount "DOMAIN\svc_secureboot"
.EXAMPLE .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports"
.EXAMPLE # Wdrażanie przy użyciu metody WinCS zamiast AvailableUpdatesPolicy .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" -UseWinCS
.EXAMPLE .\Deploy-OrchestratorTask.ps1 - Odinstaluj #>
[CmdletBinding()] param( [Parameter(Mandatory = $false)] [ciąg]$AggregationInputPath, [Parameter(Mandatory = $false)] [ciąg]$ReportBasePath, [Parameter(Mandatory = $false)] [ciąg]$TargetOU, [Parameter(Mandatory = $false)] [int]$PollIntervalMinutes = 30, [Parameter(Mandatory = $false)] [switch]$UseWinCS, [Parameter(Mandatory = $false)] [string]$WinCSKey = "F33E0C8E002", [Parameter(Mandatory = $false)] [string]$ServiceAccount = "SYSTEM", [Parameter(Mandatory = $false)] [ciąg]$ScriptPath, [Parameter(Mandatory = $false)] [switch]$Uninstall )
$ErrorActionPreference = "Stop" $TaskName = "SecureBoot-Rollout-Orchestrator" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Próbki wdrażania i monitorowania"
# ============================================================================ # SPRAWDZANIE POPRAWNOŚCI ZALEŻNOŚCI # ============================================================================
function Test-ScriptDependencies { <# . STRESZCZENIE Sprawdza, czy są dostępne wszystkie wymagane skrypty.. OPIS Sprawdza wymagane współzależności skryptów i udostępnia instrukcje pobierania, jeśli ich brakuje.#> param( [Parameter(Mandatory = $true)] [ciąg]$ScriptDirectory, [Parameter(Mandatory = $true)] [string[]]$RequiredScripts ) $missingScripts = @() foreach ($script w $RequiredScripts) { $scriptPath = Join-Path $ScriptDirectory $script if (-not (Test-Path $scriptPath)) { $missingScripts += $script } } if ($missingScripts.Count -gt 0) { Write-Host "" Write-Host ("=" * 70) -Pierwszy planKolor czerwony Write-Host "MISSING DEPENDENCIES" -ForegroundColor Red Write-Host ("=" * 70) -Pierwszy planKolor czerwony Write-Host "" Write-Host "Nie znaleziono następujących wymaganych skryptów:" -ForegroundColor Yellow foreach ($script w $missingScripts) { Write-Host " - $script" -ForegroundColor White } Write-Host "" Write-Host "Proszę pobrać najnowsze skrypty z:" -ForegroundColor Cyan adres URL Write-Host ": $DownloadUrl" -ForegroundColor White Write-Host " Przejdź do: '$DownloadSubPage'" -ForegroundColor White Write-Host "" Write-Host "Wyodrębnij wszystkie skrypty do tego samego katalogu i uruchom ponownie". -Kolor pierwszego planu Żółty Write-Host "" $false zwrotu } $true zwrotu }
# Required scripts for orchestrator deployment $requiredScripts = @( "Start-SecureBootRolloutOrchestrator.ps1", "Aggregate-SecureBootData.ps1", "Deploy-GPO-SecureBootCollection.ps1", "Detect-SecureBootCertUpdateStatus.ps1", "Get-SecureBootRolloutStatus.ps1", "Enable-SecureBootUpdateTask.ps1" )
if (-not (Test-ScriptDependencies -ScriptDirectory $PSScriptRoot -RequiredScripts $requiredScripts)) { wyjdź 1 }
# ============================================================================ # ODINSTALUJ # ============================================================================
if ($Uninstall) { Write-Host "" Write-Host "Usuwanie zaplanowanego zadania: $TaskName" —Kolor pierwszego planu— żółty $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue if ($existingTask) { Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask —Nazwa_zadania $TaskName -Confirm:$false Write-Host "Zadanie zostało pomyślnie usunięte". -Pierwszy planColor Green } inaczej { Write-Host "Nie można odnaleźć zadania". -Pierwszy planColor Gray } wyjdź 0 }
# ============================================================================ # SPRAWDZANIE POPRAWNOŚCI # ============================================================================
if (-not $AggregationInputPath -or -not $ReportBasePath) { Write-Host "ERROR: -AggregationInputPath and -ReportBasePath are required." -ForegroundColor Red Write-Host "" Write-Host "Example:" -ForegroundColor Yellow Write-Host ' .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports"' wyjdź 1 }
# Find orchestrator script if (-nie $ScriptPath) { $ScriptPath = Join-Path $PSScriptRoot "Start-SecureBootRolloutOrchestrator.ps1" }
if (-not (Test-Path $ScriptPath)) { Write-Host "ERROR: Orchestrator script not found: $ScriptPath" -ForegroundColor Red wyjdź 1 }
# Find aggregation script (needed by orchestrator) $aggregateScript = Join-Path $PSScriptRoot "Aggregate-SecureBootData.ps1" if (-not (Test-Path $aggregateScript)) { Write-Host "OSTRZEŻENIE: Aggregate-SecureBootData.ps1 nie można odnaleźć w katalogu skryptów" — Kolor pierwszego planu Żółty Write-Host " Orchestrator may fail if it cannot find this script." -ForegroundColor Yellow }
Write-Host "" Write-Host ("=" * 70) -Pierwszy planColor Cyan Write-Host " Secure Boot Rollout Orchestrator - Task Deployment" -ForegroundColor Cyan Write-Host ("=" * 70) -Pierwszy planColor Cyan Write-Host ""
# For display, show relative paths (script names only) $displayScriptPath = Split-Path $ScriptPath -Liść
Write-Host "Configuration:" -ForegroundColor Yellow Write-Host " Nazwa zadania: $TaskName" Write-Host " Orchestrator: $displayScriptPath" Write-Host " Ścieżka wprowadzania: $AggregationInputPath" Write-Host " Ścieżka raportu: $ReportBasePath" Write-Host " Target OU: $(if ($TargetOU) { $TargetOU } else { '(domain root)' })" Write-Host " Interwał ankiety: $PollIntervalMinutes minut" Write-Host " Konto usługi: $ServiceAccount" Write-Host " Metoda wdrażania: $(if ($UseWinCS) { "WinCS (WinCsFlags.exe)" } inaczej { "AvailableUpdatesPolicy (GPO)" })" if ($UseWinCS) { Write-Host " Klucz WinCS: $WinCSKey" } Write-Host ""
# ============================================================================ # WYKRYWANIE GPO — AUTOMATYCZNE WDRAŻANIE, JEŚLI NIE MA # ============================================================================
$CollectionGPOName = "SecureBoot-EventCollection" $deployGpoScript = Join-Path $PSScriptRoot "Deploy-GPO-SecureBootCollection.ps1"
# Check if GroupPolicy module is available if (Get-Module -ListAvailable -Name GroupPolicy) { Import-Module GroupPolicy —ErrorAction SilentlyContinue Write-Host "Checking for Detection GPO..." -ForegroundColor Yellow wypróbuj { # Pobierz domenę z programu AggregationInputPath (np. \\domain\share) $domainFromPath = if ($AggregationInputPath -match '^\\\\([^\\\]+)\\') { $matches[1] } inaczej { $env:USERDNSDOMAIN } # Sprawdź, czy obiekt zasad grupy istnieje $existingGpo = Get-GPO -Name $CollectionGPOName -ErrorAction SilentlyContinue if ($existingGpo) { Write-Host " Wykryto obiekt zasad grupy wykrywania: $CollectionGPOName" -ForegroundColor Green } inaczej { Write-Host "" Write-Host ("=" * 70) -Pierwszy planKolor żółty Write-Host " DETECTION GPO NOT FOUND" -ForegroundColor Yellow Write-Host ("=" * 70) —Kolor pierwszego planuColor Yellow Write-Host "" Write-Host "Nie znaleziono obiektu zasad grupy wykrywania "$CollectionGPOName". -Kolor pierwszego planu Żółty Write-Host "Ten obiekt zasad grupy jest wymagany do zbierania danych o stanie urządzenia". -Kolor pierwszego planu Żółty Write-Host "" # Zapytaj użytkownika, czy chce teraz wdrożyć obiekt zasad grupy Write-Host "Czy chcesz teraz wdrożyć obiekt zasad grupy wykrywania? (Y/N)" -ForegroundColor Cyan $response = Host odczytu if ($response -match '^[Yy]') { Write-Host "" Write-Host "Uruchomienie wdrożenia obiektu zasad grupy..." -ForegroundColor Cyan Write-Host "" # Parametry kompilacji dla wdrożenia obiektu zasad grupy $gpoParams = @{ DomainName = $domainFromPath CollectionSharePath = $AggregationInputPath ScriptSourcePath = Join-Path $PSScriptRoot "Detect-SecureBootCertUpdateStatus.ps1" } if ($TargetOU) { $gpoParams.OUPath = $TargetOU } inaczej { # Użyj funkcji AutoDetectOU, aby umożliwić użytkownikowi wybranie pozycji $gpoParams.AutoDetectOU = $true } # Uruchamianie skryptu wdrażania obiektu zasad grupy & $deployGpoScript @gpoParams if ($LASTEXITCODE -ne 0) { Write-Host "Wdrożenie obiektu zasad grupy mogło napotkać problemy. Przejrzyj dane wyjściowe powyżej." -ForegroundColor Yellow Write-Host "Możesz kontynuować wdrażanie aranżacji lub nacisnąć klawisze Ctrl+C, aby przerwać". -Kolor pierwszego planu Żółty Write-Host "" Read-Host "Naciśnij klawisz Enter, aby kontynuować" } inaczej { Write-Host "" Write-Host "Pomyślnie wdrożono obiekt zasad grupy wykrywania!" —Pierwszy planColor Green Write-Host "" } } inaczej { Write-Host "" Write-Host "Pomijanie wdrożenia obiektu zasad grupy. Aranżator nie otrzyma danych urządzenia" -ForegroundColor Yellow Write-Host "do czasu ręcznego wdrożenia obiektu zasad grupy wykrywania". -Kolor pierwszego planu Żółty Write-Host "" Write-Host "Aby wdrożyć gpo wykrywania później, uruchom:" -ForegroundColor Cyan Write-Host " .\Deploy-GPO-SecureBootCollection.ps1 -DomainName '"$domainFromPath'" -AutoDetectOU" -ForegroundColor White Write-Host "" } } } złapać { Write-Host " Nie można sprawdzić obiektu zasad grupy: $($_. Exception.Message)" -ForegroundColor Yellow Write-Host " Kontynuowanie wdrażania aranżacji..." -ForegroundColor Gray } } inaczej { Write-Host " GroupPolicy module not available - skipping GPO check" -ForegroundColor Gray Write-Host "Upewnij się, że obiekt zasad grupy wykrywania jest wdrożony oddzielnie". -Pierwszy planColor Gray }
Write-Host ""
# ============================================================================ # BUILD ARGUMENTY # ============================================================================
$arguments = @( "-NoProfile" "-ExecutionPolicy Bypass" "-Plik '"$ScriptPath'"" "-AggregationInputPath '"$AggregationInputPath'"" "-ReportBasePath '"$ReportBasePath'"" "-PollIntervalMinutes $PollIntervalMinutes" )
if ($TargetOU) { $arguments += "-TargetOU '"$TargetOU'"" }
if ($UseWinCS) { $arguments += "-UseWinCS" $arguments += "-WinCSKey '"$WinCSKey'"" }
$argumentString = $arguments -join " "
# Don't display raw arguments with full paths - it's confusing for published scripts # Zadanie użyje wewnętrznie pełnej ścieżki
# ============================================================================ # TWORZENIE ZAPLANOWANEGO ZADANIA # ============================================================================
# Check for existing task $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue if ($existingTask) { Write-Host "Zadanie już istnieje. Aktualizowanie..." -Pierwszy planKolor żółty Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask —Nazwa_zadania $TaskName -Confirm:$false }
# Create task action $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument $argumentString -WorkingDirectory $PSScriptRoot
# Create trigger - run once, immediately (orchestrator loops internally) $trigger = New-ScheduledTaskTrigger -Raz -At (Get-Date). AddMinutes(1)
# Create principal if ($ServiceAccount -eq "SYSTEM") { $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest } inaczej { # Monituj o hasło dla konta domeny Write-Host "Wprowadź hasło do $ServiceAccount" —Kolor pierwszego planuColor Yellow $cred = Get-Credential -Nazwa_użytkownika $ServiceAccount -Komunikat "Poświadczenia konta usługi dla zaplanowanego zadania" $principal = New-ScheduledTaskPrincipal -UserId $ServiceAccount -LogonType Password -RunLevel Highest }
# Task settings $settings = New-ScheduledTaskSettingsSet ' -AllowStartIfOnBatteries ' -DontStopIfGoingOnBatteries ' -StartWhenAvailable ' -RunOnlyIfNetworkAvailable ' -RestartCount 3 ' -RestartInterval (New-TimeSpan -Minutes 5) ' -ExecutionTimeLimit (New-TimeSpan -Days 30) # Zezwalaj na długotrwałe
# Register task wypróbuj { if ($ServiceAccount -eq "SYSTEM") { Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Description "Secure Boot Certificate Rollout - Automated GPO deployment" } inaczej { Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Description "Secure Boot Certificate Rollout - Automated GPO deployment" -User $ServiceAccount -Password $cred. GetNetworkCredential(). Hasło } Write-Host "Pomyślnie utworzono zaplanowane zadanie!" — Kolor pierwszego planuColor Green } złapać { Write-Host "Nie można utworzyć zaplanowanego zadania: $($_. Exception.Message)" -ForegroundColor Red wyjdź 1 }
# ============================================================================ # CREATE STATUS SHORTCUT # ============================================================================
$statusScript = Join-Path $PSScriptRoot "Get-SecureBootRolloutStatus.ps1" if (Test-Path $statusScript) { Write-Host "" Write-Host "Aby sprawdzić stan wdrożenia, uruchom:" -Pierwszy planColor Yellow Write-Host " .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '"$ReportBasePath'"" -ForegroundColor Cyan }
# ============================================================================ # OUTPUT # ============================================================================
Write-Host "" Write-Host ("=" * 70) -Pierwszy planKolor zielony Write-Host " DEPLOYMENT COMPLETE" -ForegroundColor Green Write-Host ("=" * 70) - Pierwszy planKolor zielony Write-Host "" Write-Host "Aranżacji rozpocznie się w około 1 minutę." -ForegroundColor White Write-Host "" Write-Host "MONITORING:" -Pierwszy planKolor żółty Write-Host " Wyświetl stan zadania: Get-ScheduledTask —Nazwa_zadania '$TaskName' | Wybierz województwo" Write-Host " Wyświetl dziennik zadań: Get-Content '$ReportBasePath\RolloutState\Orchestrator_$(Get-Date -Format 'yyyyMMdd').log' -Tail 50" Write-Host " Wyświetl stan wdrożenia: Get-Content '$ReportBasePath\RolloutState\RolloutState.json' | ConvertFrom-Json" Write-Host " Wyświetl pulpit nawigacyjny: Uruchamianie $ReportBasePath\Aggregation_*\SecureBoot_Dashboard*.html'" Write-Host " Szybki stan: .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '$ReportBasePath'" Write-Host "" Write-Host "MANAGEMENT:" -ForegroundColor Yellow Write-Host " Start manually: Start-ScheduledTask -TaskName '$TaskName'" Write-Host " Stop: Stop-ScheduledTask -TaskName '$TaskName'" Write-Host " Remove: .\Deploy-OrchestratorTask.ps1 -Uninstall" Write-Host ""