Se aplică la
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

Data de publicare inițială: 17 noiembrie 2025

ID KB: 5072718

Modificare dată

Modificare descriere

24 februarie 2026

  • S-a actualizat scriptul de colectare a datelor de inventar de bootare securizată eșantion.

22 februarie 2026

  • S-a actualizat scriptul de colectare a datelor de inventar de bootare securizată eșantion.

13 februarie 2026

  • S-a actualizat scriptul de colectare a datelor de inventar de bootare securizată eșantion.

Sample Secure Boot Inventory Data Collection script

Copiați și lipiți acest script eșantion și modificați după cum este necesar pentru mediul dvs.: Scriptul de colectare a datelor de inventar pentru bootare securizată eșantion.

<# . SINOPSIS     Detectează starea de actualizare a certificatului de bootare securizat pentru monitorizare la nivelul întregii flote.

. DESCRIEREA /     Acest script de detectare colectează secure Boot status, certificate update registry valori,     și informațiile despre dispozitiv. Acesta creează un șir JSON pentru monitorizare și raportare.

    Compatibil cu remedierile Intune, colectarea bazată pe GPO și alte instrumente de gestionare.Nu este necesar un script de remediere - aceasta este doar monitorizare.

    Ieșire 0 = "Fără problemă" (certificate actualizate)     Ieșirea 1 = "Cu problema" (certificate ne actualizate - doar informativ)

. Parameter OutputPath     Opţional. Calea către un folder în care va fi salvat fișierul JSON.Dacă este furnizat, salvează HOSTNAME_latest.json în acest folder.Dacă nu este furnizată, ieșire JSON la stdout (comportament original).

. EXEMPLU     # Ieșire la ieșire (detectare Intune/SCCM)     .\Detect-SecureBootCertUpdateStatus.ps1

. EXEMPLU     # Salvați în partajarea de rețea (implementare GPO)     .\Detect-SecureBootCertUpdateStatus.ps1 -OutputPath "\\server\SecureBootLogs$"

. NOTE     Căi de registry per 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     IMPLICITE, INCLUSIV, DAR FĂRĂ A SE LIMITA LA GARANȚIILE DE VANDABILITATE,     ADECVAREA PENTRU UN ANUMIT SCOP ȘI NEINFRINGEMENT. ÎN NICI UN CAZ NU SE VA     AUTORII SAU DEȚINĂTORII DE DREPTURI DE AUTOR SUNT RĂSPUNZĂTORI PENTRU ORICE REVENDICARE, DAUNE SAU ALTE     RĂSPUNDEREA, FIE ÎNTR-O ACȚIUNE CONTRACTUALĂ, DELICTUALĂ SAU ÎN ALT MOD, CARE DECURGE DIN,     ÎN AFARA SOFTWARE-ULUI SAU ÎN LEGĂTURĂ CU ACEASTA, CU UTILIZAREA SAU ALTE TRANZACȚII ÎN     SOFTWARE.#> param(     [Parametru(Obligatoriu = $false)]     [șir]$OutputPath )

# Download URL: https://aka.ms/getsecureboot -> "Deployment and Monitoring Samples" # Notă: Acest script rulează pe punctele finale pentru a colecta date de stare Secure Boot.

# 1. Hostname # PS Versiune: Toate | Admin: Nu | Cerințe de sistem: Niciuna încercați {     $hostname = $env:COMPUTERNAME     if ([string]::IsNullOrEmpty($hostname)) {         Write-Warning "Numele gazdei nu a putut fi determinat"         $hostname = "Necunoscut"     }     Write-Host "Nume gazdă: $hostname" } captură {     Write-Warning "Eroare la regăsirea numelui de gazdă: $_"     $hostname = "Eroare"     Write-Host "Nume gazdă: $hostname" }

# 2. CollectionTime # PS Versiune: Toate | Admin: Nu | Cerințe de sistem: Niciuna încercați {     $collectionTime = Get-Date     dacă ($null -eq $collectionTime) {         Write-Warning "Imposibil de regăsit data/ora curentă"         $collectionTime = "Necunoscut"     }     Write-Host "Timp colecție: $collectionTime" } captură {     Write-Warning "Eroare la regăsirea datei/orei: $_"     $collectionTime = "Eroare"     Write-Host "Timp colecție: $collectionTime" }

# Registry: Secure Boot Main Key (3 valori)

# 3. SecureBootEnabled # PS Versiune: 3.0+ | Admin: Poate fi necesar | Cerințe de sistem: sistem capabil de bootare UEFI/Secure încercați {     $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop     Write-Host "Boot securizat activat: $secureBootEnabled" } captură {     Write-Warning "Nu se poate determina starea bootării securizate prin cmdlet: $_"     # Try registry fallback     încercați {         $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop         $secureBootEnabled = [bool]$regValue.UEFISecureBootEnabled         Write-Host "Boot securizat activat: $secureBootEnabled"     } captură {         Write-Warning "Nu se poate determina starea Secure Boot prin registry. Sistemul poate să nu accepte UEFI/Boot secure."         $secureBootEnabled = $null         Write-Host "Boot securizat activat: indisponibil"     } }

# 4. HighConfidenceOptOut # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop     $highConfidenceOptOut = $regValue.HighConfidenceOptOut     Write-Host "Renunțare cu încredere maximă: $highConfidenceOptOut" } captură {     # HighConfidenceOptOut este opțional - nu este prezent pe majoritatea sistemelor     $highConfidenceOptOut = $null     Write-Host "Renunțare de mare încredere: Ne setat" }

Nr. 4b. MicrosoftUpdateManagedOptIn # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name MicrosoftUpdateManagedOptIn -ErrorAction Stop     $microsoftUpdateManagedOptIn = $regValue.MicrosoftUpdateManagedOptIn     Write-Host "Înscriere gestionată Microsoft Update: $microsoftUpdateManagedOptIn" } captură {     # MicrosoftUpdateManagedOptIn este opțional - nu este prezent pe majoritatea sistemelor     $microsoftUpdateManagedOptIn = $null     Write-Host "Înscriere gestionată Microsoft Update: Ne set" }

# 5. AvailableUpdates # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop     $availableUpdates = $regValue.AvailableUpdates     dacă ($null -ne $availableUpdates) {         # Conversie în format hexazecimal         $availableUpdatesHex = "0x{0:X}" -f $availableUpdates         Write-Host "Disponibil Actualizări: $availableUpdatesHex"     } altfel, {         Write-Host "Disponibil Actualizări: Indisponibil"     } } captură {     Write-Warning "Cheia de registry AvailableUpdates nu a fost găsită sau inaccesibilă"     $availableUpdates = $null     Write-Host "Disponibil Actualizări: Indisponibil" }

Nr. 5b. AvailableUpdatesPolicy (valoare persistentă controlată de GPO) # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdatesPolicy -ErrorAction Stop     $availableUpdatesPolicy = $regValue.AvailableUpdatesPolicy     dacă ($null -ne $availableUpdatesPolicy) {         # Conversie în format hexazecimal         $availableUpdatesPolicyHex = "0x{0:X}" -f $availableUpdatesPolicy         Write-Host "Politica de Actualizări disponibilă: $availableUpdatesPolicyHex"     } altfel, {         Write-Host "Politică de Actualizări disponibilă: Ne set"     } } captură {     # AvailableUpdatesPolicy este opțional - se setează doar atunci când se aplică GPO     $availableUpdatesPolicy = $null     Write-Host "Politică de Actualizări disponibilă: Ne set" }

# Registry: Cheie de servicii (3 valori)

# 6. UEFICA2023Status # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Status -ErrorAction Stop     $uefica 2023Status = $regValue.UEFICA2023Status     Write-Host "Starea Windows UEFI CA 2023: $uefica 2023Status" } captură {     Write-Warning "Cheia de registry de stare Windows UEFI CA 2023 nu a fost găsită sau inaccesibilă"     $uefica 2023Status = $null     Write-Host "Stare Windows UEFI CA 2023: Indisponibil" }

# 7. UEFICA2023Eroare # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop     $uefica 2023Eroare = $regValue.UEFICA2023Error     Write-Host eroarea "UEFI CA 2023: $uefica 2023Error" } captură {     # UEFICA2023Eroare există doar dacă a existat o eroare - absența este bună     $uefica 2023Eroare = $null     Write-Host "Eroare UEFI CA 2023: Fără" }

# 8. UEFICA2023ErrorEvent # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023ErrorEvent -ErrorAction Stop     $uefica 2023ErrorEvent = $regValue.UEFICA2023ErrorEvent     Write-Host "Eveniment de eroare UEFI CA 2023: $uefica 2023ErrorEvent" } captură {     $uefica 2023ErrorEvent = $null     Write-Host "Eveniment de eroare UEFI CA 2023: Indisponibil" }

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

# 9. OEMManufacturerName # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMManufacturerName -ErrorAction Stop     $oemManufacturerName = $regValue.OEMManufacturerName     if ([string]::IsNullOrEmpty($oemManufacturerName)) {         Write-Warning "OEMManufacturerName este gol"         $oemManufacturerName = "Necunoscut"     }     Write-Host "Nume producător OEM: $oemManufacturerName" } captură {     Write-Warning cheia de registry "OEMManufacturerName nu a fost găsită sau inaccesibilă"     $oemManufacturerName = $null     Write-Host "Nume producător OEM: Indisponibil" }

# 10. OEMModelSystemFamily # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelSystemFamily -ErrorAction Stop     $oemModelSystemFamily = $regValue.OEMModelSystemFamily     if ([string]::IsNullOrEmpty($oemModelSystemFamily)) {         Write-Warning "OEMModelSystemFamily este gol"         $oemModelSystemFamily = "Necunoscut"     }     Write-Host "Familie de modele OEM: $oemModelSystemFamily" } captură {     Write-Warning "Cheia de registry OEMModelSystemFamily nu a fost găsită sau nu este inaccesibilă"     $oemModelSystemFamily = $null     Write-Host "Familie de modele OEM: Indisponibil" }

# 11. NumărModel OEM # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelNumber -ErrorAction Stop     $oemModelNumber = $regValue.OEMModelNumber     if ([string]::IsNullOrEmpty($oemModelNumber)) {         Write-Warning "OEMModelNumber este gol"         $oemModelNumber = "Necunoscut"     }     Write-Host "Număr model OEM: $oemModelNumber" } captură {     Write-Warning "Cheia de registry OEMModelNumber nu a fost găsită sau inaccesibilă"     $oemModelNumber = $null     Write-Host "Număr model OEM: Indisponibil" }

# 12. FirmwareVersion # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareVersion -ErrorAction Stop     $firmwareVersion = $regValue.FirmwareVersion     if ([string]::IsNullOrEmpty($firmwareVersion)) {         Write-Warning "FirmwareVersion este gol"         $firmwareVersion = "Necunoscut"     }     Write-Host "Versiune firmware: $firmwareVersion" } captură {     Write-Warning "Cheia de registry FirmwareVersion nu a fost găsită sau inaccesibilă"     $firmwareVersion = $null     Write-Host "Versiune firmware: indisponibilă" }

# 13. FirmwareReleaseDate # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareReleaseDate -ErrorAction Stop     $firmwareReleaseDate = $regValue.FirmwareReleaseDate     if ([string]::IsNullOrEmpty($firmwareReleaseDate)) {         Write-Warning "FirmwareReleaseDate este gol"         $firmwareReleaseDate = "Necunoscut"     }     Write-Host "Dată lansare firmware: $firmwareReleaseDate" } captură {     Write-Warning "Cheia de registry FirmwareReleaseDate nu a fost găsită sau inaccesibilă"     $firmwareReleaseDate = $null     Write-Host "Dată lansare firmware: indisponibil" }

# 14. OSArchitecture # PS Versiune: Toate | Admin: Nu | Cerințe de sistem: Niciuna încercați {     $osArchitecture = $env:PROCESSOR_ARCHITECTURE     if ([string]::IsNullOrEmpty($osArchitecture)) {         # Try registry fallback         $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OSArchitecture -ErrorAction Stop         $osArchitecture = $regValue.OSArchitecture     }     if ([string]::IsNullOrEmpty($osArchitecture)) {         Write-Warning "OSArchitecture nu a putut fi determinată"         $osArchitecture = "Necunoscut"     }     Write-Host "Arhitectură sistem de operare: $osArchitecture" } captură {     Write-Warning "Eroare la regăsirea OSArchitecture: $_"     $osArchitecture = "Necunoscut"     Write-Host "Arhitectură sistem de operare: $osArchitecture" }

# 15. CanAttemptUpdateAfter (FILETIME) # PS Versiune: Toate | Admin: Poate fi necesar | Cerințe de sistem: Niciuna încercați {     $regValue = Get-ItemProperty -Cale "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop     $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter     # Convertiți FILETIME la UTC DateTime - depozite de registry ca REG_BINARY (byte[]) sau REG_QWORD (lung)     dacă ($null -ne $canAttemptUpdateAfter) {         încercați {             dacă ($canAttemptUpdateAfter -este [byte[]]) {                 $fileTime = [BitConverter]::ToInt64($canAttemptUpdateAfter, 0)                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($fileTime). ToUniversalTime()             } elseif ($canAttemptUpdateAfter -is [long]) {                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter). ToUniversalTime()             }         } captură {             Write-Warning "Imposibil de efectuat conversia CanAttemptUpdateAfter FILETIME la DateTime"         }     }     Write-Host "Se poate încerca actualizarea după: $canAttemptUpdateAfter" } captură {     Write-Warning "CanAttemptUpdateAfter cheia de registry nu a fost găsită sau nu este accesibilă"     $canAttemptUpdateAfter = $null     Write-Host "Se poate încerca actualizarea după: indisponibil" }

# Jurnale de evenimente: Jurnal de sistem (10 valori: 16-25)

# 16-25. Interogări jurnal de evenimente ID-uri eveniment #: # 1801 - Actualizare inițiată, repornire necesară # 1808 - Actualizare finalizată cu succes # 1795 - Eroare de firmware returnată (cod de eroare de captură) # 1796 - Eroare înregistrată cu codul de eroare (cod de captură) # 1800 - Repornire necesară (NU este o eroare - actualizarea va continua după repornire) # 1802 - Cunoscut problemă de firmware blocat actualizare (captura KI_<numărul> de la SkipReason) # 1803 - Potrivire KEK actualizare nu a fost găsit (OEM trebuie să furnizeze KEK semnat PK) # PS Versiune: 3.0+ | Admin: Poate fi necesar pentru jurnalul de sistem | Cerințe de sistem: Niciuna încercați {     # Interogați toate ID-urile de eveniment Secure Boot relevante     $allEventIds = @(1795, 1796, 1800, 1801, 1802, 1803, 1808)     $events = @(Get-WinEvent -FilterHashtable @{LogName='System'; ID=$allEventIds} -MaxEvents 50 -ErrorAction Stop)

    dacă ($events. Count -eq 0) {         Write-Warning "Nu s-au găsit evenimente secure boot în jurnalul de sistem"         $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 "Cel mai recent ID eveniment: indisponibil"         Write-Host "ID bucket: indisponibil"         Write-Host "Încredere: indisponibil"         Write-Host "Contor eveniment 1801: 0"         Write-Host "Contor eveniment 1808: 0"     } altfel, {         # 16. LatestEventId         $latestEvent = $events | Sort-Object TimeCreated -Descendent | Select-Object -Primul 1         dacă ($null -eq $latestEvent) {             Write-Warning "Nu s-a putut determina cel mai recent eveniment"             $latestEventId = $null             Write-Host "Cel mai recent ID eveniment: Indisponibil"         } altfel, {             $latestEventId = latestEvent.Id de lei             Write-Host "Cel mai recent ID eveniment: $latestEventId"         }

        # 17. BucketID - extras din evenimentul 1801/1808         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketId:\s*(.+)') {                 $bucketId = $matches[1]. Trim()                 Write-Host "ID bucket: $bucketId"             } altfel, {                 Write-Warning "BucketId negăsit în mesajul evenimentului"                 $bucketId = $null                 Write-Host "ID bucket: Negăsit în eveniment"             }         } altfel, {             Write-Warning "Cel mai recent eveniment sau mesaj este nul, nu se poate extrage BucketId"             $bucketId = $null             Write-Host "ID bucket: Indisponibil"         }

        # 18. Încredere - extras din evenimentul 1801/1808         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketConfidenceLevel:\s*(.+)') {                 $confidence = $matches[1]. Trim()                 Write-Host "Încredere: $confidence"             } altfel, {                 Write-Warning "Nivelul de încredere nu s-a găsit în mesajul eveniment"                 $confidence = $null                 Write-Host "Încredere: Negăsit în eveniment"             }         } altfel, {             Write-Warning "Cel mai recent eveniment sau mesaj este nul, nu poate extrage Confidence"             $confidence = $null             Write-Host "Încredere: indisponibil"         }

        Nr. 18b. SkipReason - extragerea numărului KI_<> din SkipReason în același eveniment ca BucketId         # Aceasta capturează ID-urile de probleme cunoscute care apar alături de BucketId/Confidence (nu doar evenimentul 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 "Problemă cunoscută SkipReason: $skipReasonKnownIssue" - Culoare prim plan galben             }         }

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

        # 20. Eveniment1808Count         $event 1808Array = @($events | Where-Object {$_. Id -eq 1808})         $event 1808Count = $event 1808Array.Count         Write-Host "Contor eveniment 1808: $event 1808Count"                  # Inițializați variabilele evenimentului de eroare         $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                  # Verificați evenimentele de eroare doar dacă actualizarea NU este finalizată         # Skip error analysis if: 1808 is latest event OR UEFICA2023Status is "Updated"         $updateComplete = ($latestEventId -eq 1808) -sau ($uefica 2023Status -eq "Actualizat")                  dacă (-nu $updateComplete) {             Write-Host "Actualizarea nu s-a terminat - se verifică evenimentele de eroare..." -Culoare prim plan galben                          # 21. Eveniment1795 - Eroare de firmware (cod de eroare de captură)             $event 1795Array = @($events | Where-Object {$_. Id -eq 1795})             $event 1795Count = $event 1795Array.Count             dacă ($event 1795Count -gt 0) {                 $latestEvent 1795 = $event 1795Array | Sort-Object TimeCreated -Descending | Select-Object -Primul 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 contor "Eveniment 1795 (Eroare firmware): $event 1795Count" $(if ($event 1795ErrorCode) { "Cod: $event 1795ErrorCode" })             }                          # 22. Eveniment1796 - cod de eroare înregistrat (cod de eroare de captură)             $event 1796Array = @($events | Where-Object {$_. Id -eq 1796})             $event 1796Count = $event 1796Array.Count             dacă ($event 1796Count -gt 0) {                 $latestEvent 1796 = $event 1796Array | Sort-Object TimeCreated -Descending | Select-Object -Primul 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 contor "Eveniment 1796 (eroare înregistrată): $event 1796Count" $(if ($event 1796ErrorCode) { "Cod: $event 1796ErrorCode" })             }                          # 23. Event1800 - Repornire necesară (NU este necesară o eroare - actualizarea va continua după repornire)             $event 1800Array = @($events | Where-Object {$_. Id -eq 1800})             $event 1800Count = $event 1800Array.Count             $rebootPending = $event 1800Count -gt 0             dacă ($rebootPending) {                 Write-Host "Evenimentul 1800 (repornire în așteptare): actualizarea va continua după repornire" -Prim-planColor Cyan             }                          # 24. Event1802 - problemă de firmware cunoscută (capturarea numărului KI_<> din SkipReason)             $event 1802Array = @($events | Where-Object {$_. Id -eq 1802})             $event 1802Count = $event 1802Array.Count             dacă ($event 1802Count -gt 0) {                 $latestEvent 1802 = $event 1802Array | Sort-Object TimeCreated -Descending | Select-Object -Primul 1                 if ($latestEvent 1802.Message -match 'SkipReason:\s*(KI_\d+)') {                     $knownIssueId = $matches[1]                 }                 Write-Host contorul "Eveniment 1802 (problemă de firmware cunoscută): $event 1802Count" $(dacă ($knownIssueId) { "KI: $knownIssueId" })             }                          # 25. Event1803 - Actualizare KEK lipsă (OEM trebuie să furnizeze KEK semnat PK)             $event 1803Array = @($events | Where-Object {$_. Id -eq 1803})             $event 1803Count = $event 1803Array.Count             $missingKEK = $event 1803Count -gt 0             dacă ($missingKEK) {                 Write-Host "Evenimentul 1803 (KEK lipsă): OEM trebuie să furnizeze KEK semnat PK" -Prim-planColor galben             }         } altfel, {             Write-Host "Actualizare terminată (evenimentul 1808 sau Starea=actualizată) - se ignoră analiza erorilor" -Prim-planColor Verde         }     } } captură {     Write-Warning "Eroare la regăsirea jurnalelor de evenimente. Pot fi necesare privilegii de administrator: $_"     $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 "CEL mai recent ID eveniment: eroare"     Write-Host "ID bucket: eroare"     Write-Host "Încredere: eroare"     Write-Host "Contor eveniment 1801: 0"     Write-Host "Contor eveniment 1808: 0" }

# Interogări WMI/CIM (5 valori)

# 26. Versiune OSVersion # PS Versiune: 3.0+ (utilizarea Get-WmiObject pentru 2.0) | Admin: Nu | Cerințe de sistem: Niciuna încercați {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -or [string]::IsNullOrEmpty($osInfo.Version)) {         Write-Warning "Imposibil de regăsit versiunea sistemului de operare"         $osVersion = "Necunoscut"     } altfel, {         $osVersion = $osInfo.Version     }     Write-Host "Versiune sistem de operare: $osVersion" } captură {     # CIM poate să nu reușească în unele medii - utilizarea rezervă     $osVersion = [System.Environment]::OSVersion.Version.ToString()     if ([string]::IsNullOrEmpty($osVersion)) { $osVersion = "Unknown" }     Write-Host "Versiune sistem de operare: $osVersion" }

# 27. Ora ultimei încărcări # PS Versiune: 3.0+ (utilizarea Get-WmiObject pentru 2.0) | Admin: Nu | Cerințe de sistem: Niciuna încercați {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     dacă ($null -eq $osInfo -sau $null -eq $osInfo.LastBootUpTime) {         Write-Warning "Imposibil de regăsit ora ultimei încărcări"         $lastBootTime = $null         Write-Host "Ora ultimei încărcări: indisponibilă"     } altfel, {         $lastBootTime = $osInfo.LastBootUpTime         Write-Host "Ora ultimei încărcări: $lastBootTime"     } } captură {     # CIM poate să nu reușească în unele medii - utilizarea rezervă     încercați {         $lastBootTime = (Get-Process -Id 0 -ErrorAction SilentlyContinue). Oră de început     } captură {         $lastBootTime = $null     }     dacă ($lastBootTime) { Write-Host "Ora ultimei încărcări: $lastBootTime" } altcineva { Write-Host "Ora ultimei încărcări: Indisponibil" } }

# 28. BaseBoardManufacturer # PS Versiune: 3.0+ (utilizarea Get-WmiObject pentru 2.0) | Admin: Nu | Cerințe de sistem: Niciuna încercați {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -or [string]::IsNullOrEmpty($baseBoard.Manufacturer)) {         Write-Warning "Imposibil de regăsit producătorul plăcii de bază"         $baseBoardManufacturer = "Necunoscut"     } altfel, {         $baseBoardManufacturer = $baseBoard.Manufacturer     }     Write-Host "Producător tablă de bază: $baseBoardManufacturer" } captură {     # CIM poate eșua - baseboard info este suplimentar     $baseBoardManufacturer = "Necunoscut"     Write-Host "Producător placă de bază: $baseBoardManufacturer" }

# 29. BaseBoardProduct # PS Versiune: 3.0+ (utilizarea Get-WmiObject pentru 2.0) | Admin: Nu | Cerințe de sistem: Niciuna încercați {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -or [string]::IsNullOrEmpty($baseBoard.Product)) {         Write-Warning "Imposibil de regăsit produsul din tabla de bază"         $baseBoardProduct = "Necunoscut"     } altfel, {         $baseBoardProduct = $baseBoard.Produs     }     Write-Host "Produs tablă de bază: $baseBoardProduct" } captură {     # CIM poate eșua - baseboard info este suplimentar     $baseBoardProduct = "Necunoscut"     Write-Host "Produs tablă de bază: $baseBoardProduct" }

# 30. SecureBootTaskEnabled # PS Versiune: Toate | Admin: Nu | Cerințe de sistem: Activitatea planificată există # Verifică dacă activitatea programată Secure-Boot-Update este activată $secureBootTaskEnabled = $null $secureBootTaskStatus = "Necunoscut" încercați {     $taskOutput = schtasks.exe /Query /TN "\Microsoft\Windows\PI\Secure-Boot-Update" /FO CSV 2>&1     dacă ($LASTEXITCODE -eq 0) {         $taskData = $taskOutput | ConvertFrom-Csv         dacă ($taskData) {             $secureBootTaskStatus = $taskData.Status             $secureBootTaskEnabled = ($taskData.Status -eq 'Ready' -sau $taskData.Status -eq 'Running')         }     } altfel, {         $secureBootTaskStatus = "NotFound"         $secureBootTaskEnabled = $false     }     dacă ($secureBootTaskEnabled -eq $false) {         Write-Host "Actualizare SecureBoot Activitate: $secureBootTaskStatus (Activat: $secureBootTaskEnabled)" -Culoare prim plan galben     } altfel, {         Write-Host "Actualizare SecureBoot Activitate: $secureBootTaskStatus (activat: $secureBootTaskEnabled)" -Culoare prim plan verde     } } captură {     $secureBootTaskStatus = "Eroare"     $secureBootTaskEnabled = $false     Write-Host "SecureBoot Update Task: Error checking - $_" -ForegroundColor Red }

# 31. Stare cheie WinCS (F33E0C8E002 - Actualizare certificat de bootare securizată) # PS Versiune: Toate | Admin: Da (pentru interogare) | Cerințe de sistem: WinCsFlags.exe $wincsKeyApplied = $null $wincsKeyStatus = "Necunoscut" încercați {     # Verificați locațiile comune pentru WinCsFlags.exe     $wincsFlagsPath = $null     $possiblePaths = @(         "$env:SystemRoot\System32\WinCsFlags.exe",         "$env:SystemRoot\SysWOW64\WinCsFlags.exe"     )     foreach ($p în $possiblePaths) {         if (Test-Path $p) { $wincsFlagsPath = $p; break }     }     dacă ($wincsFlagsPath) {         # Cheie specifică interogării - necesită drepturi de administrator         $queryOutput = & $wincsFlagsPath /query - F33E0C8E002 cheie 2>&1         $queryOutputStr = $queryOutput -join "'n"         dacă ($LASTEXITCODE -eq 0) {             # Verificați dacă este aplicată tasta (căutați "Configurare activă" sau un indicator similar)             dacă ($queryOutputStr -se potrivesc cu "Configurare activă.*:.*activat" -sau $queryOutputStr -se potrivesc cu "Configurare.*aplicat") {                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Aplicat"                 Write-Host "F33E0C8E002 cheie WinCS: Applied" -Prim planColor - Verde             } elseif ($queryOutputStr -potrivire "negăsit|Nicio configurație") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "Neaplicat"                 Write-Host "F33E0C8E002 cheie WinCS: Neaplicat" -Culoare prim plan galben             } altfel, {                 # Cheia există - verificați ieșirea pentru stare                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Aplicat"                 Write-Host "F33E0C8E002 cheie WinCS: Applied" -Prim planColor - Verde             }         } altfel, {             # Verificați dacă există mesaje de eroare specifice             dacă ($queryOutputStr se potrivesc cu "Acces refuzat|administrator") {                 $wincsKeyStatus = "AccessDenied"                 Write-Host "F33E0C8E002 cheie WinCS: Acces refuzat (rulați ca administrator)" -Prim-planColor DarkGray             } elseif ($queryOutputStr -potrivire "negăsit|Nicio configurație") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "Neaplicat"                 Write-Host "F33E0C8E002 cheie WinCS: Neaplicat" -Culoare prim plan galben             } altfel, {                 $wincsKeyStatus = "QueryFailed"                 Write-Host "F33E0C8E002 cheie WinCS: Interogare nereușită" -Culoare prim plan roșu             }         }     } altfel, {         $wincsKeyStatus = "WinCsFlagsNotFound"         Write-Host "F33E0C8E002 cheie WinCS: WinCsFlags.exe negăsit" -Culoare prim plan gri     } } captură {     $wincsKeyStatus = "Eroare"     Write-Host "F33E0C8E002 cheie WinCS: Verificare erori - $_" -Prim-planColor roșu }              

Nr. ============================================================================= # Detectare remediere - ieșire stare & Cod de ieșire # =============================================================================

# Build status object from all collected inventory data $status = [ordonat]@{     UEFICA2023Status = $uefica 2023Status     UEFICA2023Eroare = $uefica 2023Eroare     UEFICA2023ErrorEvent = $uefica 2023ErrorEvent     AvailableUpdates = dacă ($null -ne $availableUpdates) { $availableUpdatesHex } altcineva { $null }     AvailableUpdatesPolicy = dacă ($null -ne $availableUpdatesPolicy) { $availableUpdatesPolicyHex } altcineva { $null }     Hostname = $hostname     CollectionTime = dacă ($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 = dacă ($canAttemptUpdateAfter -is [datetime]) { $canAttemptUpdateAfter.ToString("o") } else { "$canAttemptUpdateAfter" }     LatestEventId = $latestEventId     BucketId = $bucketId     Încredere = $confidence     SkipReasonKnownIssue = numărul $skipReasonKnownIssue # KI_<> din SkipReason în evenimentul BucketId     Event1801Count = $event 1801Count     Event1808Count = $event 1808Count     # Evenimente de eroare cu detalii capturate     Eveniment1795Count = $event 1795Count # Eroare de firmware returnată     Event1795ErrorCode = $event 1795ErrorCode # Codul de eroare din firmware     Event1796Count = $event 1796Count # Codul de eroare înregistrat     Event1796ErrorCode = $event 1796ErrorCode # Codul de eroare capturat     Event1800Count = $event 1800Count # Repornire necesară (NU este o eroare)     RebootPending = $rebootPending # True dacă evenimentul 1800 este prezent     Event1802Count = $event 1802Count # Problemă de firmware cunoscută     KnownIssueId = $knownIssueId # KI_<> numărului din SkipReason     Event1803Count = $event 1803Count # Actualizare KEK lipsă     MissingKEK = $missingKEK # OEM trebuie să furnizeze KEK semnat PK     OSVersion = $osVersion     LastBootTime = if ($lastBootTime -is [datetime]) { $lastBootTime.ToString("o") } else { "$lastBootTime" }     BaseBoardManufacturer = $baseBoardManufacturer     BaseBoardProduct = $baseBoardProduct     SecureBootTaskEnabled = $secureBootTaskEnabled     SecureBootTaskStatus = $secureBootTaskStatus     WinCSKeyApplied = $wincsKeyApplied # True dacă se aplică F33E0C8E002 cheie     WinCSKeyStatus = $wincsKeyStatus # Aplicat, NotApplied, WinCsFlagsNotFound etc. }

# Ieșire stare - Pentru agregarea datelor $jsonOutput = $status | ConvertTo-Json - Comprimare

# Dacă s-a furnizat OutputPath, salvați în fișier; în caz contrar, ieșire la ieșire if (-not [string]::IsNullOrEmpty($OutputPath)) {     # Validați OutputPath - omiteți dacă arată ca o solicitare de ajutor sau dacă are caractere nevalide     dacă ($OutputPath -match '^[/\-]' -sau $OutputPath -match '[<>:"|? *]') {         Write-Host "Cale de ieșire nevalidă specificată, ieșire la stdout" -Culoare prim plan galben         Write-Output $jsonOutput         dacă ($secureBootEnabled -and $uefica 2023Status -eq "Actualizat") { exit 0 } else { exit 1 }     }          # Asigurați-vă că folderul de ieșire există     if (-not (Test-Path $OutputPath)) {         încercați {             New-Item -ItemType Directory -Path $OutputPath -Force | Nul în exterior         } captură {             Write-Warning "Imposibil de creat folderul de ieșire: $OutputPath - $_"         }     }          # Salvare în HOSTNAME_latest.json     $outputFile = Join-Path $OutputPath "$($hostname)_latest.json"     încercați {         $jsonOutput | Out-File -FilePath $outputFile -codificare UTF8 -Force         Write-Host "JSON salvat în: $outputFile" -Prim planColor Verde     } captură {         Write-Warning "Imposibil de scris în fișierul: $outputFile - $_"         # Fall back to stdout         Write-Output $jsonOutput     } } altfel, {     # Comportamentul original - ieșire la stdout     Write-Output $jsonOutput }

# Cod de ieșire: "Actualizat" este valoarea de succes pe playbook dacă ($secureBootEnabled -și $uefica 2023Status -eq "Actualizat") {     exit 0 # Fără problemă } altfel, {     exit 1 # Cu problema }

Aveți nevoie de ajutor suplimentar?

Doriți mai multe opțiuni?

Explorați avantajele abonamentului, navigați prin cursurile de instruire, aflați cum să vă securizați dispozitivul și multe altele.