Tanggal penerbitan asli: 17 November 2025
ID KB: 5072718
|
Ubah tanggal |
Ubah deskripsi |
|
24 Februari 2026 |
|
|
22 Februari 2026 |
|
|
13 Februari 2026 |
|
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 }