Kopirajte in prilepite ta vzorčni skript ter ga po potrebi spremenite za svoje okolje:
<# . SINOPSIS Uvede orkester za varni zagon kot načrtovano opravilo sistema Windows.
.DESCRIPTION Ustvari načrtovano opravilo, ki neprekinjeno vodi orkester v ozadju.Opravilo se zažene s pravilnikom za izvajanje obhoda, tako da se ne prikaže noben varnostni poziv. Orkester bo: – Anketa o posodobitvah naprave v določenem intervalu – samodejno ustvarjate valove in uvajate pravilnike skupine, – nadaljujte, dokler niso posodobljene vse upravičene naprave Nadzor napredovanja z uporabo: Get-SecureBootRolloutStatus.ps1
.PARAMETER AggregationInputPath Pot UNC do podatkov o napravi JSON (iz predmeta pravilnika skupine za zaznavanje)
.PARAMETER ReportBasePath Lokalna pot za poročila in datoteke stanja
.PARAMETER TargetOU OU za povezovanje pravilnikov skupine (izbirno – privzete vrednosti do korena domene)
.PARAMETER PollIntervalMinutes Minute med preverjanji stanja. Privzeto: 30
.PARAMETER UseWinCS Namesto pravilnika skupine AvailableUpdatesPolicy uporabite WinCS (Sistem konfiguracije sistema Windows).Ko je to omogočeno, uvede WinCsFlags.exe opravilo v končne točke namesto v predmet pravilnika skupin registra.
.PARAMETER WinCSKey Ključ WinCS za konfiguracijo varnega zagona. Privzeto: F33E0C8E002
.PARAMETER ServiceAccount Račun, da zaženete opravilo. Privzeto: SYSTEM Za postopke domene uporabite račun skrbniške storitve domene.
.PARAMETER ScriptPath Pot do orkester skript. Privzeto: Ista mapa kot ta skript.
.PARAMETER Uninstall Odstranjevanje načrtovanega opravila
.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 # Uvedba z načinom WinCS namesto AvailableUpdatesPolicy .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" -UseWinCS
.EXAMPLE .\Deploy-OrchestratorTask.ps1 - Uninstall #>
[CmdletBinding()] param ( [Parameter(Obvezno = $false)] [string]$AggregationInputPath, [Parameter(Obvezno = $false)] [string]$ReportBasePath, [Parameter(Obvezno = $false)] [string]$TargetOU, [Parameter(Obvezno = $false)] [int]$PollIntervalMinutes = 30, [Parameter(Obvezno = $false)] [switch]$UseWinCS, [Parameter(Obvezno = $false)] [string]$WinCSKey = "F33E0C8E002", [Parameter(Obvezno = $false)] [string]$ServiceAccount = "SYSTEM", [Parameter(Obvezno = $false)] [string]$ScriptPath, [Parameter(Obvezno = $false)] [stikalo]$Uninstall )
$ErrorActionPreference = "Stop" $TaskName = »SecureBoot-Rollout-Orchestrator« $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = »Vzorci uvajanja in spremljanja«
# ============================================================================ # PREVERJANJE ODVISNOSTI # ============================================================================
function Test-ScriptDependencies { <# . SINOPSIS Preveri, ali so prisotni vsi zahtevani skripti.. OPIS Preveri, ali so na voljo zahtevane odvisnosti skriptov in ponudi navodila za prenos, če manjkajo.#> param ( [Parameter(Obvezno = $true)] [string]$ScriptDirectory, [Parameter(Obvezno = $true)] [string[]]$RequiredScripts ) $missingScripts = @() foreach ($script mestu $RequiredScripts) { $scriptPath = Join-Path $ScriptDirectory $script if (-not (Test-Path $scriptPath)) { $missingScripts += $script } } if ($missingScripts.Count -gt 0) { Write-Host »« Write-Host ("=" * 70) -OspredjeBarva rdeče Write-Host » MISSING DEPENDENCIES« -ForegroundColor Red Write-Host ("=" * 70) -OspredjeBarva rdeče Write-Host »« Write-Host »Teh zahtevanih skriptov ni bilo mogoče najti:« -ForegroundColor Yellow foreach ($script mestu $missingScripts) { Write-Host " - $script" -ForegroundColor White } Write-Host »« Write-Host "Please download the latest scripts from:" -ForegroundColor Cyan Write-Host » URL: $DownloadUrl« -ForegroundColor White Write-Host »Navigate to: '$DownloadSubPage'« -ForegroundColor White Write-Host »« Write-Host »Ekstrahiraj vse skripte v isti imenik in znova zaženi.« -ForegroundColor Yellow Write-Host »« return $false } return $true }
# 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)) { izhod 1 }
# ============================================================================ # ODSTRANI # ============================================================================
if ($Uninstall) { Write-Host »« Write-Host »Removing scheduled task: $TaskName« -ForegroundColor Yellow $existingTask = Get-ScheduledTask -TaskName $TaskName ErrorAction SilentlyContinue if ($existingTask) { Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false Write-Host »Task removed successfully« (Opravilo je bilo uspešno odstranjeno). -OspredjeBarva zelena } drugo { Write-Host »Opravila ni mogoče najti«. -OspredjeBarva siva } izhod 0 }
# ============================================================================ # PREVERJANJE VELJAVNOSTI # ============================================================================
if (-not $AggregationInputPath -or -not $ReportBasePath) { Write-Host »ERROR: -AggregationInputPath and -ReportBasePath are required« (NAPAKA: –AggregationInputPath in -ReportBasePath). -ForegroundColor Red Write-Host »« Write-Host »Example:« -ForegroundColor Yellow Write-Host ' .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports"" izhod 1 }
# Find orchestrator script if (-not $ScriptPath) { $ScriptPath = Join-Path $PSScriptRoot "Start-SecureBootRolloutOrchestrator.ps1" }
if (-not (Test-Path $ScriptPath)) { Write-Host »ERROR: Orchestrator script not found: $ScriptPath« -ForegroundColor Red izhod 1 }
# Find aggregation script (needed by orchestrator) $aggregateScript = Join-Path $PSScriptRoot "Aggregate-SecureBootData.ps1" if (-not (Test-Path $aggregateScript)) { Write-Host »OPOZORILO: Aggregate-SecureBootData.ps1 ni mogoče najti v imeniku skripta« -ForegroundColor Yellow Write-Host »Orchestrator may fail if it cannot find this script« (Orkester morda ne uspe, če ne najde tega skripta). -ForegroundColor Yellow }
Write-Host "" Write-Host ("=" * 70) -ForegroundColor Cyan Write-Host " Secure Boot Rollout Orchestrator - Task Deployment" -ForegroundColor Cyan Write-Host ("=" * 70) -ForegroundColor Cyan Write-Host »«
# For display, show relative paths (script names only) $displayScriptPath = Split-Path $ScriptPath -Leaf
Write-Host "Configuration:" -ForegroundColor Yellow Write-Host »Ime opravila: $TaskName« Write-Host » Orchestrator: $displayScriptPath« Write-Host »Vhodna pot: $AggregationInputPath« Write-Host »Pot poročila: $ReportBasePath« Write-Host » Ciljna OU: $(if ($TargetOU) { $TargetOU } else { '(domain root)' })" Write-Host »Interval ankete: $PollIntervalMinutes minutes« Write-Host »Račun storitve: $ServiceAccount« Write-Host » Način uvajanja: $(if ($UseWinCS) { "WinCS (WinCsFlags.exe)" } drugo { "AvailableUpdatesPolicy (GPO)" })" if ($UseWinCS) { Write-Host »Ključ WinCS: $WinCSKey« } Write-Host »«
# ============================================================================ # ZAZNAVANJE PREDMETA PRAVILNIKA SKUPIN – SAMODEJNO UVAJANJE, ČE MANJKA # ============================================================================
$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 poskusite { # Pridobite domeno iz možnosti AggregationInputPath (npr. \\domain\share) $domainFromPath = if ($AggregationInputPath -match '^\\\\([^\\]+)\\') { $matches[1] } drugo { $env:USERDNSDOMAIN } # Preverite, ali predmet pravilnika skupin obstaja $existingGpo = Get-GPO -Name $CollectionGPOName -ErrorAction SilentlyContinue if ($existingGpo) { Write-Host »Detection GPO found: $CollectionGPOName« -ForegroundColor Green } drugo { Write-Host »« Write-Host ("=" * 70) -OspredjeBarva rumena Write-Host »DETECTION GPO NOT FOUND« -ForegroundColor Yellow Write-Host ("=" * 70) -OspredjeBarva rumena Write-Host »« Write-Host »Predmeta pravilnika skupin zaznavanja »$CollectionGPOName« ni bilo mogoče najti.« -ForegroundColor Yellow Write-Host »Ta predmet pravilnika skupin je potreben za zbiranje podatkov o stanju naprave.« -OspredjeBarva rumena Write-Host »« # Vprašajte uporabnika, ali želijo uvesti predmet pravilnika skupin zdaj Write-Host »Ali želite zdaj uvesti predmet pravilnika skupin zaznavanja? (Y/N)" -ForegroundColor Cyan $response = Read-Host if ($response -match '^[Yy]') { Write-Host »« Write-Host »Launching GPO Deployment...-ForegroundColor Cyan« Write-Host »« # Parametri graditve za uvajanje predmeta pravilnika skupin $gpoParams = @{ DomainName = $domainFromPath CollectionSharePath = $AggregationInputPath ScriptSourcePath = Join-Path $PSScriptRoot "Detect-SecureBootCertUpdateStatus.ps1" } if ($TargetOU) { $gpoParams.OUPath = $TargetOU } drugo { # S funkcijo AutoDetectOU lahko uporabnik izbere $gpoParams.AutoDetectOU = $true } # Zaženite skript uvajanja predmeta pravilnika skupin & $deployGpoScript @gpoParams if ($LASTEXITCODE-ne 0) { Write-Host »Morda je prišlo do težav pri uvajanju predmeta pravilnika skupin. Preglejte zgornji rezultat.« -OspredjeBarva rumena Write-Host »Lahko nadaljujete z uvajanjem v orkester ali pritisnete Ctrl + C, da prekinete.« -ForegroundColor Yellow Write-Host »« Read-Host »Press Enter to continue« (Za nadaljevanje pritisnite tipko Enter). } drugo { Write-Host »« Write-Host »Detection GPO deployed successfully!« -ForegroundColor Green Write-Host »« } } drugo { Write-Host »« Write-Host »Preskok uvajanja predmeta pravilnika skupin. Orchestrator ne bo prejel podatkov o napravi« -ForegroundColor Yellow Write-Host »dokler predmet pravilnika skupin zaznavanja ni uveden ročno.« -OspredjeBarva rumena Write-Host »« Write-Host »To deploy the Detection GPO later, run:« -ForegroundColor Cyan Write-Host " .\Deploy-GPO-SecureBootCollection.ps1 -DomainName '"$domainFromPath'" -AutoDetectOU" -ForegroundColor White Write-Host »« } } } ulova { Write-Host »Predmeta pravilnika skupin ni mogoče preveriti: $($_. Exception.Message)" -ForegroundColor Yellow Write-Host »Nadaljevanje z uvajanjem orkestra ...«-OspredjeBarva siva } } drugo { Write-Host »GroupPolicy module not available - preskakovanje gpo check« -ForegroundColor Gray Write-Host » Prepričajte se, da je predmet pravilnika skupin zaznavanja uveden ločeno.« -OspredjeBarva siva }
Write-Host ""
# ============================================================================ # BUILD ARGUMENTI # ============================================================================
$arguments = @( »-NoProfile« "-ExecutionPolicy Bypass" »-File '"$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 # Opravilo bo interno uporabilo celotno pot
# ============================================================================ # USTVARJANJE NAČRTOVANEGA OPRAVILA # ============================================================================
# Check for existing task $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue if ($existingTask) { Write-Host »Opravilo že obstaja. Posodabljanje ... – ospredjeBarva rumena Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName $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 -enkrat -na (Get-Date). AddMinutes(1)
# Create principal if ($ServiceAccount -eq "SYSTEM") { $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest } drugo { # Poziv za geslo za račun domene Write-Host »Enter password for $ServiceAccount« -ForegroundColor Yellow $cred = Get-Credential -UserName $ServiceAccount Message "Service account credentials for scheduled task" $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) # Allow long-running
# Register task poskusite { if ($ServiceAccount -eq "SYSTEM") { Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Description "Secure Boot Certificate Rollout - Automated GPO deployment" } drugo { 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(). Geslo } Write-Host »Načrtovano opravilo je bilo uspešno ustvarjeno!« -OspredjeColor zelena } ulova { Write-Host »Načrtovanega opravila ni bilo mogoče ustvariti: $($_. Exception.Message)" -ForegroundColor Red izhod 1 }
# ============================================================================ # USTVARJANJE BLIŽNJICE STANJA # ============================================================================
$statusScript = Join-Path $PSScriptRoot "Get-SecureBootRolloutStatus.ps1" if (preskusna pot $statusScript) { Write-Host »« Write-Host »To check rollout status, run:« -ForegroundColor Yellow Write-Host » .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '"$ReportBasePath'""" -ForegroundColor Cyan }
# ============================================================================ # OUTPUT # ============================================================================
Write-Host "" Write-Host ("=" * 70) -ForegroundColor Green Write-Host »UVAJANJE DOKONČANO« -OspredjeBarva zelena Write-Host ("=" * 70) -ForegroundColor Green Write-Host »« Write-Host »Orkester se bo začel v približno 1 minuti.« -ForegroundColor White Write-Host »« Write-Host "MONITORING:" -ForegroundColor Yellow Write-Host »View task status: Get-ScheduledTask -TaskName '$TaskName' | Izberite Zvezna država« Write-Host » Ogled dnevnika opravil: Get-Content '$ReportBasePath\RolloutState\Orchestrator_$(Get-Date -Format 'yyyyMMdd').log' -Tail 50« Write-Host » View rollout state: Get-Content '$ReportBasePath\RolloutState\RolloutState.json' | ConvertFrom-Json" Write-Host » View dashboard: Start '$ReportBasePath\Aggregation_*\SecureBoot_Dashboard*.html'« Write-Host »Quick status: .\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 » Odstrani: .\Deploy-OrchestratorTask.ps1 -Uninstall« Write-Host »«