SVARĪGI Šis raksts, kurā ir ietverts šis skripta paraugs, ir novecojis. Sākot ar Windows atjauninājumiem, kas izlaisti 2026. gada 12. maijā un vēlāk, skripta paraugs atrodas jūsu ierīces mapē %systemroot%\SecureBoot\ExampleRolloutScripts .
Nokopējiet un ielīmējiet šo skripta paraugu un modificējiet pēc nepieciešamības savai videi:
<# . KOPSAVILKUMS Izvieto drošās palaišanas ieviešanas vadības moduli kā Windows ieplānotu uzdevumu.
.DESCRIPTION Izveido ieplānotu uzdevumu, kas vadības moduli nepārtraukti palaiž fonā.Uzdevums tiek izpildīts ar izpildes politikas apiešanu, tāpēc netiek rādītas drošības uzvednes. Orķestris: - Aptauja par ierīces atjauninājumiem norādītajā intervālā - Automātiski ģenerē viļņus un izvieto GPO - Turpiniet, līdz ir atjauninātas visas piemērotās ierīces Pārraudzīt norisi, izmantojot: Get-SecureBootRolloutStatus.ps1
.PARAMETER AggregationInputPath UNC ceļš uz JSON ierīces datiem (no noteikšanas GPO)
.PARAMETER ReportBasePath Atskaišu un stāvokļa failu lokālais ceļš
.PARAMETER TargetOU OU, lai saistītu GPO (neobligāts — noklusējums ir domēna sakne)
.PARAMETER PollIntervalMinutes Minūtes starp statusa pārbaudēm. Noklusējums: 30
.PARAMETER UseWinCS AvailableUpdatesPolicy GPO vietā izmantojiet WinCS (Windows konfigurācijas sistēma).Ja šī opcija ir iespējota, izvieto WinCsFlags.exe ieplānoto uzdevumu galapunktos, nevis reģistra GPO.
.PARAMETER WinCSKey WinCS atslēga drošas palaišanas konfigurācijai. Noklusējums: F33E0C8E002
.PARAMETER ServiceAccount kontu, lai izpildītu uzdevumu. Noklusējums: SISTĒMA Domēna operācijām izmantojiet domēna administratora pakalpojuma kontu.
.PARAMETER AllowListPath Ceļš uz failu, kurā ir resursdatoru nosaukumi, lai ATĻAUTU ieviešanu (mērķtiecīga/izmēģinājuma ieviešana).Atbalsta .txt (viens resursdatora nosaukums katrā rindā) vai .csv (ar kolonnu Resursdatora nosaukums/Datora nosaukums/nosaukums).Ja tas ir norādīts, ieviešanā tiks iekļautas TIKAI šīs ierīces.
.PARAMETER AllowADGroup Tās AD drošības grupas nosaukums, kurā ir datora konti, kam piešķirt ALLOW.Piemērs: "SecureBoot-Pilot-Computers"
.PARAMETER ExclusionListPath Ceļš uz failu, kas satur resursdatoru nosaukumus, kurus IZSLĒGT no izvēršanas (VIP/izpildes ierīces).Atbalsta .txt (viens resursdatora nosaukums katrā rindā) vai .csv (ar kolonnu Resursdatora nosaukums/Datora nosaukums/nosaukums).
.PARAMETER ExcludeADGroup Tās AD drošības grupas nosaukums, kurā ir iekļauti datoru konti, kas jāizslēdz.Piemērs: "VIP datori"
.PARAMETER ScriptPath Ceļš uz orķestra skriptu. Noklusējums: tā pati mape kā šajā skriptā.
.PARAMETER Uninstall Ieplānotā uzdevuma noņemšana
.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 # Izvietošana, izmantojot WinCS metodi, nevis AvailableUpdatesPolicy .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" -UseWinCS
.EXAMPLE .\Deploy-OrchestratorTask.ps1 — atinstalēt #>
[CmdletBinding()] parametrs( [Parametrs(obligāts = $false)] [virkne]$AggregationInputPath, [Parametrs(obligāts = $false)] [virkne]$ReportBasePath, [Parametrs(obligāts = $false)] [virkne]$TargetOU, [Parametrs(obligāts = $false)] [int]$PollIntervalMinutes = 30, [Parametrs(obligāts = $false)] [pārslēgt]$UseWinCS, [Parametrs(obligāts = $false)] [virkne]$WinCSKey = "F33E0C8E002", [Parametrs(obligāts = $false)] [virkne]$ServiceAccount = "SISTĒMA", [Parametrs(obligāts = $false)] [virkne]$AllowListPath, [Parametrs(obligāts = $false)] [virkne]$AllowADGroup, [Parametrs(obligāts = $false)] [virkne]$ExclusionListPath, [Parametrs(obligāts = $false)] [virkne]$ExcludeADGroup, [Parametrs(obligāts = $false)] [virkne]$ScriptPath, [Parametrs(obligāts = $false)] [pārslēgt]$Uninstall )
$ErrorActionPreference = "Stop" $TaskName = "SecureBoot-Rollout-Orchestrator" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Deployment and monitoring samples"
# ================================================================== # ATKARĪBAS VALIDĀCIJA# ==================================================================
function Test-ScriptDependencies { <# . KOPSAVILKUMS Pārbauda, vai ir pieejami visi nepieciešamie skripti.. APRAKSTS Pārbauda nepieciešamās skripta atkarības un sniedz lejupielādes instrukcijas, ja tādas trūkst.#> parametrs( [Parametrs(obligāts = $true)] [virkne]$ScriptDirectory, [Parametrs(obligāts = $true)] [virkne[]]$RequiredScripts ) $missingScripts = @() foreach ($script $RequiredScripts) { $scriptPath = Join-Path $ScriptDirectory $script if (-not (testa ceļš $scriptPath)) { $missingScripts += $script } } if ($missingScripts.Count, -gt; 0) { Write-Host "" Write-Host ("=" * 70) -Priekšplāna krāsa sarkana Write-Host " TRŪKSTOŠAS ATKARĪBAS" -Priekšplāna krāsa sarkana Write-Host ("=" * 70) -Priekšplāna krāsa sarkana Write-Host "" Write-Host "Šādi nepieciešamie skripti netika atrasti:" -ForegroundColor dzeltena foreach ($script $missingScripts) { Write-Host " - $script" - priekšplāna krāsa balta } Write-Host "" Write-Host "Lūdzu, lejupielādējiet jaunākos skriptus no:" -ForegroundColor Cyan Write-Host " URL: $DownloadUrl" -ForegroundColor White Write-Host " Naviģēt uz: '$DownloadSubPage'" -Priekšplāna krāsa balta Write-Host "" Write-Host "Izvilkt visus skriptus tajā pašā direktorijā un palaist vēlreiz". -Priekšplāna krāsa dzeltena Write-Host "" atgriešanās $false } atgriešanās $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)) { Izeja 1 }
# ================================================================== # ATINSTALĒT# ==================================================================
if ($Uninstall) { Write-Host "" Write-Host "Notiek plānotā uzdevuma noņemšana: $TaskName" -ForegroundColor Yellow $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Ja ($existingTask) { Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false Write-Host "Uzdevums sekmīgi noņemts." -Priekšplāna krāsa zaļa } citādi { Write-Host "Uzdevums nav atrasts". -Priekšplāna krāsa pelēka } Iziet 0 }
# ================================================================== # VALIDĀCIJAS# ==================================================================
if (-not $AggregationInputPath -or -not $ReportBasePath) { Write-Host "ERROR: -AggregationInputPath un -ReportBasePath ir nepieciešami." -ForegroundColor Red Write-Host "" Write-Host "Piemērs:" -ForegroundColor Yellow Write-Host ' .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports"' Izeja 1 }
# Find orchestrator script Ja (-not $ScriptPath) { $ScriptPath = Join-Path $PSScriptRoot "Start-SecureBootRolloutOrchestrator.ps1" }
if (-not (Test-Path $ScriptPath)) { Write-Host "KĻŪDA: vadības moduļa skripts nav atrasts: $ScriptPath" -ForegroundColor Red Izeja 1 }
# Find aggregation script (needed by orchestrator) $aggregateScript = Join-Path $PSScriptRoot "Aggregate-SecureBootData.ps1" if (-not (testa ceļš $aggregateScript)) { Write-Host "BRĪDINĀJUMS: Aggregate-SecureBootData.ps1 nav atrasts skriptu direktorijā" -ForegroundColor Yellow Write-Host " Orchestrator may fail if it cannot find this script." -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 " Uzdevuma nosaukums: $TaskName" Write-Host " Orķestris: $displayScriptPath" Write-Host " Ievades ceļš: $AggregationInputPath" Write-Host " Atskaites ceļš: $ReportBasePath" Write-Host " Mērķis OU: $(if ($TargetOU) { $TargetOU } else { '(domēna sakne)' })" Write-Host " Aptaujas intervāls: $PollIntervalMinutes minūtes" Write-Host " Pakalpojuma konts: $ServiceAccount" Write-Host " Izvietošanas metode: $(if ($UseWinCS) { "WinCS (WinCsFlags.exe)" } else { "AvailableUpdatesPolicy (GPO)" })" Ja ($UseWinCS) { Write-Host " WinCS atslēga: $WinCSKey" } Write-Host ""
# ================================================================== # GPO NOTEIKŠANA — AUTOMĀTISKA IZVIETOŠANA, JA TRŪKST# ==================================================================
$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 "Pārbauda, vai nav noteikta GPO..." -ForegroundColor Yellow Izmēģiniet { # Iegūstiet domēnu no AggregationInputPath (piem., \\domain\share) $domainFromPath = IF ($AggregationInputPath -match '^\\\\([^\\]+)\\') { $matches[1] } citādi { $env:USERDNSDOMAIN } # Pārbaudiet, vai pastāv GPO $existingGpo = get-GPO -name $CollectionGPOName -ErrorAction SilentlyContinue Ja ($existingGpo) { Write-Host " Atrasts noteikšanas GPO: $CollectionGPOName" -ForegroundColor Green } citādi { Write-Host "" Write-Host ("=" * 70) -ForegroundColor dzeltena Write-Host " NOTEIKŠANA GPO NAV ATRASTA" -priekšplāna krāsa dzeltena Write-Host ("=" * 70) -priekšplāna krāsa dzeltena Write-Host "" Write-Host "Noteikšanas GPO $CollectionGPOName netika atrasts." -Priekšplāna krāsa dzeltena Write-Host "Šis GPO ir nepieciešams, lai apkopotu ierīces statusa datus." -ForegroundColor dzeltena Write-Host "" # Pajautāt lietotājam, vai viņš vēlas izvietot GPO tūlīt Write-Host "Vai vēlaties izvietot atklāšanas GPO tūlīt?" (J/N)" -ForegroundColor Cyan $response = lasīšanas resursdators if ($response -match '^[Yy]') { Write-Host "" Write-Host "Launching GPO Deployment..." -ForegroundColor Cyan Write-Host "" # Būvējuma parametri GPO izvietošanai $gpoParams = @{ Domēna nosaukums = $domainFromPath CollectionSharePath = $AggregationInputPath ScriptSourcePath = Join-Path $PSScriptRoot "Detect-SecureBootCertUpdateStatus.ps1" } Ja ($TargetOU) { $gpoParams.OUPath = $TargetOU } citādi { # Izmantojiet AutoDetectOU, lai ļautu lietotājam atlasīt $gpoParams.AutoDetectOU = $true } # Palaist GPO izvietošanas skriptu & $deployGpoScript @gpoParams IF ($LASTEXITCODE -ne 0) { Write-Host "Iespējams, radušās problēmas saistībā ar GPO izvietošanu. Pārskatiet iepriekš norādīto rezultātu." -ForegroundColor Yellow Write-Host "Varat turpināt ar vadības moduļa izvietošanu vai nospiest taustiņu kombināciju Ctrl+C, lai pārtrauktu." -Priekšplāna krāsa dzeltena Write-Host "" Read-Host "Press Enter to continue" (Nospiediet taustiņu Enter, lai turpinātu) } citādi { Write-Host "" Write-Host "Detection GPO deployed successfully!" -ForegroundColor Green Write-Host "" } } citādi { Write-Host "" Write-Host "GPO izvietošanas izlaišana. Vadības modulis nesaņems ierīces datus" -ForegroundColor Yellow Write-Host "līdz atklāšanas GPO tiek izvietots manuāli". -ForegroundColor Yellow Write-Host "" Write-Host "Lai vēlāk izvietotu atklāšanas GPO, palaidiet:" -ForegroundColor Cyan Write-Host " .\Deploy-GPO-SecureBootCollection.ps1 -DomainName '"$domainFromPath'" -AutoDetectOU" -ForegroundColor White Write-Host "" } } } noķert { Write-Host " Nevar pārbaudīt GPO: $($_. Exception.Message)" -ForegroundColor Yellow Write-Host " Turpināt ar orķestra izvietošanu..." -ForegroundColor Grey } } citādi { Write-Host " GroupPolicy modulis nav pieejams — tiek izlaista GPO pārbaude" -ForegroundColor Grey Write-Host " Pārliecinieties, ka noteikšanas GPO tiek izvietots atsevišķi." -Priekšplāna krāsa pelēka }
Write-Host ""
# ================================================================== # BUILD ARGUMENTS# ==================================================================
$arguments = @( "-NoProfile" "-ExecutionPolicy apvedceļš" "-Fails '"$ScriptPath'"" "-AggregationInputPath '"$AggregationInputPath'"" "-ReportBasePath '"$ReportBasePath'"" "-PollIntervalMinutes $PollIntervalMinutes" )
if ($TargetOU) { $arguments += "-TargetOU '"$TargetOU'"" }
if ($UseWinCS) { $arguments += "-UseWinCS" $arguments += "-WinCSKey '"$WinCSKey'"" }
if ($AllowListPath) { $arguments += "-AllowListPath '"$AllowListPath'"" }
if ($AllowADGroup) { $arguments += "-AllowADGroup '"$AllowADGroup'"" }
if ($ExclusionListPath) { $arguments += "-ExclusionListPath '"$ExclusionListPath'"" }
if ($ExcludeADGroup) { $arguments += "-ExcludeADGroup '"$ExcludeADGroup'"" }
$argumentString = $arguments -join " "
# Don't display raw arguments with full paths - it's confusing for published scripts # Uzdevuma iekšēji tiks izmantots pilns ceļš
# ================================================================== # IEPLĀNOTO UZDEVUMU# ==================================================================IZVEIDE
# Check for existing task $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Ja ($existingTask) { Write-Host "Uzdevums jau pastāv. Atjaunināšana..." -Priekšplāna krāsa dzeltena 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 -Once -At (get-date). AddMinutes(1)
# Create principal if ($ServiceAccount -eq "SYSTEM") { $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel highest } citādi { # Normalizējiet lokālā konta formātu: COMPUTERNAME\User -> User # Register-ScheduledTask nepieņem COMPUTERNAME\User vai .\User lokālajiem kontiem $taskUser = $ServiceAccount if ($ServiceAccount -match "^$([regex]::Escape($env:COMPUTERNAME))\\(.+)$") { $taskUser = $Matches[1] Write-Host " Note: Local account detected using '$taskUser' for task registration" -ForegroundColor Grey }
# Prompt for password Write-Host "Ievadiet $ServiceAccount paroli" -ForegroundColor Yellow $cred = Get-Credential -UserName $taskUser -Message "Service account credentials for scheduled task" Ja (-not $cred) { Write-Host "Akreditācijas datu ievadne ir atcelta. Notiek aborts." -Priekšplāna krāsa sarkana Izeja 1 } $principal = New-ScheduledTaskPrincipal -UserId $taskUser -LogonType parole -RunLevel highest }
# Task settings $settings = New-ScheduledTaskSettingsSet ' -AllowStartIfOnBatteries ' -DontStopIfGoingOnBatteries ' -StartWhenAvailable ' -RunOnlyIfNetworkAvailable ' -RestartCount 3 ' -RestartInterval (New-TimeSpan -Minutes 5) ' -ExecutionTimeLimit (New-TimeSpan -Days 30) # Atļaut ilgtermiņu
# Register task Izmēģiniet { if ($ServiceAccount -eq "SYSTEM") { Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Description "Drošās palaišanas sertifikāta ieviešana — automātiska GPO izvietošana" } citādi { # Izmantojiet New-ScheduledTask, lai iegultu galveno (ar RunLevel Highest) uzdevuma objektā, # pēc tam reģistrējieties ar -InputObject + -User/-Password (atsevišķs parametru komplekts no -Principal) $taskDefinition = New-ScheduledTask -Action $action -Trigger $trigger -Principal $principal -Settings $settings $taskDefinition.Description = "Secure Boot Certificate Rollout — Automated GPO deployment" # Piezīme: Register-ScheduledTask nepieciešama vienkārša teksta parole - nepastāv SecureString pārslodze $netCred = $cred. GetNetworkCredential() Register-ScheduledTask -TaskName $TaskName -InputObject $taskDefinition -User $taskUser -Password $netCred.Password -ErrorAction Stop $netCred = $null } Write-Host "Ieplānotais uzdevums veiksmīgi izveidots!" -Priekšplāna krāsa zaļa } noķert { Write-Host "Neizdevās izveidot ieplānoto uzdevumu: $($_. Exception.Message)" -ForegroundColor Red Izeja 1 }
# ================================================================== # CREATE STATUS SHORTCUT# ==================================================================
$statusScript = Join-Path $PSScriptRoot "Get-SecureBootRolloutStatus.ps1" ja (testa ceļš $statusScript) { Write-Host "" Write-Host "Lai pārbaudītu izvēršanas statusu, palaist:" -ForegroundColor Yellow Write-Host " .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '"$ReportBasePath'"" -ForegroundColor Cyan }
# ================================================================== # IZVADES# ==================================================================
Write-Host "" Write-Host ("=" * 70) -Priekšplāna krāsa zaļa Write-Host " IZVIETOŠANA PABEIGTA" -Priekšplāna krāsa zaļa Write-Host ("=" * 70) -Priekšplāna krāsa zaļa Write-Host "" Write-Host "Orkestrators sāks darboties aptuveni pēc 1 minūtes." -Priekšplāna krāsa balta Write-Host "" Write-Host "MONITORING:" -ForegroundColor Yellow Write-Host " Skatīt uzdevuma statusu: Get-ScheduledTask -TaskName '$TaskName' | Atlasīt štatu" Write-Host " Skatīt uzdevumu žurnālu: Get-Content '$ReportBasePath\RolloutState\Orchestrator_$(Get-Date -Format 'yyyyMMdd').log' -Tail 50" Write-Host " Skatīt izvēršanas stāvokli: Get-Content '$ReportBasePath\RolloutState\RolloutState.json' | ConvertFrom-Json" Write-Host " Skatīt informācijas paneli: sākums '$ReportBasePath\Aggregation_*\SecureBoot_Dashboard*.html'" Write-Host " Ātrais statuss: .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '$ReportBasePath'" Write-Host "" Write-Host "PĀRVALDĪBA:" -Priekšplāna krāsa dzeltena Write-Host " Sākt manuāli: Start-ScheduledTask -TaskName '$TaskName'" Write-Host " Stop: Stop-ScheduledTask -TaskName '$TaskName'" Write-Host " Remove: .\Deploy-OrchestratorTask.ps1 -Uninstall" Write-Host ""