Izvorni datum objave: 17. studenog 2025.
KB ID: 5072718
|
Promjena datuma |
Promjena opisa |
|
Veljača 24, 2026 |
|
|
Veljača 22, 2026 |
|
|
Veljača 13, 2026 |
|
Sample Secure Boot Inventory Data Collection script
Kopirajte i zalijepite tu oglednu skriptu i po potrebi izmijenite za svoje okruženje: skriptu zbirke podataka o oglednim inventarom sigurnog pokretanja.
< broj . SINOPSIS Otkriva status ažuriranja certifikata sigurnog pokretanja za nadzor na razini cijele flote.
. OPIS Ova skripta otkrivanja prikuplja status sigurnog pokretanja, vrijednosti registra za ažuriranje certifikata, i informacije o uređaju. Daje JSON niz za praćenje i izvješćivanje.
Kompatibilno s Intune popravke, prikupljanje utemeljeno na GPO-u i druge alate za upravljanje.Nije potrebna skripta popravka – to je samo nadzor.
Izlaz 0 = "Bez problema" (certifikati su ažurirani) Izlaz 1 = "S problemom" (certifikati nisu ažurirani – samo informativni)
. PARAMETAR OutputPath Neobavezno. Put do mape u koju će se spremiti JSON datoteka.Ako je naveden, sprema HOSTNAME_latest.json u ovu mapu.Ako nije navedeno, izlaz JSON u stdout (izvorno ponašanje).
. PRIMJER # Izlaz u stdout (Intune/SCCM otkrivanje) .\Detect-SecureBootCertUpdateStatus.ps1
. PRIMJER # Spremi u zajednički mrežni sadržaj (implementacija GPO-a) .\Detect-SecureBootCertUpdateStatus.ps1 -OutputPath "\\server\SecureBootLogs$"
. BILJEŠKE Putovi registra po 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 IMPLICIRANA, UKLJUČUJUĆI, ALI NE OGRANIČAVAJUĆI SE NA JAMSTVA PRIKLADNOSTI ZA PRIKLADNOSTI ZA ODREĐENU SVRHU I NEINFRINGEMENT. NI U KOJEM SLUČAJU AUTORI ILI NOSITELJI AUTORSKIH PRAVA BIT ĆE ODGOVORNOSTI, BEZ OBZIRA NA TO RADI LI SE O RADNJAMA UGOVORA, IZVAN SOFTVERA ILI U VEZI SA SOFTVEROM ILI KORIŠTENJEM ILI DRUGIM POSLOVIMA U SOFTVER.#> param( [Parameter(Mandatory = $false)] [niz]$OutputPath )
# DOWNLOAD URL: https://aka.ms/getsecureboot -> "Deployment and Monitoring Samples" # Napomena: ova skripta pokreće se na krajnjim točkama radi prikupljanja podataka o statusu sigurnog pokretanja.
# 1. Hostname # PS verzija: Sve | Administrator: Ne | Sistemski preduvjeti: nema pokušajte { $hostname = $env:COMPUTERNAME if ([niz]::IsNullOrEmpty($hostname)) { Write-Warning "Nije moguće odrediti naziv glavnog računala" $hostname = "Nepoznato" } Write-Host "Naziv glavnog računala: $hostname" } uhvatiti { Write-Warning "Pogreška pri dohvaćanju naziva glavnog računala: $_" $hostname = "Pogreška" Write-Host "Naziv glavnog računala: $hostname" }
# 2. Vrijeme zbirke # PS verzija: Sve | Administrator: Ne | Sistemski preduvjeti: nema pokušajte { $collectionTime = Get-Date if ($null -eq $collectionTime) { Write-Warning "Nije moguće dohvatiti trenutni datum/vrijeme" $collectionTime = "Nepoznato" } Write-Host "Vrijeme prikupljanja: $collectionTime" } uhvatiti { Write-Warning "Pogreška pri dohvaćanju datuma/vremena: $_" $collectionTime = "Pogreška" Write-Host "Vrijeme prikupljanja: $collectionTime" }
# Registry: Glavni ključ sigurnog pokretanja (3 vrijednosti)
# 3. SecureBootEnabled # PS verzija: 3.0+ | Administrator: Možda je potrebno | Sistemski preduvjeti: sustav koji podržava UEFI/Secure Boot pokušajte { $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop Write-Host "Omogućeno je sigurno pokretanje: $secureBootEnabled" } uhvatiti { Write-Warning "Nije moguće odrediti status sigurnog pokretanja putem cmdleta: $_" # Isprobajte rezervni registar pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop $secureBootEnabled = [bool]$regValue.UEFISecureBootEnabled Write-Host "Omogućeno je sigurno pokretanje: $secureBootEnabled" } uhvatiti { Write-Warning "Nije moguće odrediti status sigurnog pokretanja putem registra. Sustav možda ne podržava UEFI/Secure Boot." $secureBootEnabled = $null Write-Host "Omogućeno je sigurno pokretanje: nije dostupno" } }
# 4. HighConfidenceOptOut # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop $highConfidenceOptOut = $regValue.HighConfidenceOptOut Write-Host "Odustajanje od visoke pouzdanosti: $highConfidenceOptOut" } uhvatiti { # HighConfidenceOptOut nije obavezan – ne postoji na većini sustava $highConfidenceOptOut = $null Write-Host "Odustajanje od visoke pouzdanosti: nije postavljeno" }
# 4b. MicrosoftUpdateManagedOptIn # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name MicrosoftUpdateManagedOptIn -ErrorAction Stop $microsoftUpdateManagedOptIn = $regValue.MicrosoftUpdateManagedOptIn Write-Host "Microsoft Update Managed Opt In: $microsoftUpdateManagedOptIn" } uhvatiti { # MicrosoftUpdateManagedOptIn nije obavezan – ne postoji na većini sustava $microsoftUpdateManagedOptIn = $null Write-Host "Microsoft Update Managed Opt In: Not Set" }
# 5. Dostupniažuriranja # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop $availableUpdates = $regValue.AvailableUpdates if ($null -ne $availableUpdates) { # Pretvori u heksadecimalni oblik $availableUpdatesHex = "0x{0:X}" -f $availableUpdates Write-Host "Dostupno Ažuriranja: $availableUpdatesHex" } još { Write-Host "Dostupno Ažuriranja: nije dostupno" } } uhvatiti { Write-Warning "Ključ registra AvailableUpdates nije pronađen ili mu nije moguće pristupiti" $availableUpdates = $null Write-Host "Dostupno Ažuriranja: nije dostupno" }
# 5b. AvailableUpdatesPolicy (trajna vrijednost kontrolirana GPO-om) # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -put "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdatesPolicy -ErrorAction Stop $availableUpdatesPolicy = $regValue.AvailableUpdatesPolicy if ($null -ne $availableUpdatesPolicy) { # Pretvori u heksadecimalni oblik $availableUpdatesPolicyHex = "0x{0:X}" -f $availableUpdatesPolicy Write-Host "Dostupna Ažuriranja pravila: $availableUpdatesPolicyHex" } još { Write-Host "Dostupno Ažuriranja pravila: nije postavljeno" } } uhvatiti { # AvailableUpdatesPolicy nije obavezno – postavlja se samo kada se primjenjuje GPO $availableUpdatesPolicy = $null Write-Host "Dostupno Ažuriranja pravila: nije postavljeno" }
# Registar: servisni ključ (3 vrijednosti)
# 6. UEFICA2023Status # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $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" } uhvatiti { Write-Warning ključ registra "Windows UEFI CA 2023 Status nije pronađen ili nije dostupan" $uefica 2023Status = $null Write-Host "Windows UEFI CA 2023 Status: Not Available" }
# 7. UEFICA2023Pogreška # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop $uefica 2023Pogreška = $regValue.UEFICA2023Error Write-Host pogreška "UEFI CA 2023: $uefica 2023Error" } uhvatiti { # UEFICA2023Pogreška postoji samo ako je došlo do pogreške – izostanak je dobar $uefica 2023Pogreška = $null Write-Host pogreška "UEFI CA 2023: None" }
# 8. UEFICA2023ErrorEvent # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023ErrorEvent -ErrorAction Stop $uefica 2023ErrorEvent = $regValue.UEFICA2023ErrorEvent Write-Host "Događaj pogreške UEFI CA 2023: $uefica 2023ErrorEvent" } uhvatiti { $uefica 2023ErrorEvent = $null Write-Host "Događaj pogreške UEFI CA 2023: Nije dostupno" }
# Registar: Atributi uređaja (7 vrijednosti: 9-15)
# 9. OEMManufacturerName # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMManufacturerName -ErrorAction Stop $oemManufacturerName = $regValue.OEMManufacturerName if ([niz]::IsNullOrEmpty($oemManufacturerName)) { Write-Warning "OEMManufacturerName je prazan" $oemManufacturerName = "Nepoznato" } Write-Host "Naziv proizvođača OEM-a: $oemManufacturerName" } uhvatiti { Write-Warning ključ registra "OEMManufacturerName nije pronađen ili nije dostupan" $oemManufacturerName = $null Write-Host "Naziv proizvođača OEM-a: nije dostupno" }
# 10. OEMModelSystemFamily # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelSystemFamily -ErrorAction Stop $oemModelSystemFamily = $regValue.OEMModelSystemFamily if ([niz]::IsNullOrEmpty($oemModelSystemFamily)) { Write-Warning "OEMModelSystemFamily je prazan" $oemModelSystemFamily = "Nepoznato" } Write-Host "OEM Model System Family: $oemModelSystemFamily" } uhvatiti { Write-Warning ključ registra "OEMModelSystemFamily nije pronađen ili mu nije moguće pristupiti" $oemModelSystemFamily = $null Write-Host "OEM Model System Family: Not Available" }
# 11. OEMModelNumber # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelNumber -ErrorAction Stop $oemModelNumber = $regValue.OEMModelNumber if ([niz]::IsNullOrEmpty($oemModelNumber)) { Write-Warning "OEMModelNumber je prazan" $oemModelNumber = "Nepoznato" } Write-Host "OEM broj modela: $oemModelNumber" } uhvatiti { Write-Warning "Ključ registra OEMModelNumber nije pronađen ili mu nije moguće pristupiti" $oemModelNumber = $null Write-Host "Broj modela OEM-a: nije dostupno" }
# 12. FirmwareVersion # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareVersion -ErrorAction Stop $firmwareVersion = $regValue.FirmwareVersion if ([niz]::IsNullOrEmpty($firmwareVersion)) { Write-Warning "FirmwareVersion je prazan" $firmwareVersion = "Nepoznato" } Write-Host "Verzija opreme: $firmwareVersion" } uhvatiti { Write-Warning "Ključ registra FirmwareVersion nije pronađen ili nije dostupan" $firmwareVersion = $null Write-Host "Verzija opreme: nije dostupno" }
# 13. FirmwareReleaseDate # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareReleaseDate -ErrorAction Stop $firmwareReleaseDate = $regValue.FirmwareReleaseDate if ([niz]::IsNullOrEmpty($firmwareReleaseDate)) { Write-Warning "FirmwareReleaseDate is empty" $firmwareReleaseDate = "Nepoznato" } Write-Host "Datum izdavanja opreme: $firmwareReleaseDate" } uhvatiti { Write-Warning ključ registra "FirmwareReleaseDate nije pronađen ili mu nije moguće pristupiti" $firmwareReleaseDate = $null Write-Host "Datum izdavanja opreme: nije dostupno" }
# 14. OSArchitecture # PS verzija: Sve | Administrator: Ne | Sistemski preduvjeti: nema pokušajte { $osArchitecture = $env:PROCESSOR_ARCHITECTURE if ([niz]::IsNullOrEmpty($osArchitecture)) { # Isprobajte rezervni registar $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OSArchitecture -ErrorAction Stop $osArchitecture = $regValue.OSArchitecture } if ([niz]::IsNullOrEmpty($osArchitecture)) { Write-Warning "OSArchitecture nije moguće utvrditi" $osArchitecture = "Nepoznato" } Write-Host "Arhitektura OS-a: $osArchitecture" } uhvatiti { Write-Warning "Pogreška pri dohvaćanju OSArchitecture: $_" $osArchitecture = "Nepoznato" Write-Host "Arhitektura OS-a: $osArchitecture" }
# 15. CanAttemptUpdateAfter (FILETIME) # PS verzija: Sve | Administrator: Možda je potrebno | Sistemski preduvjeti: nema pokušajte { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter # Pretvori FILETIME u UTC DateTime – pohranjuje se u registar kao REG_BINARY (bajt[]) ili REG_QWORD (dugo) if ($null -ne $canAttemptUpdateAfter) { pokušajte { if ($canAttemptUpdateAfter -is [bajt[]]) { $fileTime = [BitConverter]::ToInt64($canAttemptUpdateAfter, 0) $canAttemptUpdateAfter = [DateTime]::FromFileTime($fileTime). ToUniversalTime() } elseif ($canAttemptUpdateAfter -is [long]) { $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter). ToUniversalTime() } } uhvatiti { Write-Warning "Nije moguće pretvoriti CanAttemptUpdateAfter FILETIME u DateTime" } } Write-Host "Može pokušati ažurirati nakon: $canAttemptUpdateAfter" } uhvatiti { Write-Warning "Ključ registra CanAttemptUpdateAfter nije pronađen ili mu nije moguće pristupiti" $canAttemptUpdateAfter = $null Write-Host "Može pokušati ažurirati nakon: nije dostupno" }
# Zapisnici događaja: zapisnik sustava (10 vrijednosti: 16-25)
# 16-25. Upiti zapisnika događaja # ID-ovi događaja: # 1801 – ažuriranje je pokrenuto, potrebno je ponovno pokretanje # 1808 – ažuriranje je uspješno dovršeno # 1795 – pogreška vraćene opreme (kod pogreške snimanja) # 1796 – pogreška zabilježena s kodom pogreške (kod za snimanje) # 1800 – potrebno je ponovno pokretanje (NIJE pogreška – ažuriranje će se nastaviti nakon ponovnog pokretanja) # 1802 – ažuriranje je blokirao poznati problem s programom (KI_<broj> iz skipReason) # 1803 – odgovarajuće KEK ažuriranje nije pronađeno (OEM treba dostaviti PK potpisano KEK) # PS verzija: 3.0+ | Administrator: Možda će biti potrebno za zapisnik sustava | Sistemski preduvjeti: nema pokušajte { # Upit za sve relevantne ID-ove događaja sigurnog pokretanja $allEventIds = @(1795, 1796, 1800, 1801, 1802, 1803, 1808) $events = @(Get-WinEvent -FilterHashtable @{LogName='Sustav'; ID=$allEventIds} -MaxEvents 50 -ErrorAction Stop)
ako ($events. Count -eq 0) { Write-Warning "U zapisniku sustava nije pronađen nijedan događaj sigurnog pokretanja" $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 "ID najnovijeg događaja: nije dostupno" Write-Host "ID grupe: nije dostupno" Write-Host "Pouzdanost: nije dostupno" Write-Host "Događaj 1801 Broj: 0" Write-Host "Događaj 1808 Broj: 0" } još { # 16. LatestEventId $latestEvent = $events | Sort-Object TimeCreated -Descending | Select-Object - Prvi 1 if ($null -eq $latestEvent) { Write-Warning "Nije moguće odrediti najnoviji događaj" $latestEventId = $null Write-Host "ID najnovijeg događaja: nije dostupno" } još { $latestEventId = $latestEvent.Id Write-Host "ID najnovijeg događaja: $latestEventId" }
# 17. BucketID – izdvojeno iz događaja 1801/1808 if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) { if ($latestEvent.Message -match 'BucketId:\s*(.+)') { $bucketId = $matches[1]. Skraćivanje() Write-Host "ID grupe: $bucketId" } još { Write-Warning "BucketId nije pronađen u poruci događaja" $bucketId = $null Write-Host "ID grupe: nije pronađeno u događaju" } } još { Write-Warning "Najnoviji događaj ili poruka ima vrijednost null, ne može izdvojiti BucketId" $bucketId = $null Write-Host "ID grupe: nije dostupno" }
# 18. Confidence – izdvojeno iz događaja 1801/1808 if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) { if ($latestEvent.Message -match 'BucketConfidenceLevel:\s*(.+)') { $confidence = $matches[1]. Skraćivanje() Write-Host "Pouzdanost: $confidence" } još { Write-Warning "Razina pouzdanosti nije pronađena u poruci događaja" $confidence = $null Write-Host "Pouzdanost: nije pronađeno u događaju" } } još { Write-Warning "Najnoviji događaj ili poruka ima vrijednost null, ne može izdvojiti pouzdanost" $confidence = $null Write-Host "Pouzdanost: nije dostupno" }
#18b. SkipReason – izdvajanje KI_<broj> iz funkcije SkipReason u istom događaju kao BucketId # Time se snima ID-ovi poznatih problema koji se pojavljuju uz BucketId/Confidence (ne samo događaj 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 poznati problem: $skipReasonKnownIssue" -Boja prednjeg plana Žuta } }
# 19. Događaj1801Count $event 1801Array = @($events | Where-Object {$_. Id -eq 1801}) $event 1801Count = $event 1801Array.Count Write-Host "Broj događaja 1801: $event 1801Count"
# 20. Event1808Count $event 1808Array = @($events | Where-Object {$_. Id -eq 1808}) $event 1808Count = $event 1808Array.Count Write-Host "Broj događaja 1808: $event 1808Count" # Inicijaliziraj varijable događaja pogreške $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 # Samo provjerite ima li događaja pogreške ako ažuriranje NIJE dovršeno # Preskoči analizu pogrešaka ako: 1808 je najnoviji događaj ILI UEFICA2023Status je "Ažurirano" $updateComplete = ($latestEventId -eq 1808) -or ($uefica 2023Status -eq "Ažurirano") if (-not $updateComplete) { Write-Host "Ažuriranje nije dovršeno – provjera događaja pogrešaka..." - Boja prednjeg plana Žuta # 21. Event1795 – pogreška opreme (kod pogreške snimanja) $event 1795Array = @($events | Where-Object {$_. Id -eq 1795}) $event 1795Count = $event 1795Array.Count if ($event 1795Count -gt 0) { $latestEvent 1795 = $event 1795Array | Sort-Object TimeCreated -Descending | Select-Object - Prvi 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 broj događaja 1795 (pogreška opreme): $event 1795Count" $(ako ($event 1795ErrorCode) { "Kod: $event 1795ErrorCode" }) } # 22. Event1796 – zapisan kôd pogreške (kod pogreške snimanja) $event 1796Array = @($events | Where-Object {$_. Id -eq 1796}) $event 1796Count = $event 1796Array.Count if ($event 1796Count -gt 0) { $latestEvent 1796 = $event 1796Array | Sort-Object TimeCreated -Descending | Select-Object - Prvi 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 broj "Događaj 1796 (zapisana pogreška): $event 1796Count" $(ako ($event 1796ErrorCode) { "Kod: $event 1796ErrorCode" }) } # 23. Event1800 – potrebno je ponovno pokretanje (NIJE pogreška – ažuriranje će se nastaviti nakon ponovnog pokretanja) $event 1800Array = @($events | Where-Object {$_. ID -eq 1800}) $event 1800Count = $event 1800Array.Count $rebootPending = $event 1800Count -gt 0 if ($rebootPending) { Write-Host "Događaj 1800 (na čekanju ponovnog pokretanja): ažuriranje će se nastaviti nakon ponovnog pokretanja" -ForegroundColor Cyan } # 24. Event1802 – poznati problem s programom (snimanje KI_<broj> iz skipReason) $event 1802Array = @($events | Where-Object {$_. Id -eq 1802}) $event 1802Count = $event 1802Array.Count if ($event 1802Count -gt 0) { $latestEvent 1802 = $event 1802Array | Sort-Object TimeCreated -Descending | Select-Object - Prvi 1 if ($latestEvent 1802.Message -match 'SkipReason:\s*(KI_\d+)') { $knownIssueId = $matches[1] } Write-Host broj "Događaj 1802 (poznati problem s programom): $event 1802Count" $(ako ($knownIssueId) { "KI: $knownIssueId" }) } # 25. Event1803 – nedostaje KEK ažuriranje (OEM treba dostaviti PK potpisani KEK) $event 1803Array = @($events | Where-Object {$_. Id -eq 1803}) $event 1803Count = $event 1803Array.Count $missingKEK = $event 1803Count -gt 0 if ($missingKEK) { Write-Host "Događaj 1803 (nedostaje KEK): OEM treba dostaviti PK potpisan KEK" -ForegroundColor Yellow } } još { Write-Host "Ažuriranje je dovršeno (događaj 1808 ili status=ažurirano) – preskače se analiza pogrešaka" -ForegroundColor Green } } } uhvatiti { Write-Warning "Pogreška pri dohvaćanju zapisnika događaja. Možda će biti potrebne administratorske ovlasti: $_" $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 "ID najnovijeg događaja: pogreška" Write-Host "ID grupe: pogreška" Write-Host "Pouzdanost: pogreška" Write-Host "Događaj 1801 Broj: 0" Write-Host "Događaj 1808 Broj: 0" }
# WMI/CIM upiti (5 vrijednosti)
# 26. OSVersion # PS verzija: 3.0+ (koristite Get-WmiObject za 2.0) | Administrator: Ne | Sistemski preduvjeti: nema pokušajte { $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop if ($null -eq $osInfo -or [string]::IsNullOrEmpty($osInfo.Version)) { Write-Warning "Nije moguće dohvatiti verziju OS-a" $osVersion = "Nepoznato" } još { $osVersion = $osInfo.version } Write-Host "Verzija OS-a: $osVersion" } uhvatiti { # CIM možda neće uspjeti u nekim okruženjima – koristite rezervni $osVersion = [System.Environment]::OSVersion.Version.ToString() if ([niz]::IsNullOrEmpty($osVersion)) { $osVersion = "Nepoznato" } Write-Host "Verzija OS-a: $osVersion" }
# 27. LastBootTime # PS verzija: 3.0+ (koristite Get-WmiObject za 2.0) | Administrator: Ne | Sistemski preduvjeti: nema pokušajte { $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop if ($null -eq $osInfo -or $null -eq $osInfo.LastBootUpTime) { Write-Warning "Nije moguće dohvatiti vrijeme zadnjeg pokretanja" $lastBootTime = $null Write-Host "Vrijeme zadnjeg pokretanja: nije dostupno" } još { $lastBootTime = $osInfo.LastBootUpTime Write-Host "Vrijeme zadnjeg pokretanja: $lastBootTime" } } uhvatiti { # CIM možda neće uspjeti u nekim okruženjima – koristite rezervni pokušajte { $lastBootTime = (Get-Process -ID 0 -ErrorAction SilentlyContinue). Vrijeme početka } uhvatiti { $lastBootTime = $null } if ($lastBootTime) { Write-Host "Last Boot Time: $lastBootTime" } else { Write-Host "Last Boot Time: Not Available" } }
# 28. BaseBoardManufacturer # PS verzija: 3.0+ (koristite Get-WmiObject za 2.0) | Administrator: Ne | Sistemski preduvjeti: nema pokušajte { $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop if ($null -eq $baseBoard -or [string]::IsNullOrEmpty($baseBoard.Manufacturer)) { Write-Warning "Nije moguće dohvatiti proizvođača osnovne ploče" $baseBoardManufacturer = "Nepoznato" } još { $baseBoardManufacturer = $baseBoard.Manufacturer } Write-Host "Proizvođač osnovne ploče: $baseBoardManufacturer" } uhvatiti { # CIM may fail - baseboard info is supplementary $baseBoardManufacturer = "Nepoznato" Write-Host "Proizvođač osnovne ploče: $baseBoardManufacturer" }
# 29. BaseBoardProduct # PS verzija: 3.0+ (koristite Get-WmiObject za 2.0) | Administrator: Ne | Sistemski preduvjeti: nema pokušajte { $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop if ($null -eq $baseBoard -or [string]::IsNullOrEmpty($baseBoard.Product)) { Write-Warning "Nije moguće dohvatiti proizvod osnovne ploče" $baseBoardProduct = "Nepoznato" } još { $baseBoardProduct = $baseBoard.Product } Write-Host "Baseboard Product: $baseBoardProduct" } uhvatiti { # CIM may fail - baseboard info is supplementary $baseBoardProduct = "Nepoznato" Write-Host "Osnovni proizvod: $baseBoardProduct" }
# 30. SecureBootTaskEnabled # PS verzija: Sve | Administrator: Ne | Sistemski preduvjeti: postoji zakazani zadatak # Provjerava je li omogućen zakazani zadatak sigurnog pokretanja $secureBootTaskEnabled = $null $secureBootTaskStatus = "Nepoznato" pokušajte { $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 'Ready' -or $taskData.Status -eq 'Running') } } još { $secureBootTaskStatus = "NotFound" $secureBootTaskEnabled = $false } if ($secureBootTaskEnabled -eq $false) { Write-Host "Zadatak ažuriranja SecureBoota: $secureBootTaskStatus (omogućeno: $secureBootTaskEnabled)" -ForegroundColor Yellow } još { Write-Host "Zadatak ažuriranja SecureBoota: $secureBootTaskStatus (omogućeno: $secureBootTaskEnabled)" -ForegroundColor Green } } uhvatiti { $secureBootTaskStatus = "Pogreška" $secureBootTaskEnabled = $false Write-Host "Zadatak ažuriranja SecureBoota: Provjera pogrešaka - $_" - Crveni prednji plan }
# 31. Status ključa za WinCS (F33E0C8E002 – ažuriranje certifikata za sigurno pokretanje) # PS verzija: Sve | Administrator: Da (za upit) | Sistemski preduvjeti: WinCsFlags.exe $wincsKeyApplied = $null $wincsKeyStatus = "Nepoznato" pokušajte { # Provjerite uobičajena mjesta za WinCsFlags.exe $wincsFlagsPath = $null $possiblePaths = @( "$env:SystemRoot\System32\WinCsFlags.exe", "$env:SystemRoot\SysWOW64\WinCsFlags.exe" ) foreach ($p u $possiblePaths) { if (Test-Path $p) { $wincsFlagsPath = $p; break } } if ($wincsFlagsPath) { # Ključ specifičan za upit – potrebna su administratorska prava $queryOutput = & $wincsFlagsPath /query --key F33E0C8E002 2>&1 $queryOutputStr = $queryOutput -join "'n" if ($LASTEXITCODE -eq 0) { # Provjerite je li primijenjen ključ (potražite "Aktivna konfiguracija" ili sličan pokazatelj) if ($queryOutputStr -match "Active Configuration.*:.*enabled" -or $queryOutputStr -match "Configuration.*applied") { $wincsKeyApplied = $true $wincsKeyStatus = "Primijenjeno" Write-Host "WinCS Key F33E0C8E002: Applied" -ForegroundColor Green } elseif ($queryOutputStr -match "nije pronađeno|Nema konfiguracije") { $wincsKeyApplied = $false $wincsKeyStatus = "Nije isporučeno" Write-Host "WinCS Key F33E0C8E002: Not Applied" -ForegroundColor Yellow } još { # Ključ postoji - provjerite stanje izlaza $wincsKeyApplied = $true $wincsKeyStatus = "Primijenjeno" Write-Host "WinCS Key F33E0C8E002: Applied" -ForegroundColor Green } } još { # Provjerite postoje li određene poruke o pogreškama if ($queryOutputStr -match "Pristup je odbijen|administrator") { $wincsKeyStatus = "AccessDenied" Write-Host "WinCS Key F33E0C8E002: Access denied (run as admin)" -ForegroundColor DarkGray } elseif ($queryOutputStr -match "nije pronađeno|Nema konfiguracije") { $wincsKeyApplied = $false $wincsKeyStatus = "Nije isporučeno" Write-Host "WinCS Key F33E0C8E002: Not Applied" -ForegroundColor Yellow } još { $wincsKeyStatus = "QueryFailed" Write-Host "WinCS Key F33E0C8E002: Query failed" -ForegroundColor Red } } } još { $wincsKeyStatus = "WinCsFlagsNotFound" Write-Host "WinCS key F33E0C8E002: WinCsFlags.exe found" -ForegroundColor Gray } } uhvatiti { $wincsKeyStatus = "Pogreška" Write-Host "WinCS Key F33E0C8E002: Error checking - $_" -ForegroundColor Red }
Ne, ne============================================================================= # Otkrivanje popravka – izlazni status & izlaznog koda # =============================================================================
# Objekt statusa međuverzije iz svih prikupljenih podataka o inventaru $status = [naručeno]@{ UEFICA2023Status = $uefica 2023Status UEFICA2023Error = $uefica 2023Error UEFICA2023ErrorEvent = $uefica 2023ErrorEvent AvailableUpdates = ako ($null -ne $availableUpdates) { $availableUpdatesHex } još { $null } AvailableUpdatesPolicy = ako ($null -ne $availableUpdatesPolicy) { $availableUpdatesPolicyHex } još { $null } Naziv glavnog računala = $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 Pouzdanost = $confidence SkipReasonKnownIssue = $skipReasonKnownIssue # KI_<broj> iz skipReason u događaju BucketId Event1801Count = $event 1801Count Event1808Count = $event 1808Count # Događaji pogreške sa snimljenim detaljima Event1795Count = $event 1795Count # Pogreška firmvera Event1795ErrorCode = $event 1795ErrorCode # kôd pogreške iz programske opreme Event1796Count = $event 1796Count # Kod pogreške prijavljen Event1796ErrorCode = $event 1796ErrorCode # Snimljen kôd pogreške Event1800Count = $event 1800Count # Potrebno je ponovno pokretanje (NIJE pogreška) RebootPending = $rebootPending # True ako događaj 1800 postoji Event1802Count = $event 1802Count # Poznati problem s firmverom KnownIssueId = $knownIssueId # KI_<broj> iz skipReasona Event1803Count = $event 1803Count # Nedostaje AŽURIRANJE KEK MissingKEK = $missingKEK # OEM treba dostaviti PK potpisan KEK OSVersion = $osVersion LastBootTime = if ($lastBootTime -is [datetime]) { $lastBootTime.ToString("o") } else { "$lastBootTime" } BaseBoardManufacturer = $baseBoardManufacturer BaseBoardProduct = $baseBoardProduct SecureBootTaskEnabled = $secureBootTaskEnabled SecureBootTaskStatus = $secureBootTaskStatus WinCSKeyApplied = $wincsKeyApplied # True ako F33E0C8E002 se primijeni tipka WinCSKeyStatus = $wincsKeyStatus # Applied, NotApplied, WinCsFlagsNotFound itd. }
# Izlazni status – za prikupljanje podataka $jsonOutput = $status | ConvertTo-Json -Compress
# Ako je outputPath naveden, spremi u datoteku; u suprotnom izlaz u stdout if (-not [string]::IsNullOrEmpty($OutputPath)) { # Validate OutputPath - skip if it looks like a help request or has invalid chars if ($OutputPath -match '^[/\-]' -or $OutputPath -match '[<>:"|? *]') ( Write-Host "Navedeni OutputPath nije valjan, izlaz u stdout" -Boja prednjeg plana Žuta Write-Output $jsonOutput if ($secureBootEnabled -and $uefica 2023Status -eq "Ažurirano") { exit 0 } else { exit 1 } } # Provjerite postoji li izlazna mapa if (-not (Test-Path $OutputPath)) { pokušajte { New-Item -ItemType Direktorij -Put $OutputPath -Force | Izlazna vrijednost -Null } uhvatiti { Write-Warning "Nije moguće stvoriti izlaznu mapu: $OutputPath - $_" } } # Spremi u HOSTNAME_latest.json $outputFile = Join-Path $OutputPath "$($hostname)_latest.json" pokušajte { $jsonOutput | Out-File -FilePath $outputFile -Encoding UTF8 -Force Write-Host "JSON spremljen u: $outputFile" -ForegroundColor Green } uhvatiti { Write-Warning "Nije moguće pisati u datoteku: $outputFile - $_" # Fall back to stdout Write-Output $jsonOutput } } još { # Izvorno ponašanje – izlaz u stdout Write-Output $jsonOutput }
# Izlazni kôd: "Ažurirano" je vrijednost uspjeha po knjizi za reprodukciju if ($secureBootEnabled -and $uefica 2023Status -eq "Ažurirano") { izlaz 0 # Bez problema } još { izlaz 1 # S problemom }