העתק והדבק קובץ Script לדוגמה זה ושנה לפי הצורך עבור הסביבה שלך:

<#מקשים . תקציר     מזהה מצב עדכון של אישור אתחול מאובטח עבור ניטור כלל הצי.

.DESCRIPTIONמקשים     קובץ Script זה לזיהוי אוסף מצב אתחול מאובטח, ערכי רישום של עדכון אישור,     ופרטי המכשיר. הוא יוצר פלט של מחרוזת JSON לניטור ולדיווח.

    Compatible with Intune Remediations, GPO-based collection, and other management tools. אין צורך בקובץ Script לתיקון - זהו ניטור בלבד.

    Exit 0 = "Without issue"  (certificates updated)מקשים     יציאה 1 = "עם בעיה" (אישורים לא עודכנו — מידע בלבד)

.PARAMETER OutputPathמקשים     אופציונלי. נתיב לתיקיה שבה יישמר קובץ ה- JSON.אם אפשרות זו HOSTNAME_latest.json, היא נשמרת בתיקיה זו.אם לא סופק, הפונקציה תכלול פלט JSON ל- stdout (אופן פעולה מקורי).

.EXAMPLEמקשים     # פלט ל- stdout (Intune/SCCM זיהוי)     .\Detect-SecureBootCertUpdateStatus.ps1

.EXAMPLEמקשים     # שמירה במיקום משותף ברשת (פריסת GPO)     .\Detect-SecureBootCertUpdateStatus.ps1 -OutputPath "\\server\SecureBootLogs$"

.NOTESמקשים     נתיבי רישום לכל 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מקשים     מרומז, כולל אך לא מוגבל לאחריות לסוחרים,     התאמה למטרה מסוימת ולאי הפרה. בכל מקרה,     מחברים או בעלי זכויות יוצרים יהיו חייבים לכל דרישה, נזקים או אחרים     אחריות, בין אם בפעולה של חוזה, תביעת תביעת חוזה או כל דבר אחר, הנובעת,     מתוך או בחיבור לתוכנה או לשימוש או לעסקאות אחרות ב-     תוכנה.מספר > param(     [Parameter(mandatory = $false)]     [string]$OutputPath )

# Download URL: https://aka.ms/getsecureboot -> "Deployment and Monitoring Samples"מקשים # הערה: קובץ Script זה פועל ב נקודות קצה כדי לאסוף נתוני מצב של אתחול מאובטח.

# 1. HostName # PS Version: All | מרכז הניהול: לא | דרישות מערכת: ללא נסה את {     $hostname = $env:COMPUTERNAME     if ([string]::IsNullOrEmpty($hostname)) {         Write-Warning "לא היתה אפשרות לקבוע את שם המחשב המארח"         $hostname = "Unknown"     אני לא יכול לעשות את     Write-Host "Hostname: $hostname" } תפוס את {     Write-Warning "שגיאה באחזור שם מארח: $_"     $hostname = "שגיאה"     Write-Host "Hostname: $hostname" }

# 2. CollectionTime # PS Version: All | מרכז הניהול: לא | דרישות מערכת: ללא נסה את {     $collectionTime = Get-Date     if ($null -eq $collectionTime) {         Write-Warning "לא היתה אפשרות לאחזר את התאריך/השעה הנוכחיים"         $collectionTime = "Unknown"     אני לא יכול לעשות את     Write-Host "זמן אוסף: $collectionTime" } תפוס את {     Write-Warning "שגיאה באחזור תאריך/שעה: $_"     $collectionTime = "שגיאה"     Write-Host "זמן איסוף: $collectionTime" }

# Registry: Secure Boot Main Key (3 values)

# 3. SecureBootEnabled # PS גירסה: 3.0+ | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: מערכת התומכת ב- UEFI/אתחול מאובטח נסה את {     $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop     Write-Host "אתחול מאובטח זמין: $secureBootEnabled" } תפוס את {     Write-Warning "לא ניתן לקבוע את מצב האתחול המאובטח באמצעות cmdlet: $_"     # נסה חזרה לרישום     נסה את {         $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop         $secureBootEnabled = [bool]$regValue.UEFISecureBootEnabled         Write-Host "אתחול מאובטח זמין: $secureBootEnabled"     } תפוס את {         Write-Warning "לא ניתן לקבוע את מצב האתחול המאובטח באמצעות הרישום. ייתכן שהמערכת אינה תומכת באתחול UEFI/Secure."         $secureBootEnabled = $null         Write-Host "אתחול מאובטח זמין: לא זמין"     אני לא יכול לעשות את }

# 4. HighConfidenceOptOut # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop     $highConfidenceOptOut = $regValue.HighConfidenceOptOut     Write-Host "ביטול הצטרפות במהימנות גבוהה: $highConfidenceOptOut" } תפוס את {     # HighConfidenceOptOut הוא אופציונלי - לא קיים ברוב המערכות     $highConfidenceOptOut = $null     Write-Host "ביטול הצטרפות במהימנות גבוהה: לא הוגדר" }

# 4b. MicrosoftUpdateManagedOptIn # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name MicrosoftUpdateManagedOptIn -ErrorAction Stop     $microsoftUpdateManagedOptIn = $regValue.MicrosoftUpdateManagedOptIn     Write-Host "הצטרפות מנוהלת של Microsoft Update: $microsoftUpdateManagedOptIn" } תפוס את {     # MicrosoftUpdateManagedOptIn הוא אופציונלי - לא קיים ברוב המערכות     $microsoftUpdateManagedOptIn = $null     Write-Host "הצטרפות מנוהלת של Microsoft Update: לא הוגדרה" }

# 5. AvailableUpdates # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop     $availableUpdates = $regValue.AvailableUpdates     if ($null -ne $availableUpdates) {         # המר לתבנית הקסדצימאלית         $availableUpdatesHex = "0x{0:X}" -f $availableUpdates         Write-Host "זמין עדכונים: $availableUpdatesHex"     } אחר {         Write-Host "זמין עדכונים: לא זמין"     אני לא יכול לעשות את } תפוס את {     Write-Warning "מפתח הרישום AvailableUpdates לא נמצא או אינו נגיש"     $availableUpdates = $null     Write-Host "זמין עדכונים: לא זמין" }

# 5b. AvailableUpdatesPolicy (GPO-controlled persistent value) # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdatesPolicy -ErrorAction Stop     $availableUpdatesPolicy = $regValue.AvailableUpdatesPolicy     if ($null -ne $availableUpdatesPolicy) {         # המר לתבנית הקסדצימאלית         $availableUpdatesPolicyHex = "0x{0:X}" -f $availableUpdatesPolicy         Write-Host "מדיניות עדכונים זמינה: $availableUpdatesPolicyHex"     } אחר {         Write-Host "מדיניות עדכונים זמינה: לא מוגדרת"     אני לא יכול לעשות את } תפוס את {     # AvailableUpdatesPolicy הוא אופציונלי - מוגדר רק בעת החלת GPO     $availableUpdatesPolicy = $null     Write-Host "מדיניות עדכונים זמינה: לא מוגדרת" }

# Registry: Servicing Key (3 values)

# 6. UEFICA2023Status # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $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" } תפוס את {     Write-Warning "מפתח הרישום של Windows UEFI CA 2023 Status לא נמצא או אינו נגיש"     $uefica 2023Status = $null     Write-Host "Windows UEFI CA 2023 Status: Not Available" }

# 7. UEFICA2023Error # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop     $uefica 2023Error = $regValue.UEFICA2023Error     Write-Host "UEFI CA 2023 Error: $uefica 2023Error" } תפוס את {     # UEFICA2023Error קיים רק אם אירעה שגיאה - היעדרות טובה     $uefica 2023Error = $null     Write-Host "שגיאת UEFI CA 2023: ללא" }

# 8. UEFICA2023ErrorEvent # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023ErrorEvent -ErrorAction Stop     $uefica 2023ErrorEvent = $regValue.UEFICA2023ErrorEvent     Write-Host "אירוע שגיאה UEFI CA 2023: $uefica 2023ErrorEvent" } תפוס את {     $uefica 2023ErrorEvent = $null     Write-Host "אירוע שגיאה UEFI CA 2023: לא זמין" }

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

# 9. OEMManufacturerName # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMManufacturerName -ErrorAction Stop     $oemManufacturerName = $regValue.OEMManufacturerName     if ([string]::IsNullOrEmpty($oemManufacturerName)) {         Write-Warning "OEMManufacturerName is empty"         $oemManufacturerName = "Unknown"     אני לא יכול לעשות את     Write-Host "שם יצרן OEM: $oemManufacturerName" } תפוס את {     Write-Warning "מפתח הרישום של OEMManufacturerName לא נמצא או אינו נגיש"     $oemManufacturerName = $null     Write-Host "שם יצרן OEM: לא זמין" }

# 10. OEMModelSystemFamily # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $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 ריק"         $oemModelSystemFamily = "Unknown"     אני לא יכול לעשות את     Write-Host "משפחת מערכות המודלים של OEM: $oemModelSystemFamily" } תפוס את {     Write-Warning "מפתח הרישום של OEMModelSystemFamily לא נמצא או אינו נגיש"     $oemModelSystemFamily = $null     Write-Host "משפחת מערכות מודלים של OEM: לא זמינה" }

# 11. OEMModelNumber # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $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 ריק"         $oemModelNumber = "Unknown"     אני לא יכול לעשות את     Write-Host "מספר דגם OEM: $oemModelNumber" } תפוס את {     Write-Warning "מפתח הרישום OEMModelNumber לא נמצא או אינו נגיש"     $oemModelNumber = $null     Write-Host "מספר דגם OEM: לא זמין" }

# 12. FirmwareVersion # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $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 is empty"         $firmwareVersion = "Unknown"     אני לא יכול לעשות את     Write-Host "גירסת קושחה: $firmwareVersion" } תפוס את {     Write-Warning "מפתח הרישום של FirmwareVersion לא נמצא או אינו נגיש"     $firmwareVersion = $null     Write-Host "גירסת קושחה: לא זמינה" }

# 13. FirmwareReleaseDate # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $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 is empty"         $firmwareReleaseDate = "Unknown"     אני לא יכול לעשות את     Write-Host "תאריך הפצה של קושחה: $firmwareReleaseDate" } תפוס את {     Write-Warning "FirmwareReleaseDate registry key not found or incessible"     $firmwareReleaseDate = $null     Write-Host "תאריך הפצה של קושחה: לא זמין" }

# 14. OSArchitecture # PS Version: All | מרכז הניהול: לא | דרישות מערכת: ללא נסה את {     $osArchitecture = $env:PROCESSOR_ARCHITECTURE     if ([string]::IsNullOrEmpty($osArchitecture)) {         # נסה חזרה לרישום         $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"         $osArchitecture = "Unknown"     אני לא יכול לעשות את     Write-Host "ארכיטקטורת מערכת הפעלה: $osArchitecture" } תפוס את {     Write-Warning "שגיאה באחזור OSArchitecture: $_"     $osArchitecture = "Unknown"     Write-Host "ארכיטקטורת מערכת הפעלה: $osArchitecture" }

# 15. CanAttemptUpdateAfter (FILETIME) # PS Version: All | מרכז הניהול: ייתכן שתידרש | דרישות מערכת: ללא נסה את {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop     $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter     # המרת FILETIME ל- UTC DateTime — מאגרי רישום כ- REG_BINARY (byte[]) או REG_QWORD (long)     if ($null -ne $canAttemptUpdateAfter) {         נסה את {             if ($canAttemptUpdateAfter -is [byte[]]) {                 $fileTime = [BitConverter]::ToInt64($canAttemptUpdateAfter, 0)                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($fileTime). ToUniversalTime()             } elseif ($canAttemptUpdateAfter -is [long]) {                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter). ToUniversalTime()             אני לא יכול לעשות את         } תפוס את {             Write-Warning "לא היתה אפשרות להמיר את CanAttemptUpdateAfter FILETIME ל- DateTime"         אני לא יכול לעשות את     אני לא יכול לעשות את     Write-Host "יכול לנסות לבצע עדכון לאחר: $canAttemptUpdateAfter" } תפוס את {     Write-Warning "CanAttemptUpdateAfter מפתח הרישום לא נמצא או לא נגיש"     $canAttemptUpdateAfter = $null     Write-Host "יכול לנסות לבצע עדכון לאחר: לא זמין" }

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

# 16-25. Event Log queries # מזהה אירוע: # 1801 - עדכון הופעל, נדרש אתחול מחדש # 1808 - העדכון הושלם בהצלחה # 1795 - הקושחה החזירה שגיאה (קוד שגיאה של לכידה) # 1796 - שגיאה שנרשם עם קוד שגיאה (קוד לכידה) # 1800 - נדרש אתחול מחדש (לא שגיאה - העדכון ימשיך לאחר אתחול מחדש) # 1802 - עדכון ידוע של בעיית קושחה חסומה (KI_<מספר> מ- SkipReason) # 1803 - עדכון KEK תואם לא נמצא (OEM צריך לספק KEK חתום PK) # PS גירסה: 3.0+ | מרכז הניהול: ייתכן שתידרש עבור יומן המערכת | דרישות מערכת: ללא נסה את {     # בצע שאילתה על כל מזהה האירוע הרלוונטי של האתחול המאובטח     $allEventIds = @(1795, 1796, 1800, 1801, 1802, 1803, 1808)     $events = @(Get-WinEvent -FilterHashtable @{LogName='System'; ID=$allEventIds} -MaxEvents 50 -ErrorAction Stop)

    if ($events.Count -eq 0) {מקשים         Write-Warning "לא נמצאו אירועי אתחול מאובטח ביומן המערכת"         $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 "מזהה האירוע העדכני ביותר: לא זמין"         Write-Host "Bucket ID: Not Available"         Write-Host "מהימנות: לא זמין"         Write-Host "ספירת אירוע 1801: 0"         Write-Host "אירוע 1808 Count: 0"     } אחר {         # 16. LatestEventId         $latestEvent = $events | Sort-Object זמןCreated -סדר יורד | Select-Object -ראשון 1         if ($null -eq $latestEvent) {             Write-Warning "לא היתה אפשרות לקבוע את האירוע האחרון"             $latestEventId = $null             Write-Host "מזהה האירוע העדכני ביותר: לא זמין"         } אחר {             $latestEventId = $latestEvent.Id             Write-Host "מזהה האירוע העדכני ביותר: $latestEventId"         }

        # 17. BucketID - Extracted from Event 1801/1808 if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketId:\s*(.+)') {                 $bucketId = $matches[1]. חתוך()                 Write-Host "Bucket ID: $bucketId"             } אחר {                 Write-Warning "BucketId לא נמצא בה הודעת אירוע"                 $bucketId = $null                 Write-Host "Bucket ID: Not Found in Event"             אני לא יכול לעשות את         } אחר {             Write-Warning "האירוע או ההודעה העדכניים ביותר הם Null, אין אפשרות לחלץ BucketId"             $bucketId = $null             Write-Host "Bucket ID: Not Available"         }

        # 18. Confidence - Extracted from Event 1801/1808 if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketConfidenceLevel:\s*(.+)') {                 $confidence = $matches[1]. חתוך()                 Write-Host "מהימנות: $confidence"             } אחר {                 Write-Warning "רמת מהימנות לא נמצאה בה הודעת אירוע"                 $confidence = $null                 Write-Host "מהימנות: לא נמצא באירוע"             אני לא יכול לעשות את         } אחר {             Write-Warning "האירוע או ההודעה העדכניים ביותר הם Null, אין אפשרות לחלץ את הביטחון"             $confidence = $null             Write-Host "מהימנות: לא זמין"         }

        # 18b. SkipReason - Extract KI_<number> from SkipReason in the same event as BucketId # פעולה זו לוכדת זהות ידועות של בעיות שמופיעות לצד BucketId/Confidence (לא רק אירוע 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: $skipReasonKnownIssue" - צבע קידמה צהוב             אני לא יכול לעשות את         }

        # 19. Event1801Count $event 1801Array = @($events | Where-Object {$_. מזהה -eq 1801})         $event 1801Count = $event 1801Array.Count         Write-Host "ספירת אירוע 1801: $event 1801Count"

        # 20. Event1808Count $event 1808Array = @($events | Where-Object {$_. מזהה -eq 1808})         $event 1808Count = $event 1808Array.Count         Write-Host "ספירת אירוע 1808: $event 1808Count"                  # אתחל משתני אירוע שגיאה         $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                  # בדוק אם קיימים אירועי שגיאה רק אם העדכון לא הושלם         # Skip error analysis if: 1808 is latest event OR UEFICA2023Status is "Updated"         $updateComplete = ($latestEventId -eq 1808) -או ($uefica 2023Status -eq "עודכן")                  if (-not $updateComplete) {             Write-Host "העדכון לא הושלם - בודק אם קיימים אירועי שגיאה..." -צבע קידמה צהוב                          # 21. Event1795 - שגיאת קושחה (קוד שגיאה של לכידה)             $event 1795Array = @($events | Where-Object {$_. מזהה -eq 1795})             $event 1795Count = $event 1795Array.Count             if ($event 1795Count -gt 0) {                 $latestEvent 1795 = $event 1795Array | Sort-Object זמןCreated -סדר יורד | Select-Object -ראשון 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 "ספירת אירוע 1795 (שגיאת קושחה): $event 1795Count" $(if ($event 1795ErrorCode) { "קוד: $event 1795ErrorCode" })             אני לא יכול לעשות את                          # 22. Event1796 - קוד שגיאה נרשם (קוד שגיאה לכידה)             $event 1796Array = @($events | Where-Object {$_. מזהה -eq 1796})             $event 1796Count = $event 1796Array.Count             if ($event 1796Count -gt 0) {                 $latestEvent 1796 = $event 1796Array | Sort-Object זמןCreated -סדר יורד | Select-Object -ראשון 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 "ספירת אירוע 1796 (רישום שגיאות): $event 1796Count" $(if ($event 1796ErrorCode) { "קוד: $event 1796ErrorCode" })             אני לא יכול לעשות את                          # 23. Event1800 - נדרש אתחול מחדש (לא שגיאה - העדכון ימשיך לאחר אתחול מחדש)             $event 1800Array = @($events | Where-Object {$_. מזהה -eq 1800})             $event 1800Count = $event 1800Array.Count             $rebootPending = $event 1800Count -gt 0             if ($rebootPending) {                 Write-Host "אירוע 1800 (ממתין לאתחול מחדש): העדכון ימשיך לאחר אתחול מחדש" -תכלת של צבע קידמה             אני לא יכול לעשות את                          # 24. Event1802 - בעיית קושחה ידועה (KI_<מספר> מ- SkipReason)             $event 1802Array = @($events | Where-Object {$_. מזהה -eq 1802})             $event 1802Count = $event 1802Array.Count             if ($event 1802Count -gt 0) {                 $latestEvent 1802 = $event 1802Array | Sort-Object זמןCreated -סדר יורד | Select-Object -ראשון 1                 if ($latestEvent 1802.Message -match 'SkipReason:\s*(KI_\d+)') {                     $knownIssueId = $matches[1]                 אני לא יכול לעשות את                 Write-Host "אירוע 1802 (בעיית קושחה ידועה): $event 1802Count" $(if ($knownIssueId) { "KI: $knownIssueId" })             אני לא יכול לעשות את                          # 25. Event1803 - עדכון KEK חסר (OEM צריך לספק KEK חתום של PK)             $event 1803Array = @($events | Where-Object {$_. מזהה -eq 1803})             $event 1803Count = $event 1803Array.Count             $missingKEK = $event 1803Count -gt 0             if ($missingKEK) {                 Write-Host "אירוע 1803 (KEK חסר): OEM צריך לספק KEK חתום של PK" -צבע קידמה צהוב             אני לא יכול לעשות את         } אחר {             Write-Host "העדכון הושלם (אירוע 1808 או מצב=עדכון) - מדלג על ניתוח שגיאות" -צבע קידמה ירוק         אני לא יכול לעשות את     אני לא יכול לעשות את } תפוס את {     Write-Warning "שגיאה באחזור יומני אירועים. עשוי לדרוש הרשאות מנהל מערכת: $_"     $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 "מזהה האירוע העדכני ביותר: שגיאה"     Write-Host "Bucket ID: Error"     Write-Host "מהימנות: שגיאה"     Write-Host "ספירת אירוע 1801: 0"     Write-Host "אירוע 1808 Count: 0" }

# WMI/CIM Queries (5 values)

# 26. OSVersion # PS גירסה: 3.0+ (השתמש Get-WmiObject עבור 2.0) | מרכז הניהול: לא | דרישות מערכת: ללא נסה את {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -or [string]::IsNullOrEmpty($osInfo.Version)) {         Write-Warning "לא היתה אפשרות לאחזר גירסת מערכת הפעלה"         $osVersion = "Unknown"     } אחר {         $osVersion = $osInfo.Version     אני לא יכול לעשות את     Write-Host "גירסת מערכת ההפעלה: $osVersion" } תפוס את {     # CIM עלול להיכשל בסביבות מסוימות - השתמש בחזרה     $osVersion = [System.Environment]::OSVersion.Version.ToString()     if ([string]::IsNullOrEmpty($osVersion)) { $osVersion = "Unknown" }     Write-Host "גירסת מערכת ההפעלה: $osVersion" }

# 27. LastBootTime # PS גירסה: 3.0+ (השתמש Get-WmiObject עבור 2.0) | מרכז הניהול: לא | דרישות מערכת: ללא נסה את {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -or $null -eq $osInfo.LastBootUpTime) {         Write-Warning "לא היתה אפשרות לאחזר את זמן האתחול האחרון"         $lastBootTime = $null         Write-Host "זמן האתחול האחרון: לא זמין"     } אחר {         $lastBootTime = $osInfo.LastBootUpTime         Write-Host "שעת האתחול האחרון: $lastBootTime"     אני לא יכול לעשות את } תפוס את {     # CIM עלול להיכשל בסביבות מסוימות - השתמש בחזרה     נסה את {         $lastBootTime = (Get-Process -Id 0 -ErrorAction SilentlyContinue). StartTime     } תפוס את {         $lastBootTime = $null     אני לא יכול לעשות את     if ($lastBootTime) { Write-Host Last Boot Time: $lastBootTime" } else { Write-Host "Last Boot Time: Not available" } }

# 28. BaseBoardManufacturer # PS גירסה: 3.0+ (השתמש Get-WmiObject עבור 2.0) | מרכז הניהול: לא | דרישות מערכת: ללא נסה את {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -or [string]::IsNullOrEmpty($baseBoard.Manufacturer)) {         Write-Warning "לא היתה אפשרות לאחזר את יצרן לוח הבסיס"         $baseBoardManufacturer = "Unknown"     } אחר {         $baseBoardManufacturer = $baseBoard.Manufacturer     אני לא יכול לעשות את     Write-Host "יצרן לוח הבסיס: $baseBoardManufacturer" } תפוס את {     # CIM עשוי להיכשל - פרטי לוח הבסיס משלימים     $baseBoardManufacturer = "Unknown"     Write-Host "יצרן לוח הבסיס: $baseBoardManufacturer" }

# 29. BaseBoardProduct # PS גירסה: 3.0+ (השתמש Get-WmiObject עבור 2.0) | מרכז הניהול: לא | דרישות מערכת: ללא נסה את {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -or [string]::IsNullOrEmpty($baseBoard.Product)) {         Write-Warning "לא היתה אפשרות לאחזר מוצר של לוח בסיס"         $baseBoardProduct = "Unknown"     } אחר {         $baseBoardProduct = $baseBoard.Product     אני לא יכול לעשות את     Write-Host "Baseboard Product: $baseBoardProduct" } תפוס את {     # CIM עשוי להיכשל - פרטי לוח הבסיס משלימים     $baseBoardProduct = "Unknown"     Write-Host "מוצר Baseboard: $baseBoardProduct" }

# 30. SecureBootTaskEnabled # PS Version: All | מרכז הניהול: לא | דרישות מערכת: המשימה המתוזמנת קיימת # בדיקה אם המשימה המתוזמנת 'עדכון אתחול מאובטח' זמינה $secureBootTaskEnabled = $null $secureBootTaskStatus = "Unknown" נסה את {     $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' -או $taskData.Status -eq 'פועל')         אני לא יכול לעשות את     } אחר {         $secureBootTaskStatus = "NotFound"         $secureBootTaskEnabled = $false     אני לא יכול לעשות את     if ($secureBootTaskEnabled -eq $false) {         Write-Host "משימת עדכון SecureBoot: $secureBootTaskStatus (זמין: $secureBootTaskEnabled)" -צבע קידמה צהוב     } אחר {         Write-Host "משימת עדכון SecureBoot: $secureBootTaskStatus (זמין: $secureBootTaskEnabled)" -צבע קידמה ירוק     אני לא יכול לעשות את } תפוס את {     $secureBootTaskStatus = "שגיאה"     $secureBootTaskEnabled = $false     Write-Host "משימת עדכון SecureBoot: בדיקת שגיאות - $_" -צבע קידמה אדום }

# 31. WinCS Key Status (F33E0C8E002 - Secure Boot Certificate Update) # PS Version: All | מרכז הניהול: כן (עבור שאילתה) | דרישות המערכת: WinCsFlags.exe $wincsKeyApplied = $null $wincsKeyStatus = "Unknown" נסה את {     # בדוק מיקומים נפוצים עבור WinCsFlags.exe     $wincsFlagsPath = $null     $possiblePaths = @(         "$env:SystemRoot\System32\WinCsFlags.exe",         "אירוחenv:SystemRoot\SysWOW64\WinCsFlags.exe"     )     foreach ($p in $possiblePaths) {         if (Test-Path $p) { $wincsFlagsPath = $p; break }     אני לא יכול לעשות את     if ($wincsFlagsPath) {         מפתח ספציפי לשאילתה # - דורש זכויות מנהל מערכת         $queryOutput = & $wincsFlagsPath /query --key F33E0C8E002 2>&1         $queryOutputStr = $queryOutput -join "'n"         if ($LASTEXITCODE -eq 0) {             # בדוק אם המפתח הוחל (חפש את "תצורה פעילה" או מחוון דומה)             if ($queryOutputStr -match "Active Configuration.*:.*enabled" -or $queryOutputStr -match "Configuration.*applied") {                 $wincsKeyApplied = $true                 $wincsKeyStatus = "הוחל"                 Write-Host "WinCS key F33E0C8E002: Applied" -ForegroundColor Green             } elseif ($queryOutputStr -match "not found|ללא תצורה") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "WinCS key F33E0C8E002: Not Applied" -ForegroundColor Yellow             } אחר {                 מפתח # קיים - בדוק את הפלט עבור מצב                 $wincsKeyApplied = $true                 $wincsKeyStatus = "הוחל"                 Write-Host "WinCS key F33E0C8E002: Applied" -ForegroundColor Green             אני לא יכול לעשות את         } אחר {             # בדוק אם קיימות הודעות שגיאה ספציפיות             if ($queryOutputStr -match "הגישה נדחתה|administrator") {                 $wincsKeyStatus = "AccessDenied"                 Write-Host "WinCS key F33E0C8E002: Access denied (run as admin)" -ForegroundColor DarkGray             } elseif ($queryOutputStr -match "not found|ללא תצורה") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "מפתח WinCS F33E0C8E002: לא הוחל" - צבע קידמה צהוב             } אחר {                 $wincsKeyStatus = "QueryFailed"                 Write-Host "WinCS Key F33E0C8E002: Query failed" -ForegroundColor Red             אני לא יכול לעשות את         אני לא יכול לעשות את     } אחר {         $wincsKeyStatus = "WinCsFlagsNotFound"         Write-Host "WinCS key F33E0C8E002: WinCsFlags.exe not found" -ForegroundColor Gray     אני לא יכול לעשות את } תפוס את {     $wincsKeyStatus = "שגיאה"     Write-Host "WinCS key F33E0C8E002: Error checking - $_" -ForegroundColor Red }              

# =============================================================================מקשים זיהוי # תיקון - פלט מצב & קוד יציאה # =============================================================================

# Build status object from all collected inventory dataמקשים $status = [ordered]@{     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 }     Hostname = $hostname     CollectionTime = if ($collectionTime -is [datetime]) { $collectionTime.ToString("o") } else { "$collectionTime" }     SecureBootEnabled = $secureBootEnabled     HighConfidenceOptOut = $highConfidenceOptOut     MicrosoftUpdateManagedOptIn = $microsoftUpdateManagedOptIn     OEMManufacturerName = $oemManufacturerName     OEMModelSystemFamily = $oemModelSystemFamily     OEMModelNumber = $oemModelNumber     קושחהVersion = $firmwareVersion     FirmwareReleaseDate = $firmwareReleaseDate     OSArchitecture = $osArchitecture     CanAttemptUpdateAfter = if ($canAttemptUpdateAfter -is [datetime]) { $canAttemptUpdateAfter.ToString("o") } else { "$canAttemptUpdateAfter" }     LatestEventId = $latestEventId     BucketId = $bucketId     Confidence = $confidence     SkipReasonKnownIssue = $skipReasonKnownIssue # KI_<מספר> מ- SkipReason באירוע BucketId     Event1801Count = $event 1801Count     Event1808Count = $event 1808Count     # אירועי שגיאה עם פרטים שנלכדו     Event1795Count = $event 1795Count # Firmware returned error     Event1795ErrorCode = $event 1795ErrorCode # קוד שגיאה מקשחה     Event1796Count = $event 1796Count # קוד שגיאה נרשם     Event1796ErrorCode = $event 1796ErrorCode # שלכדת קוד שגיאה     Event1800Count = $event 1800Count # נדרש אתחול מחדש (לא שגיאה)     ממתין לאתחול מחדש = $rebootPending # True אם קיים אירוע 1800     Event1802Count = $event 1802Count # בעיית קושחה ידועה     KnownIssueId = $knownIssueId # KI_<מספר> מ- SkipReason     Event1803Count = $event 1803Count # חסר עדכון KEK     MissingKEK = $missingKEK # OEM צריך לספק KEK חתום של PK     OSVersion = $osVersion     LastBootTime = if ($lastBootTime -is [datetime]) { $lastBootTime.ToString("o") } else { "$lastBootTime" }     BaseBoardManufacturer = $baseBoardManufacturer     BaseBoardProduct = $baseBoardProduct     SecureBootTaskEnabled = $secureBootTaskEnabled     SecureBootTaskStatus = $secureBootTaskStatus     WinCSKeyApplied = $wincsKeyApplied # True אם F33E0C8E002 המפתח מוחל     WinCSKeyStatus = $wincsKeyStatus # Applied, NotApplied, WinCsFlagsNotFound וכו'. }

# Output the status - For data aggregationמקשים $jsonOutput = $status | ConvertTo-Json - דחוס

# If OutputPath provided, save to file; otherwise output to stdoutמקשים if (-not [string]::IsNullOrEmpty($OutputPath)) {     # Validate OutputPath - דלג אם הוא נראה כמו בקשת עזרה או כולל תווים לא חוקיים     if ($OutputPath -match '^[/\-]' -או $OutputPath -match '[<>:"|? *]') {         Write-Host "OutputPath לא חוקי צוין, יוצר פלט ל- stdout" -צבע קידמה צהוב         Write-Output $jsonOutput         if ($secureBootEnabled -and $uefica 2023Status -eq "עודכן") { exit 0 } else { exit 1 }     אני לא יכול לעשות את          # ודא כי תיקיית הפלט קיימת     if (-not (Test-Path $OutputPath)) {         נסה את {             New-Item -ItemType Directory -נתיב $OutputPath -Force | Out-Null         } תפוס את {             Write-Warning "לא היתה אפשרות ליצור תיקיית פלט: $OutputPath - $_"         אני לא יכול לעשות את     אני לא יכול לעשות את          # שמור HOSTNAME_latest.json     $outputFile = Join-Path $OutputPath "$($hostname)_latest.json"     נסה את {         $jsonOutput | Out-File -FilePath $outputFile - קידוד UTF8 -Force         Write-Host "JSON נשמר ב: $outputFile" -צבע קידמה ירוק     } תפוס את {         Write-Warning "לא היתה אפשרות לכתוב לקובץ: $outputFile - $_"         # לחזור למצב קודם         Write-Output $jsonOutput ברירת Write-Output $jsonOutput     אני לא יכול לעשות את } אחר {     # התנהגות מקורית - פלט ל- stdout     Write-Output $jsonOutput }

# Exit code: "Updated" is the success value per the playbookמקשים if ($secureBootEnabled -and $uefica 2023Status -eq "Updated") {     יציאה 0 # ללא בעיה } אחר {     יציאה 1 # עם בעיה }

​​​​​​​

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

גלה את יתרונות המנוי, עיין בקורסי הדרכה, למד כיצד לאבטח את המכשיר שלך ועוד.