VIKTIGT Den här artikeln som innehåller det här exempelskriptet har tagits bort. Från och med Windows-uppdateringarna som släpptes den 12 maj 2026 finns exempelskriptet i mappen %systemroot%\SecureBoot\ExampleRolloutScripts på enheten.
Kopiera och klistra in det här exempelskriptet och ändra efter behov för din miljö:
<# . SYNOPSIS Aktiverar den schemalagda aktiviteten Säker start-uppdatering.
.DESCRIPTION Det här skriptet säkerställer schemalagd aktivitet för Windows Secure Boot Update (\Microsoft\Windows\PI\Secure-Boot-Update) är aktiverat. Om inställningen är inaktiverad aktiverar den. Om uppgiften har tagits bort kan den återskapa den.
.PARAMETER Action Den åtgärd som ska utföras. Giltiga värden: kontrollera, aktivera, skapa - kontrollera: Kontrollera bara aktivitetsstatus - aktivera: (standard) Aktivera aktiviteten om den är inaktiverad. Om uppgiften saknas uppmanas du att skapa.– skapa: Skapa uppgiften om den inte finns
.PARAMETER ComputerName Valfri. Matris med datornamn som du vill kontrollera/aktivera aktiviteten på.Om det inte anges körs det på den lokala datorn.
.PARAMETER Credential Valfri. Autentiseringsuppgifter för fjärrdatoråtkomst.
.PARAMETER Quiet Ignorerar uppmaningar och svarar automatiskt ja. Användbart för automatisering.
.EXAMPLE .\Enable-SecureBootTask.ps1 # Aktiverar aktivitetsstatus på lokal dator
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 aktivera # Aktiverar aktiviteten om den är inaktiverad. Promptar att skapa om det saknas.
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 skapa # Skapar aktiviteten om den togs bort och kontrollerar dess status
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 check -ComputerName "PC1", "PC2" # Kontrollerar uppgiften på fjärrdatorer
.NOTES Administratörsbehörighet krävs för att aktivera eller skapa uppgiften.Uppgiftssökväg: \Microsoft\Windows\PI\Secure-Boot-Update Uppgiften körs taskhostw.exe var 12:e timme med förhöjd behörighet.#>
[CmdletBinding(SupportsShouldProcess)] param( [Parameter(Position=0)] [ValidateSet('check', 'enable', 'create', '')] [sträng]$Action = "aktivera",
[Parameter()] [sträng[]]$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! Det här skriptet körs på slutpunkter för att aktivera uppgiften Säker start-uppdatering.
$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 Fel = $null }
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { # Använd schtasks.exe för mer tillförlitlig uppgiftsidentifiering $schtasksOutput = schtasks.exe /Query /TN "$TaskPath$TaskName" /FO CSV 2>&1 if ($LASTEXITCODE -ne 0) { # Uppgiften hittades inte är ett fel – det betyder bara att aktiviteten inte finns $result. TaskExists = $false returnera $result } # Parsa CSV-utdata $taskData = $schtasksOutput | KonverteraFrom-Csv if ($taskData) { $result. TaskExists = $true $result. TaskState = $taskData.Status $result. IsEnabled = ($taskData.Status -eq 'Ready' -eller $taskData.Status -eq 'Running') # Försök att få nästa körningstid från data if ($taskData.'Next Run Time' -and $taskData.'Next Run Time' -ne 'N/A') { prova { $result. NextRunTime = [DateTime]::P arse($taskData.'Next Run Time') } fångst { } } } } else { # Fjärrdator – använda 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) { # Uppgiften hittades inte är ett fel – det betyder bara att aktiviteten inte finns $result. TaskExists = $false returnera $result }
$taskData = $remoteResult.Output | ConvertFrom-Csv if ($taskData) { $result. TaskExists = $true $result. TaskState = $taskData.Status $result. IsEnabled = ($taskData.Status -eq 'Ready' -eller $taskData.Status -eq 'Running') } } } catch { $result. Fel = $_. Undantag.Meddelande }
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 # Använder ComHandler med SBServicing-klass, körs som LocalSystem $taskXml = @" <?xml version="1.0" kodning="UTF-16"?> <Task version="1.6" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <datum>2012-02-07T16:39:20</Datum> <SecurityDescriptor>O:BAG:BAD:P(A;; FA;;; BA)(A;; FA;;; SY)(A;; FRFX;;; LS)</SecurityDescriptor> <Source>'$(@%SystemRoot%\system32\TpmTasks.dll,-601)</Source> <författare>'$(@%SystemRoot%\system32\TpmTasks.dll,-600)</Author> <Beskrivning>'$(@%SystemRoot%\system32\TpmTasks.dll,-604)</Description> <URI>\Microsoft\Windows\PI\Secure-Boot-Update</URI> </RegistrationInfo> <Principals> <Principal id="LocalSystem"> <UserId>S-1-5-18</UserId> </Principal> </Principals> <Inställningar> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <StartNärtillgänglig>sant</StartNärtillgänglig> <IdleSettings> <StopOnIdleEnd>sant</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> </Settings> <utlöser> <BootTrigger> <fördröjning>PT5M</Delay> <Repetition> <Intervall>PT12H</Interval> </Repetition> </BootTrigger> </Triggers> <Actions Context="LocalSystem"> <comHandler> <ClassId>{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> <data><! [CDATA[SBServicing]]></Data> </ComHandler> </Actions> </Task> " @
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { if ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Create scheduled task")) { # Spara XML för att spara filen och importera $tempFile = [System.IO.Path]::GetTempFileName() $taskXml | Out-File -FilePath $tempFile -Kodning Unicode -Force $output = schtasks.exe /Create /TN "$TaskPath$TaskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force -ErrorAction SilentlyContinue if ($LASTEXITCODE -eq 0) { $success = $true } annars { $errorMsg = $output -join " " } } } else { if ($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 -Kodning 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 om ($result. ExitCode -eq 0) { $success = $true } annars { $errorMsg = $result. Utdata -join " " } } } } catch { $errorMsg = $_. Undantag.Meddelande }
return @{ Success = $success Fel = $errorMsg } }
function Enable-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [string]$Computer = $env:COMPUTERNAME )
$success = $false $errorMsg = $null
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { if ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Enable scheduled task")) { $output = schtasks.exe /Change /TN "$TaskPath$TaskName" /ENABLE 2>&1 if ($LASTEXITCODE -eq 0) { $success = $true } annars { $errorMsg = $output -join " " } } } else { if ($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 om ($result. ExitCode -eq 0) { $success = $true } annars { $errorMsg = $result. Utdata -join " " } } } } catch { $errorMsg = $_. Undantag.Meddelande }
return @{ Success = $success Fel = $errorMsg } }
# Main execution Write-Host "" Write-Host "========================================" -ForegroundColor Cyan Write-Host " Secure Boot Update Task Enabler" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "" Write-Host "Uppgift: $TaskPath$TaskName" -ForegroundColor Gray Write-Host ""
# Determine target computers $targets = om ($ComputerName) { $ComputerName } annars { @($env:DATORNAMN) }
$results = @()
foreach ($computer in $targets) { Write-Host "Checking: $computer" -ForegroundColor Yellow $status = Get-SecureBootTaskStatus -Dator $computer om ($status. Fel) { Write-Host " Fel: $($status. Fel)" -ForegroundColor Red } elseif (inte $status. TaskExists) { Write-Host " Uppgiften finns inte på det här systemet" -FörgrundFärg röd # Skapa om det begärs eller fråga om Aktivera har angetts $shouldCreate = $Create if (-not $shouldCreate -and $Enable) { Write-Host "" Write-Host " Uppgiften kan ha tagits bort." -FörgrundFärg gul if ($Quiet) { Write-Host " Automatisk skapande av uppgift (tyst läge)" - FörgrundFärg Cyan $shouldCreate = $true } annars { $confirm = Read-Host " Vill du återskapa uppgiften? (Y/N)" if ($confirm -eq 'Y' -or $confirm -eq 'y') { $shouldCreate = $true } } } if ($shouldCreate) { Write-Host "Skapa uppgift..." -FörgrundFärg gul $createResult = New-SecureBootTask -Dator $computer if ($createResult.Success) { Write-Host " Uppgiften har skapats" -Förgrundfärg Grön # Kontrollera status igen $status = Get-SecureBootTaskStatus -Dator $computer om ($status. TaskExists) { $stateColor = om ($status. IsEnabled) { "Grön" } annars { "Röd" } Write-Host " Delstat: $($status. TaskState)" -ForegroundColor $stateColor } } else { Write-Host " Det gick inte att skapa: $($createResult.Error)" -ForegroundColor Red } } } else { $stateColor = om ($status. IsEnabled) { "Grön" } annars { "Röd" } Write-Host " Delstat: $($status. TaskState)" -ForegroundColor $stateColor om ($status. LastRunTime – och $status. LastRunTime -ne [DateTime]::MinValue) { Write-Host " Senaste körning: $($status. LastRunTime)" -ForegroundColor Gray } om ($status. NextRunTime - och $status. NextRunTime -ne [DateTime]::MinValue) { Write-Host " Nästa körning: $($status. NextRunTime)" -ForegroundColor Gray }
# Enable if requested and currently disabled om ($Enable -och -inte $status. IsEnabled) { Write-Host " Aktivering av uppgift..." -FörgrundFärg gul $enableResult = Enable-SecureBootTask -Dator $computer if ($enableResult.Success) { Write-Host " Aktivitet aktiverad korrekt" -FörgrundFärg grön # Kontrollera status igen $status = Get-SecureBootTaskStatus -Dator $computer } else { Write-Host " Det gick inte att aktivera: $($enableResult.Error)" -ForegroundColor Red } } elseif ($Enable - och $status. IsEnabled) { Write-Host " Uppgiften är redan aktiverad" -FörgrundFärg grön } } $results += $status Write-Host "" }
# Summary Write-Host "========================================" -ForegroundColor Cyan Write-Host " Sammanfattning" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan
$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results | Where-Object { $_. TaskExists - och -not $_. IsEnabled }). Räkna $notFound = ($results | Where-Object { -not $_. TaskExists }). Räkna $errors = ($results | Where-Object { $_. Fel }). Räkna
Write-Host "Total Checked: $($results.Count)" Write-Host "Enabled: $enabled" -ForegroundColor Green if ($disabled -gt 0) { Write-Host "Disabled: $disabled" -ForegroundColor Red } if ($notFound -gt 0) { Write-Host "Hittades inte: $notFound" -ForegroundColor Yellow } if ($errors -gt 0) { Write-Host "Errors: $errors" -ForegroundColor Red }
# Return results for pipeline $results