Gælder for
Windows 10 Windows 10, version 1607, all editions Win 10 Ent LTSC 2019 Win 10 IoT Ent LTSC 2019 Windows 10 IoT Core LTSC Windows 10 Enterprise LTSC 2021 Windows 10 IoT Enterprise LTSC 2021 Windows 10, version 22H2, all editions Windows 11 Home and Pro, version 21H2 Windows 11 Enterprise Multi-Session, version 21H2 Windows 11 Enterprise and Education, version 21H2 Windows 11 IoT Enterprise, version 21H2 Windows 11 Home and Pro, version 22H2 Windows 11 Enterprise Multi-Session, version 22H2 Windows 11 Enterprise and Education, version 22H2 Windows 11 IoT Enterprise, version 22H2 Windows 11 SE, version 23H2 Windows 11 Home and Pro, version 23H2 Windows 11 Enterprise and Education, version 23H2 Windows 11 Enterprise Multi-Session, version 23H2 Windows 11 SE, version 24H2 Windows 11 Enterprise and Education, version 24H2 Windows 11 Enterprise Multi-Session, version 24H2 Windows 11 Home and Pro, version 24H2 Windows 11 IoT Enterprise, version 24H2 Windows Server 2012 ESU Windows Server 2012 R2 ESU Windows Server 2016 Windows Server 2019 Windows Server 2022 Windows Server 2025

Oprindelig publiceringsdato: 17. november 2025

KB-id: 5072718

Rediger dato

Skift beskrivelse

24. februar 2026

  • Scriptet Sample Secure Boot Inventory Data Collection er opdateret.

22. februar 2026

  • Scriptet Sample Secure Boot Inventory Data Collection er opdateret.

13. februar 2026

  • Scriptet Sample Secure Boot Inventory Data Collection er opdateret.

Eksempel på script til indsamling af data til sikker bootstart

Kopiér og indsæt dette eksempelscript, og rediger det efter behov for dit miljø: Scriptet Sample Secure Boot Inventory Data Collection.

< nr. . SYNOPSIS     Registrerer status for sikker bootstartcertifikatopdatering til overvågning for hele flåden.

. BESKRIVELSE     Dette registreringsscript indsamler status for sikker bootstart, værdier for certifikatopdatering i registreringsdatabasen,     og enhedsoplysninger. Det outputs en JSON streng til overvågning og rapportering.

    Kompatibel med Intune afhjælpninger, GPO-baseret samling og andre administrationsværktøjer.Der kræves ikke et afhjælpningsscript – dette er kun overvågning.

    Afslut 0 = "Uden problem" (certifikater er opdateret)     Afslut 1 = "Med problem" (certifikater ikke opdateret – kun oplysende)

. PARAMETER OutputPath     Valgfri. Sti til en mappe, hvor JSON-filen gemmes.Hvis det er angivet, gemmes HOSTNAME_latest.json i denne mappe.Hvis det ikke er angivet, udskrives JSON til stdout (oprindelig funktionsmåde).

. EKSEMPEL     # Output til stdout (registrering af Intune/SCCM)     .\Detect-SecureBootCertUpdateStatus.ps1

. EKSEMPEL     # Gem på netværksshare (GPO-installation)     .\Detect-SecureBootCertUpdateStatus.ps1 -OutputPath "\\server\SecureBootLogs$"

. NOTER     Registreringsdatabasestier pr. https://aka.ms/securebootplaybook:       HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot       HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing

    SOFTWAREN LEVERES "SOM DEN ER OG FOREFINDES", UDEN GARANTI AF NOGEN ART, EXPRESS ELLER     STILTIENDE, HERUNDER, MEN IKKE BEGRÆNSET TIL GARANTIER FOR SALGBARHED,     EGNETHED TIL ET BESTEMT FORMÅL OG IKKE-KRÆNKELSE. I INTET TILFÆLDE KAN     FORFATTERE ELLER INDEHAVERE AF OPHAVSRET HÆFTER FOR ETHVERT KRAV, SKADER ELLER ANDRE     ANSVAR, UANSET OM DER ER TALE OM EN KONTRAKT, ERSTATNINGSPLIGT ELLER PÅ ANDEN MÅDE     UD AF ELLER I FORBINDELSE MED SOFTWAREN ELLER BRUGEN ELLER ANDRE     SOFTWARE.#> param(     [Parameter(Obligatorisk = $false)]     [streng]$OutputPath )

# Download URL-adresse: https://aka.ms/getsecureboot -> "Installations- og overvågningseksempler" # Bemærk! Dette script kører på slutpunkter for at indsamle statusdata for sikker bootstart.

# 1. Værtsnavn # PS Version: Alle | Administration: Nej | Systemkrav: Ingen prøv {     $hostname = $env:COMPUTERNAVN     if ([string]::IsNullOrEmpty($hostname)) {         Write-Warning "Værtsnavn kunne ikke bestemmes"         $hostname = "Ukendt"     }     Write-Host "Hostname: $hostname" } fange {     Write-Warning "Fejl under hentning af værtsnavn: $_"     $hostname = "Fejl"     Write-Host "Hostname: $hostname" }

# 2. CollectionTime # PS Version: Alle | Administration: Nej | Systemkrav: Ingen prøv {     $collectionTime = Hent dato     if ($null -eq $collectionTime) {         Write-Warning "Dags dato/klokkeslæt kunne ikke hentes"         $collectionTime = "Ukendt"     }     Write-Host "Samlingstid: $collectionTime" } fange {     Write-Warning "Fejl under hentning af dato/klokkeslæt: $_"     $collectionTime = "Fejl"     Write-Host "Samlingstid: $collectionTime" }

# Registreringsdatabase: Hovednøgle til sikker bootstart (3 værdier)

# 3. SecureBootEnabled # PS Version: 3.0+ | Administration: Kan være påkrævet | Systemkrav: UEFI/Secure Boot-kompatibelt system prøv {     $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop     Write-Host "Sikker bootstart aktiveret: $secureBootEnabled" } fange {     Write-Warning "Status for sikker bootstart kan ikke bestemmes via cmdlet: $_"     # Prøv fallback i registreringsdatabasen     prøv {         $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop         $secureBootEnabled = [bool]$regValue.UEFISecureBootEnabled         Write-Host "Sikker bootstart aktiveret: $secureBootEnabled"     } fange {         Write-Warning "Status for sikker bootstart kan ikke bestemmes via registreringsdatabasen. Systemet understøtter muligvis ikke UEFI/Secure Boot."         $secureBootEnabled = $null         Write-Host "Sikker bootstart aktiveret: Ikke tilgængelig"     } }

# 4. HighConfidenceOptOut # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop     $highConfidenceOptOut = $regValue.HighConfidenceOptOut     Write-Host "Fravalg af høj konfidens: $highConfidenceOptOut" } fange {     # HighConfidenceOptOut er valgfri – findes ikke på de fleste systemer     $highConfidenceOptOut = $null     Write-Host "Fravalg af høj konfidens: Ikke angivet" }

Nr. 4b. MicrosoftUpdateAdministrerdOptIn # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name MicrosoftUpdateManagedOptIn -ErrorAction Stop     $microsoftUpdateManagedOptIn = $regValue.MicrosoftUpdateManagedOptIn     Write-Host "Microsoft Update Managed Opt In: $microsoftUpdateManagedOptIn" } fange {     # MicrosoftUpdateAdministrerdOptIn er valgfri – findes ikke på de fleste systemer     $microsoftUpdateManagedOptIn = $null     Write-Host "Microsoft Update Managed Opt In: Not Set" }

# 5. Tilgængelige opdateringer # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop     $availableUpdates = $regValue.AvailableUpdates     if ($null -ne $availableUpdates) {         # Konvertér til hexadecimalformat         $availableUpdatesHex = "0x{0:X}" -f $availableUpdates         Write-Host "Tilgængelig Opdateringer: $availableUpdatesHex"     } ellers {         Write-Host "Tilgængelig Opdateringer: Ikke tilgængelig"     } } fange {     Write-Warning "AvailableUpdates registry key not found or inaccessible"     $availableUpdates = $null     Write-Host "Tilgængelig Opdateringer: Ikke tilgængelig" }

Nr. 5b. AvailableUpdatesPolicy (GPO-styret fast værdi) # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdatesPolicy -ErrorAction Stop     $availableUpdatesPolicy = $regValue.AvailableUpdatesPolicy     if ($null -ne $availableUpdatesPolicy) {         # Konvertér til hexadecimalformat         $availableUpdatesPolicyHex = "0x{0:X}" -f $availableUpdatesPolicy         Write-Host "Tilgængelig politik for Opdateringer: $availableUpdatesPolicyHex"     } ellers {         Write-Host "Tilgængelig Opdateringer politik: Ikke angivet"     } } fange {     # AvailableUpdatesPolicy er valgfri – angives kun, når gruppepolitikobjekt anvendes     $availableUpdatesPolicy = $null     Write-Host "Tilgængelig Opdateringer politik: Ikke angivet" }

# Registreringsdatabase: Serviceringsnøgle (3 værdier)

# 6. UEFICA2023Status # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Status -ErrorAction Stop     $uefica 2023Status = $regValue.UEFICA2023Status     Write-Host "Windows UEFI CA 2023 Status: $uefica 2023Status" } fange {     Write-Warning "Windows UEFI CA 2023 Status registry key not found or inaccessible"     $uefica 2023Status = $null     Write-Host "Windows UEFI CA 2023-status: Ikke tilgængelig" }

# 7. UEFICA2023Fejl # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop     $uefica 2023Fejl = $regValue.UEFICA2023Fejl     Write-Host "UEFI CA 2023-fejl: $uefica 2023Fejl" } fange {     #UEFICA2023Fejl findes kun, hvis der opstod en fejl – fravær er godt     $uefica 2023Fejl = $null     Write-Host "UEFI CA 2023-fejl: Ingen" }

# 8. UEFICA2023ErrorEvent # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023ErrorEvent -ErrorAction Stop     $uefica 2023ErrorEvent = $regValue.UEFICA2023ErrorEvent     Write-Host "UEFI CA 2023 Error Event: $uefica 2023ErrorEvent" } fange {     $uefica 2023ErrorEvent = $null     Write-Host "UEFI CA 2023-fejlhændelse: Ikke tilgængelig" }

# Registreringsdatabase: Enhedsattributter (7 værdier: 9-15)

# 9. OEMManufacturerName # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMManufacturerName -ErrorAction Stop     $oemManufacturerName = $regValue.OEMManufacturerName     if ([string]::IsNullOrEmpty($oemManufacturerName)) {         Write-Warning "OEMManufacturerName is empty"         $oemManufacturerName = "Ukendt"     }     Write-Host "OEM-producentnavn: $oemManufacturerName" } fange {     Write-Warning "OEMManufacturerName registry key not found or inaccessible"     $oemManufacturerName = $null     Write-Host "OEM-producentnavn: ikke tilgængelig" }

# 10. OEMModelSystemFamily # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelSystemFamily -ErrorAction Stop     $oemModelSystemFamily = $regValue.OEMModelSystemFamily     if ([string]::IsNullOrEmpty($oemModelSystemFamily)) {         Write-Warning "OEMModelSystemFamily er tom"         $oemModelSystemFamily = "Ukendt"     }     Write-Host "OEM Model System Family: $oemModelSystemFamily" } fange {     Write-Warning "OEMModelSystemFamily-registreringsdatabasenøglen blev ikke fundet eller ikke tilgængelig"     $oemModelSystemFamily = $null     Write-Host "OEM Model System Family: Not Available" }

# 11. OEMModelNumber # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelNumber -ErrorAction Stop     $oemModelNumber = $regValue.OEMModelNumber     if ([string]::IsNullOrEmpty($oemModelNumber)) {         Write-Warning "OEMModelNumber er tom"         $oemModelNumber = "Ukendt"     }     Write-Host "OEM-modelnummer: $oemModelNumber" } fange {     Write-Warning "Registreringsdatabasenøglen OEMModelNumber blev ikke fundet eller ikke tilgængelig"     $oemModelNumber = $null     Write-Host "OEM-modelnummer: Ikke tilgængelig" }

# 12. FirmwareVersion # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareVersion -ErrorAction Stop     $firmwareVersion = $regValue.FirmwareVersion     if ([string]::IsNullOrEmpty($firmwareVersion)) {         Write-Warning "FirmwareVersion er tom"         $firmwareVersion = "Ukendt"     }     Write-Host "Firmwareversion: $firmwareVersion" } fange {     Write-Warning "Registreringsdatabasenøglen FirmwareVersion blev ikke fundet eller ikke tilgængelig"     $firmwareVersion = $null     Write-Host "Firmwareversion: ikke tilgængelig" }

# 13. FirmwareReleaseDate # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareReleaseDate -ErrorAction Stop     $firmwareReleaseDate = $regValue.FirmwareReleaseDate     if ([string]::IsNullOrEmpty($firmwareReleaseDate)) {         Write-Warning "FirmwareReleaseDate is empty"         $firmwareReleaseDate = "Ukendt"     }     Write-Host "Udgivelsesdato for firmware: $firmwareReleaseDate" } fange {     Write-Warning "FirmwareReleaseDate registreringsdatabasenøglen blev ikke fundet eller ikke tilgængelig"     $firmwareReleaseDate = $null     Write-Host "Udgivelsesdato for firmware: ikke tilgængelig" }

# 14. OSArchitecture # PS Version: Alle | Administration: Nej | Systemkrav: Ingen prøv {     $osArchitecture = $env:PROCESSOR_ARCHITECTURE     if ([streng]::IsNullOrEmpty($osArchitecture)) {         # Prøv fallback i registreringsdatabasen         $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OSArchitecture -ErrorAction Stop         $osArchitecture = $regValue.OSArchitecture     }     if ([streng]::IsNullOrEmpty($osArchitecture)) {         Write-Warning "OSArchitecture kunne ikke bestemmes"         $osArchitecture = "Ukendt"     }     Write-Host "OS-arkitektur: $osArchitecture" } fange {     Write-Warning "Fejl under hentning af OSArchitecture: $_"     $osArchitecture = "Ukendt"     Write-Host "OS-arkitektur: $osArchitecture" }

# 15. CanAttemptUpdateAfter (FILETIME) # PS Version: Alle | Administration: Kan være påkrævet | Systemkrav: Ingen prøv {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop     $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter     # Konvertér FILETIME til UTC DateTime – registreringsdatabasen gemmer som REG_BINARY (byte[]) eller REG_QWORD (lang)     if ($null -ne $canAttemptUpdateAfter) {         prøv {             if ($canAttemptUpdateAfter -is [byte[]]) {                 $fileTime = [BitConverter]::ToInt64($canAttemptUpdateAfter, 0)                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($fileTime). ToUniversalTime()             } elseif ($canAttemptUpdateAfter -is [long]) {                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter). ToUniversalTime()             }         } fange {             Write-Warning "CanAttemptUpdateAfter FILETIME kunne ikke konverteres til DateTime"         }     }     Write-Host "Kan forsøge at opdatere efter: $canAttemptUpdateAfter" } fange {     Write-Warning "CanAttemptUpdateAfter registry key not found or inaccessible"     $canAttemptUpdateAfter = $null     Write-Host "Kan forsøge at opdatere efter: ikke tilgængelig" }

# Hændelseslogge: Systemlog (10 værdier: 16-25)

# 16-25. Forespørgsler i hændelseslogfil # Hændelses-id'er: Nr. 1801 – Opdatering startet, genstart kræves Nr. 1808 – Opdateringen er fuldført # 1795 – Firmware returnerede fejl (registrering af fejlkode) # 1796 – Fejl logført med fejlkode (kodeklip) # 1800 - Genstart er nødvendig (IKKE en fejl - opdateringen fortsætter efter genstart) # 1802 – Kendt firmwareproblem blokeret opdatering (registrer KI_<nummer> fra SkipReason) # 1803 – Matchende KEK-opdatering blev ikke fundet (OEM skal levere KEK-signeret PK) # PS Version: 3.0+ | Administration: Kan være påkrævet for systemloggen | Systemkrav: Ingen prøv {     # Forespørg om alle relevante secure boot-hændelses-id'er     $allEventIds = @(1795, 1796, 1800, 1801, 1802, 1803, 1808)     $events = @(Get-WinEvent -FilterHashtable @{LogName='System'; ID=$allEventIds} -MaxEvents 50 -ErrorAction Stop)

    hvis ($events. Antal -eq 0) {         Write-Warning "Der blev ikke fundet nogen sikker bootstarthændelser i systemloggen"         $latestEventId = $null         $bucketId = $null         $confidence = $null         $skipReasonKnownIssue = $null         $event 1801TÆL = 0         $event 1808TÆL = 0         $event 1795Tæl = 0         $event 1795Fejlkode = $null         $event 1796Tæl = 0         $event 1796Fejlkode = $null         $event 1800TÆL = 0         $rebootPending = $false         $event 1802Tæl = 0         $knownIssueId = $null         $event 1803Tæl = 0         $missingKEK = $false         Write-Host "Seneste hændelses-id: Ikke tilgængelig"         Write-Host "Bucket-id: Ikke tilgængelig"         Write-Host "Konfidens: Ikke tilgængelig"         Write-Host "Antal hændelser 1801: 0"         Write-Host "Hændelse 1808 Antal: 0"     } ellers {         # 16. LatestEventId         $latestEvent = $events | Sort-Object TimeCreated -Faldende | Select-Object -Første 1         if ($null -eq $latestEvent) {             Write-Warning "Kunne ikke fastslå den seneste hændelse"             $latestEventId = $null             Write-Host "Seneste hændelses-id: Ikke tilgængelig"         } ellers {             $latestEventId = $latestEvent.Id             Write-Host "Seneste hændelses-id: $latestEventId"         }

        # 17. BucketID – Hentet fra hændelse 1801/1808         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketId:\s*(.+)') {                 $bucketId = $matches[1]. Trim()                 Write-Host "Bucket ID: $bucketId"             } ellers {                 Write-Warning "BucketId blev ikke fundet i hændelsesmeddelelse"                 $bucketId = $null                 Write-Host "Bucket-id: Blev ikke fundet i hændelse"             }         } ellers {             Write-Warning "Seneste hændelse eller meddelelse er null, kan ikke udtrække BucketId"             $bucketId = $null             Write-Host "Bucket-id: Ikke tilgængelig"         }

        # 18. Konfidens – Hentet fra begivenhed 1801/1808         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketConfidenceLevel:\s*(.+)') {                 $confidence = $matches[1]. Trim()                 Write-Host "Konfidens: $confidence"             } ellers {                 Write-Warning "Tillidsniveau blev ikke fundet i hændelsesmeddelelse"                 $confidence = $null                 Write-Host "Konfidens: Ikke fundet i begivenhed"             }         } ellers {             Write-Warning "Seneste hændelse eller meddelelse er null, kan ikke udtrække Konfidens"             $confidence = $null             Write-Host "Konfidens: Ikke tilgængelig"         }

        Nr. 18b. SkipReason – Udtræk KI_<tal> fra SkipReason i samme hændelse som BucketId         # Dette registrerer kendte problem-id'er, der vises sammen med BucketId/Confidence (ikke kun hændelse 1802)         $skipReasonKnownIssue = $null         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'SkipReason:\s*(KI_\d+)') {                 $skipReasonKnownIssue = $matches[1]                 Write-Host "SkipReason kendt problem: $skipReasonKnownIssue" -Forgrundsfarve gul             }         }

        # 19. Hændelse1801Tæl         $event 1801Array = @($events | Where-Object {$_. Id -eq 1801})         $event 1801Tæl = $event 1801Array.Count         Write-Host "Antal hændelser 1801: $event 1801TÆL"

        # 20. Hændelse1808Tæl         $event 1808Array = @($events | Where-Object {$_. Id -eq 1808})         $event 1808Tæl = $event 1808Array.Count         Write-Host "Antal hændelser 1808: $event 1808TÆL"                  # Initialiser fejlhændelsesvariabler         $event 1795Tæl = 0         $event 1795ErrorCode = $null         $event 1796Tæl = 0         $event 1796ErrorCode = $null         $event 1800TÆL = 0         $rebootPending = $false         $event 1802Tæl = 0         $knownIssueId = $null         $event 1803Tæl = 0         $missingKEK = $false                  # Kontrollér kun for fejlhændelser, hvis opdateringen IKKE er fuldført         # Spring fejlanalyse over, hvis: 1808 er den seneste hændelse, ELLER UEFICA2023Status er "Opdateret"         $updateComplete = ($latestEventId -eq 1808) -or ($uefica 2023Status -eq "Updated")                  if (-not $updateComplete) {             Write-Host "Opdateringen er ikke fuldført - kontrollerer, om der er fejlhændelser..." -Forgrundsfarve Gul                          # 21. Hændelse1795 – Firmwarefejl (registrering af fejlkode)             $event 1795Array = @($events | Where-Object {$_. Id -eq 1795})             $event 1795Tæl = $event 1795Array.Count             if ($event 1795Count -gt 0) {                 $latestEvent 1795 = $event 1795Array | Sort-Object TimeCreated -Faldende | Select-Object -Første 1                 if ($latestEvent 1795.Message -match '(?:error|code|status)[:\s]*(?:0x)?( [0-9A-Fa-f]{8}|[0-9A-Fa-f]+)') {                     $event 1795Fejlkode = $matches[1]                 }                 Write-Host "Antal hændelser 1795 (firmwarefejl): $event 1795Tæl" $(if ($event 1795Fejlkode) { "Kode: $event 1795Fejlkode" })             }                          # 22. Hændelse1796 – Fejlkode logført (registrering af fejlkode)             $event 1796Array = @($events | Where-Object {$_. Id -eq 1796})             $event 1796Tæl = $event 1796Array.Count             if ($event 1796Count -gt 0) {                 $latestEvent 1796 = $event 1796Array | Sort-Object TimeCreated -Faldende | Select-Object -Første 1                 if ($latestEvent 1796.Message -match '(?:error|code|status)[:\s]*(?:0x)?( [0-9A-Fa-f]{8}|[0-9A-Fa-f]+)') {                     $event 1796Fejlkode = $matches[1]                 }                 Write-Host "Antal hændelser 1796 (fejllogført): $event 1796Tæl" $(if ($event 1796Fejlkode) { "Kode: $event 1796Fejlkode" })             }                          # 23. Hændelse1800 – Genstart er nødvendig (IKKE en fejl – opdateringen fortsætter efter genstart)             $event 1800Array = @($events | Where-Object {$_. Id -eq 1800})             $event 1800Tæl = $event 1800Array.Count             $rebootPending = $event 1800Tæl -gt 0             if ($rebootPending) {                 Write-Host "Hændelse 1800 (genstart venter): Opdateringen fortsætter efter genstart" -Forgrundsfarve cyan             }                          # 24. Hændelse1802 – Kendt firmwareproblem (registrering KI_<nummer> fra SkipReason)             $event 1802Array = @($events | Where-Object {$_. Id -eq 1802})             $event 1802Tæl = $event 1802Array.Count             if ($event 1802Count -gt 0) {                 $latestEvent 1802 = $event 1802Array | Sort-Object TimeCreated -Faldende | Select-Object -Første 1                 if ($latestEvent 1802.Message -match 'SkipReason:\s*(KI_\d+)') {                     $knownIssueId = $matches[1]                 }                 Write-Host antal "Hændelse 1802 (kendt firmwareproblem): $event 1802Tæl" $(if ($knownIssueId) { "KI: $knownIssueId" })             }                          # 25. Hændelse1803 – Manglende KEK-opdatering (OEM skal levere KEK-signeret PK)             $event 1803Array = @($events | Where-Object {$_. Id -eq 1803})             $event 1803Tæl = $event 1803Array.Count             $missingKEK = $event 1803Tæl -gt 0             if ($missingKEK) {                 Write-Host "Hændelse 1803 (manglende KEK): OEM skal levere PK-signeret KEK" -Forgrundsfarve gul             }         } ellers {             Write-Host "Opdatering fuldført (hændelse 1808 eller Status=Opdateret) - springer fejlanalyse over" -Forgrundsfarve grøn         }     } } fange {     Write-Warning "Fejl under hentning af hændelseslogge. Kan kræve administratorrettigheder: $_"     $latestEventId = $null     $bucketId = $null     $confidence = $null     $skipReasonKnownIssue = $null     $event 1801TÆL = 0     $event 1808Tæl = 0     $event 1795Tæl = 0     $event 1795ErrorCode = $null     $event 1796Tæl = 0     $event 1796Fejlkode = $null     $event 1800TÆL = 0     $rebootPending = $false     $event 1802Tæl = 0     $knownIssueId = $null     $event 1803Tæl = 0     $missingKEK = $false     Write-Host "Seneste hændelses-id: Fejl"     Write-Host "Bucket-id: Fejl"     Write-Host "Konfidens: Fejl"     Write-Host "Antal hændelser 1801: 0"     Write-Host "Hændelse 1808 Antal: 0" }

# WMI/CIM-forespørgsler (5 værdier)

# 26. OSVersion # PS Version: 3.0+ (brug Get-WmiObject til 2.0) | Administration: Nej | Systemkrav: Ingen prøv {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -or [string]::IsNullOrEmpty($osInfo.Version)) {         Write-Warning "Versionen af operativsystemet kunne ikke hentes"         $osVersion = "Ukendt"     } ellers {         $osVersion = $osInfo.Version     }     Write-Host "Version af operativsystem: $osVersion" } fange {     # CIM kan mislykkes i nogle miljøer – brug fallback     $osVersion = [System.Environment]::OSVersion.Version.ToString()     if ([string]::IsNullOrEmpty($osVersion)) { $osVersion = "Unknown" }     Write-Host "Version af operativsystemet: $osVersion" }

# 27. LastBootTime # PS Version: 3.0+ (brug Get-WmiObject til 2.0) | Administration: Nej | Systemkrav: Ingen prøv {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -or $null -eq $osInfo.LastBootUpTime) {         Write-Warning "Sidste starttidspunkt kunne ikke hentes"         $lastBootTime = $null         Write-Host "Sidste starttidspunkt: Ikke tilgængelig"     } ellers {         $lastBootTime = $osInfo.LastBootUpTime         Write-Host "Sidste starttidspunkt: $lastBootTime"     } } fange {     # CIM kan mislykkes i nogle miljøer – brug fallback     prøv {         $lastBootTime = (Get-Process -Id 0 -ErrorAction SilentlyContinue). Starttidspunkt     } fange {         $lastBootTime = $null     }     if ($lastBootTime) { Write-Host "Last Boot Time: $lastBootTime" } else { Write-Host "Last Boot Time: Not Available" } }

# 28. BaseBoardManufacturer # PS Version: 3.0+ (brug Get-WmiObject til 2.0) | Administration: Nej | Systemkrav: Ingen prøv {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -eller [string]::IsNullOrEmpty($baseBoard.Manufacturer)) {         Write-Warning "Producenten af basisbordet kunne ikke hentes"         $baseBoardManufacturer = "Ukendt"     } ellers {         $baseBoardManufacturer = $baseBoard.Manufacturer     }     Write-Host "Producent af grundbord: $baseBoardManufacturer" } fange {     # CIM kan mislykkes - baseboard info er supplerende     $baseBoardManufacturer = "Ukendt"     Write-Host "Producent af grundbord: $baseBoardManufacturer" }

# 29. BaseBoardProduct # PS Version: 3.0+ (brug Get-WmiObject til 2.0) | Administration: Nej | Systemkrav: Ingen prøv {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -eller [streng]::IsNullOrEmpty($baseBoard.Product)) {         Write-Warning "Basisproduktet kunne ikke hentes"         $baseBoardProduct = "Ukendt"     } ellers {         $baseBoardProduct = $baseBoard.Product     }     Write-Host "Basisprodukt: $baseBoardProduct" } fange {     # CIM kan mislykkes - baseboard info er supplerende     $baseBoardProduct = "Ukendt"     Write-Host "Basisprodukt: $baseBoardProduct" }

# 30. SecureBootTaskEnabled # PS Version: Alle | Administration: Nej | Systemkrav: Planlagt opgave findes # Kontrollerer, om den planlagte opgave Sikker bootstart er aktiveret $secureBootTaskEnabled = $null $secureBootTaskStatus = "Ukendt" prøv {     $taskOutput = schtasks.exe /Query /TN "\Microsoft\Windows\PI\Secure-Boot-Update" /FO CSV 2>&1     if ($LASTEXITCODE -eq 0) {         $taskData = $taskOutput | ConvertFrom-Csv         if ($taskData) {             $secureBootTaskStatus = $taskData.Status             $secureBootTaskEnabled = ($taskData.Status -eq 'Klar' -eller $taskData.Status -eq 'Kører')         }     } ellers {         $secureBootTaskStatus = "NotFound"         $secureBootTaskEnabled = $false     }     if ($secureBootTaskEnabled -eq $false) {         Write-Host "SecureBoot-opdateringsopgave: $secureBootTaskStatus (aktiveret: $secureBootTaskEnabled)" -Forgrundsfarve gul     } ellers {         Write-Host "SecureBoot-opdateringsopgave: $secureBootTaskStatus (aktiveret: $secureBootTaskEnabled)" -Forgrundsfarve grøn     } } fange {     $secureBootTaskStatus = "Fejl"     $secureBootTaskEnabled = $false     Write-Host "SecureBoot-opdateringsopgave: Fejlkontrol - $_" -Forgrundsfarve rød }

# 31. WinCS-nøglestatus (F33E0C8E002 – sikker bootstartcertifikatopdatering) # PS Version: Alle | Administration: Ja (for forespørgsel) | Systemkrav: WinCsFlags.exe $wincsKeyApplied = $null $wincsKeyStatus = "Ukendt" prøv {     # Kontrollér fælles placeringer for WinCsFlags.exe     $wincsFlagsPath = $null     $possiblePaths = @(         "$env:SystemRoot\System32\WinCsFlags.exe",         "$env:SystemRoot\SysWOW64\WinCsFlags.exe"     )     foreach ($p i $possiblePaths) {         if (teststi $p) { $wincsFlagsPath = $p; pause }     }     if ($wincsFlagsPath) {         # Forespørgselsspecifik nøgle – kræver administratorrettigheder         $queryOutput = & $wincsFlagsPath /query --key F33E0C8E002 2>&1         $queryOutputStr = $queryOutput -join "'n"         if ($LASTEXITCODE -eq 0) {             # Kontrollér, om tasten er anvendt (se efter "Aktiv konfiguration" eller lignende indikator)             if ($queryOutputStr -match "Active Configuration.*:.*enabled" -or $queryOutputStr -match "Configuration.*applied") {                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Anvendt"                 Write-Host "WinCS-tast F33E0C8E002: Anvendt" -Forgrundsfarve grøn             } elseif ($queryOutputStr -match "ikke fundet|Ingen konfiguration") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "WinCS-tast F33E0C8E002: Ikke anvendt" -Forgrundsfarve gul             } ellers {                 # Der findes en nøgle – kontrollér output for tilstand                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Anvendt"                 Write-Host "WinCS-tast F33E0C8E002: Anvendt" -Forgrundsfarve grøn             }         } ellers {             # Kontrollér, om der er bestemte fejlmeddelelser             if ($queryOutputStr -match "Adgang nægtet|administrator") {                 $wincsKeyStatus = "AccessDenied"                 Write-Host "WinCS-nøgle F33E0C8E002: Adgang nægtet (kør som administrator)" -Forgrundsfarve DarkGray             } elseif ($queryOutputStr -match "ikke fundet|Ingen konfiguration") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "WinCS-tast F33E0C8E002: Ikke anvendt" -Forgrundsfarve gul             } ellers {                 $wincsKeyStatus = "QueryFailed"                 Write-Host "WinCS-tast F33E0C8E002: Forespørgslen mislykkedes" -Forgrundsfarve rød             }         }     } ellers {         $wincsKeyStatus = "WinCsFlagsNotFound"         Write-Host "WinCS-tast F33E0C8E002: WinCsFlags.exe ikke fundet" -Forgrundsfarve grå     } } fange {     $wincsKeyStatus = "Fejl"     Write-Host "WinCS-tast F33E0C8E002: Fejlkontrol - $_" -Forgrundsfarve rød }              

# ============================================================================= # Afhjælpningsregistrering – Statusoutput & afslut kode # =============================================================================

#Build-statusobjekt fra alle indsamlede lagerdata $status = [bestilt]@{     UEFICA2023Status = $uefica 2023Status     UEFICA2023Fejl = $uefica 2023Fejl     UEFICA2023ErrorEvent = $uefica 2023ErrorEvent     AvailableUpdates = if ($null -ne $availableUpdates) { $availableUpdatesHex } else { $null }     AvailableUpdatesPolicy = if ($null -ne $availableUpdatesPolicy) { $availableUpdatesPolicyHex } else { $null }     Hostname = $hostname     CollectionTime = if ($collectionTime -is [datetime]) { $collectionTime.ToString("o") } else { "$collectionTime" }     SecureBootEnabled = $secureBootEnabled     HighConfidenceOptOut = $highConfidenceOptOut     MicrosoftUpdateAdministrerdOptIn = $microsoftUpdateManagedOptIn     OEMManufacturerName = $oemManufacturerName     OEMModelSystemFamily = $oemModelSystemFamily     OEMModelNumber = $oemModelNumber     FirmwareVersion = $firmwareVersion     FirmwareReleaseDate = $firmwareReleaseDate     OSArchitecture = $osArchitecture     CanAttemptUpdateAfter = if ($canAttemptUpdateAfter -is [datetime]) { $canAttemptUpdateAfter.ToString("o") } else { "$canAttemptUpdateAfter" }     LatestEventId = $latestEventId     BucketId = $bucketId     Konfidens = $confidence     SkipReasonKnownIssue = $skipReasonKnownIssue # KI_<tal> fra SkipReason i BucketId-hændelse     Event1801Count = $event 1801Count     Hændelse1808Tæl = $event 1808Tæl     # Fejlhændelser med registrerede detaljer     Hændelse1795Tæl = $event 1795Tæl # Firmware returnerede fejl     Hændelse1795Fejlkode = $event 1795Fejlkode # Fejlkode fra firmware     Event1796Count = $event 1796Count # Fejlkode logført     Hændelse1796Fejlkode = $event 1796Fejlkode # Fejlkode registreret     Event1800Count = $event 1800Count # Reboot needed (NOT an error)     RebootPending = $rebootPending # True if Event 1800 present     Event1802Count = $event 1802Count # Kendt firmwareproblem     KnownIssueId = $knownIssueId # KI_<tal> fra SkipReason     Event1803Count = $event 1803Count # Missing KEK update     MissingKEK = $missingKEK # OEM skal levere KEK-signeret PK     OSVersion = $osVersion     LastBootTime = if ($lastBootTime -is [datetime]) { $lastBootTime.ToString("o") } else { "$lastBootTime" }     BaseBoardManufacturer = $baseBoardManufacturer     BaseBoardProduct = $baseBoardProduct     SecureBootTaskEnabled = $secureBootTaskEnabled     SecureBootTaskStatus = $secureBootTaskStatus     WinCSKeyApplied = $wincsKeyApplied # True, hvis der anvendes F33E0C8E002 nøgle     WinCSKeyStatus = $wincsKeyStatus # Applied, NotApplied, WinCsFlagsNotFound osv. }

# Output status - For datasammenlægning $jsonOutput = $status | ConvertTo-Json -Compress

# Hvis OutputPath er angivet, skal du gemme i filen. ellers output til stdout if (-not [string]::IsNullOrEmpty($OutputPath)) {     # Valider OutputPath – spring over, hvis det ligner en hjælpanmodning eller har ugyldige tegn     if ($OutputPath -match '^[/\-]' -eller $OutputPath -match '[<>:"|? *]') {         Write-Host "Der er angivet en ugyldig OutputPath, output til stdout" -Forgrundsfarve gul         Write-Output $jsonOutput         if ($secureBootEnabled -and $uefica 2023Status -eq "Updated") { exit 0 } else { exit 1 }     }          # Kontrollér, at outputmappen findes     if (-not (Test-Path $OutputPath)) {         prøv {             New-Item -ItemType Directory -Path $OutputPath -Force | Out-Null         } fange {             Write-Warning "Outputmappen kunne ikke oprettes: $OutputPath - $_"         }     }          # Gem i HOSTNAME_latest.json     $outputFile = Join-Path $OutputPath "$($hostname)_latest.json"     prøv {         $jsonOutput | Out-File -FilePath $outputFile -Encoding UTF8 -Force         Write-Host "JSON gemt i: $outputFile" -Forgrundsfarve grøn     } fange {         Write-Warning "Kunne ikke skrive til filen: $outputFile - $_"         # Fall back to stdout         Write-Output $jsonOutput     } } ellers {     # Oprindelig funktionsmåde – output til stdout     Write-Output $jsonOutput }

# Exit code: "Updated" is the success value per the playbook if ($secureBootEnabled -and $uefica 2023Status -eq "Updated") {     afslut 0 # Uden problem } ellers {     afslut 1 # Med problem }

Har du brug for mere hjælp?

Vil du have flere indstillinger?

Udforsk abonnementsfordele, gennemse kurser, få mere at vide om, hvordan du sikrer din enhed og meget mere.