Oprindelig publiceringsdato: 17. november 2025
KB-id: 5072718
|
Rediger dato |
Skift beskrivelse |
|
24. februar 2026 |
|
|
22. februar 2026 |
|
|
13. februar 2026 |
|
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 }