ВАЖЛИВО Цю статтю, яка містить цей зразок сценарію, закрито. Починаючи з оновлень Windows, випущених 12 травня 2026 р., зразок сценарію розташовано в папці %systemroot%\SecureBoot\ExampleRolloutScripts на пристрої.
Скопіюйте та вставте цей зразок сценарію та змініть його за потреби для свого середовища:
<# . ПІДСУМОК Вмикає заплановане завдання оновлення безпечного завантаження.
.DESCRIPTION Цей сценарій забезпечує заплановане завдання оновлення безпечного завантаження Windows (\Microsoft\Windows\PI\Secure-Boot-Update) увімкнуто. Якщо вимкнуто, активує цю функцію. Якщо завдання видалено, його можна створити повторно.
.PARAMETER Action Дія, яка потрібно виконати. Припустимі значення: перевірка, ввімкнення, створення - check: Check Only the task status - enable: (default) Enable the task if disabled. Якщо завдання відсутнє, з'явиться запит на створення.- створення: створення завдання, якщо воно не існує
.PARAMETER ComputerName Необов'язково. Масив імен комп'ютерів для перевірки та ввімкнення завдання.Якщо не вказано, запускається на локальному комп'ютері.
.PARAMETER Credential Необов'язково. Облікові дані для віддаленого доступу до комп'ютера.
.PARAMETER Quiet Блокує запити та автоматично відповідає так. Використовується для автоматизації.
.EXAMPLE .\Enable-SecureBootTask.ps1 # Вмикає стан завдання на локальному комп'ютері
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 увімкнути # Вмикає завдання, якщо його вимкнуто. Підказки, щоб створити файл, якщо він відсутній.
.EXAMPLE Створення .\Check-SecureBootScheduledTask.ps1 # Створює завдання, якщо його видалено, а потім перевіряє його стан
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 check -ComputerName "PC1", "PC2" # Перевіряє завдання на віддалених комп'ютерах
.NOTES Для ввімкнення або створення завдання потрібні права адміністратора.Шлях завдання: \Microsoft\Windows\PI\Secure-Boot-Update Завдання виконується taskhostw.exe кожні 12 годин із правами адміністратора.#>
[CmdletBinding(SupportsShouldProcess)] param( [Parameter(Position=0)] [ValidateSet('check', 'enable', 'create', '')] [string]$Action = "enable",
[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" # Примітка. Цей сценарій виконується в кінцевих точках, щоб увімкнути завдання оновлення безпечного завантаження.
$TaskPath = "\Microsoft\Windows\PI\" $TaskName = "Secure-Boot-Update"
function Get-SecureBootTaskStatus { [КомандлетBinding()] param( [string]$Computer = $env:ІМ'Я КОМП'ЮТЕРА )
$result = [PSCustomObject]@{ Ім'я комп'ютера = $Computer Індекси завдань = $false Стан завдання = $null IsEnabled = $false LastRunTime = $null NextRunTime = $null Помилка = $null }
try { if ($Computer -eq $env:COMPUTERNAME - або $Computer -eq "localhost" -or $Computer -eq ".") { # Використовуйте schtasks.exe для більш надійного виявлення завдань $schtasksOutput = schtasks.exe /Query /TN "$TaskPath$TaskName" /FO CSV 2>&1 якщо ($LASTEXITCODE -ne 0) { # Завдання не знайдено не є помилкою – просто означає, що завдання не існує $result. Індекси завдань = $false повернути $result } (}) # Аналіз результатів CSV $taskData = $schtasksOutput | Перетворення файлу CSV якщо ($taskData) { $result. Індекси завдань = $true $result. Стан завдання = $taskData.стан $result. IsEnabled = ($taskData.Status -eq "Ready" -or $taskData.Status -eq "Running") # Спробуйте отримати наступний час виконання з даних якщо ($taskData.'Час наступного виконання' -and $taskData.'Next Run Time" -ne 'N/A') { спробуйте { $result. NextRunTime = [DateTime]::P arse($taskData.'Next Run Time') } зловити { } } (}) } (}) } (}) інакше { # Віддалений комп'ютер - використання Invoke-Command з schtasks $remoteResult = Invoke-Command -Ім'я комп'ютера $Computer -ScriptBlock { param($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. Індекси завдань = $false повернути $result }
$taskData = $remoteResult.Output | ConvertFrom-Csv якщо ($taskData) { $result. Індекси завдань = $true $result. Стан завдання = $taskData.Стан $result. IsEnabled = ($taskData.Status -eq "Ready" -or $taskData.Status -eq "Running") } (}) } (}) } (}) зловити { $result. Помилка = $_. Виняток.Повідомлення }
return $result }
function New-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [string]$Computer = $env:ІМ'Я КОМП'ЮТЕРА )
$success = $false $errorMsg = $null
# Task definition - matches the original Windows Secure Boot Update task # використовує ComHandler із класом SBServicing, запускається як LocalSystem $taskXml = @" <?xml version="1.0" encoding="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;; FA;;; BA)(A;; FA;;; SY)(A;; 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"> <ідентифікатор користувача>S-1-5-18</UserId> </principal> </Principals> >настройок < <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <початокУвімніть,>true</StartWhenAvailable> <>IdleSettings <stopOnIdleEnd>true</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> </Settings> тригери <> <> BootTrigger <затримка>PT5M</Затримка> <>повторення <інтервал>PT12H</interval> </> повторення </BootTrigger> </Triggers> <actions Context="LocalSystem"> <> ComHandler <ClassId>{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> <>< даних! [CDATA[SBServicing]]></Data> </comHandler> </Actions> </> завдань " @
try { if ($Computer -eq $env:COMPUTERNAME - або $Computer -eq "localhost" -or $Computer -eq ".") { якщо ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Create scheduled task")) { # Зберегти XML у тимчасовому файлі та імпортувати $tempFile = [System.IO.Path]::GetTempFileName() $taskXml | Out-File -FilePath $tempFile -Encoding Юнікод -Force $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 " " } (}) } (}) } (}) інакше { якщо ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName","Створити заплановане завдання")) { $result = Invoke-Command -Ім'я комп'ютера $Computer -ScriptBlock { param($taskPath, $taskName, $xml) $tempFile = [System.IO.Path]::GetTempFileName() $xml | Out-File -FilePath $tempFile -Encoding Юнікод -Force $output = schtasks.exe /Створити /TN "$taskPath$taskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force - ErrorAction SilentlyContinue @{ ExitCode = $LASTEXITCODE; Вивід = $output } } - ArgumentList $TaskPath, $TaskName, $taskXml -ErrorAction Stop якщо ($result. Код виходу –eq 0) { $success = $true } інакше { $errorMsg = $result. Вивід -join " " } (}) } (}) } (}) } (}) зловити { $errorMsg = $_. Виняток.Повідомлення }
return @{ Success = $success Помилка = $errorMsg } (}) }
function Enable-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [string]$Computer = $env:ІМ'Я КОМП'ЮТЕРА )
$success = $false $errorMsg = $null
try { if ($Computer -eq $env:COMPUTERNAME - або $Computer -eq "localhost" -or $Computer -eq ".") { якщо ($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 " " } (}) } (}) } (}) інакше { якщо ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName", "Enable scheduled task")) { $result = Invoke-Command -Ім'я комп'ютера $Computer -ScriptBlock { param($fullTaskName) $output = schtasks.exe /Change /TN $fullTaskName /ENABLE 2>&1 @{ ExitCode = $LASTEXITCODE; Вивід = $output } } - ArgumentList "$TaskPath$TaskName" -ErrorAction Stop якщо ($result. Код виходу –eq 0) { $success = $true } інакше { $errorMsg = $result. Вивід -join " " } (}) } (}) } (}) } (}) зловити { $errorMsg = $_. Виняток.Повідомлення }
return @{ Success = $success Помилка = $errorMsg } (}) }
# Main execution Write-Host "" Write-Host "========================================" -Блакитний колір переднього плану Write-Host "Увімкнення завдання безпечного оновлення завантаження" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "" Write-Host "Завдання: $TaskPath$Ім'я завдання" – сірий колір переднього плану Write-Host ""
# Determine target computers $targets = якщо ($ComputerName) { $ComputerName } інакше { @($env:ІМ'Я КОМП'ЮТЕРА) }
$results = @()
foreach ($computer in $targets) { Write-Host "Check: $computer" -ForegroundColor Yellow $status = Get-SecureBootTaskStatus -комп'ютер $computer якщо ($status. Помилка: { Write-Host " Помилка: $($status. Error)" -ForegroundColor Red } (}) elseif (-not $status. Індекси завдань) { Write-Host " Завдання не існує в цій системі" -Червоний колір переднього плану # Створити, якщо це потрібно, або запит, якщо вказано параметр "Увімкнути" $shouldCreate = $Create якщо (-не $shouldCreate -і $Enable) { Write-Host "" Write-Host " Можливо, завдання видалено." -ForegroundColor Yellow якщо ($Quiet) { Write-Host " Завдання автоматичного створення (тихий режим)" -Блакитний колір переднього плану $shouldCreate = $true } інакше { $confirm = Read-Host " Повторно створити завдання? (Y/N)" якщо ($confirm -eq 'Y' -або $confirm -eq 'y') { $shouldCreate = $true } (}) } (}) } (}) якщо ($shouldCreate) { Write-Host " Створення завдання..." - Жовтий колір переднього плану $createResult = New-SecureBootTask -Комп'ютер $computer якщо ($createResult.Success) { Write-Host " Завдання успішно створено" -ForegroundColor Green # Повторна перевірка стану $status = Get-SecureBootTaskStatus -Комп'ютер $computer якщо ($status. Індекси завдань) { $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 – і $status. LastRunTime –ne [DateTime]::MinValue) { Write-Host " Останній запуск: $($status. LastRunTime)" -ForegroundColor Gray } (}) якщо ($status. NextRunTime – і $status. NextRunTime –ne [DateTime]::MinValue) { Write-Host " Наступний запуск: $($status. NextRunTime)" -ForegroundColor Gray }
# Enable if requested and currently disabled якщо ($Enable -and -not $status. IsEnabled) { Write-Host " Увімкнення завдання..." -ForegroundColor Yellow $enableResult = Enable-SecureBootTask -Комп'ютер $computer якщо ($enableResult.Success) { Write-Host " Завдання успішно ввімкнуто" -ForegroundColor Green # Повторна перевірка стану $status = Get-SecureBootTaskStatus -Комп'ютер $computer } (}) інакше { Write-Host " Не вдалося ввімкнути: $($enableResult.Error)" -ForegroundColor Red } (}) } (}) elseif ($Enable -and $status. IsEnabled) { Write-Host " Завдання вже ввімкнуто" -ForegroundColor Green } (}) } (}) $results += $status Write-Host "" }
# Summary Write-Host "========================================" -ForegroundColor Cyan Write-Host "Зведення" -Блакитний колір переднього плану Write-Host "========================================" -ForegroundColor Cyan
$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results | Where-Object { $_. TaskExists – а –не $_. IsEnabled }). Розраховувати $notFound = ($results | Where-Object { -not $_. Індекси завдань }). Розраховувати $errors = ($results | Where-Object { $_. Помилка }). Розраховувати
Write-Host "Total Checked: $($results.Count)" Write-Host "Увімкнуто: $enabled" -ForegroundColor Green якщо ($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