POMEMBNO Ta članek, ki vsebuje ta vzorčni skript, je bil ukinjen. Od izdaje posodobitev sistema Windows 12. maja 2026 in po tem se vzorčni skript nahaja v mapi %systemroot%\SecureBoot\ExampleRolloutScripts v vaši napravi.
Kopirajte in prilepite ta vzorčni skript ter ga po potrebi spremenite za svoje okolje:
<# . SINOPSIS Omogoča načrtovano opravilo posodobitve varnega zagona.
.DESCRIPTION Ta skript zagotavlja načrtovano opravilo posodobitve varnega zagona sistema Windows (\Microsoft\Windows\PI\Secure-Boot-Update) je omogočen. Če je onemogočeno, to omogoča. Če je bilo opravilo izbrisano, ga lahko znova ustvarite.
.PARAMETER Action Dejanje, ki ga želite izvesti. Veljavne vrednosti: preverjanje, omogočanje, ustvarjanje - check: Only check the task status – omogoči: (privzeto) Omogoči opravilo, če je onemogočeno. Če opravilo manjka, morate ustvariti pozive.– ustvarjanje: ustvarite opravilo, če ne obstaja
.PARAMETER ComputerName Neobvezno. Matrika imen računalnika za preverjanje/omogočanje opravila.Če ni navedeno, se izvaja v lokalnem računalniku.
.PARAMETER Credential Neobvezno. Poverilnice za oddaljeni dostop do računalnika.
.PARAMETER Quiet Prepreči pozive in samodejno odgovori na »Da«. Uporabno za avtomatizacijo.
.EXAMPLE .\Enable-SecureBootTask.ps1 # Omogoči stanje opravila v lokalnem računalniku
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 omogoči # Omogoči opravilo, če je onemogočeno. Pozivi, če manjka.
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 create # Ustvari opravilo, če je bilo izbrisano, nato pa preveri njegovo stanje
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 check -ComputerName "PC1", "PC2" # Preveri opravilo v oddaljenih računalnikih
.NOTES Za omogočanje ali ustvarjanje opravila potrebujete skrbniške pravice.Pot opravila: \Microsoft\Windows\PI\Secure-Boot-Update Opravilo se taskhostw.exe vsakih 12 ur s povišanimi pravicami.#>
[CmdletBinding(SupportsShouldProcess)] param ( [Parameter(Position=0)] [ValidateSet('check', 'enable', 'create', '')] [string]$Action = 'enable',
[Parameter()] [string[]]$ComputerName,
[Parameter()] [PSCredential]$Credential,
[Parameter()] [Alias('Force', 'Silent')] [stikalo]$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" # Opomba: Ta skript se zažene na končnih točkah, da omogoči opravilo za posodobitev varnega zagona.
$TaskPath = "\Microsoft\Windows\PI\" $TaskName = "Secure-Boot-Update"
function Get-SecureBootTaskStatus { [CmdletBinding()] param ( [string]$Computer = $env:COMPUTERNAME )
$result = [PSCustomObject]@{ Ime računalnika = $Computer TaskExists = $false Stanje opravila = $null IsEnabled = $false LastRunTime = $null NextRunTime = $null Napaka = $null }
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { # Uporabite schtasks.exe za zanesljivejše zaznavanje opravil $schtasksOutput = schtasks.exe /Query /TN "$TaskPath$TaskName" /FO CSV 2>&1 if ($LASTEXITCODE-ne 0) { # Opravila ni mogoče najti, ker je ni mogoče najti, pač pa pomeni, da opravilo ne obstaja -$result. TaskExists = $false return $result } # Razčlenite izhod CSV $taskData = $schtasksOutput | ConvertFrom- Csv if ($taskData) { -$result. TaskExists = $true -$result. Stanje opravila = $taskData.Stanje -$result. IsEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running') # Poskusite dobiti čas naslednjega izvajanja iz podatkov if ($taskData.'Next Run Time' -and $taskData.'Next Run Time' -ne 'N/A') { poskusite { -$result. NextRunTime = [DateTime]::P arse($taskData.'Next Run Time') } ulov { } } } } druga oseba { # Oddaljeni računalnik – Invoke-Command z schtasks $remoteResult = Invoke-Command -ComputerName $Computer -ScriptBlock { param($fullTaskName) $output = schtasks.exe /Query /TN $fullTaskName /FO CSV 2>&1 V tem razdelku so vam na primer na ExitCode = $LASTEXITCODE Izhod = $output } } -ArgumentList "$TaskPath$TaskName" -ErrorAction Stop
if ($remoteResult.ExitCode -ne 0) { # Opravila ni mogoče najti, ker je ni mogoče najti, pač pa pomeni, da opravilo ne obstaja -$result. TaskExists = $false return $result }
$taskData = $remoteResult.Output | ConvertFrom-Csv if ($taskData) { -$result. TaskExists = $true -$result. Stanje opravila = $taskData.Stanje -$result. IsEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running') } } } ulov { -$result. Napaka = $_. Izjema.Sporočilo }
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 # Uses ComHandler with SBServicing class, runs as LocalSystem $taskXml = @" <?xml version="1.0" encoding="UTF-16"?> <Task version="1.6" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <datum>2012-02-07T16:39:20</Date> <Varnostni deskriptor>O:BAG:BAD:P(A;; OS;;; BA)(A;; OS;;; SY)(A;; FRFX;; LS)</SecurityDescriptor> <source>'$(@%SystemRoot%\system32\TpmTasks.dll,-601)</Source> <avtor>'$(@%SystemRoot%\system32\TpmTasks.dll,-600)</Author> <Opis>'$(@%SystemRoot%\system32\TpmTasks.dll,-604)</Description> <URI>\Microsoft\Windows\PI\Secure-Boot-Update</URI> </RegistrationInfo> <Upravniki> <Principal id="LocalSystem"> <UserId>S-1-5-18</UserId> </Principal> </Principals> <Nastavitve> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 »MultipleInstancesPolicy«>IgnoreNew</MultipleInstancesPolicy> <StartWhenAvailable>true</StartWhenAvailable> <IdleSettings> <StopOnIdleEnd>resnično</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> </Settings> <Sprožilci> <BootTrigger> <zakasnitev>PT5M</Delay> <Ponovitev> <Interval>PT12H</Interval> </Ponovitev> </BootTrigger> </Triggers> <Actions Context="LocalSystem"> <ComHandler> <ClassId>{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> <podatkov><! [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")) { # Shranjevanje XML-ja v začasno datoteko in uvoz $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 if ($LASTEXITCODE -eq 0) { $success = $true } drugo { $errorMsg = $output -join " " } } } druga oseba { 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 -Encoding Unicode -Force $output = schtasks.exe /Create /TN "$taskPath$taskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force -ErrorAction SilentlyContinue @{ ExitCode = $LASTEXITCODE; Izhod = $output } } -ArgumentList $TaskPath, $TaskName, $taskXml -ErrorAction Stop če ($result. ExitCode -eq 0) { $success = $true } drugo { $errorMsg = $result. Output -join " " } } } } ulov { $errorMsg = $_. Izjema.Sporočilo }
return @{ Uspeh = $success Napaka = $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 } drugo { $errorMsg = $output -join " " } } } druga oseba { 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; Izhod = $output } } -ArgumentList "$TaskPath$TaskName" -ErrorAction Stop če ($result. ExitCode -eq 0) { $success = $true } drugo { $errorMsg = $result. Output -join " " } } } } ulov { $errorMsg = $_. Izjema.Sporočilo }
return @{ Uspeh = $success Napaka = $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 »Opravilo: $TaskPath$TaskName« -ForegroundColor Gray Write-Host »«
# Determine target computers $targets = if ($ComputerName) { $ComputerName } else { @($env:COMPUTERNAME) }
$results = @()
foreach ($computer in $targets) { Write-Host »Checking: $computer« -ForegroundColor Yellow $status = Get-SecureBootTaskStatus -Computer $computer če ($status. Napaka) { Write-Host » Napaka: $($status. Napaka)« –ospredjeBarva rdeče } elseif (-not $status. TaskExists) { Write-Host »Opravilo ne obstaja v tem sistemu« –OspredjeBarva rdeče # Ustvari, če je bilo zahtevano, ali poziv, če je bila možnost »Omogoči« določena $shouldCreate = $Create if (-not $shouldCreate -and $Enable) { Write-Host »« Write-Host » Opravilo je bilo morda izbrisano.« -Barva ospredjaBarva rumena if ($Quiet) { Write-Host »Auto-creating task (Quiet mode)« -ForegroundColor Cyan $shouldCreate = $true } drugo { $confirm = Read-Host « Ali želite znova ustvariti opravilo? (Y/N)" če ($confirm -eq 'Y' -ali $confirm -eq 'y') { $shouldCreate = $true } } } if ($shouldCreate) { Write-Host »Creating task...« (Ustvarjanje opravila ... – ospredjeBarva rumena $createResult = New-SecureBootTask -Computer $computer if ($createResult.Success) { Write-Host »Task created successfully« -ForegroundColor Green # Znova preverite stanje $status = Get-SecureBootTaskStatus -Computer $computer če ($status. TaskExists) { $stateColor = if ($status. IsEnabled) { "Zelena" } drugo { "Rdeča" } Write-Host » Država: $($status. Stanje opravila)« – barva ospredja $stateColor } } druga oseba { Write-Host »Ustvarjanje ni uspelo: $($createResult.Error)« -ForegroundColor Red } } } druga oseba { $stateColor = if ($status. IsEnabled) { "Zelena" } drugo { "Rdeča" } Write-Host » Država: $($status. Stanje opravila)« – barva ospredja $stateColor če ($status. LastRunTime -and $status. LastRunTime -ne [DateTime]::MinValue) { Write-Host » Zadnji zagon: $($status. LastRunTime)" -ForegroundColor Gray } če ($status. NextRunTime -and $status. NextRunTime -ne [DateTime]::MinValue) { Write-Host » Naslednji zagon: $($status. NextRunTime)" -ForegroundColor Gray }
# Enable if requested and currently disabled če ($Enable -in -not $status. IsEnabled) { Write-Host » Omogočanje opravila ...« – barva ospredjaBarva rumena $enableResult = Enable-SecureBootTask -Computer $computer if ($enableResult.Success) { Write-Host »Task enabled successfully« -ForegroundColor Green # Znova preverite stanje $status = Get-SecureBootTaskStatus -Computer $computer } druga oseba { Write-Host »Ni bilo mogoče omogočiti: $($enableResult.Error)« -ForegroundColor Red } } elseif ($Enable -and $status. IsEnabled) { Write-Host »Task is already enabled« -ForegroundColor Green } } $results += $status Write-Host »« }
# Summary Write-Host "========================================" -ForegroundColor Cyan Write-Host "Povzetek" -ForegroundColor Cyan Write-Host »========================================« -ForegroundColor Cyan
$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results | Where-Object { $_. TaskExists -and -not $_. IsEnabled }). Count $notFound = ($results | Where-Object { -not $_. TaskExists }). Count $errors = ($results | Where-Object { $_. Napaka }). Count
Write-Host "Total Checked: $($results.Count)" Write-Host »Omogočeno: $enabled« –OspredjeBarva zelena if ($disabled -gt 0) { Write-Host "Disabled: $disabled" -ForegroundColor Red } if ($notFound -gt 0) { Write-Host »Ni mogoče najti: $notFound« -ForegroundColor Yellow } if ($errors -gt 0) { Write-Host "Errors: $errors" -ForegroundColor Red }
# Return results for pipeline $results