ВАЖНО Тази статия, съдържаща този примерен скрипт, е оттеглена. Започвайки с актуализациите на 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  

Нуждаете ли се от още помощ?

Искате ли още опции?

Разгледайте ползите от абонамента, прегледайте курсовете за обучение, научете как да защитите устройството си и още.