Nukopijuokite ir įklijuokite šį scenarijaus pavyzdį ir modifikuokite, kiek reikia jūsų aplinkai:
<# . ANOTACIJA Diegia "Secure Boot Rollout Orchestrator" kaip "Windows" suplanuotą užduotį.
.DESCRIPTION Sukuria suplanuotą užduotį, kuri fone nuolat paleidžia valdymo modulio veikimą.Užduotis vykdoma su apėjimo vykdymo strategija, kad nebūtų rodomi jokie saugos raginimai. Orkestras: - Apklausa apie įrenginio naujinimus nurodytu intervalu - Automatiškai generuoti bangas ir įdiegti GPO - Tęsti, kol bus atnaujinti visi tinkami įrenginiai Stebėkite eigą naudodami: Get-SecureBootRolloutStatus.ps1
.PARAMETER AggregationInputPath UNC kelias į JSON įrenginio duomenis (nuo aptikimo GPO)
.PARAMETER ReportBasePath Vietinis kelias ataskaitoms ir būsenos failams
.PARAMETER TargetOU OU susieti GPO (pasirinktinai – numatytosios domeno šaknies reikšmės)
.PARAMETER PollIntervalMinutes Minučių skaičius tarp būsenos patikrų. Numatytoji reikšmė: 30
.PARAMETER UseWinCS Naudokite "WinCS" ("Windows" konfigūravimo sistema), o ne AvailableUpdatesPolicy GPO.Įgalinus, įdiegia WinCsFlags.exe suplanuotą užduotį į pabaigos taškus, o ne į registro GPO.
.PARAMETER WinCSKey "WinCS" saugiosios įkrovos konfigūracijos raktas. Numatytoji reikšmė: F33E0C8E002
.PARAMETER ServiceAccount Paskyra, kad būtų vykdoma užduotis. Numatytoji reikšmė: SISTEMA Domeno operacijoms naudokite domeno administravimo tarnybos paskyrą.
.PARAMETER ScriptPath Kelias į valdymo modulio scenarijų. Numatytoji reikšmė: tas pats aplankas kaip ir šis scenarijus.
.PARAMETER Uninstall Pašalinti suplanuotą užduotį
.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 # Diegimas naudojant "WinCS" metodą vietoj AvailableUpdatesPolicy .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" - UseWinCS
.EXAMPLE .\Deploy-OrchestratorTask.ps1 – išdiegti #>
[CmdletBinding()] param( [Parametras(Privalomas = $false)] [eilutė]$AggregationInputPath, [Parametras(Privalomas = $false)] [eilutė]$ReportBasePath, [Parametras(Privalomas = $false)] [eilutė]$TargetOU, [Parametras(Privalomas = $false)] [sveikasis skaičius]$PollIntervalMinutes = 30, [Parametras(Privalomas = $false)] [jungiklis]$UseWinCS, [Parametras(Privalomas = $false)] [eilutė]$WinCSKey = "F33E0C8E002", [Parametras(Privalomas = $false)] [eilutė]$ServiceAccount = "SYSTEM", [Parametras(Privalomas = $false)] [eilutė]$ScriptPath, [Parametras(Privalomas = $false)] [jungiklis]$Uninstall )
$ErrorActionPreference = "Stop" $TaskName = "SecureBoot-Rollout-Orchestrator" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Diegimo ir stebėjimo pavyzdžiai"
# ============================================================================ # PRIKLAUSOMYBĖS TIKRINIMAS # ============================================================================
function Test-ScriptDependencies { <# . ANOTACIJA Patikrina, ar yra visi būtini scenarijai.. APRAŠYMAS / KONTROLĖ Tikrina, ar yra būtinų scenarijų priklausomybių, ir pateikia atsisiuntimo instrukcijas, jei jų nėra.#> param( [Parametras(Privalomas = $true)] [eilutė]$ScriptDirectory, [Parametras(Privalomas = $true)] [eilutė[]$RequiredScripts ) $missingScripts = @() foreach ($script in $RequiredScripts) { $scriptPath = Join-Path $ScriptDirectory $script jei (-not (testo kelias $scriptPath)) { $missingScripts += $script } } jei ($missingScripts.Count -gt 0) { Write-Host Write-Host (=" * 70) – priekinio planopalva raudona Write-Host " MISSING DEPENDENCIES" -ForegroundColor Red Write-Host ("=" * 70) – priekinio planopalva raudona Write-Host Write-Host "Nerasta šių būtinų scenarijų:" -Priekinio planopalva geltona foreach ($script in $missingScripts) { Write-Host " - $script" - Priekinio planopalva balta } Write-Host Write-Host "Atsisiųskite naujausius scenarijus iš:" -ForegroundColor Cyan Write-Host " URL: $DownloadUrl" -ForegroundColor White Write-Host " Pereiti į: "$DownloadSubPage" - priekinio planopalva balta Write-Host Write-Host "Išskleisti visus scenarijus į tą patį katalogą ir paleisti iš naujo." -Priekinio planopalva Geltona Write-Host grąžinimo $false } grąžinimo $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)) { išeiti iš 1 }
# ============================================================================ # IŠDIEGTI # ============================================================================
if ($Uninstall) { Write-Host Write-Host "Šalinama suplanuota užduotis: $TaskName" – geltona priekinio plano spalva $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue jei ($existingTask) { Stop-ScheduledTask –TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false Write-Host "Užduotis sėkmingai pašalinta". -Priekinio planopalva žalia } dar { Write-Host "Užduotis nerasta". -Priekinio planopalva pilka } išeiti iš 0 }
# ============================================================================ # TIKRINIMAS # ============================================================================
if (-not $AggregationInputPath -or -not $ReportBasePath) { Write-Host "KLAIDA: -AggregationInputPath ir -ReportBasePath yra būtini." -ForegroundColor Red Write-Host Write-Host "Example:" -ForegroundColor Yellow Write-Host ' .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports"' išeiti iš 1 }
# Find orchestrator script jei (-not $ScriptPath) { $ScriptPath = Join-Path $PSScriptRoot "Start-SecureBootRolloutOrchestrator.ps1" }
if (-not (Test-Path $ScriptPath)) { Write-Host "KLAIDA: valdymo modulio scenarijus nerastas: $ScriptPath" -ForegroundColor Red išeiti iš 1 }
# Find aggregation script (needed by orchestrator) $aggregateScript = Join-Path $PSScriptRoot "Aggregate-SecureBootData.ps1" jei (-not (testo kelias $aggregateScript)) { Write-Host "ĮSPĖJIMAS: Aggregate-SecureBootData.ps1 nerasta scenarijų kataloge" -Priekinio planopalva Geltona Write-Host " Orchestrator gali nepavykti, jei nepavyksta rasti šio scenarijaus." -ForegroundColor Yellow }
Write-Host "" Write-Host ("=" * 70) - Priekinio planopalvos žydra Write-Host " Secure Boot Rollout Orchestrator - Task Deployment" -ForegroundColor Cyan Write-Host ("=" * 70) - Priekinio planopalvos žydra Write-Host
# For display, show relative paths (script names only) $displayScriptPath = Split-Path $ScriptPath -Leaf
Write-Host "Configuration:" -ForegroundColor Yellow Write-Host " Užduoties pavadinimas: $TaskName" Write-Host " Orchestrator: $displayScriptPath" Write-Host " Įvesties kelias: $AggregationInputPath" Write-Host " Ataskaitos kelias: $ReportBasePath" Write-Host " Target OU: $(if ($TargetOU) { $TargetOU } else { '(domain root)' })" Write-Host " Apklausos intervalas: $PollIntervalMinutes minutės" Write-Host " Paslaugos abonementas: $ServiceAccount" Write-Host " Diegimo metodas: $(if ($UseWinCS) { "WinCS (WinCsFlags.exe)" } dar { "AvailableUpdatesPolicy (GPO)" })" jei ($UseWinCS) { Write-Host " WinCS raktas: $WinCSKey" } Write-Host
# ============================================================================ # GPO APTIKIMAS – AUTOMATINIS DIEGIMAS, JEI JO NĖRA # ============================================================================
$CollectionGPOName = "SecureBoot-EventCollection" $deployGpoScript = Join-Path $PSScriptRoot "Deploy-GPO-SecureBootCollection.ps1"
# Check if GroupPolicy module is available jei (Get-Module -ListAvailable -Name GroupPolicy) { Import-Module GroupPolicy - ErrorAction SilentlyContinue Write-Host "Tikrinama, ar yra aptikimo GPO..." – geltona priekinio plano spalva išbandykite { # Gaukite domeną iš AggregationInputPath (pvz., \\domain\share) $domainFromPath = jei ($AggregationInputPath -match '^\\\\([^\\]+)\\') { $matches[1] } dar { $env:USERDNSDOMAIN } # Patikrinkite, ar GPO yra $existingGpo = Get-GPO -Name $CollectionGPOName -ErrorAction SilentlyContinue jei ($existingGpo) { Write-Host " Rasta aptikimo GPO: $CollectionGPOName" -Priekinio planopalva žalia } dar { Write-Host Write-Host ("=" * 70) – priekinio planopalva geltona Write-Host " DETECTION GPO NOT FOUND" -ForegroundColor Yellow Write-Host ("=" * 70) – geltona priekinio plano spalva Write-Host "" Write-Host "Nerastas aptikimo GPO "$CollectionGPOName". -Priekinio planopalva geltona Write-Host "Šis GPO būtinas įrenginio būsenos duomenims rinkti." -Priekinio planopalva Geltona Write-Host # Paklauskite vartotojo, ar jis nori įdiegti GPO dabar Write-Host "Ar norite dabar įdiegti aptikimo GPO? (Y/N)" -ForegroundColor Cyan $response = skaitymo pagrindinis kompiuteris jei ($response -atitinka ^[Yy]) { Write-Host Write-Host "GPO diegimo paleidimas..." -ForegroundColor Cyan Write-Host # GPO diegimo komponavimo versijos parametrai $gpoParams = @{ DomainName = $domainFromPath CollectionSharePath = $AggregationInputPath ScriptSourcePath = Join-Path $PSScriptRoot "Detect-SecureBootCertUpdateStatus.ps1" } jei ($TargetOU) { $gpoParams.OUPath = $TargetOU } dar { # Naudokite AutoDetectOU, kad leistumėte vartotojui pasirinkti $gpoParams.AutoDetectOU = $true } # Paleiskite GPO diegimo scenarijų & $deployGpoScript @gpoParams jei ($LASTEXITCODE -ne 0) { Write-Host gali kilti problemų dėl GPO diegimo. Peržiūrėkite aukščiau pateiktą išvestį." -Priekinio planopalva Geltona Write-Host "Galite tęsti valdymo modulio diegimą arba paspausti Ctrl + C, kad nutrauktumėte." -Priekinio planopalva Geltona Write-Host Read-Host "Norėdami tęsti, paspauskite klavišą "Enter" } dar { Write-Host Write-Host "Aptikimo GPO sėkmingai įdiegtas!" -Priekinio planocolor žalia Write-Host } } dar { Write-Host Write-Host "GPO diegimo praleidimas. Valdymo modulis negaus įrenginio duomenų" – "ForegroundColor Yellow" Write-Host "kol aptikimo GPO bus įdiegtas rankiniu būdu." -Priekinio planopalva Geltona Write-Host Write-Host "Norėdami įdiegti aptikimo GPO vėliau, vykdyti:" -ForegroundColor Cyan Write-Host ".\Deploy-GPO-SecureBootCollection.ps1 -DomainName '"$domainFromPath'" -AutoDetectOU" -Priekinio planopalva balta Write-Host } } } sugauti { Write-Host " Nepavyksta patikrinti GPO: $($_. Exception.Message)" -ForegroundColor Yellow Write-Host " Continuing with orchestrator deployment..." -ForegroundColor Gray } } dar { Write-Host " GroupPolicy modulis nepasiekiamas – GPO patikros praleidimas" -Priekinio planopalva pilka Write-Host " Įsitikinkite, kad aptikimo GPO diegiamas atskirai." -Priekinio planopalva pilka }
Write-Host ""
# ============================================================================ # KOMPONAVIMO VERSIJOS ARGUMENTAI # ============================================================================
$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 # Užduotis naudos visą kelią viduje
# ============================================================================ # KURTI SUPLANUOTĄ UŽDUOTĮ # ============================================================================
# Check for existing task $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue jei ($existingTask) { Write-Host Užduotis jau yra. Naujinama..." – geltona priekinio plano spalva 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 } dar { # Raginti įvesti domeno paskyros slaptažodį Write-Host "Įvesti $ServiceAccount slaptažodį" – geltona priekinio plano spalva $cred = Get-Credential -UserName $ServiceAccount -Message "Service account credentials for scheduled task" $principal = New-ScheduledTaskPrincipal -UserId $ServiceAccount -LogonType slaptažodis -RunLevel Highest }
# Task settings $settings = New-ScheduledTaskSettingsSet ' -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -PradžiaKai Galima ' -RunOnlyIfNetworkAvailable -RestartCount 3 ' -RestartInterval (New-TimeSpan -Minutes 5) ' -ExecutionTimeLimit (New-TimeSpan -Days 30) # Allow long-running
# Register task išbandykite { if ($ServiceAccount -eq "SYSTEM") { Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Description "Secure Boot Certificate Rollout - Automated GPO deployment" } dar { 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(). Slaptažodį } Write-Host "Suplanuota užduotis sukurta sėkmingai!" -Priekinio planopalva Žalia } sugauti { Write-Host "Nepavyko sukurti suplanuotos užduoties: $($_. Exception.Message)" -ForegroundColor Red išeiti iš 1 }
# ============================================================================ # BŪSENOS NUORODOS KŪRIMAS # ============================================================================
$statusScript = Join-Path $PSScriptRoot "Get-SecureBootRolloutStatus.ps1" if (Test-Path $statusScript) { Write-Host Write-Host "To check rollout status, run:" -ForegroundColor Yellow Write-Host . \Get-SecureBootRolloutStatus.ps1 -ReportBasePath $ReportBasePath - ForegroundColor Cyan }
# ============================================================================ # IŠVESTIS # ============================================================================
Write-Host "" Write-Host ("=" * 70) - Priekinio planopalva žalia Write-Host " DEPLOYMENT COMPLETE" -ForegroundColor Green Write-Host ("=" * 70) - Priekinio planopalva žalia Write-Host " Write-Host "Orkestras prasidės maždaug per 1 minutę." -Priekinio planocolor balta Write-Host " Write-Host "MONITORING:" -Priekinio planopalva geltona Write-Host " Peržiūrėti užduoties būseną: Get-ScheduledTask -TaskName '$TaskName' | Select State" Write-Host " View task log: Get-Content '$ReportBasePath\RolloutState\Orchestrator_$(Get-Date -Format 'yyyyMMdd').log' -Tail 50" Write-Host " Peržiūrėti diegimo būseną: Get-Content "$ReportBasePath\RolloutState\RolloutState.json" | ConvertFrom-Json" Write-Host " View dashboard: Start '$ReportBasePath\Aggregation_*\SecureBoot_Dashboard*.html" Write-Host " Sparčioji būsena: .\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