Kopiér og indsæt dette eksempelscript, og rediger det efter behov for dit miljø:
<# . SYNOPSIS Aktiverer den planlagte opgave Sikker bootstartopdatering.
.DESCRIPTION Dette script sikrer, at den planlagte Windows Secure Boot Update-opgave (\Microsoft\Windows\PI\Secure-Boot-Update) er aktiveret. Hvis det er deaktiveret, det aktiverer det. Hvis opgaven er blevet slettet, kan den genoprettes.
.PARAMETER Action Den handling, der skal udføres. Gyldige værdier: kontrollér, aktivér, opret - check: Kontrollér kun opgavestatus - aktivér: (standard) Aktivér opgaven, hvis den er deaktiveret. Hvis opgaven mangler, bliver du bedt om at oprette.– opret: Opret opgaven, hvis den ikke findes
.PARAMETER ComputerName Valgfri. Matrix med computernavne, som opgaven skal kontrolleres/aktiveres på.Hvis det ikke er angivet, kører på den lokale computer.
.PARAMETER Credential Valgfri. Legitimationsoplysninger til fjernadgang.
.PARAMETER Quiet Undertrykker prompter og svarer automatisk Ja. Nyttig til automatisering.
.EXAMPLE .\Enable-SecureBootTask.ps1 # Aktiverer opgavestatus på lokal computer
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 aktivere # Aktiverer opgaven, hvis den er deaktiveret. Prompter at oprette, hvis den mangler.
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 oprette # Opretter opgaven, hvis den blev slettet, kontrollerer derefter dens status
.EXAMPLE .\Check-SecureBootScheduledTask.ps1 check -ComputerName "PC1", "PC2" # Kontrollerer opgaven på fjerncomputere
.NOTES Kræver administratorrettigheder for at aktivere eller oprette opgaven.Opgavesti: \Microsoft\Windows\PI\Secure-Boot-Update Opgaven kører taskhostw.exe hver 12. time med administratorrettigheder.#>
[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" # Bemærk! Dette script kører på slutpunkter for at aktivere opgaven Sikker bootstartopdatering.
$TaskPath = "\Microsoft\Windows\PI\" $TaskName = "Secure-Boot-Update"
function Get-SecureBootTaskStatus { [CmdletBinding()] param( [streng]$Computer = $env:COMPUTERNAVN )
$result = [PSCustomObject]@{ Computernavn = $Computer TaskExists = $false TaskState = $null IsEnabled = $false LastRunTime = $null NextRunTime = $null Fejl = $null }
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { # Brug schtasks.exe til mere pålidelig opgaveregistrering $schtasksOutput = schtasks.exe /Query /TN "$TaskPath$TaskName" /FO CSV 2>&1 if ($LASTEXITCODE -ne 0) { # Opgaven blev ikke fundet er ikke en fejl – det betyder blot, at opgaven ikke findes $result. TaskExists = $false returner $result } # Fortolke CSV-output $taskData = $schtasksOutput | ConvertFrom-Csv if ($taskData) { $result. TaskExists = $true $result. TaskState = $taskData.Status $result. IsEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running') # Prøv at få næste kørselstid fra dataene if ($taskData.'Next Run Time' -and $taskData.'Next Run Time' -ne 'N/A') { prøv { $result. NextRunTime = [DateTime]::P arse($taskData.'Next Run Time') } fange { } } } } ellers { # Fjerncomputer – brug Invoke-Command med schtasks $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) { # Opgaven blev ikke fundet er ikke en fejl – det betyder blot, at opgaven ikke findes $result. TaskExists = $false returner $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. Fejl = $_. Undtagelse.Meddelelse }
return $result }
function New-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [streng]$Computer = $env:COMPUTERNAVN )
$success = $false $errorMsg = $null
# Task definition - matches the original Windows Secure Boot Update task # Bruger ComHandler med klassen SBServicing, kører som LocalSystem $taskXml = @" <?xml version="1.0" encoding="UTF-16"?> <Task version="1.6" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <Dato>2012-02-07T16:39:20</Dato> <SecurityDescriptor>O:BAG:BAD:P(A;; FA;;; BA)(A;; FA;;; SY)(A;; FRFX;;; LS)</SecurityDescriptor> <kilde>'$(@%SystemRoot%\system32\TpmTasks.dll,-601)</Source> <Forfatter>'$(@%SystemRoot%\system32\TpmTasks.dll,-600)</Author> <Beskrivelse>'$(@%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> <indstillinger> <Tillad ikkeStartIfOnBatteries>falsk</DisallowStartIfOnBatteries> ><0 StopIfGoingOnBatteries>falsk</StopIfGoingOnBatteries> ><4 ExecutionTimeLimit>PT1H</ExecutionTimeLimit> ><8 MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <StartNår tilgængelig>sand</StartNår tilgængelig> <inaktive indstillinger> <StopOnIdleEnd>sand</StopOnIdleEnd> <RestartOnIdle>falsk</RestartOnIdle> </IdleSettings> <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine> </> Indstillinger <udløsere> <BootTrigger-> <forsinkelse>PT5M</Delay> <gentagelse> <interval>PT12H</Interval> </Gentagelse> </BootTrigger> </Udløsere> <Actions Context="LocalSystem"> <ComHandler-> <ClassId->{5014B7C8-934E-4262-9816-887FA745A6C4}</ClassId> <data><! [CDATA[SBServicing]]></Data> </ComHandler> </Actions> </>Opgave " @
try { if ($Computer -eq $env:COMPUTERNAME -or $Computer -eq "localhost" -or $Computer -eq ".") { if ($PSCmdlet.ShouldProcess("$TaskPath$TaskName", "Create scheduled task")) { # Gem XML som midlertidig fil, og importér $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 } ellers { $errorMsg = $output -joinforbindelse " " } } } ellers { 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 hvis ($result. ExitCode -eq 0) { $success = $true } ellers { $errorMsg = $result. Output -join " " } } } } catch { $errorMsg = $_. Undtagelse.Meddelelse }
return @{ Success = $success Fejl = $errorMsg } }
function Enable-SecureBootTask { [CmdletBinding(SupportsShouldProcess)] param( [streng]$Computer = $env:COMPUTERNAVN )
$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 } ellers { $errorMsg = $output -join " " } } } ellers { 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 hvis ($result. ExitCode -eq 0) { $success = $true } ellers { $errorMsg = $result. Output -join " " } } } } catch { $errorMsg = $_. Undtagelse.Meddelelse }
return @{ Success = $success Fejl = $errorMsg } }
# Main execution Write-Host "" Write-Host "========================================" -Forgrundsfarve cyan Write-Host " Secure Boot Update Task Enabler" -ForegroundColor Cyan Write-Host "========================================" -Forgrundsfarve cyan Write-Host "" Write-Host "Opgave: $TaskPath$Opgavenavn" -Forgrundsfarve grå Write-Host ""
# Determine target computers $targets = if ($ComputerName) { $ComputerName } else { @($env:COMPUTERNAME) }
$results = @()
foreach ($computer in $targets) { Write-Host "Kontrollerer: $computer" -Forgrundsfarve gul $status = Get-SecureBootTaskStatus -Computer $computer hvis ($status. Fejl) { Write-Host " Fejl: $($status. Fejl)" -Forgrundsfarve rød } elseif (-not $status. TaskExists) { Write-Host " Opgaven findes ikke på dette system" -Forgrundsfarve rød # Opret, hvis der anmodes om det, eller spørg, om Aktivér blev angivet $shouldCreate = $Create if (-not $shouldCreate -and $Enable) { Write-Host "" Write-Host " Opgaven er muligvis blevet slettet." -Forgrundsfarve gul if ($Quiet) { Write-Host " Automatisk oprettelse af opgave (stillet tilstand)" -Forgrundsfarve cyan $shouldCreate = $true } ellers { $confirm = Read-Host " Vil du genskabe opgaven? (Å/N)" if ($confirm -eq 'Y' -or $confirm -eq 'y') { $shouldCreate = $true } } } if ($shouldCreate) { Write-Host " Opretter opgave..." -Forgrundsfarve gul $createResult = New-SecureBootTask -Computer $computer if ($createResult.Success) { Write-Host " Opgaven blev oprettet" -Forgrundsfarve grøn # Kontrollér status igen $status = Get-SecureBootTaskStatus -Computer $computer hvis ($status. TaskExists) { $stateColor = hvis ($status. IsEnabled) { "Grøn" } ellers { "Rød" } Write-Host " Stat: $($status. TaskState)" -Forgrundsfarve $stateColor } } ellers { Write-Host " Kunne ikke oprettes: $($createResult.Error)" -Forgrundsfarve rød } } } ellers { $stateColor = hvis ($status. IsEnabled) { "Grøn" } ellers { "Rød" } Write-Host " Stat: $($status. TaskState)" -Forgrundsfarve $stateColor hvis ($status. LastRunTime - og $status. LastRunTime -ne [DateTime]::MinValue) { Write-Host " Sidste kørsel: $($status. LastRunTime)" -Forgrundsfarve grå } hvis ($status. NextRunTime - og $status. NextRunTime -ne [DateTime]::MinValue) { Write-Host " Næste kørsel: $($status. NextRunTime)" -Forgrundsfarve grå }
# Enable if requested and currently disabled hvis ($Enable -og -ikke $status. IsEnabled) { Write-Host " Aktiverer opgave..." -Forgrundsfarve gul $enableResult = Enable-SecureBootTask -Computer $computer if ($enableResult.Success) { Write-Host " Opgaven er aktiveret" -Forgrundsfarve grøn # Kontrollér status igen $status = Get-SecureBootTaskStatus -Computer $computer } ellers { Write-Host " Kunne ikke aktiveres: $($enableResult.Error)" -Forgrundsfarve rød } } elseif ($Enable -og $status. IsEnabled) { Write-Host " Opgaven er allerede aktiveret" -Forgrundsfarve grøn } } $results += $status Write-Host "" }
# Summary Write-Host "========================================" -Forgrundsfarve cyan Write-Host " Oversigt" -Forgrundsfarve cyan Write-Host "========================================" -Forgrundsfarve cyan
$enabled = ($results | Where-Object { $_.IsEnabled }).Count $disabled = ($results | Where-Object { $_. TaskExists -and -not $_. IsEnabled }). Tælle $notFound = ($results | Where-Object { -ikke $_. TaskExists }). Tælle $errors = ($results | Where-Object { $_. Fejl }). Tælle
Write-Host "Total Checked: $($results.Count)" Write-Host "Aktiveret: $enabled" -Forgrundsfarve grøn if ($disabled -gt 0) { Write-Host "Disabled: $disabled" -ForegroundColor Red } if ($notFound -gt 0) { Write-Host "Ikke fundet: $notFound" -Forgrundsfarve gul } if ($errors -gt 0) { Write-Host "Fejl: $errors" -Forgrundsfarve rød }
# Return results for pipeline $results