העתק והדבק קובץ Script לדוגמה זה ושנה לפי הצורך עבור הסביבה שלך:
<#מקשים . תקציר הפיכת המשימה המתוזמנת 'עדכון אתחול מאובטח' לזמין.
.DESCRIPTIONמקשים קובץ Script זה מבטיח את המשימה המתוזמנת של עדכון האתחול המאובטח של 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"מקשים # הערה: קובץ Script זה פועל ב נקודות קצה כדי להפוך את המשימה עדכון אתחול מאובטח לזמינה.
$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 IsEnabled = $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. TaskExists = $false החזר $result אני לא יכול לעשות את # Parse CSV output $taskData = $schtasksOutput | ConvertFrom-Csv if ($taskData) { $result. TaskExists = $true $result. TaskState = $taskData.Status $result. IsEnabled = ($taskData.Status -eq 'Ready' -או $taskData.Status -eq 'פועל') # נסה לקבל את זמן הריצה הבא מהנתונים if ($taskData.'Next Run Time' -and $taskData.'Next Run Time' -ne 'N/A') { נסה את { $result. NextRunTime = [DateTime]::P arse($taskData.'Next Run Time') } תפוס את { } אני לא יכול לעשות את אני לא יכול לעשות את אני לא יכול לעשות את אחרת { # מחשב מרוחק - השתמש Invoke-Command עם משימות $remoteResult = Invoke-Command -ComputerName $Computer -ScriptBlock { param($fullTaskName) $output = schtasks.exe /Query /TN $fullTaskName /FO CSV 2>&1 תרמה תרמה ExitCode = $LASTEXITCODE Output = $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' -או $taskData.Status -eq 'פועל') אני לא יכול לעשות את אני לא יכול לעשות את אני לא יכול לעשות את לתפוס את { $result. שגיאה = $_. חריגה.הודעה }
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"> <רישום חשבון> <יום>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)</source> <מחבר>'$(@%SystemRoot%\system32\TpmTasks.dll,-600)</author> <תיאור>'$(@%SystemRoot%\system32\TpmTasks.dll,-604)</description> <URI>\Microsoft\Windows\PI\Secure-Boot-Update</URI> </RegistrationInfo> <מנהלים> <הראשי="LocalSystem"> <UserId>S-1-5-18</UserId> </מנהל> </מנהלים> <הגדרות> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries>כוזבת</StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <התחלהכאת זמינות>true</startכאיל> <IdleSettings> <StopOnIdleEnd>True</StopOnIdleEnd> <RestartOnIdle>False</RestartOnIdle> </IdleSettings> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> </הגדרות> <מפעילים> <BootTrigger> <השהיית>PT5M</השהיית> <חזרה> <מרווח זמן>PT12H</interval> </repetition> </BootTrigger> </Triggers> <הקשר פעולות נוספות="LocalSystem"> <ComHandler> <ClassId>{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> <נתונים><! [CDATA[SBServicing]]></Data> </ComHandler> </Actions> </task> " @
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 -קידוד 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 -קידוד Unicode -Force $output = schtasks.exe /Create /TN "$taskPath$taskName" /XML $tempFile /F 2>&1 Remove-Item $tempFile -Force -ErrorAction SilentlyContinue @{ ExitCode = $LASTEXITCODE; Output = $output } } -ArgumentList $TaskPath, $TaskName, $taskXml -ErrorAction Stop if ($result. ExitCode -eq 0) { $success = $true } אחר { $errorMsg = $result. Output -join " " אני לא יכול לעשות את אני לא יכול לעשות את אני לא יכול לעשות את אני לא יכול לעשות את לתפוס את { $errorMsg = $_. חריגה.הודעה }
return @{מקשים Success = $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 = $output } } -ArgumentList "$TaskPath$TaskName" -ErrorAction Stop if ($result. ExitCode -eq 0) { $success = $true } אחר { $errorMsg = $result. Output -join " " אני לא יכול לעשות את אני לא יכול לעשות את אני לא יכול לעשות את אני לא יכול לעשות את לתפוס את { $errorMsg = $_. חריגה.הודעה }
return @{מקשים Success = $success שגיאה = $errorMsg אני לא יכול לעשות את }
# Main executionמקשים Write-Host "" Write-Host "========================================" - תכלת צבע קידמה Write-Host " Secure Boot Update Task Enabler" -ForegroundColor Cyan Write-Host "========================================" - צבע קידמה תכלת Write-Host "" Write-Host "פעילות: $TaskPath$TaskName" -צבע רקע אפור Write-Host ""
# Determine target computersמקשים $targets = if ($ComputerName) { $ComputerName } else { @($env:COMPUTERNAME) }
$results = @()
foreach ($computer in $targets) {מקשים Write-Host "בודק: $computer" -צבע קידמה צהוב $status = Get-SecureBootTaskStatus -מחשב $computer if ($status. שגיאה) { Write-Host " שגיאה: $($status. Error)" -ForegroundColor Red אני לא יכול לעשות את elseif (-not $status. TaskExists) { Write-Host " המשימה אינה קיימת במערכת זו" -צבע קידמה אדום # צור אם התבקש, או הצג בקשה אם האפשרות הפוך לזמין צוינה $shouldCreate = $Create if (-not $shouldCreate -and $Enable) { Write-Host "" Write-Host " ייתכן שהפעילות נמחקה". -צבע קידמה צהוב if ($Quiet) { Write-Host " יצירה אוטומטית של משימה (מצב שקט)" -צבע קידמה תכלת $shouldCreate = $true } אחר { $confirm = Read-Host " האם ברצונך ליצור מחדש את הפעילות? (Y/N)" if ($confirm -eq 'Y' -או $confirm -eq 'y') { $shouldCreate = $true אני לא יכול לעשות את אני לא יכול לעשות את אני לא יכול לעשות את if ($shouldCreate) { Write-Host " Creating task..." -ForegroundColor Yellow $createResult = New-SecureBootTask -מחשב $computer if ($createResult.Success) { Write-Host " המשימה נוצרה בהצלחה" -צבע קידמה ירוק # בדוק מחדש את המצב $status = Get-SecureBootTaskStatus -מחשב $computer if ($status. TaskExists) { $stateColor = if ($status. IsEnabled) { "ירוק" } אחר { "אדום" } Write-Host " מצב: $($status. TaskState)" -צבע קידמה $stateColor אני לא יכול לעשות את אני לא יכול לעשות את אחרת { Write-Host " יצירת: $($createResult.Error)" -צבע קידמה אדום אני לא יכול לעשות את אני לא יכול לעשות את אני לא יכול לעשות את אחרת { $stateColor = if ($status. IsEnabled) { "ירוק" } אחר { "אדום" } Write-Host " מצב: $($status. TaskState)" -צבע קידמה $stateColor if ($status. LastRunTime -and $status. LastRunTime -ne [DateTime]::MinValue) { Write-Host " הפעלה אחרונה: $($status. LastRunTime)" -צבע רקע אפור אני לא יכול לעשות את if ($status. NextRunTime - $status. NextRunTime -ne [DateTime]::MinValue) { Write-Host " Next Run: $($status. NextRunTime)" -קידמה - צבע אפור }
# Enable if requested and currently disabledמקשים if ($Enable -and -not $status. IsEnabled) { Write-Host " הפיכת פעילות לפעילות..." - צבע קידמה צהוב $enableResult = Enable-SecureBootTask -מחשב $computer if ($enableResult.Success) { Write-Host " המשימה הופעלה בהצלחה" -צבע קידמה ירוק # בדוק מחדש את המצב $status = Get-SecureBootTaskStatus -מחשב $computer אני לא יכול לעשות את אחרת { Write-Host " לא היתה אפשרות להפוך לזמין: $($enableResult.Error)" -צבע קידמה אדום אני לא יכול לעשות את אני לא יכול לעשות את elseif ($Enable -and $status. IsEnabled) { Write-Host " פעילות כבר זמינה" -צבע קידמה ירוק אני לא יכול לעשות את אני לא יכול לעשות את $results += $status Write-Host "" }
# Summaryמקשים Write-Host "========================================" - צבע קידמה תכלת Write-Host " Summary" - תכלת צבע קידמה 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" -צבע קידמה ירוק if ($disabled -gt 0) { Write-Host "Disabled: $disabled" -ForegroundColor Red } if ($notFound -gt 0) { Write-Host "Not found: $notFound" -ForegroundColor Yellow } if ($errors -gt 0) { Write-Host "Errors: $errors" -ForegroundColor Red }
# Return results for pipelineמקשים $results