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 "" ​​​​​​​

Trenger du mer hjelp?

Vil du ha flere alternativer?

Utforsk abonnementsfordeler, bla gjennom opplæringskurs, finn ut hvordan du sikrer enheten og mer.