Kopieer en plak dit voorbeeldscript en wijzig deze indien nodig voor uw omgeving:
<# . SYNOPSIS Hiermee schakelt u de geplande taak Update voor beveiligd opstarten in.
.DESCRIPTION Dit script zorgt ervoor dat de geplande taak Windows Secure Boot Update (\Microsoft\Windows\PI\Secure-Boot-Update) is ingeschakeld. Als dit is uitgeschakeld, hiermee wordt het ingeschakeld. Als de taak is verwijderd, kan deze opnieuw worden gemaakt.
.PARAMETER Action De actie die moet worden uitgevoerd. Geldige waarden: controleren, inschakelen, maken - controleren: alleen de taakstatus controleren - inschakelen: (standaard) Schakel de taak in als deze is uitgeschakeld. Als de taak ontbreekt, wordt gevraagd om te maken.- maken: de taak maken als deze niet bestaat
.PARAMETER ComputerName Optionele. Matrix met computernamen om de taak te controleren/in te schakelen.Als dit niet is opgegeven, wordt uitgevoerd op de lokale computer.
.PARAMETER Credential Optionele. Referenties voor externe computertoegang.
.PARAMETER Quiet Onderdrukt prompts en antwoordt automatisch Ja. Handig voor automatisering.
.EXAMPLE .\Enable-SecureBootTask.ps1 # Hiermee schakelt u de taakstatus op de lokale computer in
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 inschakelen # Schakelt de taak in als deze is uitgeschakeld. Prompts om te maken als deze ontbreekt.
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 maken # Maakt de taak als deze is verwijderd en controleert vervolgens de status ervan
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 check -ComputerName "PC1", "PC2" # Controleert de taak op externe machines
.NOTES Vereist beheerdersbevoegdheden om de taak in te schakelen of te maken.Taakpad: \Microsoft\Windows\PI\Secure-Boot-Update De taak wordt elke 12 uur taskhostw.exe uitgevoerd met verhoogde bevoegdheden.#>
[CmdletBinding(SupportsShouldProcess)] param( [Parameter(Position=0)] [ValidateSet('check', 'enable', 'create', '')] [string]$Action = 'enable',
[Parameter()] [tekenreeks[]]$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" # Opmerking: dit script wordt uitgevoerd op eindpunten om de taak Update voor beveiligd opstarten in te schakelen.
$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 Fout = $null }
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { # Gebruik schtasks.exe voor betrouwbaardere taakdetectie $schtasksOutput = schtasks.exe /Query /TN "$TaskPath$TaskName" /FO CSV 2>&1 if ($LASTEXITCODE -ne 0) { # Taak niet gevonden is geen fout - betekent alleen dat de taak niet bestaat $result. TaskExists = $false $result retourneren } # CSV-uitvoer parseren $taskData = $schtasksOutput | ConverterenVan-CSV if ($taskData) { $result. TaskExists = $true $result. TaskState = $taskData.Status $result. IsEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running') # Probeer de volgende uitvoeringstijd op te halen uit de gegevens if ($taskData.'Volgende uitvoeringstijd' -en $taskData.'Volgende uitvoeringstijd' -ne 'N/B') { probeer { $result. NextRunTime = [DateTime]::P arse($taskData.'Next Run Time') } catch { } } } } else { # Externe computer - gebruik Invoke-Command met schtasks $remoteResult = Invoke-Command -ComputerName $Computer -ScriptBlock { param($fullTaskName) $output = schtasks.exe /Query /TN $fullTaskName /FO CSV 2>&1 @{ ExitCode = $LASTEXITCODE Uitvoer = $output } } -ArgumentList "$TaskPath$TaskName" -ErrorAction Stop
if ($remoteResult.ExitCode -ne 0) { # Taak niet gevonden is geen fout - betekent alleen dat de taak niet bestaat $result. TaskExists = $false $result retourneren }
$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. Fout = $_. 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 # Maakt gebruik van ComHandler met SBServicing-klasse, wordt uitgevoerd als LocalSystem $taskXml = @" <?xml version="1.0" encoding="UTF-16"?> <Task version="1.6" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <Datum>2012-02-07T16:39:20</Date> <SecurityDescriptor>O:BAG:BAD:P(A;; FA;;; BA)(A;; FA;;; SY)(A;; FRFX;;; LS)</SecurityDescriptor> <source>'$(@%SystemRoot%\system32\TpmTasks.dll,-601)</Source> <Author>'$(@%SystemRoot%\system32\TpmTasks.dll,-600)</Author> <description>'$(@%SystemRoot%\system32\TpmTasks.dll,-604)</Description> <URI>\Microsoft\Windows\PI\Secure-Boot-Update</URI> </RegistrationInfo> <principals> <Principal id="LocalSystem"> <UserId>S-1-5-18</UserId> </Principal> </Principals> <instellingen> <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNieuwe</MultipleInstancesPolicy> <StartWhenAvailable>true</StartWhenAvailable> <IdleSettings> <StopOnIdleEnd>true</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> </Instellingen> <triggers> <BootTrigger> <delay>PT5M</Delay> ><herhaling <interval>PT12H</Interval> </Herhaling> </BootTrigger> </Triggers> <Actions Context="LocalSystem"> <ComHandler> <ClassId>{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> <data><! [CDATA[SBServicing]]></Data> </ComHandler> </Acties> </Taak> " @
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { if ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Geplande taak maken")) { # XML opslaan in tijdelijk bestand en importeren $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 Op de achtergrond Doorgaan if ($LASTEXITCODE -eq 0) { $success = $true } else { $errorMsg = $output -join " " " } } } else { if ($PSCmdlet.ShouldProcess("$Computer\$TaskPath$TaskName", "Geplande taak maken")) { $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; Uitvoer = $output } } -ArgumentList $TaskPath, $TaskName, $taskXml -ErrorAction Stop if ($result. ExitCode -eq 0) { $success = $true } else { $errorMsg = $result. Uitvoer -join " " " } } } } catch { $errorMsg = $_. Exception.Message }
return @{ Geslaagd = $success Fout = $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", "Geplande taak inschakelen")) { $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", "Geplande taak inschakelen")) { $result = Invoke-Command -ComputerName $Computer -ScriptBlock { param($fullTaskName) $output = schtasks.exe /Change /TN $fullTaskName /ENABLE 2>&1 @{ ExitCode = $LASTEXITCODE; Uitvoer = $output } } -ArgumentList "$TaskPath$TaskName" -ErrorAction Stop if ($result. ExitCode -eq 0) { $success = $true } else { $errorMsg = $result. Uitvoer -join " " " } } } } catch { $errorMsg = $_. Exception.Message }
return @{ Geslaagd = $success Fout = $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 "Task: $TaskPath$TaskName" -ForegroundColor Gray Write-Host ""
# Determine target computers $targets = if ($ComputerName) { $ComputerName } else { @($env:COMPUTERNAME) }
$results = @()
foreach ($computer in $targets) { Write-Host "Checking: $computer" -ForegroundColor Yellow $status = Get-SecureBootTaskStatus -Computer $computer if ($status. Fout) { Write-Host ' Fout: $($status. Error)" -ForegroundColor Red } elseif (-niet $status. TaskExists) { Write-Host "Taak bestaat niet op dit systeem" -VoorgrondKleur Rood # Maken indien aangevraagd of vraag of Inschakelen is opgegeven $shouldCreate = $Create if (-not $shouldCreate -and $Enable) { Write-Host "" Write-Host 'De taak is mogelijk verwijderd.' -ForegroundColor Yellow if ($Quiet) { Write-Host 'Taak automatisch maken (stille modus)' -ForegroundColor Cyan $shouldCreate = $true } else { $confirm = Read-Host " Wilt u de taak opnieuw maken? (Y/N)" if ($confirm -eq 'Y' -of $confirm -eq 'y') { $shouldCreate = $true } } } if ($shouldCreate) { Write-Host " Taak maken..." -VoorgrondKleur Geel $createResult = New-SecureBootTask -Computer $computer if ($createResult.Success) { Write-Host 'Taak is gemaakt' -VoorgrondKleur Groen # Status opnieuw controleren $status = Get-SecureBootTaskStatus -Computer $computer if ($status. TaskExists) { $stateColor = if ($status. IsEnabled) { "Green" } else { "Red" } Write-Host " Status: $($status. TaskState)" -ForegroundColor $stateColor } } else { Write-Host ' Kan niet maken: $($createResult.Error)' -ForegroundColor Red } } } else { $stateColor = if ($status. IsEnabled) { "Green" } else { "Red" } Write-Host " Status: $($status. TaskState)" -ForegroundColor $stateColor if ($status. LastRunTime -en $status. LastRunTime -ne [DateTime]::MinValue) { Write-Host ' Laatste uitvoering: $($status. LastRunTime)" -ForegroundColor Gray } if ($status. NextRunTime -en $status. NextRunTime -ne [DateTime]::MinValue) { Write-Host " Volgende uitvoering: $($status. NextRunTime)" -ForegroundColor Gray }
# Enable if requested and currently disabled if ($Enable -en -niet $status. IsEnabled) { Write-Host "Taak inschakelen..." -VoorgrondKleur Geel $enableResult = Enable-SecureBootTask -Computer $computer if ($enableResult.Success) { Write-Host 'Taak is ingeschakeld' -ForegroundColor Green # Status opnieuw controleren $status = Get-SecureBootTaskStatus -Computer $computer } else { Write-Host ' Kan het volgende niet inschakelen: $($enableResult.Error)' -ForegroundColor Red } } elseif ($Enable -en $status. IsEnabled) { Write-Host 'Taak is al ingeschakeld' -VoorgrondKleur Groen } } $results += $status Write-Host "" }
# Summary Write-Host "========================================" -ForegroundColor Cyan Write-Host "Samenvatting" -ForegroundColor Cyaan Write-Host "========================================" -ForegroundColor Cyan
$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results | Where-Object { $_. TaskExists -en -niet $_. IsEnabled }). Tellen $notFound = ($results | Where-Object { -not $_. TaskExists }). Tellen $errors = ($results | Where-Object { $_. Fout }). Tellen
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