ВАЖНО Тази статия, съдържаща този примерен скрипт, е оттеглена. Започвайки с актуализациите на Windows, издадени на и след 12 май 2026 г., примерният скрипт се намира в папката %systemroot%\SecureBoot\ExampleRolloutScripts на вашето устройство.
Копирайте и поставете този примерен скрипт и променете, както е необходимо за вашата среда:
<# . СИНОПСИС Разрешава планираната задача за актуализация на защитеното стартиране.
.DESCRIPTION Този скрипт гарантира планираната задача на актуализацията на защитеното стартиране на Windows (\Microsoft\Windows\PI\Secure-Boot-Update) е разрешено. Ако е дезактивирана, тя го разрешава. Ако задачата е изтрита, тя може да я създаде отново.
.PARAMETER Action Действието, което трябва да се извърши. Валидни стойности: отметнете, разрешете, създайте - проверка: Проверете само състоянието на задачата - разрешаване: (по подразбиране) Разрешаване на задачата, ако е забранена. Ако задачата липсва, подканва за създаване.- create: Create the task if it't exist
.PARAMETER ComputerName Незадължителен. Масив от компютърни имена за проверка/разрешаване на задачата.Ако не е зададено, се изпълнява на локалния компютър.
.PARAMETER Credential Незадължителен. Идентификационни данни за отдалечен достъп до компютър.
.PARAMETER Quiet Потиска подканите и автоматично отговаря на "Да". Полезно за автоматизацията.
.EXAMPLE .\Enable-SecureBootTask.ps1 # Разрешава състоянието на задачата на локалния компютър
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 разрешаване # Разрешава задачата, ако е дезактивирана. Подкани да създадете, ако липсва.
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 създаване # Създава задачата, ако е изтрита, след което проверява състоянието й
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 отметнете -ComputerName "PC1", "PC2" # Проверява задачата на отдалечени машини
.NOTES Изисква привилегии на администратор, за да разреши или създаде задачата.Път до задачата: \Microsoft\Windows\PI\Secure-Boot-Update Задачата се изпълнява taskhostw.exe всеки 12 часа с повишени привилегии.#>
[CmdletBinding(SupportsShouldProcess)] парам( [Параметър(Позиция=0)] [ValidateSet('check', 'enable', 'create', '')] [string]$Action = 'enable',
[Parameter()] [string[]]$ComputerName,
[Parameter()] [PSCredential]$Credential,
[Parameter()] [Alias('Force', 'Silent')] [ключ]$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" # Забележка: Този скрипт се изпълнява на крайни точки, за да се разреши задачата за актуализация на защитеното стартиране.
$TaskPath = "\Microsoft\Windows\PI\" $TaskName = "Актуализация на защитено стартиране"
function Get-SecureBootTaskStatus { [CmdletBinding()] парам( [string]$Computer = $env:ИМЕ_НА_КОМПЮТЪР )
$result = [PSCustomObject]@{ ComputerName = $Computer TaskExists = $false TaskState = $null IsEnabled = $false LastRunTime = $null NextRunTime = $null Грешка = $null }
try { if ($Computer -eq $env:COMPUTERNAME -или $Computer -eq "localhost" -или $Computer -eq ".") { # Използвайте schtasks.exe за по-надеждно откриване на задачи $schtasksOutput = schtasks.exe /Query /TN "$TaskPath$TaskName" /FO CSV 2>&1 ако ($LASTEXITCODE -ne 0) { # Задачата не е намерена не е грешка – просто означава, че задачата не съществува - $result, ще го запитам. TaskExists = $false връщане $result } # Анализиране на CSV резултата $taskData = $schtasksOutput | ConvertFrom-Csv ако ($taskData) { - $result, ще го запитам. TaskExists = $true - $result, ще го запитам. TaskState = $taskData.Status - $result, ще го запитам. IsEnabled = ($taskData.Status -eq "Готов" -или $taskData.Status -eq "Изпълнява се") # Опитайте се да получите следващото време за изпълнение от данните if ($taskData."Next Run Time" -and $taskData."Next Run time" -ne 'N/A') { опитайте { - $result, ще го запитам. NextRunTime = [DateTime]::P arse($taskData.'Час на следващото изпълнение') } улов { } } } } друго { # Отдалечен компютър – използвайте Invoke-Command с schtasks $remoteResult = Invoke-Command - ComputerName $Computer – ScriptBlock { парам($fullTaskName) $output = schtasks.exe /Query /TN $fullTaskName /FO CSV 2>&1 @{ ExitCode = $LASTEXITCODE Изход = $output } } -ArgumentList "$TaskPath$TaskName" - ErrorAction Stop
if ($remoteResult.ExitCode -ne 0) { # Задачата не е намерена не е грешка – просто означава, че задачата не съществува - $result, ще го запитам. TaskExists = $false връщане $result }
$taskData = $remoteResult.Output | ConvertFrom-Csv ако ($taskData) { - $result, ще го запитам. TaskExists = $true - $result, ще го запитам. TaskState = $taskData.Status - $result, ще го запитам. IsEnabled = ($taskData.Status -eq "Готов" -или $taskData.Status -eq "Изпълнява се") } } } улов { - $result, ще го запитам. Грешка = $_. Exception.Message }
return $result }
function New-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] парам( [string]$Computer = $env:ИМЕ_НА_КОМПЮТЪР )
$success = $false $errorMsg = $null
# Task definition - matches the original Windows Secure Boot Update task # Използва ComHandler с клас SBServicing, изпълнява се като LocalSystem $taskXml = @" <?xml версия="1.0" кодиране="UTF-16"? > <task version="1.6" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> ><RegistrationInfo <дата>2012-02-07T16:39:20</Date> <SecurityDescriptor>O:BAG:BAD:P(A;; ФА;;; BA(A;; ФА;;; SY, буква А;; FRFX;;; LS)</SecurityDescriptor> <източник>"$(@%SystemRoot%\system32\TpmTasks.dll,-601)</source> <автор>"$(@%SystemRoot%\system32\TpmTasks.dll,-600)</Author> <описание>"$(@%SystemRoot%\system32\TpmTasks.dll,-604)</description> <URI>\Microsoft\Windows\PI\Secure-Boot-Update</URI> </RegistrationInfo> >на < принципали <Principal id="LocalSystem"> <UserId>S-1-5-18</UserId> </главен> </Principals> >"Настройки" на < <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> ><4 ExecutionTimeLimit><на PT1H /ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <StartWhenAvailable>True</StartWhenAvailable> <> на неактивните настройки <True>StopOnIdleEnd</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> </Settings> >на < превключватели > <BootTrigger <забавяне><PT5M /Delay> >на повторения на < интервал><<PT12H /интервал> </> на повторения </BootTrigger> </triggers> <Actions Context="LocalSystem"> <ComHandler> <ClassId>{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> <>< на данни! [CDATA[SBServicing]]></Data> </ComHandler> </Actions> </task> " @
try { if ($Computer -eq $env:COMPUTERNAME -или $Computer -eq "localhost" -или $Computer -eq ".") { if ($PSCmdlet.ShouldProcess("$TaskPath$TaskName"; "Create scheduled task")) { # Записване на XML във временен файл и импортиране $tempFile = [System.IO.Path]::GetTempFileName() $taskXml | Out-File – FilePath $tempFile – Кодиране на Unicode – принудително $output = schtasks.exe /Create /TN "$TaskPath$TaskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force - ErrorAction SilentlyContinue ако ($LASTEXITCODE -eq 0) { $success = $true } друго { $errorMsg = $output -join " } } } друго { if ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName"; "Create scheduled task")) { $result = Invoke-Command - ComputerName $Computer – ScriptBlock { парам($taskPath, $taskName, $xml) $tempFile = [System.IO.Path]::GetTempFileName() $xml | Out-File – FilePath $tempFile – Кодиране на Unicode – принудително $output = schtasks.exe /Create /TN "$taskPath$taskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force -ErrorAction SilentlyContinue @{ ExitCode = $LASTEXITCODE; Изход = $output } } -ArgumentList $TaskPath, $TaskName, $taskXml -ErrorAction Stop ако ($result. ExitCode -eq 0) { $success = $true } друго { $errorMsg = $result. Изход -съединение " " } } } } улов { $errorMsg = $_. Exception.Message }
return @{ Успех = $success Грешка = $errorMsg } }
function Enable-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] парам( [string]$Computer = $env:ИМЕ_НА_КОМПЮТЪР )
$success = $false $errorMsg = $null
try { if ($Computer -eq $env:COMPUTERNAME -или $Computer -eq "localhost" -или $Computer -eq ".") { if ($PSCmdlet.ShouldProcess("$TaskPath$TaskName"; "Enable scheduled task")) { $output = schtasks.exe /Change /TN "$TaskPath$TaskName" /ENABLE 2>&1 ако ($LASTEXITCODE -eq 0) { $success = $true } друго { $errorMsg = $output -join " } } } друго { if ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName"; "Enable scheduled task")) { $result = Invoke-Command -ComputerName $Computer -ScriptBlock { парам($fullTaskName) $output = schtasks.exe /Change /TN $fullTaskName /ENABLE 2>&1 @{ ExitCode = $LASTEXITCODE; Изход = $output } } -ArgumentList "$TaskPath$TaskName" - ErrorAction Stop ако ($result. ExitCode -eq 0) { $success = $true } друго { $errorMsg = $result. Изход -съединение " " } } } } улов { $errorMsg = $_. Exception.Message }
return @{ Успех = $success Грешка = $errorMsg } }
# Main execution Write-Host "" Write-Host "========================================" – Цвят на текста циан Write-Host " Разрешаване на задача за актуализация на защитено стартиране" – ForegroundColor Cyan Write-Host "========================================" – Цвят на текста циан Write-Host "" Write-Host "Task: $TaskPath$TaskName" - ForegroundColor Gray Write-Host ""
# Determine target computers $targets = ако ($ComputerName) { $ComputerName } друго { @($env:ИМЕ_НА_КОМПЮТЪР) }
$results = @()
foreach ($computer in $targets) { Write-Host "Проверка: $computer" – Цвят на преден план Жълто $status = Get-SecureBootTaskStatus - Компютърен $computer ако ($status. Грешка) { Write-Host " Грешка: $($status. Error)" – Цвят на текста в червено } elseif (-not $status. TaskExists) { Write-Host " Задачата не съществува в тази система" - ForegroundColor Red # Create if requested, or prompt if Enable was specified $shouldCreate = $Create ако (-not $shouldCreate -и $Enable) { Write-Host "" Write-Host " Задачата може да е изтрита." – Цвят на преден план – жълт ако ($Quiet) { Write-Host " Автоматично създаване на задача (тих режим)" – ForegroundColor Cyan $shouldCreate = $true } друго { $confirm = Read-Host " Искате ли да пресъздадете задачата? (Y/N)" ако ($confirm -eq "Y" -или $confirm -eq "y") { $shouldCreate = $true } } } ако ($shouldCreate) { Write-Host " Creating task..." -ForegroundColor Yellow $createResult = New-SecureBootTask - Компютърен $computer ако ($createResult.Success) { Write-Host " Задачата е създадена успешно" – ForegroundColor Green # Повторна проверка на състоянието $status = Get-SecureBootTaskStatus $computer на компютъра ако ($status. TaskExists) { $stateColor = ако ($status. IsEnabled) { "Зелен" } друго { "Червено" } Write-Host " Щат: $($status. TaskState)" – ForegroundColor $stateColor } } друго { Write-Host " Неуспешно създаване: $($createResult.Error)" -ForegroundColor Red } } } друго { $stateColor = ако ($status. IsEnabled) { "Зелен" } друго { "Червено" } Write-Host " Щат: $($status. TaskState)" – ForegroundColor $stateColor ако ($status. LastRunTime -and $status. LastRunTime -ne [DateTime]::MinValue) { Write-Host " Последно изпълнение: $($status. LastRunTime)" – Цвят на преден план – сиво } ако ($status. NextRunTime -and $status. NextRunTime -ne [DateTime]::MinValue) { Write-Host " Следващо изпълнение: $($status. NextRunTime)" – Цвят на преден план – сиво }
# Enable if requested and currently disabled ако ($Enable и -not $status. IsEnabled) { Write-Host " Разрешаване на задача..." – Цвят на преден план Жълт $enableResult = Enable-SecureBootTask - Компютърен $computer ако ($enableResult.Success) { Write-Host " Задачата е разрешена успешно" – ForegroundColor Green # Повторна проверка на състоянието $status = Get-SecureBootTaskStatus $computer } друго { Write-Host " Неуспешно разрешаване: $($enableResult.Error)" -ForegroundColor Red } } elseif ($Enable и $status. IsEnabled) { Write-Host " Задачата вече е разрешена" – ForegroundColor Green } } $results += $status Write-Host "" }
# Summary Write-Host "========================================" – Цвят на текста циан Write-Host " Summary" – ForegroundColor Cyan Write-Host "========================================" – Цвят на преден план – циан
$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results | Where-Object { $_. TaskExists -and -not $_. IsEnabled }). Брой $notFound = ($results | Where-Object { -not $_. TaskExists }). Брой $errors = ($results | Where-Object { $_. Грешка }). Брой
Write-Host "Total Checked: $($results.Count)" Write-Host "Разрешено: $enabled" – цвят на преден план – зелено ако ($disabled -gt 0) { Write-Host "Забранено: $disabled" -ForegroundColor Red } ако ($notFound -gt 0) { Write-Host "Не е намерено: $notFound" -ForegroundColor Yellow } ако ($errors -gt 0) { Write-Host "Грешки: $errors" -ForegroundColor Red }
# Return results for pipeline $results