Berlaku Untuk
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

Tanggal penerbitan asli: 17 November 2025

ID KB: 5072718

Ubah tanggal

Ubah deskripsi

24 Februari 2026

  • Memperbarui sampel skrip Pengumpulan Data Inventori Boot Aman.

22 Februari 2026

  • Memperbarui sampel skrip Pengumpulan Data Inventori Boot Aman.

13 Februari 2026

  • Memperbarui sampel skrip Pengumpulan Data Inventori Boot Aman.

Sampel skrip Pengumpulan Data Inventori Boot Aman

Salin dan tempelkan contoh skrip ini dan ubah sesuai kebutuhan untuk lingkungan Anda: Sampel skrip Pengumpulan Data Boot Aman.

<# . SINOPSIS     Mendeteksi status pembaruan sertifikat Boot Aman untuk pemantauan seluruh armada.

. DESKRIPSI     Skrip deteksi ini mengumpulkan status Boot Aman, nilai registri pembaruan sertifikat,     dan informasi perangkat. Ini menghasilkan string JSON untuk pemantauan dan pelaporan.

    Kompatibel dengan Intune Remediations, koleksi berbasis GPO, dan alat manajemen lainnya.Tidak diperlukan skrip perbaikan — ini hanya memantau.

    Keluar 0 = "Tanpa masalah" (sertifikat diperbarui)     Keluar 1 = "Dengan masalah" (sertifikat tidak diperbarui — informasi saja)

. PARAMETER OutputPath     Opsional. Jalur ke folder tempat file JSON akan disimpan.Jika disediakan, menyimpan HOSTNAME_latest.json ke folder ini.Jika tidak disediakan, output JSON ke stdout (perilaku asli).

. CONTOH     # Output ke stdout (deteksi Intune/SCCM)     .\Detect-SecureBootCertUpdateStatus.ps1

. CONTOH     # Simpan ke berbagi jaringan (penyebaran GPO)     .\Detect-SecureBootCertUpdateStatus.ps1 -OutputPath "\\server\SecureBootLogs$"

. CATATAN     Jalur registri per https://aka.ms/securebootplaybook:       HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot       HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing

    PERANGKAT LUNAK INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA JAMINAN APA PUN, EXPRESS ATAU     TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN KELAYAKAN UNTUK DIPERDAGANGKAN,     KESESUAIAN UNTUK TUJUAN TERTENTU DAN PELANGGARAN. DALAM KEADAAN APA PUN,     PENULIS ATAU PEMEGANG HAK CIPTA BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN, ATAU     TANGGUNG JAWAB, BAIK DALAM SUATU TINDAKAN KONTRAK, KESALAHAN ATAU SEBALIKNYA, YANG TIMBUL DARI,     DARI ATAU SEHUBUNGAN DENGAN PERANGKAT LUNAK ATAU PENGGUNAAN ATAU PENAWARAN LAIN DALAM     PERANGKAT LUNAK.#> param(     [Parameter(Wajib = $false)]     [string]$OutputPath )

# Unduh URL: https://aka.ms/getsecureboot -> "Sampel Penyebaran dan Pemantauan" # Catatan: Skrip ini berjalan di titik akhir untuk mengumpulkan data status Boot Aman.

# 1. HostName # Versi PS: Semua | Admin: Tidak | Persyaratan Sistem: Tidak Ada coba {     $hostname = $env:COMPUTERNAME     if ([string]:::IsNullOrEmpty($hostname)) {         Write-Warning "Nama host tidak dapat ditentukan"         $hostname = "Tidak Diketahui"     }     Write-Host "Nama host: $hostname" } tangkap {     Write-Warning "Kesalahan mengambil nama host: $_"     $hostname = "Kesalahan"     Write-Host "Nama host: $hostname" }

# 2. CollectionTime # Versi PS: Semua | Admin: Tidak | Persyaratan Sistem: Tidak Ada coba {     $collectionTime = Get-Date     if ($null -eq $collectionTime) {         Write-Warning "Tidak dapat mengambil tanggal/waktu saat ini"         $collectionTime = "Tidak Diketahui"     }     Write-Host "Waktu Koleksi: $collectionTime" } tangkap {     Write-Warning "Kesalahan mengambil tanggal/waktu: $_"     $collectionTime = "Kesalahan"     Write-Host "Waktu Koleksi: $collectionTime" }

# Registri: Kunci Utama Boot Aman (3 nilai)

# 3. SecureBootEnabled # Versi PS: 3.0+ | Admin: Mungkin diperlukan | Persyaratan Sistem: UEFI/Sistem berkemampuan Boot Aman coba {     $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop     Write-Host "Secure Boot Enabled: $secureBootEnabled" } tangkap {     Write-Warning "Tidak dapat menentukan status Boot Aman melalui cmdlet: $_"     # Coba registri fallback     coba {         $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop         $secureBootEnabled = [bool]$regValue.UEFISecureBootEnabled         Write-Host "Boot Aman Diaktifkan: $secureBootEnabled"     } tangkap {         Write-Warning "Tidak dapat menentukan status Boot Aman melalui registri. Sistem mungkin tidak mendukung UEFI/Secure Boot."         $secureBootEnabled = $null         Write-Host "Boot Aman Diaktifkan: Tidak Tersedia"     } }

# 4. HighConfidenceOptOut # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop     $highConfidenceOptOut = $regValue.HighConfidenceOptOut     Write-Host "Kepercayaan Diri Tinggi Menolak: $highConfidenceOptOut" } tangkap {     # HighConfidenceOptOut bersifat opsional - tidak ada di sebagian besar sistem     $highConfidenceOptOut = $null     Write-Host "High Confidence Opt out: Not Set" }

# 4b. MicrosoftUpdateManagedOptIn # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name MicrosoftUpdateManagedOptIn -ErrorAction Stop     $microsoftUpdateManagedOptIn = $regValue.MicrosoftUpdateManagedOptIn     Write-Host "Microsoft Update Managed Opt In: $microsoftUpdateManagedOptIn" } tangkap {     # MicrosoftUpdateManagedOptIn bersifat opsional - tidak ada di sebagian besar sistem     $microsoftUpdateManagedOptIn = $null     Write-Host "Microsoft Update Managed Opt In: Not Set" }

# 5. AvailableUpdates # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop     $availableUpdates = $regValue.AvailableUpdates     if ($null -ne $availableUpdates) {         # Konversi ke format heksadesimal         $availableUpdatesHex = "0x{0:X}" -f $availableUpdates         Write-Host "Updates tersedia: $availableUpdatesHex"     } lain {         Write-Host "Updates tersedia: Tidak Tersedia"     } } tangkap {     Write-Warning "AvailableUpdates kunci registri tidak ditemukan atau tidak dapat diakses"     $availableUpdates = $null     Write-Host "Updates tersedia: Tidak Tersedia" }

# 5b. AvailableUpdatesPolicy (nilai persisten terkontrol GPO) # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdatesPolicy -ErrorAction Stop     $availableUpdatesPolicy = $regValue.AvailableUpdatesPolicy     if ($null -ne $availableUpdatesPolicy) {         # Konversi ke format heksadesimal         $availableUpdatesPolicyHex = "0x{0:X}" -f $availableUpdatesPolicy         Write-Host "Kebijakan Updates tersedia: $availableUpdatesPolicyHex"     } lain {         Write-Host "Kebijakan Updates tersedia: Tidak Diatur"     } } tangkap {     # AvailableUpdatesPolicy bersifat opsional - hanya diatur ketika GPO diterapkan     $availableUpdatesPolicy = $null     Write-Host "Kebijakan Updates tersedia: Tidak Diatur" }

# Registri: Kunci Pelayanan (3 nilai)

# 6. UEFICA2023Status # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Status -ErrorAction Stop     $uefica 2023Status = $regValue.UEFICA2023Status     Write-Host "Status Windows UEFI CA 2023: $uefica 2023Status" } tangkap {     Write-Warning "Kunci registri Status Windows UEFI CA 2023 tidak ditemukan atau tidak dapat diakses"     $uefica 2023Status = $null     Write-Host "Status Windows UEFI CA 2023: Tidak Tersedia" }

# 7. UEFICA2023Error # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop     $uefica 2023Error = $regValue.UEFICA2023Error     Write-Host "Kesalahan UEFI CA 2023: $uefica 2023Error" } tangkap {     # UEFICA2023Error hanya ada jika ada kesalahan - tidak ada yang baik     $uefica 2023Error = $null     Write-Host "Kesalahan UEFI CA 2023: Tidak Ada" }

# 8. UEFICA2023ErrorEvent # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023ErrorEvent -ErrorAction Stop     $uefica 2023ErrorEvent = $regValue.UEFICA2023ErrorEvent     Write-Host "Kejadian Kesalahan UEFI CA 2023: $uefica 2023ErrorEvent" } tangkap {     $uefica 2023ErrorEvent = $null     Write-Host "Kejadian Kesalahan UEFI CA 2023: Tidak Tersedia" }

# Registri: Atribut Perangkat (7 nilai: 9-15)

# 9. OEMManufacturerName # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $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 kosong"         $oemManufacturerName = "Tidak Diketahui"     }     Write-Host "OEM Manufacturer Name: $oemManufacturerName" } tangkap {     Write-Warning "OEMManufacturerName kunci registri tidak ditemukan atau tidak dapat diakses"     $oemManufacturerName = $null     Write-Host "OEM Manufacturer Name: Not Available" }

# 10. OEMModelSystemFamily # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelSystemFamily -ErrorAction Stop     $oemModelSystemFamily = $regValue.OEMModelSystemFamily     if ([string]:::IsNullOrEmpty($oemModelSystemFamily)) {         Write-Warning "OEMModelSystemFamily kosong"         $oemModelSystemFamily = "Tidak Diketahui"     }     Write-Host "OEM Model System Family: $oemModelSystemFamily" } tangkap {     Write-Warning "OEMModelSystemFamily registri key not found or inaccessible"     $oemModelSystemFamily = $null     Write-Host "OEM Model System Family: Not Available" }

# 11. OEMModelNumber # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelNumber -ErrorAction Stop     $oemModelNumber = $regValue.OEMModelNumber     if ([string]:::IsNullOrEmpty($oemModelNumber)) {         Write-Warning "OEMModelNumber kosong"         $oemModelNumber = "Tidak Diketahui"     }     Write-Host "Nomor Model OEM: $oemModelNumber" } tangkap {     Write-Warning "OEMModelNumber kunci registri tidak ditemukan atau tidak dapat diakses"     $oemModelNumber = $null     Write-Host "Nomor Model OEM: Tidak Tersedia" }

# 12. FirmwareVersion # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareVersion -ErrorAction Stop     $firmwareVersion = $regValue.FirmwareVersion     if ([string]:::IsNullOrEmpty($firmwareVersion)) {         Write-Warning "FirmwareVersion kosong"         $firmwareVersion = "Tidak Diketahui"     }     Write-Host "Versi Firmware: $firmwareVersion" } tangkap {     Write-Warning "Kunci registri FirmwareVersion tidak ditemukan atau tidak dapat diakses"     $firmwareVersion = $null     Write-Host "Versi Firmware: Tidak Tersedia" }

# 13. FirmwareReleaseDate # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareReleaseDate -ErrorAction Stop     $firmwareReleaseDate = $regValue.FirmwareReleaseDate     if ([string]:::IsNullOrEmpty($firmwareReleaseDate)) {         Write-Warning "FirmwareReleaseDate kosong"         $firmwareReleaseDate = "Tidak Diketahui"     }     Write-Host "Tanggal Rilis Firmware: $firmwareReleaseDate" } tangkap {     Write-Warning "FirmwareReleaseDate kunci registri tidak ditemukan atau tidak dapat diakses"     $firmwareReleaseDate = $null     Write-Host "Tanggal Rilis Firmware: Tidak Tersedia" }

# 14. OSArchitecture # Versi PS: Semua | Admin: Tidak | Persyaratan Sistem: Tidak Ada coba {     $osArchitecture = $env:PROCESSOR_ARCHITECTURE     if ([string]:::IsNullOrEmpty($osArchitecture)) {         # Coba registri fallback         $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OSArchitecture -ErrorAction Stop         $osArchitecture = $regValue.OSArchitecture     }     if ([string]:::IsNullOrEmpty($osArchitecture)) {         Write-Warning "OSArchitecture tidak dapat ditentukan"         $osArchitecture = "Tidak Diketahui"     }     Write-Host "Arsitektur OS: $osArchitecture" } tangkap {     Write-Warning "Kesalahan dalam mengambil OSArchitecture: $_"     $osArchitecture = "Tidak Diketahui"     Write-Host "Arsitektur OS: $osArchitecture" }

# 15. CanAttemptUpdateAfter (FILETIME) # Versi PS: Semua | Admin: Mungkin diperlukan | Persyaratan Sistem: Tidak Ada coba {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop     $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter     # Konversi FILETIME ke UTC DateTime — penyimpanan registri sebagai REG_BINARY (byte[]) atau REG_QWORD (panjang)     if ($null -ne $canAttemptUpdateAfter) {         coba {             if ($canAttemptUpdateAfter -is [byte[]]) {                 $fileTime = [BitConverter]::ToInt64($canAttemptUpdateAfter, 0)                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($fileTime). ToUniversalTime()             } elseif ($canAttemptUpdateAfter -is [long]) {                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter). ToUniversalTime()             }         } tangkap {             Write-Warning "Tidak dapat mengonversi CanAttemptUpdateAfter FILETIME ke DateTime"         }     }     Write-Host "Dapat Mencoba Memperbarui Setelah: $canAttemptUpdateAfter" } tangkap {     Write-Warning "CanAttemptUpdateAfter kunci registri tidak ditemukan atau tidak dapat diakses"     $canAttemptUpdateAfter = $null     Write-Host "Dapat Mencoba Memperbarui Setelah: Tidak Tersedia" }

# Log Kejadian: Log Sistem (10 nilai: 16-25)

# 16-25. Kueri Log Kejadian # ID Kejadian: # 1801 - Pembaruan dimulai, perlu boot ulang # 1808 - Pembaruan berhasil diselesaikan # 1795 - Firmware mengembalikan kesalahan (kode kesalahan penangkapan) # 1796 - Kesalahan dicatat dengan kode kesalahan (kode tangkapan) # 1800 - Perlu boot ulang (BUKAN kesalahan - pembaruan akan dilanjutkan setelah boot ulang) # 1802 - Masalah firmware yang diketahui memblokir pembaruan (mengambil KI_<nomor> dari SkipReason) # 1803 - Pembaruan KEK yang sesuai tidak ditemukan (OEM perlu memasok KEK yang ditandatangani PK) # Versi PS: 3.0+ | Admin: Mungkin diperlukan untuk Log sistem | Persyaratan Sistem: Tidak Ada coba {     # Buat kueri semua ID kejadian Boot Aman yang relevan     $allEventIds = @(1795, 1796, 1800, 1801, 1802, 1803, 1808)     $events = @(Get-winEvent -FilterHashtable @{LogName='System'; ID=$allEventIds} -MaxEvents 50 -ErrorAction Stop)

    jika ($events. Hitung -eq 0) {         Write-Warning "Tidak ditemukan kejadian Boot Aman di log 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 "ID Acara Terbaru: Tidak Tersedia"         Write-Host "ID Wadah: Tidak Tersedia"         Write-Host "Kepercayaan Diri: Tidak Tersedia"         Write-Host "Event 1801 Count: 0"         Write-Host "Event 1808 Count: 0"     } lain {         # 16. LatestEventId         $latestEvent = $events | Sort-Object TimeCreated -Descending | Select-Object -1 Pertama         if ($null -eq $latestEvent) {             Write-Warning "Tidak dapat menentukan acara terbaru"             $latestEventId = $null             Write-Host "ID Acara Terbaru: Tidak Tersedia"         } lain {             $latestEventId = $latestEvent.Id             Write-Host "ID Acara Terbaru: $latestEventId"         }

        # 17. BucketID - Diekstrak dari Kejadian 1801/1808         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketId:\s*(.+)') {                 $bucketId = $matches[1]. Pangkas()                 Write-Host "ID Bucket: $bucketId"             } lain {                 Write-Warning "BucketId tidak ditemukan dalam pesan acara"                 $bucketId = $null                 Write-Host "BUCKET ID: Not Found in Event"             }         } lain {             Write-Warning "Acara atau pesan terbaru adalah null, tidak dapat mengekstrak BucketId"             $bucketId = $null             Write-Host "ID Wadah: Tidak Tersedia"         }

        # 18. Kepercayaan Diri - Diekstrak dari Acara 1801/1808         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketConfidenceLevel:\s*(.+)') {                 $confidence = $matches[1]. Pangkas()                 Write-Host "Kepercayaan Diri: $confidence"             } lain {                 Write-Warning "Tingkat kepercayaan tidak ditemukan dalam pesan acara"                 $confidence = $null                 Write-Host "Kepercayaan Diri: Tidak Ditemukan dalam Kejadian"             }         } lain {             Write-Warning "Acara atau pesan terbaru adalah null, tidak dapat mengekstrak Kepercayaan Diri"             $confidence = $null             Write-Host "Kepercayaan Diri: Tidak Tersedia"         }

        # 18b. SkipReason - Ekstrak KI_<angka> dari SkipReason dalam acara yang sama dengan BucketId         # Ini menangkap ID Masalah Umum yang muncul bersama BucketId/Confidence (bukan hanya Kejadian 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 Masalah Umum: $skipReasonKnownIssue" -ForegroundColor Yellow             }         }

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

        # 20. Event1808Count         $event 1808Array = @($events | Where-Object {$_. Id -eq 1808})         $event 1808Count = $event 1808Array.Count         Write-Host "Event 1808 Count: $event 1808Count"                  # Menginisialisasi variabel kejadian kesalahan         $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                  # Hanya periksa kejadian kesalahan jika pembaruan TIDAK selesai         # Lewati analisis kesalahan jika: 1808 adalah acara terbaru ATAU UEFICA2023Status adalah "Diperbarui"         $updateComplete = ($latestEventId -eq 1808) -or ($uefica 2023Status -eq "Diperbarui")                  if (-not $updateComplete) {             Write-Host "Pembaruan belum selesai - memeriksa kejadian kesalahan..." -ForegroundColor Yellow                          # 21. Event1795 - Kesalahan Firmware (kode kesalahan penangkapan)             $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 -1 Pertama                 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 Hitungan "Kejadian 1795 (Kesalahan Firmware): $event 1795Count" $(if ($event 1795ErrorCode) { "Code: $event 1795ErrorCode" })             }                          # 22. Event1796 - Kode Kesalahan Dicatat (kode kesalahan penangkapan)             $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 -1 Pertama                 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 "Peristiwa 1796 (Log Kesalahan) Hitungan: $event 1796Count" $(if ($event 1796ErrorCode) { "Code: $event 1796ErrorCode" })             }                          # 23. Event1800 - Reboot Diperlukan (NOT kesalahan - pembaruan akan dilanjutkan setelah boot ulang)             $event 1800Array = @($events | Where-Object {$_. Id -eq 1800})             $event 1800Count = $event 1800Array.Count             $rebootPending = $event 1800Count -gt 0             if ($rebootPending) {                 Write-Host "Event 1800 (Reboot Pending): Pembaruan akan dilanjutkan setelah boot ulang" -ForegroundColor Cyan             }                          # 24. Event1802 - Masalah Firmware yang Diketahui (ambil KI_<nomor> dari 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 -1 Pertama                 if ($latestEvent 1802.Message -match 'SkipReason:\s*(KI_\d+)') {                     $knownIssueId = $matches[1]                 }                 Write-Host Hitungan "Kejadian 1802 (Masalah Firmware Diketahui): $event 1802Count" $(if ($knownIssueId) { "KI: $knownIssueId" })             }                          # 25. Event1803 - Pembaruan KEK yang Hilang (OEM perlu memasok KEK yang ditandatangani PK)             $event 1803Array = @($events | Where-Object {$_. Id -eq 1803})             $event 1803Count = $event 1803Array.Count             $missingKEK = $event 1803Count -gt 0             if ($missingKEK) {                 Write-Host "Event 1803 (Missing KEK): OEM perlu memasok PK yang ditandatangani KEK" -ForegroundColor Yellow             }         } lain {             Write-Host "Pembaruan selesai (Kejadian 1808 atau Status=Diperbarui) - melewati analisis kesalahan" -ForegroundColor Green         }     } } tangkap {     Write-Warning "Kesalahan mengambil log kejadian. Mungkin memerlukan hak istimewa 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 "ID Kejadian Terbaru: Kesalahan"     Write-Host "ID Wadah: Kesalahan"     Write-Host "Kepercayaan Diri: Kesalahan"     Write-Host "Event 1801 Count: 0"     Write-Host "Event 1808 Count: 0" }

# Kueri WMI/CIM (5 nilai)

# 26. OSVersion # Versi PS: 3.0+ (gunakan Get-WmiObject untuk 2.0) | Admin: Tidak | Persyaratan Sistem: Tidak Ada coba {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -or [string]::IsNullOrEmpty($osInfo.Version)) {         Write-Warning "Tidak dapat mengambil versi OS"         $osVersion = "Tidak Diketahui"     } lain {         $osVersion = $osInfo.Version     }     Write-Host "Versi OS: $osVersion" } tangkap {     # CIM mungkin gagal di beberapa lingkungan - gunakan fallback     $osVersion = [System.Environment]::OSVersion.Version.ToString()     if ([string]:::IsNullOrEmpty($osVersion)) { $osVersion = "Unknown" }     Write-Host "Versi OS: $osVersion" }

# 27. LastBootTime # Versi PS: 3.0+ (gunakan Get-WmiObject untuk 2.0) | Admin: Tidak | Persyaratan Sistem: Tidak Ada coba {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -or $null -eq $osInfo.LastBootUpTime) {         Write-Warning "Tidak dapat mengambil waktu boot terakhir"         $lastBootTime = $null         Write-Host "Waktu Boot Terakhir: Tidak Tersedia"     } lain {         $lastBootTime = $osInfo.LastBootUpTime         Write-Host "Waktu Boot Terakhir: $lastBootTime"     } } tangkap {     # CIM mungkin gagal di beberapa lingkungan - gunakan fallback     coba {         $lastBootTime = (Get-Process -Id 0 -ErrorAction SilentlyContinue). Waktu Mulai     } tangkap {         $lastBootTime = $null     }     if ($lastBootTime) { Write-Host "Last Boot Time: $lastBootTime" } else { Write-Host "Last Boot Time: Not Available" } }

# 28. BaseBoardManufacturer # Versi PS: 3.0+ (gunakan Get-WmiObject untuk 2.0) | Admin: Tidak | Persyaratan Sistem: Tidak Ada coba {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -or [string]::IsNullOrEmpty($baseBoard.Manufacturer)) {         Write-Warning "Tidak dapat mengambil produsen baseboard"         $baseBoardManufacturer = "Tidak Diketahui"     } lain {         $baseBoardManufacturer = $baseBoard.Manufacturer     }     Write-Host "Produsen Baseboard: $baseBoardManufacturer" } tangkap {     # CIM mungkin gagal - info baseboard adalah tambahan     $baseBoardManufacturer = "Tidak Diketahui"     Write-Host "Produsen Baseboard: $baseBoardManufacturer" }

# 29. BaseBoardProduct # Versi PS: 3.0+ (gunakan Get-WmiObject untuk 2.0) | Admin: Tidak | Persyaratan Sistem: Tidak Ada coba {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -or [string]::IsNullOrEmpty($baseBoard.Product)) {         Write-Warning "Tidak dapat mengambil produk baseboard"         $baseBoardProduct = "Tidak Diketahui"     } lain {         $baseBoardProduct = $baseBoard.Product     }     Write-Host "Produk Baseboard: $baseBoardProduct" } tangkap {     # CIM mungkin gagal - info baseboard adalah tambahan     $baseBoardProduct = "Tidak Diketahui"     Write-Host "Produk Baseboard: $baseBoardProduct" }

# 30. SecureBootTaskEnabled # Versi PS: Semua | Admin: Tidak | Persyaratan Sistem: Tugas Terjadwal sudah ada # Memeriksa apakah tugas terjadwal Secure-Boot-Update diaktifkan $secureBootTaskEnabled = $null $secureBootTaskStatus = "Tidak Diketahui" coba {     $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 'Siap' -atau $taskData.Status -eq 'Berjalan')         }     } lain {         $secureBootTaskStatus = "NotFound"         $secureBootTaskEnabled = $false     }     if ($secureBootTaskEnabled -eq $false) {         Write-Host "Tugas Pembaruan SecureBoot: $secureBootTaskStatus (Diaktifkan: $secureBootTaskEnabled)" -ForegroundColor Yellow     } lain {         Write-Host "SecureBoot Update Task: $secureBootTaskStatus (Enabled: $secureBootTaskEnabled)" -ForegroundColor Green     } } tangkap {     $secureBootTaskStatus = "Kesalahan"     $secureBootTaskEnabled = $false     Write-Host "SecureBoot Update Task: Pemeriksaan kesalahan - $_" -ForegroundColor Red }

# 31. Status Kunci WinCS (F33E0C8E002 - Pembaruan Sertifikat Boot Aman) # Versi PS: Semua | Admin: Ya (untuk kueri) | Persyaratan Sistem: WinCsFlags.exe $wincsKeyApplied = $null $wincsKeyStatus = "Tidak Diketahui" coba {     # Periksa lokasi umum untuk WinCsFlags.exe     $wincsFlagsPath = $null     $possiblePaths = @(         "$env:SystemRoot\System32\WinCsFlags.exe",         "$env:SystemRoot\SysWOW64\WinCsFlags.exe"     )     foreach ($p di $possiblePaths) {         if (Test-Path $p) { $wincsFlagsPath = $p; break }     }     if ($wincsFlagsPath) {         # Kunci khusus kueri - memerlukan hak admin         $queryOutput = & $wincsFlagsPath /query --key F33E0C8E002 2>&1         $queryOutputStr = $queryOutput -join "'n"         if ($LASTEXITCODE -eq 0) {             # Periksa apakah kunci diterapkan (cari "Konfigurasi Aktif" atau indikator serupa)             if ($queryOutputStr -match "Active Configuration.*:.*enabled" -or $queryOutputStr -match "Configuration.*applied") {                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Diterapkan"                 Write-Host "F33E0C8E002 Kunci WinCS: Diterapkan" -Hijau ForegroundColor             } elseif ($queryOutputStr -match "not found|Tidak ada konfigurasi") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "F33E0C8E002 Kunci WinCS: Tidak Diterapkan" -ForegroundColor Yellow             } lain {                 # Kunci ada - periksa output untuk status                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Diterapkan"                 Write-Host "Kunci WinCS F33E0C8E002: Applied" -ForegroundColor Green             }         } lain {             # Periksa pesan kesalahan tertentu             if ($queryOutputStr -match "Access denied|administrator") {                 $wincsKeyStatus = "AccessDenied"                 Write-Host "Kunci WinCS F33E0C8E002: Access denied (run as admin)" -ForegroundColor DarkGray             } elseif ($queryOutputStr -match "not found|Tidak ada konfigurasi") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "Kunci WinCS F33E0C8E002: Tidak Diterapkan" -ForegroundColor Yellow             } lain {                 $wincsKeyStatus = "QueryFailed"                 Write-Host "F33E0C8E002 Kunci WinCS: Kueri gagal" -ForegroundColor Red             }         }     } lain {         $wincsKeyStatus = "WinCsFlagsNotFound"         Write-Host "F33E0C8E002 Kunci WinCS: WinCsFlags.exe tidak ditemukan" -ForegroundColor Gray     } } tangkap {     $wincsKeyStatus = "Kesalahan"     Write-Host "Kunci WinCS F33E0C8E002: Pemeriksaan kesalahan - $_" -ForegroundColor Red }              

# ============================================================================= # Deteksi Perbaikan - Output Status & Kode Keluar # =============================================================================

# Susun objek status dari semua data inventori yang dikumpulkan $status = [dipesan]@{     UEFICA2023Status = $uefica 2023Status     UEFICA2023Error = $uefica 2023Error     UEFICA2023ErrorEvent = $uefica 2023ErrorEvent     AvailableUpdates = if ($null -ne $availableUpdates) { $availableUpdatesHex } else { $null }     AvailableUpdatesPolicy = if ($null -ne $availableUpdatesPolicy) { $availableUpdatesPolicyHex } else { $null }     Nama host = $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     Kepercayaan diri = $confidence     SkipReasonKnownIssue = $skipReasonKnownIssue # KI_<angka> dari SkipReason dalam acara BucketId     Event1801Count = $event 1801Count     Event1808Count = $event 1808Count     # Kejadian kesalahan dengan detail yang diambil     Kejadian1795Count = $event 1795Count # Firmware mengembalikan kesalahan     Event1795ErrorCode = $event 1795ErrorCode # Kode kesalahan dari firmware     Event1796Count = $event 1796Count # Kode kesalahan dicatat     Event1796ErrorCode = $event 1796ErrorCode # Kode kesalahan yang ditangkap     Event1800Count = $event 1800Count # Reboot diperlukan (NOT kesalahan)     RebootPending = $rebootPending # True if Event 1800 present     Event1802Count = $event 1802Count # Masalah firmware yang diketahui     KnownIssueId = $knownIssueId # KI_<angka> dari SkipReason     Event1803Count = $event 1803Count # Missing KEK update     MissingKEK = $missingKEK # OEM perlu memasok KEK yang ditandatangani PK     OSVersion = $osVersion     LastBootTime = if ($lastBootTime -is [datetime]) { $lastBootTime.ToString("o") } else { "$lastBootTime" }     BaseBoardManufacturer = $baseBoardManufacturer     BaseBoardProduct = $baseBoardProduct     SecureBootTaskEnabled = $secureBootTaskEnabled     SecureBootTaskStatus = $secureBootTaskStatus     WinCSKeyApplied = $wincsKeyApplied # True jika kunci F33E0C8E002 diterapkan     WinCSKeyStatus = $wincsKeyStatus # Applied, NotApplied, WinCsFlagsNotFound, dll. }

# Output status - Untuk agregasi data $jsonOutput = $status | ConvertTo-Json -Compress

# Jika OutputPath disediakan, simpan ke file; jika tidak output ke stdout if (-not [string]::IsNullOrEmpty($OutputPath)) {     # Validasi OutputPath - lewati jika terlihat seperti permintaan bantuan atau memiliki karakter yang tidak valid     if ($OutputPath -match '^[/\-]' -or $OutputPath -match '[<>:"|? *]') {         Write-Host "OutputPath tidak valid ditentukan, output ke stdout" -ForegroundColor Yellow         Write-Output $jsonOutput         if ($secureBootEnabled -and $uefica 2023Status -eq "Updated") { exit 0 } else { exit 1 }     }          # Pastikan folder output ada     if (-not (Test-Path $OutputPath)) {         coba {             New-Item -Direktori ItemType -Path $OutputPath -Force | Out-Null         } tangkap {             Write-Warning "Tidak dapat membuat folder output: $OutputPath - $_"         }     }          # Simpan ke HOSTNAME_latest.json     $outputFile = Join-Path $OutputPath "$($hostname)_latest.json"     coba {         $jsonOutput | Out-File -FilePath $outputFile -Encoding UTF8 -Force         Write-Host "JSON saved to: $outputFile" -ForegroundColor Green     } tangkap {         Write-Warning "Tidak dapat menulis ke file: $outputFile - $_"         # Kembali ke stdout         Write-Output $jsonOutput     } } lain {     # Perilaku asli - output ke stdout     Write-Output $jsonOutput }

# Kode keluar: "Diperbarui" adalah nilai keberhasilan per playbook if ($secureBootEnabled -and $uefica 2023Status -eq "Updated") {     keluar 0 # Tanpa masalah } lain {     keluar 1 # Dengan masalah }

Perlu bantuan lainnya?

Ingin opsi lainnya?

Jelajahi manfaat langganan, telusuri kursus pelatihan, pelajari cara mengamankan perangkat Anda, dan banyak lagi.