複製貼上這個範例腳本,並根據你的環境進行修改:

<# .劇情簡介     啟用安全開機更新排程任務。

.DESCRIPTION     此腳本確保 Windows 安全開機更新排程任務     (\Microsoft\Windows\PI\Secure-Boot-Update) 已啟用。 如果被停用,     它促成了這種行為。 如果任務被刪除,它可以重新建立。

.PARAMETER Action     要執行的行動。 有效值:檢查、啟用、創建     - 檢查:僅檢查任務狀態     - 啟用: (預設) 若停用則啟用該任務。 如果缺少任務,則會提示創建。- 創建:若任務不存在,則建立該任務

.PARAMETER ComputerName     可選的。 用來檢查或啟用任務的電腦名稱陣列。若未指定,則可在本地機器上執行。

.PARAMETER Credential     可選的。 遠端電腦存取的憑證。

.PARAMETER Quiet     會抑制提示並自動回答「是」。 對自動化很有用。

.EXAMPLE     .\Enable-SecureBootTask.ps1     # 啟用本地機器的任務狀態

.EXAMPLE     .\Check-SecureBootScheduledTask.ps1 啟用     # 若停用該任務,則啟用該任務。 如果缺少提示,請建立。

.EXAMPLE     .\Check-SecureBootScheduledTask.ps1 創造     # 如果任務已被刪除,則建立該任務,然後檢查其狀態

.EXAMPLE     .\Check-SecureBootScheduledTask.ps1 檢查 -電腦名稱「PC1」、「PC2」     # 在遠端機器上檢查任務

.NOTES     啟用或建立任務需要管理員權限。任務路徑:\Microsoft\Windows\PI\Secure-Boot-Update     任務每12小時 taskhostw.exe 執行一次,權限提升。#>

[CmdletBinding(SupportsShouldProcess)] 參數 (     [參數 (位置=0) ]     [ValidateSet ('check', 'enable', 'create', ') ]     [字串]$Action = 「使得」,

    [Parameter()]     [string[]]$ComputerName,

    [Parameter()]     [PSCredential]$Credential,

    [Parameter()]     [別名 (『原力』、『沉默』) ]     [切換]$Quiet )

# Convert Action to switches for backward compatibility $Enable = $Action -eq 'enable' $Create = $Action -eq「創造」

# Download URL: https://aka.ms/getsecureboot -> "Deployment and Monitoring Samples" # 注意:此腳本會在端點執行以啟用安全啟動更新任務。

$TaskPath = "\Microsoft\Windows\PI\" $TaskName = 「安全啟動更新」

function Get-SecureBootTaskStatus {     [指令綁定 () ]     參數 (         [字串]$Computer = $env:COMPUTERNAME     )

    $result = [PSCustomObject]@{         電腦名稱 = $Computer         任務存在 = $false         任務狀態 = $null         IsEnabled = $false         最後運行時間 = $null         NextRunTime = $null         誤差 = $null     }

    try {         如果 ($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。任務存在 = $true                 $result。任務狀態 = $taskData.狀態                 $result。IsEnabled = ($taskData.Status -eq 「準備好」 -或 $taskData.Status -eq 「運行中」)                                  # 嘗試從資料中取得下一次執行時間                 if ($taskData.「下一次執行時間」 -以及 $taskData.「下一次執行時間」 -ne 'N/A') {                     試試看 {                         $result。NextRunTime = [DateTime]::P arse ($taskData.'Next Run Time')                     } 接住 { }                 }             }         }         否則 {             # 遠端電腦 - 使用 Invoke-Command 與 schtasks             $remoteResult = Invoke-Command -ComputerName $Computer -ScriptBlock {                 參數 ($fullTaskName)                 $output = schtasks.exe /查詢 /TN $fullTaskName /FO CSV 2>&1                 @{                     ExitCode = $LASTEXITCODE                     輸出 = $output                 }             } -ArgumentList “$TaskPath$TaskName” -ErrorAction 停止

            if ($remoteResult.ExitCode -ne 0) {                 # 找不到任務不是錯誤——只是表示任務不存在                 $result。任務存在 = $false                 返回$result             }

            $taskData = $remoteResult.Output | ConvertFrom-Csv             若 ($taskData) {                 $result。TaskExists = $true                 $result。TaskState = $taskData.狀態                 $result。IsEnabled = ($taskData.Status -eq 「準備好」 -或 $taskData.Status -eq 「運行中」)             }         }     }     抓到 {         $result。誤差 = $_。例外。訊息     }

    return $result }

function New-SecureBootTask {     [CmdletBinding (supportsShould Process) ]     參數 (         [字串]$Computer = $env:COMPUTERNAME     )

    $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”>   <註冊資訊>     <日期>2012-02-07<16:39:20 /日期>     <SecurityDescriptor>O:BAG:BAD:P (A;;FA;;;學士) (A;FA;;;SY) (A;FRFX;;;LS) </SecurityDescriptor>     <Source>'$ (@%SystemRoot%\system32\TpmTasks.dll,-601) </Source>     <作者>'$ (@%SystemRoot%\system32\TpmTasks.dll,-600) </作者>     <描述>'$ (@%SystemRoot%\system32\TpmTasks.dll,-604) </Description>     <URI>\Microsoft\Windows\PI\Secure-Boot-Update</URI>   </註冊資訊>   <校長>     <Principal id=“LocalSystem”>       <使用者ID>S-1-5-18</UserID>     </校長>   </校長>   <設定>     <disallowStartIfOnBatteries>false</disallowStartIfOnBatteries>     ><0 StopIfGoingOnBatteries></StopIfGoingOnBatteries>     ><4 執行時間限制>PT1H</執行時間限制>     ><8 MultipleInstancesPolicy>忽略新</MultipleInstancesPolicy>     <StartWhen>真正的</StartWhen 可用>     <IdleSettings>       <StopOnIdleEnd>true</StopOnIdleEnd>       (2 RestartOnIdle>false</RestartOnIdle>     (6 /IdleSettings>     (8 UseUnifiedSchedulingEngine>真正的</UseUnifiedSchedulingEngine>   </設定>   <觸發因素>     <BootTrigger>       <PT5M>延遲</延遲>       (2 重複>         (4 PT12H></中場休息>       (8 /重複>     </BootTrigger>   </觸發>   <動作上下文=「LocalSystem」>     <指揮官>       <類別編號>{5014B7C8-934E-4262-9816-887FA745A6C4}</類別編號>       <資料><![CDATA[SBServicing]></資料>     </指揮官>   </行動> </任務> "@

    try {         如果 ($Computer -eq $env:COMPUTERNAME -或 $Computer -eq 「localhost」 -或 $Computer -eq 「。」) {             如果 ($PSCmdlet.ShouldProcess (“$TaskPath$TaskName”, “建立排程任務”) ) {                 # 將 XML 儲存到暫存檔並匯入                 $tempFile = [System.IO.Path]::GetTempFileName ()                 $taskXml |Out-File -檔案路徑 $tempFile -編碼 Unicode -強制                                  $output = schtasks.exe /Create /TN “$TaskPath$TaskName” /XML $tempFile /F 2>&1                                  Remove-Item $tempFile -強制 -錯誤動作 靜默繼續                                  若 ($LASTEXITCODE -eq 0) {                     $success = $true                 } 否則 {                     $errorMsg = $output -加入“ ”                 }             }         }         否則 {             如果 ($PSCmdlet.ShouldProcess (“$Computer\$TaskPath$TaskName”, “建立排程任務”) ) {                 $result = Invoke-Command -ComputerName $Computer -ScriptBlock {                     Param ($taskPath、$taskName、$xml)                     $tempFile = [System.IO.Path]::GetTempFileName ()                     $xml |Out-File -檔案路徑 $tempFile -編碼 Unicode -強制                     $output = schtasks.exe /Create /TN “$taskPath$taskName” /XML $tempFile /F 2>&1                     Remove-Item $tempFile -強制 -錯誤動作 靜默繼續                     @{ ExitCode = $LASTEXITCODE;輸出 = $output }                 } -ArgumentList $TaskPath, $TaskName, $taskXml -ErrorAction 停止                                  如果 ($result。ExitCode -eq 0) {                     $success = $true                 } 否則 {                     $errorMsg = $result。輸出 -join “ ”                 }             }         }     }     抓到 {         $errorMsg = $_。例外。訊息     }

    return @{         成功 = $success         誤差 = $errorMsg     } }

function Enable-SecureBootTask {     [CmdletBinding (supportsShould Process) ]     參數 (         [字串]$Computer = $env:COMPUTERNAME     )

    $success = $false     $errorMsg = $null

    try {         如果 ($Computer -eq $env:COMPUTERNAME -或 $Computer -eq 「localhost」 -或 $Computer -eq 「。」) {             如果 ($PSCmdlet.ShouldProcess (“$TaskPath$TaskName”, “啟用排程任務”) ) {                 $output = schtasks.exe /Change /TN 「$TaskPath$TaskName」 /ENABLE 2>&1                 若 ($LASTEXITCODE -eq 0) {                     $success = $true                 } 否則 {                     $errorMsg = $output -加入“ ”                 }             }         }         否則 {             如果 ($PSCmdlet.ShouldProcess (“$Computer\$TaskPath$TaskName”, “啟用排程任務”) ) {                 $result = Invoke-Command -ComputerName $Computer -ScriptBlock {                     參數 ($fullTaskName)                     $output = schtasks.exe /Change /TN $fullTaskName /ENABLE 2>&1                     @{ ExitCode = $LASTEXITCODE;輸出 = $output }                 } -ArgumentList “$TaskPath$TaskName” -ErrorAction 停止                                  如果 ($result。ExitCode -eq 0) {                     $success = $true                 } 否則 {                     $errorMsg = $result。輸出 -join “ ”                 }             }         }     }     抓到 {         $errorMsg = $_。例外。訊息     }

    return @{         成功 = $success         誤差 = $errorMsg     } }

# Main execution Write-Host「」 Write-Host 「========================================」-前景青色 Write-Host「安全開機更新任務啟用器」-foregroundColor 青色 Write-Host 「========================================」-前景青色 Write-Host「」 Write-Host 「任務:$TaskPath$任務名稱」-前景灰色 Write-Host「」

# Determine target computers $targets = 如果 ($ComputerName) { $ComputerName } 否則 { @ ($env:COMPUTERNAME) }

$results = @()

foreach ($computer in $targets) {     Write-Host 「檢查中:$computer」-前景色黃          $status = Get-SecureBootTaskStatus -電腦$computer          如果 ($status。錯誤) {         Write-Host 「錯誤:$ ($status。錯誤) “ -前景紅色     }     否則 ( 不$status。任務存在) {         Write-Host「此系統不存在任務」-前景紅色                  # 若有請求則建立,若指定啟用則提示         $shouldCreate = $Create         若 (-not $shouldCreate -且 $Enable) {             Write-Host「」             Write-Host「任務可能已被刪除。」-前景黃色             如果 ($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.成功) {                 Write-Host「任務成功建立」-前景綠色                 # 重新檢查狀態                 $status = Get-SecureBootTaskStatus -電腦$computer                                  如果 ($status。TaskExists) {                     $stateColor = 如果 ($status。IsEnabled) {「綠色」} 否則 {「紅色」 }                     Write-Host 州:$ ($status。任務狀態) “ -前景色彩$stateColor                 }             }             否則 {                 Write-Host 「無法建立:$ ($createResult.Error) “ -前景紅色             }         }     }     否則 {         $stateColor = 如果 ($status。IsEnabled) {「Green」} 否則 {「Red」}         Write-Host 州: ($status 美元。TaskState) “ -前景色彩$stateColor                  如果 ($status。LastRunTime -and $status。LastRunTime -ne [DateTime]::MinValue) {             Write-Host 「最後一輪:$ ($status。LastRunTime) “ -前景顏色灰色         }         如果 ($status。NextRunTime -and $status。NextRunTime -ne [DateTime]::MinValue) {             Write-Host 「下一輪:$ ($status。下一週執行時間) “ -前景灰色         }

        # Enable if requested and currently disabled         如果 ($Enable -且 -不是$status。IsEnabled) {             Write-Host「啟用任務......」-前景色 黃色             $enableResult = Enable-SecureBootTask -電腦$computer                          如果 ($enableResult.成功) {                 Write-Host 「任務成功啟用」-前景綠色                 # 重新檢查狀態                 $status = Get-SecureBootTaskStatus -電腦$computer             }             否則 {                 Write-Host 「啟用失敗:$ ($enableResult.錯誤) “ -前景紅色             }         }         否則 ($Enable -和$status。IsEnabled) {             Write-Host「任務已啟用」-前景綠色         }     }          $results += $status     Write-Host「」 }

# Summary Write-Host 「========================================」-前景青色 Write-Host 「摘要」-前景 青色 Write-Host 「========================================」-前景青色

$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results |Where-Object { $_。TaskExists -而不是 $_。IsEnabled }) 。伯爵 $notFound = ($results |Where-Object { -不是$_。任務存在 }) 。伯爵 $errors = ($results |Where-Object { $_。錯誤 }) 。伯爵

Write-Host "Total Checked: $($results.Count)" Write-Host 「啟用:$enabled」-前景綠色 若 ($disabled -gt 0) { Write-Host 「停用:$disabled」 -前景色紅色 } 若 ($notFound -gt 0) { Write-Host 「未找到:$notFound」 -前景色為黃色 } 如果 ($errors -gt 0) { Write-Host 「錯誤:$errors」 -前景色紅 }

# Return results for pipeline $results  

需要更多協助嗎?

想要其他選項嗎?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。