このサンプル スクリプトをコピーして貼り付け、環境に合わせて必要に応じて変更します。
<# .SYNOPSIS セキュア ブート更新のスケジュールされたタスクを有効にします。
.DESCRIPTION このスクリプトにより、Windows Secure Boot Update のスケジュールされたタスク (\Microsoft\Windows\PI\Secure-Boot-Update) が有効になっています。 無効にした場合は、 これを有効にします。 タスクが削除された場合は、タスクを再作成できます。
.PARAMETER Action 実行するアクション。 有効な値: チェック、有効、作成 - チェック: タスクの状態のみをチェックします - enable: (既定値) 無効になっている場合はタスクを有効にします。 タスクが見つからない場合は、作成を求めるメッセージが表示されます。- 作成: タスクが存在しない場合は作成します
.PARAMETER ComputerName オプション。 タスクをチェック/有効にするコンピューター名の配列。指定しない場合は、ローカル コンピューターでを実行します。
.PARAMETER Credential オプション。 リモート コンピューター アクセスの資格情報。
.PARAMETER Quiet プロンプトを抑制し、自動的に [はい] と回答します。 自動化に役立ちます。
.EXAMPLE .\Enable-SecureBootTask.ps1 # ローカル コンピューターでタスクの状態を有効にします
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 有効にします # 無効にした場合にタスクを有効にします。 不足している場合は、作成するプロンプト。
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 create # タスクが削除された場合にタスクを作成し、その状態を確認します
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 チェック -ComputerName "PC1","PC2" # リモート マシン上のタスクを確認します
.NOTES タスクを有効または作成するには、管理者特権が必要です。タスク パス: \Microsoft\Windows\PI\Secure-Boot-Update タスクは、昇格された特権で 12 時間ごとに taskhostw.exe 実行されます。#>
[CmdletBinding(SupportsShouldProcess)] param( [Parameter(Position=0)] [ValidateSet('チェック', '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 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 return $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') } catch { } } } } else { # リモート コンピューター - schtasks で Invoke-Command を使用します $remoteResult = Invoke-Command -ComputerName $Computer -ScriptBlock { param($fullTaskName) $output = /Query /TN $fullTaskName /FO CSV 2>&1 schtasks.exe @{ ExitCode = $LASTEXITCODE Output = $output } } -ArgumentList "$TaskPath$TaskName" -ErrorAction Stop
if ($remoteResult.ExitCode -ne 0) { # タスクが見つからないのはエラーではありません。タスクが存在しないことを意味します $result。TaskExists = $false return $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') } } } catch { $result。エラー = $_。Exception.Message }
return $result }
function New-SecureBootTask { [コマンドレットバインド(SupportsShouldProcess)] param( [string]$Computer = $env:COMPUTERNAME )
$success = $false $errorMsg = $null
# Task definition - matches the original Windows Secure Boot Update task # SbServicing クラスで ComHandler を使用し、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</Date> <SecurityDescriptor>O:BAG:BAD:P(A;;Fa;;;BA)(A;;Fa;;;SY)(A;;FRFX;;;LS)</SecurityDescriptor> <ソース>'$(@%SystemRoot%\system32\TpmTasks.dll,-601)</Source> <Author>'$(@%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> /Principal> の < </Principals> <設定> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> stopIfGoingOnBatteries ><0 false></StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <StartWhenAvailable>true</StartWhenAvailable> <IdleSettings> StopOnIdleEnd <true</StopOnIdleEnd>> <RestartOnIdle>false</RestartOnIdle> /IdleSettings> の < UseUnifiedSchedulingEngine <true></UseUnifiedSchedulingEngine> /Settings> の < <トリガー> <BootTrigger> PT5M</Delay>>遅延の < <繰り返し> PT12H</Interval>><間隔 /繰り返し> の < /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 -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 " " } } } else { 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 = $output } } -ArgumentList $TaskPath、$TaskName、$taskXml -ErrorAction Stop if ($result。ExitCode -eq 0) { $success = $true } else { $errorMsg = $result。Output -join " " } } } } catch { $errorMsg = $_。Exception.Message }
return @{ 成功 = $success エラー = $errorMsg } }
function Enable-SecureBootTask { [コマンドレットバインド(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 } else { $errorMsg = $output -join " " } } } else { 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 " " } } } } catch { $errorMsg = $_。Exception.Message }
return @{ 成功 = $success エラー = $errorMsg } }
# Main execution "" を Write-Host する Write-Host "========================================" -ForegroundColor シアン Write-Host "セキュア ブート更新タスク イネーブラー" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor シアン "" を Write-Host する Write-Host "Task: $TaskPath$TaskName" -ForegroundColor Gray "" を Write-Host する
# Determine target computers $targets = if ($ComputerName) { $ComputerName } else { @($env:COMPUTERNAME) }
$results = @()
foreach ($computer in $targets) { Write-Host "チェック: $computer" -ForegroundColor Yellow $status = Get-SecureBootTaskStatus -Computer $computer if ($status。エラー) { Write-Host " エラー: $($status。エラー)" -ForegroundColor Red } elseif (-not $status。TaskExists) { Write-Host " タスクはこのシステムに存在しません" -ForegroundColor Red # 要求された場合は作成し、Enable が指定された場合はプロンプトを表示します $shouldCreate = $Create (-not $shouldCreate -and $Enable) { "" を Write-Host する Write-Host " タスクが削除されている可能性があります。-ForegroundColor Yellow if ($Quiet) { Write-Host "自動作成タスク (Quiet mode)" -ForegroundColor Cyan $shouldCreate = $true } else { $confirm = Read-Host " タスクを再作成しますか? (Y/N)" if ($confirm -eq 'Y' -or $confirm -eq 'y') { $shouldCreate = $true } } } if ($shouldCreate) { Write-Host "タスクの作成...." -ForegroundColor Yellow $createResult = New-SecureBootTask -Computer $computer if ($createResult.Success) { Write-Host " タスクが正常に作成されました" -ForegroundColor Green # 状態を再チェックします $status = Get-SecureBootTaskStatus -Computer $computer if ($status。TaskExists) { $stateColor = if ($status。IsEnabled) { "Green" } else { "Red" } Write-Host " 状態: $($status。TaskState)" -ForegroundColor $stateColor } } else { Write-Host " 作成に失敗しました: $($createResult.Error)" -ForegroundColor Red } } } else { $stateColor = if ($status。IsEnabled) { "Green" } else { "Red" } Write-Host " State: $($status。TaskState)" -ForegroundColor $stateColor if ($status。LastRunTime -and $status。LastRunTime -ne [DateTime]::MinValue) { Write-Host " Last Run: $($status。LastRunTime)" -ForegroundColor Gray } if ($status。NextRunTime -and $status。NextRunTime -ne [DateTime]::MinValue) { Write-Host " 次の実行: $($status。NextRunTime)" -ForegroundColor Gray }
# Enable if requested and currently disabled if ($Enable -and -not $status。IsEnabled) { Write-Host "タスクの有効化...." -ForegroundColor Yellow $enableResult = Enable-SecureBootTask -Computer $computer if ($enableResult.Success) { Write-Host " タスクが正常に有効になりました" -ForegroundColor Green # 状態を再チェックします $status = Get-SecureBootTaskStatus -Computer $computer } else { Write-Host " を有効にできませんでした: $($enableResult.Error)" -ForegroundColor Red } } elseif ($Enable -and $status。IsEnabled) { Write-Host "タスクは既に有効になっています" -ForegroundColor Green } } $results += $status "" を Write-Host する }
# Summary Write-Host "========================================" -ForegroundColor シアン Write-Host " Summary" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor シアン
$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results | Where-Object { $_.TaskExists -and -not $_.IsEnabled })。Count $notFound = ($results | Where-Object { -not $_.TaskExists })。Count $errors = ($results | Where-Object { $_.エラー })。カウント
Write-Host "Total Checked: $($results.Count)" Write-Host "Enabled: $enabled" -ForegroundColor Green 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