VIKTIG Denne artikkelen som inneholder dette eksempelskriptet, er trukket tilbake. Fra og med Windows-oppdateringene som ble utgitt 12. mai 2026, er eksempelskriptet plassert i mappen %systemroot%\SecureBoot\ExampleRolloutScripts på enheten.
Kopier og lim inn dette eksempelskriptet og endre etter behov for miljøet:
<# . SYNOPSIS Distribuerer orchestratoren for sikker oppstartsutrulling som en Windows-planlagt oppgave.
.DESCRIPTION Oppretter en planlagt oppgave som kjører orchestratoren kontinuerlig i bakgrunnen.Oppgaven kjører med policy for å omgå kjøring, slik at ingen sikkerhetsmeldinger vises. Orchestratoren vil: – Undersøkelse for enhetsoppdateringer på det angitte intervallet – Generer bølger automatisk og distribuer gpoer – Fortsett til alle kvalifiserte enheter er oppdatert Overvåk fremdriften ved hjelp av: Get-SecureBootRolloutStatus.ps1
.PARAMETER AggregationInputPath UNC-bane til JSON-enhetsdata (fra GPO-gjenkjenning)
.PARAMETER ReportBasePath Lokal bane for rapporter og tilstandsfiler
.PARAMETER TargetOU Ou å koble GPOer (valgfritt - standard til domenerot)
.PARAMETER PollIntervalMinutes Minutter mellom statuskontroller. Standard: 30
.PARAMETER UseWinCS Bruk WinCS (Windows Configuration System) i stedet for AvailableUpdatesPolicy GPO.Når den er aktivert, distribueres WinCsFlags.exe planlagt oppgave til endepunkter i stedet for register-GPO.
.PARAMETER WinCSKey WinCS-nøkkelen for konfigurasjon av sikker oppstart. Standard: F33E0C8E002
.PARAMETER ServiceAccount Konto for å kjøre oppgaven. Standard: SYSTEM Bruk en tjenestekonto for domeneadministrator for domeneoperasjoner.
.PARAMETER AllowListPath Bane til en fil som inneholder vertsnavn til TILLAT for utrulling (målrettet/pilotutrulling).Støtter .txt (ett vertsnavn per linje) eller .csv (med kolonnen Hostname/ComputerName/Name).Når dette er angitt, inkluderes BARE disse enhetene i utrullingen.
.PARAMETER AllowADGroup Navnet på en AD-sikkerhetsgruppe som inneholder datamaskinkontoer som skal TILLATEs.Eksempel: SecureBoot-Pilot-Computers
.PARAMETER ExclusionListPath Bane til en fil som inneholder vertsnavn til EXCLUDE fra utrulling (VIP/executive-enheter).Støtter .txt (ett vertsnavn per linje) eller .csv (med kolonnen Hostname/ComputerName/Name).
.PARAMETER ExcludeADGroup Navnet på en AD-sikkerhetsgruppe som inneholder datamaskinkontoer som skal utelates.Eksempel: VIP-datamaskiner
.PARAMETER ScriptPath Bane til orchestratorskriptet. Standard: Samme mappe som dette skriptet.
.PARAMETER Uninstall Fjerne den planlagte aktiviteten
.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 # Distribuer ved hjelp av WinCS-metode i stedet for AvailableUpdatesPolicy .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports" -UseWinCS
.EXAMPLE .\Deploy-OrchestratorTask.ps1 -Avinstaller #>
[CmdletBinding()] param( [Parameter(Obligatorisk = $false)] [streng]$AggregationInputPath, [Parameter(Obligatorisk = $false)] [streng]$ReportBasePath, [Parameter(Obligatorisk = $false)] [streng]$TargetOU, [Parameter(Obligatorisk = $false)] [int]$PollIntervalMinutes = 30, [Parameter(Obligatorisk = $false)] [switch]$UseWinCS, [Parameter(Obligatorisk = $false)] [streng]$WinCSKey = "F33E0C8E002", [Parameter(Obligatorisk = $false)] [streng]$ServiceAccount = "SYSTEM", [Parameter(Obligatorisk = $false)] [streng]$AllowListPath, [Parameter(Obligatorisk = $false)] [streng]$AllowADGroup, [Parameter(Obligatorisk = $false)] [streng]$ExclusionListPath, [Parameter(Obligatorisk = $false)] [streng]$ExcludeADGroup, [Parameter(Obligatorisk = $false)] [streng]$ScriptPath, [Parameter(Obligatorisk = $false)] [switch]$Uninstall )
$ErrorActionPreference = "Stop" $TaskName = "SecureBoot-Rollout-Orchestrator" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = «Eksempler på distribusjon og overvåking»
# ================================================================== ## ==================================================================FOR AVHENGIGHETSVALIDERING
function Test-ScriptDependencies { <# . SYNOPSIS Validerer at alle nødvendige skript finnes.. BESKRIVELSE Ser etter nødvendige skriptavhengigheter og gir nedlastingsinstruksjoner hvis de mangler.#> param( [Parameter(Obligatorisk = $true)] [streng]$ScriptDirectory, [Parameter(Obligatorisk = $true)] [string[]]$RequiredScripts ) $missingScripts = @() foreach ($script i $RequiredScripts) { $scriptPath = Join-Path $ScriptDirectory $script if (-not (Test-Path $scriptPath)) { $missingScripts += $script } } hvis ($missingScripts.Count -gt 0) { Write-Host "" Write-Host ("=" * 70) -ForegroundColor Red Write-Host " MISSING DEPENDENCIES" -ForegroundColor Red Write-Host ("=" * 70) -Forgrunnsfarge rød Write-Host "" Write-Host "Finner ikke følgende nødvendige skript:" -ForegroundColor Yellow foreach ($script i $missingScripts) { Write-Host " - $script" -ForegroundColor White } Write-Host "" Write-Host «Last ned de nyeste skriptene fra:» –Forgrunnsfarge Cyan URL-adresse for Write-Host " $DownloadUrl" -ForegroundColor White Write-Host " Naviger til: '$DownloadSubPage'" -ForegroundColor White Write-Host "" Write-Host «Trekk ut alle skript i samme mappe og kjør på nytt». -Forgrunnsfarge Gul Write-Host "" returner $false } returner $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)) { avslutt 1 }
# ================================================================== # AVINSTALLER# ==================================================================
if ($Uninstall) { Write-Host "" Write-Host "Fjerner planlagt aktivitet: $TaskName" -Forgrunnsfarge gul $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue hvis ($existingTask) { Stop-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false Write-Host «Oppgaven er fjernet». –Forgrunnsfarge grønn } ellers { Write-Host "Finner ikke oppgave." -Forgrunnsfarge grå } avslutt 0 }
# ================================================================== # VALIDERING# ==================================================================
if (-not $AggregationInputPath -or -not $ReportBasePath) { Write-Host «FEIL: -AggregationInputPath og -ReportBasePath kreves.» -Forgrunnsfarge rød Write-Host "" Write-Host "Eksempel:" -Forgrunnsfarge gul Write-Host ' .\Deploy-OrchestratorTask.ps1 -AggregationInputPath "\\server\SecureBootData$" -ReportBasePath "C:\SecureBootReports"' avslutt 1 }
# Find orchestrator script hvis (-ikke $ScriptPath) { $ScriptPath = Join-Path $PSScriptRoot "Start-SecureBootRolloutOrchestrator.ps1" }
if (-not (Test-Path $ScriptPath)) { Write-Host «FEIL: Finner ikke Orchestrator-skript: $ScriptPath» –Forgrunnsfarge rød avslutt 1 }
# Find aggregation script (needed by orchestrator) $aggregateScript = Join-Path $PSScriptRoot "Aggregate-SecureBootData.ps1" if (-not (Test-Path $aggregateScript)) { Write-Host «ADVARSEL: Aggregate-SecureBootData.ps1 ikke funnet i skriptkatalogen» –Forgrunnsfarge gul Write-Host " Orchestrator kan mislykkes hvis det ikke finner dette skriptet." -ForegroundColor Yellow }
Write-Host "" Write-Host ("=" * 70) -Forgrunnsfarge Cyan Write-Host " Secure Boot Rollout Orchestrator - Task Deployment" -ForegroundColor Cyan Write-Host ("=" * 70) -Forgrunnsfarge Cyan Write-Host ""
# For display, show relative paths (script names only) $displayScriptPath = Split-Path $ScriptPath -Leaf
Write-Host "Configuration:" -ForegroundColor Yellow Write-Host " Aktivitetsnavn: $TaskName" Write-Host " Orchestrator: $displayScriptPath" Write-Host " Inndatabane: $AggregationInputPath" Write-Host " Rapportbane: $ReportBasePath" Write-Host " Target OU: $(if ($TargetOU) { $TargetOU } else { '(domain root)' })" Write-Host " Avspørringsintervall: $PollIntervalMinutes minutter" Write-Host " Tjenestekonto: $ServiceAccount" Write-Host " Deployment Method: $(if ($UseWinCS) { "WinCS (WinCsFlags.exe)" } else { "AvailableUpdatesPolicy (GPO)" })" hvis ($UseWinCS) { Write-Host " WinCS-nøkkel: $WinCSKey" } Write-Host ""
# ================================================================== # GPO-GJENKJENNING – AUTOMATISK DISTRIBUSJON HVIS MANGLENDE# ==================================================================
$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 "Ser etter GPO for gjenkjenning..." -Forgrunnsfarge gul prøv { # Hent domenet fra AggregationInputPath (for eksempel \\domene\del) $domainFromPath = hvis ($AggregationInputPath -match '^\\\\([^\\]+)\\') { $matches[1] } ellers { $env:USERDNSDOMAIN } # Kontroller om gruppepolicyobjektet finnes $existingGpo = Get-GPO -Name $CollectionGPOName -ErrorAction SilentlyContinue hvis ($existingGpo) { Write-Host " Detection GPO funnet: $CollectionGPOName" -ForegroundColor Green } ellers { Write-Host "" Write-Host ("=" * 70) -Forgrunnsfarge gul Write-Host " DETECTION GPO NOT FOUND" -ForegroundColor Yellow Write-Host ("=" * 70) -Forgrunnsfarge gul Write-Host "" Write-Host "Gjenkjennings-GPO -$CollectionGPOName" ble ikke funnet. -Forgrunnsfarge gul Write-Host «Dette gruppepolicyobjektet kreves for å samle inn enhetsstatusdata.» –Forgrunnsfarge gul Write-Host "" # Spør brukeren om de vil distribuere gruppepolicyobjektet nå Write-Host «Vil du distribuere GPO for gjenkjenning nå? (Y/N)" -Forgrunnsfarge Cyan $response = Lesevert hvis ($response -match '^[ÅÅ]') { Write-Host "" Write-Host "Launching GPO Deployment..." -ForegroundColor Cyan Write-Host "" # byggparametere for GPO-distribusjon $gpoParams = @{ DomainName = $domainFromPath CollectionSharePath = $AggregationInputPath ScriptSourcePath = Join-Path $PSScriptRoot "Detect-SecureBootCertUpdateStatus.ps1" } hvis ($TargetOU) { $gpoParams.OUPath = $TargetOU } ellers { # Bruk AutoDetectOU for å la brukeren velge $gpoParams.AutoDetectOU = $true } # Kjør skriptet for GPO-distribusjon & $deployGpoScript @gpoParams hvis ($LASTEXITCODE -ne 0) { Write-Host «GPO-distribusjon kan ha oppstått problemer. Se gjennom utdataene ovenfor.» -Forgrunnsfarge gul Write-Host «Du kan fortsette med distribuering av orchestrator eller trykke CTRL+C for å avbryte.» –Forgrunnsfarge gul Write-Host "" Read-Host «Trykk ENTER for å fortsette» } ellers { Write-Host "" Write-Host «GPO for gjenkjenning er distribuert!» –Forgrunnsfarge grønn Write-Host "" } } ellers { Write-Host "" Write-Host «Hopper over GPO-distribusjon. Orchestratoren vil ikke motta enhetsdata" -ForegroundColor Yellow Write-Host «inntil GPO for gjenkjenning distribueres manuelt». –Forgrunnsfarge gul Write-Host "" Write-Host «Hvis du vil distribuere GPO for gjenkjenning senere, kjører du:» –Forgrunnsfarge Cyan Write-Host " .\Deploy-GPO-SecureBootCollection.ps1 -DomainName '"$domainFromPath'" -AutoDetectOU" -ForegroundColor White Write-Host "" } } } catch { Write-Host " Kan ikke se etter gruppepolicyobjekt: $($_. Exception.Message)" -ForegroundColor Gul Write-Host " Fortsetter med orchestrator-distribusjon..." -ForegroundColor Gray } } ellers { Write-Host " GroupPolicy-modulen er ikke tilgjengelig - hopper over GPO-kontroll" -Forgrunnsfarge grå Write-Host " Sørg for at GPO for gjenkjenning distribueres separat." -Forgrunnsfarge grå }
Write-Host ""
# ================================================================== # BUILD-ARGUMENTER# ==================================================================
$arguments = @( "-NoProfile" "-ExecutionPolicy Bypass" "-Fil "$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 # Aktiviteten bruker hele banen internt
# ================================================================== # OPPRETT PLANLAGT AKTIVITET# ==================================================================
# Check for existing task $existingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue hvis ($existingTask) { Write-Host «Aktiviteten finnes allerede. Oppdaterer ... -Forgrunnsfarge gul 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 hvis ($ServiceAccount -eq "SYSTEM") { $principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest } ellers { # Normaliser lokalt kontoformat: COMPUTERNAME\User -> User # Register-ScheduledTask godtar ikke COMPUTERNAME\User eller .\User for lokale kontoer $taskUser = $ServiceAccount hvis ($ServiceAccount -match "^$([regex]::Escape($env:COMPUTERNAME))\\(.+)$") { $taskUser = $Matches[1] Write-Host " Obs! Lokal konto oppdaget ved hjelp av "$taskUser" for oppgaveregistrering" -ForegroundColor Gray }
# Prompt for password Write-Host «Skriv inn passord for $ServiceAccount» –Forgrunnsfarge gul $cred = Get-Credential -UserName $taskUser -Message "Legitimasjon for tjenestekonto for planlagt oppgave" hvis (-ikke $cred) { Write-Host «Legitimasjonsoppføring avbrutt. Avbryter.» -Forgrunnsfarge rød avslutt 1 } $principal = New-ScheduledTaskPrincipal -UserId $taskUser -LogonType Password -RunLevel Highest }
# Task settings $settings = New-ScheduledTaskSettingsSet ' -AllowStartIfOnBatteries ' -DontStopIfGoingOnBatteries ' -StartNår tilgjengelig ' -RunOnlyIfNetworkAvailable ' -RestartCount 3 ' -RestartInterval (New-TimeSpan -Minutes 5) ' -ExecutionTimeLimit (New-TimeSpan -Days 30) # Tillat langvarig
# Register task prøv { hvis ($ServiceAccount -eq "SYSTEM") { Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Description "Utrulling av sikkert oppstartssertifikat - automatisert GPO-distribusjon" } ellers { # Bruk New-ScheduledTask til å bygge inn hovedstolen (med RunLevel Highest) i et oppgaveobjekt, # registrer deg deretter med -InputObject + -User/-Password (separat parametersett fra -Principal) $taskDefinition = New-ScheduledTask -Action $action -Trigger $trigger -Principal $principal -Settings $settings $taskDefinition.Description = "Utrulling av sikkert oppstartssertifikat - automatisert GPO-distribusjon" # Obs! Register-ScheduledTask krever passord for ren tekst - det finnes ingen SecureString-overbelastning $netCred = $cred. GetNetworkCredential() Register-ScheduledTask -TaskName $TaskName -InputObject $taskDefinition -User $taskUser -Password $netCred.Password -ErrorAction Stop $netCred = $null } Write-Host Planlagt oppgave opprettet! -Forgrunnsfarge grønn } catch { Write-Host «Kan ikke opprette planlagt aktivitet: $($_. Exception.Message)" -ForegroundColor Red avslutt 1 }
# ================================================================== # OPPRETT STATUSSNARVEI# ==================================================================
$statusScript = Join-Path $PSScriptRoot "Get-SecureBootRolloutStatus.ps1" hvis (testbane $statusScript) { Write-Host "" Write-Host «Hvis du vil kontrollere utrullingsstatus, kjør:» –Forgrunnsfarge gul Write-Host " .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath '"$ReportBasePath'"" -Forgrunnsfarge Cyan }
# ================================================================== # OUTPUT# ==================================================================
Write-Host "" Write-Host ("=" * 70) -Forgrunnsfarge grønn Write-Host " DEPLOYMENT COMPLETE" -ForegroundColor Green Write-Host ("=" * 70) -Forgrunnsfarge grønn Write-Host "" Write-Host "Orchestratoren starter om ca. 1 minutt." -Forgrunnsfarge hvit Write-Host "" Write-Host "MONITORING:" -ForegroundColor Yellow Write-Host " Vis aktivitetsstatus: Get-ScheduledTask -TaskName $TaskName | Velg delstat» Write-Host " Vis oppgavelogg: Get-Content '$ReportBasePath\RolloutState\Orchestrator_$(Get-Date -Format 'yyyyMDd').log' -Tail 50" Write-Host " Vis utrullingsstatus: Get-Content '$ReportBasePath\RolloutState\RolloutState.json' | ConvertFrom-Json" Write-Host « Vis instrumentbord: Start $ReportBasePath\Aggregation_*\SecureBoot_Dashboard*.html» Write-Host hurtigstatus: .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath $ReportBasePath Write-Host "" Write-Host "MANAGEMENT:" -ForegroundColor Yellow Write-Host " Start manuelt: Start-ScheduledTask -TaskName $TaskName" Write-Host " Stopp: Stop-ScheduledTask -TaskName $TaskName" Write-Host " Fjern: .\Deploy-OrchestratorTask.ps1 -Avinstaller" Write-Host ""