複製貼上這個範例腳本,並根據你的環境進行修改:
<# .劇情簡介 啟用安全開機更新排程任務。
.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