Nukopijuokite ir įklijuokite šį scenarijaus pavyzdį ir modifikuokite, kiek reikia jūsų aplinkai:

<# . ANOTACIJA     Aptinka laivyno stebėjimo saugiosios įkrovos sertifikato naujinimo būseną.

.DESCRIPTION     Šis aptikimo scenarijus renka saugiosios įkrovos būseną, sertifikato naujinimo registro reikšmes,     ir įrenginio informaciją. Ji pateikia JSON eilutę, skirtą stebėti ir teikti ataskaitas.

    Compatible with Intune Remediations, GPO-based collection, and other management tools. Taisymo scenarijaus nereikia – jis stebimas tik.

    Exit 0 = "Without issue"  (certificates updated)     Išėjimas 1 = "Problema" (sertifikatai neatnaujinami – tik informaciniai)

.PARAMETER OutputPath     Pasirinktinai. Kelias į aplanką, kuriame bus įrašytas JSON failas.Jei pateikta, įrašo HOSTNAME_latest.json į šį aplanką.Jei nepateiktas, išveda JSON į stdout (pradinį veikimą).

.EXAMPLE     # Išvestis į stdout (Intune / SCCM aptikimas)     .\Detect-SecureBootCertUpdateStatus.ps1

.EXAMPLE     # Įrašyti į bendrai naudojamą tinklo objektą (GPO diegimas)     .\Detect-SecureBootCertUpdateStatus.ps1 -OutputPath "\\server\SecureBootLogs$"

.NOTES     Registro keliai pagal https://aka.ms/securebootplaybook:       HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot       HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR     ĮSKAITANT, BET NEAPSIRIBOJANT, GARANTIJAS DĖL TINKAMUMO PARDUOTI,     TINKAMUMAS KONKREČIAM TIKSLUI IR NEFRINGAS. BET KURIUO ATVEJU     AUTORIAI ARBA AUTORIAUS TEISIŲ TURĖTOJAI BUS ATSAKINGI UŽ BET KOKĮ REIKALAVIMĄ, NUOSTOLIUS AR     CIVILINĖS TEISĖS PAŽEIDIMĄ AR KITOKIĄ ATSAKOMYBĘ, KYLANČIĄ IŠ,     PROGRAMINĘ ĮRANGĄ, NAUDOJIMĄ AR KITUS REIKALUS, SUSIJUSIUS SU PROGRAMINE ĮRANGA,     PROGRAMINĖ ĮRANGA.#> param(     [Parametras(Privalomas = $false)]     [eilutė]$OutputPath )

# Download URL: https://aka.ms/getsecureboot -> "Deployment and Monitoring Samples" #Pastaba: šis scenarijus vykdomas pabaigos taškams, kad būtų renkami saugiosios įkrovos būsenos duomenys.

# 1. HostName # PS Versija: Visi | Administratorius: Ne | Sistemos reikalavimai: nėra išbandykite {     $hostname = $env:COMPUTERNAME     if ([string]::IsNullOrEmpty($hostname)) {         Write-Warning "Nepavyko nustatyti pagrindinio kompiuterio vardo"         $hostname = "Nežinoma"     }     Write-Host "Hostname: $hostname" } sugauti {     Write-Warning "Klaida nuskaitant pagrindinio kompiuterio vardą: $_"     $hostname = "Klaida"     Write-Host "Hostname: $hostname" }

# 2. CollectionTime # PS Versija: Visi | Administratorius: Ne | Sistemos reikalavimai: nėra išbandykite {     $collectionTime = Gavimo data     jei ($null -eq $collectionTime) {         Write-Warning "Nepavyko nuskaityti dabartinės datos / laiko"         $collectionTime = "Nežinoma"     }     Write-Host "Collection Time: $collectionTime" } sugauti {     Write-Warning "Klaida nuskaitant datą / laiką: $_"     $collectionTime = "Klaida"     Write-Host "Collection Time: $collectionTime" }

# Registry: Secure Boot Main Key (3 values)

# 3. SecureBootEnabled # PS Versija: 3.0+ | Administratorius: Gali reikėti | Sistemos reikalavimai: UEFI / saugiosios įkrovos palaikanti sistema išbandykite {     $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop     Write-Host "Saugi įkrova įgalinta: $secureBootEnabled" } sugauti {     Write-Warning "Nepavyko nustatyti saugiosios įkrovos būsenos naudojant cmdlet: $_"     # Išbandykite atsarginį registrą     išbandykite {         $regValue = Get-ItemProperty -Kelias "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop         $secureBootEnabled = [Bulio logika]$regValue.UEFISecureBootEnabled         Write-Host "Saugi įkrova įgalinta: $secureBootEnabled"     } sugauti {         Write-Warning "Nepavyksta nustatyti saugiosios įkrovos būsenos naudojant registrą. Sistema gali nepalaikyti UEFI / saugiosios įkrovos."         $secureBootEnabled = $null         Write-Host "Saugi įkrova įgalinta: nepasiekiama"     } }

# 4. HighConfidenceOptOut # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop     $highConfidenceOptOut = $regValue.HighConfidenceOptOut     Write-Host "Didelio patikimumo atsisakymas: $highConfidenceOptOut" } sugauti {     # HighConfidenceOptOut yra pasirinktinis – daugelyje sistemų jų nėra     $highConfidenceOptOut = $null     Write-Host "Didelio patikimumo atsisakymas: nenustatytas" }

# 4b. MicrosoftUpdateManagedOptIn # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name MicrosoftUpdateManagedOptIn -ErrorAction Stop     $microsoftUpdateManagedOptIn = $regValue.MicrosoftUpdateManagedOptIn     Write-Host "Microsoft Update Managed Opt in: $microsoftUpdateManagedOptIn" } sugauti {     # MicrosoftUpdateManagedOptIn yra pasirinktinis – jo nėra daugumoje sistemų     $microsoftUpdateManagedOptIn = $null     Write-Host "Microsoft Update Managed Opt in: Not Set" }

# 5. AvailableUpdates # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Kelias "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop     $availableUpdates = $regValue.AvailableUpdates     jei ($null -ne $availableUpdates) {         # Konvertuoti į šešioliktainį formatą         $availableUpdatesHex = "0x{0:X}" -f $availableUpdates         Write-Host "Available Naujinimai: $availableUpdatesHex"     } dar {         Write-Host "Available Naujinimai: Not Available"     } } sugauti {     Write-Warning "AvailableUpdates" registro raktas nerastas arba nepasiekiamas"     $availableUpdates = $null     Write-Host "Available Naujinimai: Not Available" }

# 5b. AvailableUpdatesPolicy (GPO-controlled persistent value) # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Kelias "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdatesPolicy -ErrorAction Stop     $availableUpdatesPolicy = $regValue.AvailableUpdatesPolicy     jei ($null -ne $availableUpdatesPolicy) {         # Konvertuoti į šešioliktainį formatą         $availableUpdatesPolicyHex = "0x{0:X}" -f $availableUpdatesPolicy         Write-Host "Available Naujinimai Policy: $availableUpdatesPolicyHex"     } dar {         Write-Host "Pasiekiama Naujinimai strategija: nenustatyta"     } } sugauti {     # AvailableUpdatesPolicy yra pasirinktinis – nustatomas tik tada, kai taikomas GPO     $availableUpdatesPolicy = $null     Write-Host "Available Naujinimai Policy: Not Set" }

# Registry: Servicing Key (3 values)

# 6. UEFICA2023Status # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Status -ErrorAction Stop     $uefica 2023Status = $regValue.UEFICA2023Status     Write-Host "Windows UEFI CA 2023 būsena: $uefica 2023Status" } sugauti {     Write-Warning "Windows UEFI CA 2023 būsenos registro raktas nerastas arba nepasiekiamas"     $uefica 2023Status = $null     Write-Host "Windows UEFI CA 2023 būsena: nepasiekiama" }

# 7. UEFICA2023Error # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop     $uefica 2023Error = $regValue.UEFICA2023Error     Write-Host "UEFI CA 2023 klaida: $uefica 2023Error" } sugauti {     # UEFICA2023Klaida yra tik įvykus klaidai – nėra gerai     $uefica 2023Error = $null     Write-Host "UEFI CA 2023 klaida: nėra" }

# 8. UEFICA2023ErrorEvent # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023ErrorEvent -ErrorAction Stop     $uefica 2023ErrorEvent = $regValue.UEFICA2023ErrorEvent     Write-Host "UEFI CA 2023 klaidos įvykis: $uefica 2023ErrorEvent" } sugauti {     $uefica 2023ErrorEvent = $null     Write-Host "UEFI CA 2023 klaidos įvykis: nepasiekiamas" }

# Registry: Device Attributes (7 values: 9-15)

# 9. OEMManufacturerName # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $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 = "Nežinoma"     }     Write-Host "OEM Manufacturer Name: $oemManufacturerName" } sugauti {     Write-Warning "OEMManufacturerName" registro raktas nerastas arba nepasiekiamas"     $oemManufacturerName = $null     Write-Host "OĮG gamintojo pavadinimas: nepasiekiamas" }

# 10. OEMModelSystemFamily # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelSystemFamily -ErrorAction Stop     $oemModelSystemFamily = $regValue.OEMModelSystemFamily     jei ([eilutė]::IsNullOrEmpty($oemModelSystemFamily)) {         Write-Warning "OEMModelSystemFamily is empty"         $oemModelSystemFamily = "Nežinoma"     }     Write-Host "OEM Model System Family: $oemModelSystemFamily" } sugauti {     Write-Warning "OEMModelSystemFamily registro raktas nerastas arba nepasiekiamas"     $oemModelSystemFamily = $null     Write-Host "OEM Model System Family: Not Available" }

# 11. OEMModelNumber # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelNumber -ErrorAction Stop     $oemModelNumber = $regValue.OEMModelNumber     jei ([eilutė]::IsNullOrEmpty($oemModelNumber)) {         Write-Warning "OEMModelNumber is empty"         $oemModelNumber = "Nežinoma"     }     Write-Host "OEM Model Number: $oemModelNumber" } sugauti {     Write-Warning "OEMModelNumber registro raktas nerastas arba nepasiekiamas"     $oemModelNumber = $null     Write-Host "OĮG modelio numeris: nepasiekiamas" }

# 12. FirmwareVersion # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareVersion -ErrorAction Stop     $firmwareVersion = $regValue.FirmwareVersion     jei ([eilutė]::IsNullOrEmpty($firmwareVersion)) {         Write-Warning "FirmwareVersion" tuščias"         $firmwareVersion = "Nežinoma"     }     Write-Host "Programinės-aparatinės įrangos versija: $firmwareVersion" } sugauti {     Write-Warning "FirmwareVersion" registro raktas nerastas arba nepasiekiamas"     $firmwareVersion = $null     Write-Host "Programinės-aparatinės įrangos versija: nepasiekiama" }

# 13. FirmwareReleaseDate # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareReleaseDate -ErrorAction Stop     $firmwareReleaseDate = $regValue.FirmwareReleaseDate     jei ([eilutė]::IsNullOrEmpty($firmwareReleaseDate)) {         Write-Warning "FirmwareReleaseDate is empty"         $firmwareReleaseDate = "Nežinoma"     }     Write-Host "Programinės-aparatinės įrangos išleidimo data: $firmwareReleaseDate" } sugauti {     Write-Warning "FirmwareReleaseDate registro raktas nerastas arba nepasiekiamas"     $firmwareReleaseDate = $null     Write-Host "Programinės-aparatinės įrangos išleidimo data: nepasiekiama" }

# 14. OSArchitecture # PS Versija: Visi | Administratorius: Ne | Sistemos reikalavimai: nėra išbandykite {     $osArchitecture = $env:PROCESSOR_ARCHITECTURE     jei ([eilutė]::IsNullOrEmpty($osArchitecture)) {         # Išbandykite atsarginį registrą         $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OSArchitecture -ErrorAction Stop         $osArchitecture = $regValue.OSArchitecture     }     jei ([eilutė]::IsNullOrEmpty($osArchitecture)) {         Write-Warning "Nepavyko nustatyti OSArchitecture"         $osArchitecture = "Nežinoma"     }     Write-Host "OS Architecture: $osArchitecture" } sugauti {     Write-Warning "Klaida nuskaitant OSArchitecture: $_"     $osArchitecture = "Nežinoma"     Write-Host "OS Architecture: $osArchitecture" }

# 15. CanAttemptUpdateAfter (FILETIME) # PS Versija: Visi | Administratorius: Gali reikėti | Sistemos reikalavimai: nėra išbandykite {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop     $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter     # Konvertuoti FILETIME į UTC DateTime – registro saugyklos kaip REG_BINARY (baitas[]) arba REG_QWORD (ilgas)     jei ($null -ne $canAttemptUpdateAfter) {         išbandykite {             jei ($canAttemptUpdateAfter -yra [baitas[]]) {                 $fileTime = [BitConverter]::ToInt64($canAttemptUpdateAfter, 0)                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($fileTime). ToUniversalTime()             } elseif ($canAttemptUpdateAfter -is [long]) {                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter). ToUniversalTime()             }         } sugauti {             Write-Warning "Nepavyko konvertuoti CanAttemptUpdateAfter FILETIME į DateTime"         }     }     Write-Host "Gali bandyti atnaujinti po: $canAttemptUpdateAfter" } sugauti {     Write-Warning "CanAttemptUpdateAfter registro raktas nerastas arba nepasiekiamas"     $canAttemptUpdateAfter = $null     Write-Host "Gali bandyti atnaujinti po: nepasiekiama" }

# Event Logs: System Log (10 values: 16-25)

# 16-25. Event Log queries # Įvykio ID: # 1801 – pradėtas naujinimas, būtinas perkrovimas # 1808 – naujinimas sėkmingai baigtas # 1795 – pateikta programinės-aparatinės įrangos klaida (užfiksuoti klaidos kodą) # 1796 – klaida užregistruota su klaidos kodu (fiksavimo kodas) # 1800 – reikalingas paleidimas iš naujo (NE klaida – naujinimas bus tęsiamas paleidus iš naujo) # 1802 – žinoma programinės-aparatinės įrangos problema, užblokuotas naujinimas ("SkipReason" užfiksuoti KI_<numerį>) # 1803 – atitinkantis KEK naujinimas nerastas (OĮG turi pateikti PK pasirašytą KEK) # PS Versija: 3.0+ | Administratorius: gali reikėti sistemos žurnalui | Sistemos reikalavimai: nėra išbandykite {     # Užklausti visus susijusius saugiosios įkrovos įvykio ID     $allEventIds = @(1795, 1796, 1800, 1801, 1802, 1803, 1808)     $events = @(Get-WinEvent -FilterHashtable @{LogName='System'; ID=$allEventIds} -MaxEvents 50 -ErrorAction Stop)

    if ($events.Count -eq 0) {         Write-Warning "Sistemos žurnale nerasta saugiosios įkrovos įvykių"         $latestEventId = $null         $bucketId = $null         $confidence = $null         $skipReasonKnownIssue = $null         $event 1801Count = 0         $event 1808Count = 0         $event 1795Count = 0         $event 1795ErrorCode = $null         $event 1796Count = 0         $event 1796ErrorCode = $null         $event 1800Count = 0         $rebootPending = $false         $event 1802Count = 0         $knownIssueId = $null         $event 1803Count = 0         $missingKEK = $false         Write-Host "Naujausias įvykio ID: nepasiekiamas"         Write-Host "Talpyklos ID: nepasiekiamas"         Write-Host "Patikimumas: nepasiekiamas"         Write-Host "1801 įvykis: 0"         Write-Host "Event 1808 Count: 0"     } dar {         # 16. Vėliausi eventId         $latestEvent = $events | Sort-Object TimeCreated -Descending | Select-Object – pirmas 1         jei ($null -eq $latestEvent) {             Write-Warning "Nepavyko nustatyti naujausio įvykio"             $latestEventId = $null             Write-Host "Vėliausio įvykio ID: nepasiekiamas"         } dar {             $latestEventId = $latestEvent.Id             Write-Host "Naujausias įvykio ID: $latestEventId"         }

        # 17. BucketID - Extracted from Event 1801/1808 jei ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             jei ($latestEvent.Message -match 'BucketId:\s*(.+)') {                 $bucketId = $matches[1]. Trim()                 Write-Host "Segmento ID: $bucketId"             } dar {                 Write-Warning "BucketId nerastas įvykio pranešime"                 $bucketId = $null                 Write-Host "Segmento ID: nerastas įvykyje"             }         } dar {             Write-Warning "Naujausias įvykis arba pranešimas yra nulinis, negalima išskleisti BucketId"             $bucketId = $null             Write-Host "Talpyklos ID: nepasiekiamas"         }

        # 18. Confidence - Extracted from Event 1801/1808 jei ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             jei ($latestEvent.Message -match 'BucketConfidenceLevel:\s*(.+)') {                 $confidence = $matches[1]. Trim()                 Write-Host "Pasitikėjimas: $confidence"             } dar {                 Write-Warning "Patikimumo lygis nerastas įvykio pranešime"                 $confidence = $null                 Write-Host "Pasitikėjimas: nerastas įvykyje"             }         } dar {             Write-Warning "Naujausias įvykis arba pranešimas yra nulinis, negalima išskleisti patikimumo"             $confidence = $null             Write-Host "Patikimumas: nepasiekiamas"         }

        # 18b. SkipReason - Extract KI_<number> from SkipReason in the same event as BucketId # Tai fiksuoja žinomų problemų ID, kurie rodomi kartu su BucketId / confidence (ne tik 1802 įvykis)         $skipReasonKnownIssue = $null         jei ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             jei ($latestEvent.Message -match 'SkipReason:\s*(KI_\d+)') {                 $skipReasonKnownIssue = $matches[1]                 Write-Host "SkipReason" žinoma problema: $skipReasonKnownIssue" – priekinio planopalva geltona             }         }

        # 19. Event1801Count $event 1801Array = @($events | Where-Object {$_. Id -eq 1801})         $event 1801Count = $event 1801Array.Count         Write-Host "Event 1801 Count: $event 1801Count"

        # 20. Event1808Count $event 1808Array = @($events | Where-Object {$_. Id -eq 1808})         $event 1808Count = $event 1808Array.Count         Write-Host "Event 1808 Count: $event 1808Count"                  # Inicijuoti klaidos įvykio kintamuosius         $event 1795Count = 0         $event 1795ErrorCode = $null         $event 1796Count = 0         $event 1796ErrorCode = $null         $event 1800Count = 0         $rebootPending = $false         $event 1802Count = 0         $knownIssueId = $null         $event 1803Count = 0         $missingKEK = $false                  # Tik patikrinkite, ar nėra klaidų įvykių, jei naujinimas NEBAIGTAS         # Praleisti klaidos analizę, jei: 1808 yra naujausias įvykis ARBA UEFICA2023Status yra "Atnaujinta"         $updateComplete = ($latestEventId -eq 1808) -or ($uefica 2023Status -eq "Atnaujinta")                  jei (-not $updateComplete) {             Write-Host "Naujinimas nebaigtas – tikrinama, ar yra klaidų įvykių..." -Priekinio planopalva geltona                          # 21. Event1795 – programinės-aparatinės įrangos klaida (fiksavimo klaidos kodas)             $event 1795Array = @($events | Where-Object {$_. Id -eq 1795})             $event 1795Count = $event 1795Array.Count             jei ($event 1795Count -gt 0) {                 $latestEvent 1795 = $event 1795Array | Sort-Object TimeCreated -Descending | Select-Object – pirmas 1                 if ($latestEvent 1795.Message -match '(?:error|code|status)[:\s]*(?:0x)?( [0-9A-Fa-f]{8}|[0-9A-Fa-f]+)') {                     $event 1795ErrorCode = $matches[1]                 }                 Write-Host "Įvykių 1795 (programinės-aparatinės įrangos klaida) skaičius: $event 1795Count" $(if ($event 1795ErrorCode) { "Kodas: $event 1795ErrorCode" })             }                          # 22. Event1796 – užregistruotas klaidos kodas (įrašymo klaidos kodas)             $event 1796Array = @($events | Where-Object {$_. Id -eq 1796})             $event 1796Count = $event 1796Array.Count             jei ($event 1796Count -gt 0) {                 $latestEvent 1796 = $event 1796Array | Sort-Object TimeCreated -Descending | Select-Object – pirmas 1                 if ($latestEvent 1796.Message -match '(?:error|code|status)[:\s]*(?:0x)?( [0-9A-Fa-f]{8}|[0-9A-Fa-f]+)') {                     $event 1796ErrorCode = $matches[1]                 }                 Write-Host "Event 1796 (Error Logged) Count: $event 1796Count" $(if ($event 1796ErrorCode) { "Code: $event 1796ErrorCode" })             }                          # 23. Event1800 – reikalingas paleidimas iš naujo (NE klaida – naujinimas bus tęsiamas paleidus iš naujo)             $event 1800Array = @($events | Where-Object {$_. Id -eq 1800})             $event 1800Count = $event 1800Array.Count             $rebootPending = $event 1800Count -gt 0             jei ($rebootPending) {                 Write-Host "Event 1800 (Pending Reboot Pending): Update will proceed after reboot" -ForegroundColor Cyan             }                          # 24. Event1802 – žinomos programinės-aparatinės įrangos problema ("SkipReason"> surinkimo KI_<numeris)             $event 1802Array = @($events | Where-Object {$_. Id -eq 1802})             $event 1802Count = $event 1802Array.Count             jei ($event 1802Count -gt 0) {                 $latestEvent 1802 = $event 1802Array | Sort-Object TimeCreated -Descending | Select-Object – pirmas 1                 jei ($latestEvent 1802.Message -match 'SkipReason:\s*(KI_\d+)') {                     $knownIssueId = $matches[1]                 }                 Write-Host "Įvykių 1802 (žinomos programinės-aparatinės įrangos problema) skaičius: $event 1802Count" $(jei ($knownIssueId) { "KI: $knownIssueId" })             }                          # 25. Event1803 – trūksta KEK naujinimo (OĮG turi pateikti PK pasirašytą KEK)             $event 1803Array = @($events | Where-Object {$_. Id -eq 1803})             $event 1803Count = $event 1803Array.Count             $missingKEK = $event 1803Count -gt 0             jei ($missingKEK) {                 Write-Host "Event 1803 (Missing KEK): OEM needs to supply PK signed KEK" -ForegroundColor Yellow             }         } dar {             Write-Host "Naujinimas baigtas (1808 įvykis arba būsena=atnaujinta) – praleidžiama klaidų analizė" -Priekinio planopalva žalia         }     } } sugauti {     Write-Warning "Klaida nuskaitant įvykių žurnalus. Gali reikėti administratoriaus teisių: $_"     $latestEventId = $null     $bucketId = $null     $confidence = $null     $skipReasonKnownIssue = $null     $event 1801Count = 0     $event 1808Count = 0     $event 1795Count = 0     $event 1795ErrorCode = $null     $event 1796Count = 0     $event 1796ErrorCode = $null     $event 1800Count = 0     $rebootPending = $false     $event 1802Count = 0     $knownIssueId = $null     $event 1803Count = 0     $missingKEK = $false     Write-Host "Naujausias įvykio ID: klaida"     Write-Host "Talpyklos ID: klaida"     Write-Host "Pasitikėjimas: klaida"     Write-Host "1801 įvykis: 0"     Write-Host "1808 įvykis: 0" }

# WMI/CIM Queries (5 values)

# 26. OSVersion # PS versija: 3.0+ (naudokite Get-WmiObject 2.0 versijai) | Administratorius: Ne | Sistemos reikalavimai: nėra išbandykite {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -arba [string]::IsNullOrEmpty($osInfo.Version)) {         Write-Warning "Nepavyko nuskaityti OS versijos"         $osVersion = "Nežinoma"     } dar {         $osVersion = $osInfo.Version     }     Write-Host "OS versija: $osVersion" } sugauti {     # CIM gali nepavykti kai kuriose aplinkose – naudokite atsarginę     $osVersion = [System.Environment]::OSVersion.Version.ToString()     if ([string]::IsNullOrEmpty($osVersion)) { $osVersion = "Nežinoma" }     Write-Host "OS versija: $osVersion" }

# 27. LastBootTime # PS versija: 3.0+ (naudokite Get-WmiObject 2.0 versijai) | Administratorius: Ne | Sistemos reikalavimai: nėra išbandykite {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     jei ($null -eq $osInfo arba $null -eq $osInfo.LastBootUpTime) {         Write-Warning "Nepavyko gauti paskutinės įkrovos laiko"         $lastBootTime = $null         Write-Host "Paskutinės įkrovos laikas: nepasiekiama"     } dar {         $lastBootTime = $osInfo.LastBootUpTime         Write-Host "Paskutinio paleidimo laikas: $lastBootTime"     } } sugauti {     # CIM gali nepavykti kai kuriose aplinkose – naudokite atsarginę     išbandykite {         $lastBootTime = (Get-Process -Id 0 -ErrorAction SilentlyContinue). Pradžios laikas     } sugauti {         $lastBootTime = $null     }     jei ($lastBootTime) { Write-Host "Paskutinės įkrovos laikas: $lastBootTime" } dar { Write-Host "Paskutinio paleidimo laikas: nepasiekiama" } }

# 28. BaseBoardManufacturer # PS versija: 3.0+ (naudokite Get-WmiObject 2.0 versijai) | Administratorius: Ne | Sistemos reikalavimai: nėra išbandykite {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     jei ($null -eq $baseBoard arba [eilutė]::IsNullOrEmpty($baseBoard.Manufacturer)) {         Write-Warning "Nepavyko nuskaityti bazinių lentų gamintojo"         $baseBoardManufacturer = "Nežinoma"     } dar {         $baseBoardManufacturer = $baseBoard.Manufacturer     }     Write-Host "Baseboard Manufacturer: $baseBoardManufacturer" } sugauti {     # CIM gali nepavykti – bazinių lentų informacija yra papildoma     $baseBoardManufacturer = "Nežinoma"     Write-Host "Baseboard Manufacturer: $baseBoardManufacturer" }

# 29. BaseBoardProduct # PS versija: 3.0+ (naudokite Get-WmiObject 2.0 versijai) | Administratorius: Ne | Sistemos reikalavimai: nėra išbandykite {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -arba [string]::IsNullOrEmpty($baseBoard.Product)) {         Write-Warning "Nepavyko nuskaityti baseboard produkto"         $baseBoardProduct = "Nežinoma"     } dar {         $baseBoardProduct = $baseBoard.Product     }     Write-Host "Baseboard Product: $baseBoardProduct" } sugauti {     # CIM gali nepavykti – bazinių lentų informacija yra papildoma     $baseBoardProduct = "Nežinoma"     Write-Host "Baseboard Product: $baseBoardProduct" }

# 30. SecureBootTaskEnabled # PS Versija: Visi | Administratorius: Ne | Sistemos reikalavimai: suplanuota užduotis yra # Tikrina, ar įgalinta saugiosios įkrovos naujinimo suplanuota užduotis $secureBootTaskEnabled = $null $secureBootTaskStatus = "Nežinoma" išbandykite {     $taskOutput = schtasks.exe /Query /TN "\Microsoft\Windows\PI\Secure-Boot-Update" /FO CSV 2>&1     jei ($LASTEXITCODE -eq 0) {         $taskData = $taskOutput | ConvertFrom-Csv         jei ($taskData) {             $secureBootTaskStatus = $taskData.Status             $secureBootTaskEnabled = ($taskData.Status -eq 'Ready' -or $taskData.Status -eq 'Running')         }     } dar {         $secureBootTaskStatus = "NotFound"         $secureBootTaskEnabled = $false     }     jei ($secureBootTaskEnabled -eq $false) {         Write-Host "SecureBoot Update Task: $secureBootTaskStatus (Enabled: $secureBootTaskEnabled)" -ForegroundColor Yellow     } dar {         Write-Host "SecureBoot Update Task: $secureBootTaskStatus (Enabled: $secureBootTaskEnabled)" -ForegroundColor Green     } } sugauti {     $secureBootTaskStatus = "Klaida"     $secureBootTaskEnabled = $false     Write-Host "SecureBoot Update Task: Error checking - $_" -ForegroundColor Red }

# 31. WinCS Key Status (F33E0C8E002 - Secure Boot Certificate Update) # PS Versija: Visi | Administratorius: Taip (užklausai) | Sistemos reikalavimai: WinCsFlags.exe $wincsKeyApplied = $null $wincsKeyStatus = "Nežinoma" išbandykite {     # Patikrinkite bendras vietas, kuriose yra WinCsFlags.exe     $wincsFlagsPath = $null     $possiblePaths = @(         "$env:SystemRoot\System32\WinCsFlags.exe",         "$env:SystemRoot\SysWOW64\WinCsFlags.exe"     )     foreach ($p in $possiblePaths) {         if (Test-Path $p) { $wincsFlagsPath = $p; break }     }     jei ($wincsFlagsPath) {         # Užklausai būdingas raktas – būtinos administratoriaus teisės         $queryOutput = & $wincsFlagsPath /query – rakto F33E0C8E002 2>&1         $queryOutputStr = $queryOutput -join "'n"         jei ($LASTEXITCODE -eq 0) {             # Patikrinkite, ar pritaikytas raktas (ieškokite "Active Configuration" arba panašaus indikatoriaus)             jei ($queryOutputStr -atitinka "Active Configuration.*:*enabled" -arba $queryOutputStr -match "Configuration.*applied") {                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Pritaikyta"                 Write-Host "WinCS" klavišų F33E0C8E002: pritaikytas" – priekinio planopalva žalia             } elseif ($queryOutputStr -match nerasta|Konfigūracijos nėra") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "WinCS" klavišų F33E0C8E002: netaikoma" – priekinio planopalva geltona             } dar {                 # Kodas yra - tikrinti būsenos išvestį                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Pritaikyta"                 Write-Host "WinCS key F33E0C8E002: Applied" –Priekinio planopalva žalia             }         } dar {             # Patikrinkite, ar yra konkrečių klaidų pranešimų             jei ($queryOutputStr -atitinka "Prieiga uždrausta|administratorius") {                 $wincsKeyStatus = "AccessDenied"                 Write-Host "WinCS key F33E0C8E002: Access denied (run as admin)" -ForegroundColor DarkGray             } elseif ($queryOutputStr -match nerasta|Konfigūracijos nėra") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "WinCS" klavišų F33E0C8E002: netaikoma" – priekinio planopalva geltona             } dar {                 $wincsKeyStatus = "Užklausa nepavyko"                 Write-Host "WinCS rakto F33E0C8E002: užklausa nepavyko" -Priekinio planopalva raudona             }         }     } dar {         $wincsKeyStatus = "WinCsFlagsNotFound"         Write-Host "WinCS key F33E0C8E002: WinCsFlags.exe not found" -ForegroundColor Gray     } } sugauti {     $wincsKeyStatus = "Klaida"     Write-Host "WinCS key F33E0C8E002: Error checking - $_" -ForegroundColor Red }              

# ============================================================================= # Atkūrimo aptikimas – būsenos išvestis & išėjimo kodas # =============================================================================

# Build status object from all collected inventory data $status = [sutvarkyta]@{     UEFICA2023Status = $uefica 2023Status     UEFICA2023Error = $uefica 2023Error     UEFICA2023ErrorEvent = $uefica 2023ErrorEvent     AvailableUpdates = if ($null -ne $availableUpdates) { $availableUpdatesHex } else { $null }     AvailableUpdatesPolicy = jei ($null -ne $availableUpdatesPolicy) { $availableUpdatesPolicyHex } dar { $null }     Pagrindinio kompiuterio vardas = $hostname     CollectionTime = if ($collectionTime -is [datetime]) { $collectionTime.ToString("o") } else { "$collectionTime" }     SecureBootEnabled = $secureBootEnabled     HighConfidenceOptOut = $highConfidenceOptOut     MicrosoftUpdateManagedOptIn = $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     Patikimumas = $confidence     SkipReasonKnownIssue = $skipReasonKnownIssue # KI_<skaičius,> iš SkipReason BucketId įvykyje     Event1801Count = $event 1801Count     Event1808Count = $event 1808Count     # Klaidos įvykiai su užfiksuotą išsamia informacija     Event1795Count = $event 1795Count # grąžinta programinė-aparatinė įranga klaida     Event1795ErrorCode = $event 1795ErrorCode # klaidos kodas iš programinės-aparatinės įrangos     Event1796Count = $event 1796Count # užregistruotas klaidos kodas     Event1796ErrorCode = $event 1796ErrorCode # Užfiksuotas klaidos kodas     Event1800Count = $event 1800Count # Reikalingas perkrovimas (NE klaida)     RebootPending = $rebootPending # True, jei 1800 įvykis yra     Event1802Count = $event 1802Count # žinoma programinės-aparatinės įrangos problema     KnownIssueId = $knownIssueId # KI_<skaičius,> skipReason     Event1803Count = $event 1803Count # Trūksta KEK naujinimo     MissingKEK = $missingKEK # OEM reikia pateikti PK pasirašytą KEK     OSVersion = $osVersion     LastBootTime = if ($lastBootTime -is [datetime]) { $lastBootTime.ToString("o") } else { "$lastBootTime" }     BaseBoardManufacturer = $baseBoardManufacturer     BaseBoardProduct = $baseBoardProduct     SecureBootTaskEnabled = $secureBootTaskEnabled     SecureBootTaskStatus = $secureBootTaskStatus     WinCSKeyApplied = $wincsKeyApplied # True, jei taikomas F33E0C8E002 raktas     WinCSKeyStatus = $wincsKeyStatus # Pritaikyta, NotApplied, WinCsFlagsNotFound ir kt. }

# Output the status - For data aggregation $jsonOutput = $status | ConvertTo-Json – glaudinti

# If OutputPath provided, save to file; otherwise output to stdout jei (-not [eilutė]::IsNullOrEmpty($OutputPath)) {     #Validate OutputPath – praleisti, jei ji atrodo kaip žinyno užklausa arba joje yra neleistinų simbolių     jei ($OutputPath -atitinka ^[/\-]' -arba $OutputPath -match '[<>:"|? *]') {         Write-Host "Nurodyta neleistina OutputPath, išvestis į stdout" -Priekinio planopalva Geltona         Write-Output $jsonOutput         jei ($secureBootEnabled -and $uefica 2023Status -eq "Atnaujinta") { išeiti 0 } dar { išeiti 1 }     }     # Įsitikinkite, kad išvesties aplankas yra     jei (-not (testo kelias $OutputPath)) {         išbandykite {             New-Item -ItemType katalogas - Kelias $OutputPath -Force | Nu neapibrėžta reikšmė (Out-Null)         } sugauti {             Write-Warning "Nepavyko sukurti išvesties aplanko: $OutputPath – $_"         }     }     # Įrašyti į HOSTNAME_latest.json     $outputFile = Join-Path $OutputPath "$($hostname)_latest.json"     išbandykite {         $jsonOutput | Out-File -FilePath $outputFile -Encoding UTF8 -Force         Write-Host "JSON saved to: $outputFile" -ForegroundColor Green     } sugauti {         Write-Warning "Nepavyko rašyti į failą: $outputFile - $_"         # Grįžti į stdout         Write-Output $jsonOutput     } } dar {     # Pradinis veikimas – išvestis į stdout     Write-Output $jsonOutput }          

# Exit code: "Updated" is the success value per the playbook jei ($secureBootEnabled ir $uefica 2023Status -eq "Atnaujinta") {     išeiti 0 # be problemų } dar {     exit 1 # With issue }

​​​​​​​

Reikia daugiau pagalbos?

Norite daugiau parinkčių?

Sužinokite apie prenumeratos pranašumus, peržiūrėkite mokymo kursus, sužinokite, kaip apsaugoti savo įrenginį ir kt.