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 Aktiverer planlagt oppgave for sikker oppstartsoppdatering.
.DESCRIPTION Dette skriptet sikrer den planlagte oppgaven Windows Secure Boot Update (\Microsoft\Windows\PI\Secure-Boot-Update) er aktivert. Hvis deaktivert, den aktiverer den. Hvis oppgaven ble slettet, kan den opprette den på nytt.
.PARAMETER Action Handlingen som skal utføres. Gyldige verdier: kontroller, aktiver, opprett - kontroller: Kontroller bare aktivitetsstatusen – aktiver: (standard) Aktiver oppgaven hvis deaktivert. Hvis oppgaven mangler, blir du bedt om å opprette.– opprett: Opprett oppgaven hvis den ikke finnes
.PARAMETER ComputerName Valgfritt. Matrise med datamaskinnavn som oppgaven skal kontrolleres/aktiveres på.Hvis det ikke er angitt, kjører du på den lokale maskinen.
.PARAMETER Credential Valgfritt. Legitimasjon for ekstern datamaskintilgang.
.PARAMETER Quiet Undertrykker ledetekster og svarer automatisk på Ja. Nyttig for automatisering.
.EXAMPLE .\Enable-SecureBootTask.ps1 # Aktiverer aktivitetsstatusen på lokal maskin
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 aktivere # Aktiverer oppgaven hvis deaktivert. Spørsmål å opprette hvis den mangler.
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 opprette # Oppretter oppgaven hvis den ble slettet, og kontrollerer deretter statusen
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 sjekk -ComputerName "PC1", "PC2" # Kontrollerer oppgaven på eksterne maskiner
.NOTES Krever administratorrettigheter for å aktivere eller opprette oppgaven.Oppgavebane: \Microsoft\Windows\PI\Secure-Boot-Update Aktiviteten kjører taskhostw.exe hver 12. time med utvidede rettigheter.#>
[CmdletBinding(SupportsShouldProcess)] param( [Parameter(Posisjon=0)] [ValidateSet('check', 'enable', 'create', '')] [streng]$Action = 'aktiver',
[Parameter()] [string[]]$ComputerName,
[Parameter()] [PSCredential]$Credential,
[Parameter()] [Alias('Force', 'Silent')] [switch]$Quiet )
# Convert Action to switches for backward compatibility $Enable = $Action -eq 'enable' $Create = $Action -eq 'create'
# Download URL: https://aka.ms/getsecureboot -> "Deployment and Monitoring Samples" # Obs! Dette skriptet kjøres på endepunkter for å aktivere oppgaven Sikker oppstartsoppdatering.
$TaskPath = "\Microsoft\Windows\PI\" $TaskName = "Secure-Boot-Update"
function Get-SecureBootTaskStatus { [CmdletBinding()] param( [string]$Computer = $env:COMPUTERNAME )
$result = [PSCustomObject]@{ ComputerName = $Computer TaskExists = $false TaskState = $null IsEnabled = $false LastRunTime = $null NextRunTime = $null Feil = $null }
try { hvis ($Computer -eq $env:COMPUTERNAME -eller $Computer -eq "localhost" -eller $Computer -eq ".") { # Bruk schtasks.exe for mer pålitelig oppgaveregistrering $schtasksOutput = schtasks.exe /Query /TN "$TaskPath$TaskName" /FO CSV 2>&1 hvis ($LASTEXITCODE -ne 0) { Finner ikke # Aktivitet er ikke en feil . betyr bare at aktiviteten ikke finnes $result. TaskExists = $false returner $result } # Analyser CSV-utdata $taskData = $schtasksOutput | ConvertFrom-Csv hvis ($taskData) { $result. TaskExists = $true $result. TaskState = $taskData.Status $result. IsEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running') # Prøv å hente neste kjøretid fra dataene hvis ($taskData.'Neste kjøretid' -og $taskData.'Neste kjøretid' -ne 'I/T') { prøv { $result. NextRunTime = [DateTime]::P arse($taskData.'Neste kjøretid') } catch { } } } } else { # Ekstern datamaskin - bruk Invoke-Command med schtasks $remoteResult = Invoke-Command -ComputerName $Computer -ScriptBlock { param($fullTaskName) $output = schtasks.exe /Query /TN $fullTaskName /FO CSV 2>&1 @{ ExitCode = $LASTEXITCODE Utdata = $output } } -ArgumentList "$TaskPath$TaskName" -ErrorAction Stop
if ($remoteResult.ExitCode -ne 0) { Finner ikke # Aktivitet er ikke en feil . betyr bare at aktiviteten ikke finnes $result. TaskExists = $false returner $result }
$taskData = $remoteResult.Output | ConvertFrom-Csv hvis ($taskData) { $result. TaskExists = $true $result. TaskState = $taskData.Status $result. IsEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running') } } } catch { $result. Feil = $_. Exception.Message }
return $result }
function New-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [string]$Computer = $env:COMPUTERNAME )
$success = $false $errorMsg = $null
# Task definition - matches the original Windows Secure Boot Update task # Bruker ComHandler med SBServicing-klassen, kjører som LocalSystem $taskXml = @" <?xml version="1.0" koding="UTF-16"?> <Task version="1.6" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <dato>2012-02-07T16:39:20</Date> <SecurityDescriptor>O:BAG:BAD:P(A;; FA;;; BA)(A;; FA;;; SY)(A;; FRFX;;; LS)</SecurityDescriptor> <kilde>$(@%SystemRoot%\system32\TpmTasks.dll,-601)</Source> <forfatter>'$(@%SystemRoot%\system32\TpmTasks.dll,-600)</Author> <beskrivelse>'$(@%SystemRoot%\system32\TpmTasks.dll,-604)</Description> <URI>\Microsoft\Windows\PI\Secure-Boot-Update</URI> </RegistrationInfo> <sikkerhetskontohavere> <principal id="LocalSystem"> <UserId>S-1-5-18</UserId> </Principal> </Principals> <Innstillinger> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <StartWhenAvailable>true</StartWhenAvailable> <IdleSettings> <StopOnIdleEnd>sann</StopOnIdleEnd> <RestartOnIdle>usann</RestartOnIdle> </IdleSettings> <UseUnifiedSchedulingEngine>sann</UseUnifiedSchedulingEngine> </Innstillinger> <utløsere> <BootTrigger> <forsinkelse>PT5M</forsinkelse> <repetisjon> <intervall>PT12H</intervall> </Repetisjon> </BootTrigger> </Utløsere> <Actions Context="LocalSystem"> <ComHandler> <ClassId>{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> <Data><! [CDATA[SBServicing]]></Data> </comHandler> </Actions> </Aktivitet> " @
try { hvis ($Computer -eq $env:COMPUTERNAME -eller $Computer -eq "localhost" -eller $Computer -eq ".") { hvis ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Create scheduled task")) { # Lagre XML til midlertidig fil og import $tempFile = [System.IO.Path]::GetTempFileName() $taskXml | Out-File -FilePath $tempFile -Encoding Unicode -Force $output = schtasks.exe /Create /TN "$TaskPath$TaskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force -ErrorAction SilentlyContinue hvis ($LASTEXITCODE -eq 0) { $success = $true } ellers { $errorMsg = $output -join " " } } } else { hvis ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName", "Create scheduled task")) { $result = Invoke-Command -ComputerName $Computer -ScriptBlock { param($taskPath, $taskName, $xml) $tempFile = [System.IO.Path]::GetTempFileName() $xml | Out-File -FilePath $tempFile -Encoding Unicode -Force $output = schtasks.exe /Create /TN "$taskPath$taskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force -ErrorAction SilentlyContinue @{ ExitCode = $LASTEXITCODE; Utdata = $output } } -ArgumentList $TaskPath, $TaskName, $taskXml -ErrorAction Stop hvis ($result. ExitCode -eq 0) { $success = $true } ellers { $errorMsg = $result. Utdata -sammenføyning " " } } } } catch { $errorMsg = $_. Exception.Message }
return @{ Vellykket = $success Feil = $errorMsg } }
function Enable-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [string]$Computer = $env:COMPUTERNAME )
$success = $false $errorMsg = $null
try { hvis ($Computer -eq $env:COMPUTERNAME -eller $Computer -eq "localhost" -eller $Computer -eq ".") { hvis ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Enable scheduled task")) { $output = schtasks.exe /Change /TN "$TaskPath$TaskName" /ENABLE 2>&1 hvis ($LASTEXITCODE -eq 0) { $success = $true } ellers { $errorMsg = $output -join " " } } } else { hvis ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName", "Enable scheduled task")) { $result = Invoke-Command -ComputerName $Computer -ScriptBlock { param($fullTaskName) $output = schtasks.exe /Change /TN $fullTaskName /ENABLE 2>&1 @{ ExitCode = $LASTEXITCODE; Utdata = $output } } -ArgumentList "$TaskPath$TaskName" -ErrorAction Stop hvis ($result. ExitCode -eq 0) { $success = $true } ellers { $errorMsg = $result. Utdata -sammenføyning " " } } } } catch { $errorMsg = $_. Exception.Message }
return @{ Vellykket = $success Feil = $errorMsg } }
# Main execution Write-Host "" Write-Host "========================================" -ForegroundColor Cyan Write-Host " Task Enabler for sikker oppstartsoppdatering" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "" Write-Host «Oppgave: $TaskPath$TaskName» –Forgrunnsfarge grå Write-Host ""
# Determine target computers $targets = hvis ($ComputerName) { $ComputerName } annet { @($env:COMPUTERNAME) }
$results = @()
foreach ($computer in $targets) { Write-Host "Checking: $computer" -ForegroundColor Yellow $status = Get-SecureBootTaskStatus -Computer $computer hvis ($status. Feil) { Write-Host " Feil: $($status. Feil)" -Forgrunnsfarge rød } elseif (-not $status. TaskExists) { Write-Host " Oppgave finnes ikke på dette systemet" -ForegroundColor Red # Opprett hvis du blir bedt om det, eller spør om Aktiver ble angitt $shouldCreate = $Create hvis (-ikke $shouldCreate -og $Enable) { Write-Host "" Write-Host " Oppgaven kan ha blitt slettet." -Forgrunnsfarge Gul hvis ($Quiet) { Write-Host " Auto-creating task (Quiet mode)" -ForegroundColor Cyan $shouldCreate = $true } ellers { $confirm = Read-Host " Vil du opprette oppgaven på nytt? (Y/N)" hvis ($confirm -eq 'Y' -eller $confirm -eq 'y') { $shouldCreate = $true } } } hvis ($shouldCreate) { Write-Host " Oppretter oppgave..." -Forgrunnsfarge Gul $createResult = New-SecureBootTask -Computer $computer hvis ($createResult.Success) { Write-Host " Oppgave opprettet" -ForegroundColor Green # Kontroller statusen på nytt $status = Get-SecureBootTaskStatus -Computer $computer hvis ($status. TaskExists) { $stateColor = hvis ($status. IsEnabled) { "Green" } else { "Red" } Write-Host " State: $($status. TaskState)" -ForegroundColor $stateColor } } else { Write-Host " Kan ikke opprette: $($createResult.Error)" -ForegroundColor Red } } } else { $stateColor = hvis ($status. IsEnabled) { "Green" } else { "Red" } Write-Host " State: $($status. TaskState)" -ForegroundColor $stateColor hvis ($status. LastRunTime – og $status. LastRunTime -ne [DateTime]::MinValue) { Write-Host " Siste kjøring: $($status. LastRunTime)" -ForegroundColor Grå } hvis ($status. NextRunTime – og $status. NextRunTime -ne [DateTime]::MinValue) { Write-Host " Next Run: $($status. NextRunTime)" -Forgrunnsfarge grå }
# Enable if requested and currently disabled hvis ($Enable -og -not $status. IsEnabled) { Write-Host " Aktivere oppgave..." -Forgrunnsfarge Gul $enableResult = Enable-SecureBootTask -Computer $computer hvis ($enableResult.Success) { Write-Host " Oppgave aktivert" -ForegroundColor Green # Kontroller statusen på nytt $status = Get-SecureBootTaskStatus -Computer $computer } else { Write-Host " Kan ikke aktivere: $($enableResult.Error)" -ForegroundColor Red } } elseif ($Enable -and $status. IsEnabled) { Write-Host " Aktivitet er allerede aktivert" -ForegroundColor Green } } $results += $status Write-Host "" }
# Summary Write-Host "========================================" -ForegroundColor Cyan Write-Host " Summary" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan
$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results | Where-Object { $_. TaskExists -and -not $_. IsEnabled }). Telle $notFound = ($results | Where-Object { -not $_. TaskExists }). Telle $errors = ($results | Where-Object { $_. Feil }). Telle
Write-Host "Total Checked: $($results.Count)" Write-Host "Enabled: $enabled" -ForegroundColor Green hvis ($disabled -gt 0) { Write-Host "Disabled: $disabled" -ForegroundColor Red } if ($notFound -gt 0) { Write-Host "Finner ikke: $notFound" -ForegroundColor Yellow } hvis ($errors -gt 0) { Write-Host "Errors: $errors" -ForegroundColor Red }
# Return results for pipeline $results