คัดลอกและวางสคริปต์ตัวอย่างนี้และปรับเปลี่ยนตามที่จําเป็นสําหรับสภาพแวดล้อมของคุณ:
<# . คําพ้องความหมาย เปิดใช้งานงานที่กําหนดเวลาการอัปเดตการบูตแบบปลอดภัย
.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 ตรวจสอบ -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 { [CmdletBinding()] param( [string]$Computer = $env:COMPUTERNAME )
$result = [PSCustomObject]@{ ComputerName = $Computer TaskExists = $false TaskState = $null เปิดใช้งาน = $false LastRunTime = $null NextRunTime = $null ข้อผิดพลาด = $null }
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { # ใช้ schtasks.exe เพื่อการตรวจหางานที่เชื่อถือได้มากขึ้น $schtasksOutput = schtasks.exe /Query /TN "$TaskPath$TaskName" /FO CSV 2>&1 if ($LASTEXITCODE -ne 0) { # ไม่พบงานไม่ใช่ข้อผิดพลาด - หมายความว่าไม่มีงานอยู่ $result งาน Exists = $false ส่งคืน$result } # แยกวิเคราะห์ผลลัพธ์ CSV $taskData = $schtasksOutput | ConvertFrom-Csv if ($taskData) { $result TaskExists = $true $result TaskState = $taskData.Status $result IsEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running') # พยายามเรียกใช้งานครั้งถัดไปจากข้อมูล if ($taskData.'Next Run Time' -and $taskData.'Next Run Time' -ne 'N/A') { ลอง { $result NextRunTime = [DateTime]::P arse($taskData.'Next Run Time') } จับ { } } } } อื่นๆ { # คอมพิวเตอร์ระยะไกล - ใช้ Invoke-Command กับ schtasks $remoteResult = Invoke-Command -ComputerName $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 TaskExists = $false ส่งคืน$result }
$taskData = $remoteResult.Output | ConvertFrom-Csv if ($taskData) { $result TaskExists = $true $result TaskState = $taskData.Status $result IsEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running') } } } จับ { $result ข้อผิดพลาด = $_. Exception.message }
return $result }
function New-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [string]$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"> >RegistrationInfo ของ < <วันที่>2012-02-07T16:39:20</วันที่> <SecurityDescriptor>O:BAG:BAD:P(A;; Fa;;; BA)(A;; Fa;;; SY)(A;; FRFX;; LS)</SecurityDescriptor> <แหล่งข้อมูล>'$(@%SystemRoot%\system32\TpmTasks.dll,-601)</> ต้นทาง <ผู้เขียน>'$(@%SystemRoot%\system32\TpmTasks.dll,-600)</Author> คําอธิบาย <>'$(@%SystemRoot%\system32\TpmTasks.dll,-604)</Description> <URI>\Microsoft\Windows\PI\Secure-Boot-Update</URI> ></RegistrationInfo >หลัก < <id หลัก="LocalSystem"> <UserId>S-1-5-18</userId> </> หลัก </principals> > การตั้งค่า < <DisallowStartIfOnBatteries><เท็จ /DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries><เท็จ /StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <StartWhenAvailable>true</StartWhenAvailable> >idleSettings < <stopOnIdleEnd>true</StopOnIdleEnd> <RestartOnIdle><เท็จ /RestartOnIdle> ></IdleSettings <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> </> การตั้งค่า >ทริกเกอร์ < >BootTrigger < <หน่วงเวลา>PT5M</หน่วงเวลา> >การทําซ้ํา < ช่วง <>><PT12H /Interval </>การทําซ้ํา ></BootTrigger > </ทริกเกอร์ <Actions Context="LocalSystem"> > <ComHandler <ClassId>{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> >< ข้อมูล <! [CDATA[SBServicing]]></Data> ></ComHandler </แอคชัน> </> งาน " @
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { if ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Create scheduled task")) { # บันทึก XML ลงในไฟล์ชั่วคราวและนําเข้า $tempFile = [System.IO.Path]::GetTempFileName() $taskXml | Out-File -FilePath $tempFile -Encoding Unicode -Force $output = schtasks.exe /Create /TN "$TaskPath$TaskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force -ErrorAction SilentlyContinue if ($LASTEXITCODE -eq 0) { $success = $true } อื่น { $errorMsg = $output -join " " } } } อื่นๆ { if ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName", "Create scheduled task")) { $result = Invoke-Command -ComputerName $Computer -ScriptBlock { param($taskPath, $taskName, $xml) $tempFile = [System.IO.Path]::GetTempFileName() $xml | Out-File -FilePath $tempFile -Encoding Unicode -Force $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 Output -join " " } } } } จับ { $errorMsg = $_. Exception.message }
return @{ สําเร็จ = $success ข้อผิดพลาด = $errorMsg } }
function Enable-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [string]$Computer = $env:COMPUTERNAME )
$success = $false $errorMsg = $null
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { if ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Enable scheduled task")) { $output = schtasks.exe /Change /TN "$TaskPath$TaskName" /ENABLE 2>&1 if ($LASTEXITCODE -eq 0) { $success = $true } อื่น { $errorMsg = $output -join " " } } } อื่นๆ { if ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName", "Enable scheduled task")) { $result = Invoke-Command -ComputerName $Computer -ScriptBlock { param($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 Output -join " " } } } } จับ { $errorMsg = $_. Exception.message }
return @{ สําเร็จ = $success ข้อผิดพลาด = $errorMsg } }
# Main execution Write-Host "" Write-Host "========================================" -ForegroundColor Cyan Write-Host " Secure Boot Update Task Enabler" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "" Write-Host "งาน: $TaskPath$TaskName" -ForegroundColor Gray Write-Host ""
# Determine target computers $targets = if ($ComputerName) { $ComputerName } else { @($env:COMPUTERNAME) }
$results = @()
foreach ($computer in $targets) { Write-Host "การตรวจสอบ: $computer" -สีพื้นหน้าสีเหลือง $status = $computer Get-SecureBootTaskStatus -คอมพิวเตอร์ ถ้า ($status ข้อผิดพลาด) { Write-Host " ข้อผิดพลาด: $($status Error)" -ForegroundColor Red } elseif (-not $status. TaskExists) { Write-Host " ไม่มีงานอยู่ในระบบนี้" -ForegroundColor Red # สร้างถ้ามีการร้องขอ หรือพร้อมท์ถ้ามีการระบุ Enable $shouldCreate = $Create if (-not $shouldCreate -and $Enable) { Write-Host "" Write-Host " งานอาจถูกลบไปแล้ว" -ForegroundColor Yellow if ($Quiet) { Write-Host " สร้างงานโดยอัตโนมัติ (โหมดเงียบ)" -ForegroundColor Cyan $shouldCreate = $true } อื่น { $confirm = Read-Host " คุณต้องการสร้างงานใหม่หรือไม่ (Y/N)" if ($confirm -eq 'Y' -or $confirm -eq 'y') { $shouldCreate = $true } } } if ($shouldCreate) { Write-Host " การสร้างงาน..." -ForegroundColor สีเหลือง $createResult = $computer New-SecureBootTask -คอมพิวเตอร์ if ($createResult.Success) { Write-Host " สร้างงานสําเร็จแล้ว" -ForegroundColor Green # ตรวจสอบสถานะอีกครั้ง $status = $computer Get-SecureBootTaskStatus -คอมพิวเตอร์ ถ้า ($status TaskExists) { $stateColor = if ($status. เปิดใช้งานแล้ว) { "สีเขียว" } อื่น { "สีแดง" } Write-Host " รัฐ: $($status TaskState)" -$stateColor สีพื้นหน้า } } อื่นๆ { Write-Host " ไม่สามารถสร้าง: $($createResult.Error)" -ForegroundColor Red } } } อื่นๆ { $stateColor = if ($status. เปิดใช้งานแล้ว) { "สีเขียว" } อื่น { "สีแดง" } Write-Host " รัฐ: $($status TaskState)" -$stateColor สีพื้นหน้า ถ้า ($status LastRunTime -and $status LastRunTime -ne [DateTime]::MinValue) { Write-Host " เรียกใช้ครั้งล่าสุด: $($status LastRunTime)" -ForegroundColor Gray } ถ้า ($status NextRunTime -and $status NextRunTime -ne [DateTime]::MinValue) { Write-Host " เรียกใช้ครั้งถัดไป: $($status NextRunTime)" -ForegroundColor Gray }
# Enable if requested and currently disabled ถ้า ($Enable -and -not $status เปิดใช้งานแล้ว) { Write-Host " การเปิดใช้งานงาน..." -ForegroundColor สีเหลือง $enableResult = $computer Enable-SecureBootTask -คอมพิวเตอร์ if ($enableResult.Success) { Write-Host "เปิดใช้งานเรียบร้อยแล้ว" -ForegroundColor สีเขียว # ตรวจสอบสถานะอีกครั้ง $status = $computer Get-SecureBootTaskStatus -คอมพิวเตอร์ } อื่นๆ { Write-Host " ไม่สามารถเปิดใช้งาน: $($enableResult.Error)" -ForegroundColor Red } } elseif ($Enable -and $status เปิดใช้งานแล้ว) { Write-Host " งานถูกเปิดใช้งานแล้ว" -ForegroundColor Green } } $results += $status Write-Host "" }
# Summary Write-Host "========================================" -ForegroundColor Cyan Write-Host " สรุป" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan
$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" -ForegroundColor Green if ($disabled -gt 0) { Write-Host "Disabled: $disabled" -ForegroundColor Red } if ($notFound -gt 0) { Write-Host "ไม่พบ: $notFound" -ForegroundColor Yellow } if ($errors -gt 0) { Write-Host "ข้อผิดพลาด: $errors" -ForegroundColor Red }
# Return results for pipeline $results