Uygulandığı Öğe
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

Özgün yayımlama tarihi: 17 Kasım 2025, İstanbul

KB kimliği: 5072718

Tarihi değiştir

Açıklamayı değiştir

24 Şubat 2026, İstanbul

  • Örnek Güvenli Önyükleme Envanteri Veri Toplama betiği güncelleştirildi.

22 Şubat 2026, Saat 2026, İstanbul

  • Örnek Güvenli Önyükleme Envanteri Veri Toplama betiği güncelleştirildi.

13 Şubat 2026, İstanbul

  • Örnek Güvenli Önyükleme Envanteri Veri Toplama betiği güncelleştirildi.

Örnek Güvenli Önyükleme Envanteri Veri Toplama betiği

Bu örnek betiği kopyalayıp yapıştırın ve ortamınız için gerektiği gibi değiştirin: Örnek Güvenli Önyükleme Envanteri Veri Toplama betiği.

<# . ÖZET     Filo genelinde izleme için Güvenli Önyükleme sertifikası güncelleştirme durumunu algılar.

. AÇIKLAMA     Bu algılama betiği Güvenli Önyükleme durumu, sertifika güncelleştirme kayıt defteri değerlerini toplar,     ve cihaz bilgilerini seçin. İzleme ve raporlama için bir JSON dizesi verir.

    Intune Düzeltmeleri, GPO tabanlı koleksiyon ve diğer yönetim araçlarıyla uyumludur.Düzeltme betiği gerekmez; bu yalnızca izlemedir.

    Çıkış 0 = "Sorun yok" (sertifikalar güncelleştirildi)     Çıkış 1 = "Sorun var" (sertifikalar güncelleştirilmedi — yalnızca bilgilendirme)

. PARAMETER OutputPath     Isteğe bağlı. JSON dosyasının kaydedileceği klasörün yolu.Sağlanırsa, HOSTNAME_latest.json bu klasöre kaydeder.Sağlanmadıysa, JSON'ı stdout'a (özgün davranış) çıkışlar.

. ÖRNEK     # stdout çıkışı (Intune/SCCM algılama)     .\Detect-SecureBootCertUpdateStatus.ps1

. ÖRNEK     # Ağ paylaşımına kaydet (GPO dağıtımı)     .\Detect-SecureBootCertUpdateStatus.ps1 -OutputPath "\\server\SecureBootLogs$"

. NOTLAR     https://aka.ms/securebootplaybook başına kayıt defteri yolları:       HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot       HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing

    YAZILIM, "OLDUĞU GIBI" SAĞLANMALI, GARANTİ OLMADAN,     SATILABİlİRLİk GARANTİLERİ DAHİl ANCAK BUNLARLA SıNıRLı OLMAMAK ÜZERE ZımNI,     BELIRLI BIR AMACA UYGUNLUK VE NONINFRINGEMENT. HIÇBIR DURUMDA,     YAZARLAR VEYA TELIF HAKKı SAHIPLERI HERHANGI BIR TALEPTEN, ZARARDAN VEYA DIĞER     SORUMLULUK, SÖZLEŞME, HAKSıZ VEYA BAŞKA BIR EYLEMDE,     YAZıLıM VEYA KULLANıM DıŞı VEYA BUNLARLA BAĞLANTıLı OLARAK VEYA     YAZILIM.#> param(     [Parameter(Zorunlu = $false)]     [string]$OutputPath )

# İNDIRME URL'si: https://aka.ms/getsecureboot -> "Dağıtım ve İzleme Örnekleri" # Not: Bu betik, Güvenli Önyükleme durum verilerini toplamak için uç noktalarda çalışır.

# 1. Hostname # PS Sürümü: Tümü | Yönetici: Hayır | Sistem Gereksinimleri: Yok try {     $hostname = $env:COMPUTERNAME     if ([string]::IsNullOrEmpty($hostname)) {         Write-Warning "Ana bilgisayar adı belirlenemedi"         $hostname = "Bilinmiyor"     }     "Ana bilgisayar adı: $hostname" Write-Host } catch {     Write-Warning "Ana bilgisayar adı alınırken hata oluştu: $_"     $hostname = "Hata"     "Ana bilgisayar adı: $hostname" Write-Host }

# 2. CollectionTime # PS Sürümü: Tümü | Yönetici: Hayır | Sistem Gereksinimleri: Yok try {     $collectionTime = Get-Date     if ($null -eq $collectionTime) {         Write-Warning "Geçerli tarih/saat alınamadı"         $collectionTime = "Bilinmiyor"     }     Write-Host "Koleksiyon Zamanı: $collectionTime" } catch {     Write-Warning "Tarih/saat alınırken hata oluştu: $_"     $collectionTime = "Hata"     Write-Host "Koleksiyon Zamanı: $collectionTime" }

# Kayıt Defteri: Güvenli Önyükleme Ana Anahtarı (3 değer)

# 3. SecureBootEnabled # PS Sürümü: 3.0+ | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: UEFI/Güvenli Önyükleme özellikli sistem try {     $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop     Write-Host "Güvenli Önyükleme Etkin: $secureBootEnabled" } catch {     Write-Warning "Cmdlet aracılığıyla Güvenli Önyükleme durumu belirlenemiyor: $_"     # Kayıt defteri geri dönüşünü deneyin     try {         $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop         $secureBootEnabled = [bool]$regValue.UEFISecureBootEnabled         Write-Host "Güvenli Önyükleme Etkin: $secureBootEnabled"     } catch {         Write-Warning "Kayıt defteri aracılığıyla Güvenli Önyükleme durumu belirlenemiyor. Sistem UEFI/Güvenli Önyüklemeyi desteklemeyebilir."         $secureBootEnabled = $null         Write-Host "Güvenli Önyükleme Etkin: Kullanılamıyor"     } }

# 4. HighConfidenceOptOut # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop     $highConfidenceOptOut = $regValue.HighConfidenceOptOut     Write-Host "Yüksek Güvenilirlikli Geri Çevirme: $highConfidenceOptOut" } catch {     # HighConfidenceOptOut isteğe bağlıdır - çoğu sistemde yoktur     $highConfidenceOptOut = $null     Write-Host "Yüksek Güvenilirlikli Geri Çevirme: Ayarlanmadı" }

# 4b. MicrosoftUpdateManagedOptIn # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name MicrosoftUpdateManagedOptIn -ErrorAction Stop     $microsoftUpdateManagedOptIn = $regValue.MicrosoftUpdateManagedOptIn     Write-Host "Microsoft Update Yönetilen Kabul Etme: $microsoftUpdateManagedOptIn" } catch {     # MicrosoftUpdateManagedOptIn isteğe bağlıdır - çoğu sistemde yoktur     $microsoftUpdateManagedOptIn = $null     Write-Host "Microsoft Update Yönetilen Kabul Etme: Ayarlanmadı" }

# 5. AvailableUpdates # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop     $availableUpdates = $regValue.AvailableUpdates     if ($null -ne $availableUpdates) {         # Onaltılık biçime dönüştür         $availableUpdatesHex = "0x{0:X}" -f $availableUpdates         Write-Host "Kullanılabilir Güncelleştirmeler: $availableUpdatesHex"     } else {         Write-Host "Kullanılabilir Güncelleştirmeler: Kullanılamıyor"     } } catch {     Write-Warning "AvailableUpdates kayıt defteri anahtarı bulunamadı veya erişilemez"     $availableUpdates = $null     Write-Host "Kullanılabilir Güncelleştirmeler: Kullanılamıyor" }

# 5b. AvailableUpdatesPolicy (GPO tarafından denetlenen kalıcı değer) # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdatesPolicy -ErrorAction Stop     $availableUpdatesPolicy = $regValue.AvailableUpdatesPolicy     if ($null -ne $availableUpdatesPolicy) {         # Onaltılık biçime dönüştür         $availableUpdatesPolicyHex = "0x{0:X}" -f $availableUpdatesPolicy         Write-Host "Kullanılabilir Güncelleştirmeler İlkesi: $availableUpdatesPolicyHex"     } else {         Write-Host "Kullanılabilir Güncelleştirmeler İlkesi: Ayarlanmadı"     } } catch {     # AvailableUpdatesPolicy isteğe bağlıdır- yalnızca GPO uygulandığında ayarlanır     $availableUpdatesPolicy = $null     Write-Host "Kullanılabilir Güncelleştirmeler İlkesi: Ayarlanmadı" }

# Kayıt Defteri: Bakım Anahtarı (3 değer)

# 6. UEFICA2023Status # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Status -ErrorAction Stop     $uefica 2023Status = $regValue.UEFICA2023Status     Write-Host "Windows UEFI CA 2023 Durumu: $uefica 2023Status" } catch {     Write-Warning "Windows UEFI CA 2023 Durum kayıt defteri anahtarı bulunamadı veya erişilemez"     $uefica 2023Status = $null     Write-Host "Windows UEFI CA 2023 Durumu: Kullanılamıyor" }

# 7. UEFICA2023Hata # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop     $uefica 2023Hata = $regValue.UEFICA2023Hata     Write-Host "UEFI CA 2023 Hatası: $uefica 2023Hata" } catch {     # UEFICA2023Hata yalnızca bir hata varsa var - devamsızlık iyidir     $uefica 2023Hata = $null     Write-Host "UEFI CA 2023 Hatası: Yok" }

# 8. UEFICA2023ErrorEvent # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023ErrorEvent -ErrorAction Stop     $uefica 2023ErrorEvent = $regValue.UEFICA2023ErrorEvent     Write-Host "UEFI CA 2023 Hata Olayı: $uefica 2023ErrorEvent" } catch {     $uefica 2023ErrorEvent = $null     Write-Host "UEFI CA 2023 Hata Olayı: Kullanılamıyor" }

# Kayıt Defteri: Cihaz Öznitelikleri (7 değer: 9-15)

# 9. OEMManufacturerName # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $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 boş"         $oemManufacturerName = "Bilinmiyor"     }     Write-Host "OEM Üretici Adı: $oemManufacturerName" } catch {     Write-Warning "OEMManufacturerName kayıt defteri anahtarı bulunamadı veya erişilemez"     $oemManufacturerName = $null     Write-Host "OEM Üretici Adı: Kullanılamıyor" }

# 10. OEMModelSystemFamily # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $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 boş"         $oemModelSystemFamily = "Bilinmiyor"     }     Write-Host "OEM Model Sistem Ailesi: $oemModelSystemFamily" } catch {     Write-Warning "OEMModelSystemFamily kayıt defteri anahtarı bulunamadı veya erişilemez"     $oemModelSystemFamily = $null     Write-Host "OEM Model Sistemi Ailesi: Kullanılamıyor" }

# 11. OEMModelNumber # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $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 boş"         $oemModelNumber = "Bilinmiyor"     }     Write-Host "OEM Model Numarası: $oemModelNumber" } catch {     Write-Warning "OEMModelNumber kayıt defteri anahtarı bulunamadı veya erişilemez"     $oemModelNumber = $null     Write-Host "OEM Model Numarası: Kullanılamıyor" }

# 12. FirmwareVersion # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $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 boş"         $firmwareVersion = "Bilinmiyor"     }     Write-Host "Üretici Yazılımı Sürümü: $firmwareVersion" } catch {     Write-Warning "FirmwareVersion kayıt defteri anahtarı bulunamadı veya erişilemez"     $firmwareVersion = $null     Write-Host "Üretici Yazılımı Sürümü: Kullanılamıyor" }

# 13. Üretici YazılımıReleaseDate # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $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 boş"         $firmwareReleaseDate = "Bilinmiyor"     }     Write-Host "Üretici Yazılımı Sürüm Tarihi: $firmwareReleaseDate" } catch {     Write-Warning "FirmwareReleaseDate kayıt defteri anahtarı bulunamadı veya erişilemez"     $firmwareReleaseDate = $null     Write-Host "Üretici Yazılımı Sürüm Tarihi: Kullanılamıyor" }

# 14. OSArchitecture # PS Sürümü: Tümü | Yönetici: Hayır | Sistem Gereksinimleri: Yok try {     $osArchitecture = $env:PROCESSOR_ARCHITECTURE     if ([string]::IsNullOrEmpty($osArchitecture)) {         # Kayıt defteri geri dönüşünü deneyin         $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 belirlenemedi"         $osArchitecture = "Bilinmiyor"     }     Write-Host "İşletim Sistemi Mimarisi: $osArchitecture" } catch {     Write-Warning "OSArchitecture alınırken hata oluştu: $_"     $osArchitecture = "Bilinmiyor"     Write-Host "İs Mimarisi: $osArchitecture" }

# 15. CanAttemptUpdateAfter (FILETIME) # PS Sürümü: Tümü | Yönetici: Gerekli olabilir | Sistem Gereksinimleri: Yok try {     $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop     $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter     # FILETIME'ı UTC DateTime'a dönüştürme — kayıt defteri REG_BINARY (bayt[]) veya REG_QWORD (uzun) olarak depolar     if ($null -ne $canAttemptUpdateAfter) {         try {             if ($canAttemptUpdateAfter -is [bayt[]]) {                 $fileTime = [BitConverter]::ToInt64($canAttemptUpdateAfter, 0)                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($fileTime). ToUniversalTime()             } elseif ($canAttemptUpdateAfter -is [long]) {                 $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter). ToUniversalTime()             }         } catch {             Write-Warning "CanAttemptUpdateAfter FILETIME, DateTime'a dönüştürülemedi"         }     }     Write-Host "GüncelleştirmeDen Sonra Denenebilir: $canAttemptUpdateAfter" } catch {     Write-Warning "CanAttemptUpdateAfter kayıt defteri anahtarı bulunamadı veya erişilemez"     $canAttemptUpdateAfter = $null     Write-Host "Sonrasında Güncelleştirmeyi Deneme: Kullanılamıyor" }

# Olay Günlükleri: Sistem Günlüğü (10 değer: 16-25)

# 16-25. Olay Günlüğü sorguları # Olay Kimlikleri: # 1801 - Güncelleştirme başlatıldı, yeniden başlatma gerekiyor # 1808 - Güncelleştirme başarıyla tamamlandı # 1795 - Üretici yazılımı hata döndürdü (yakalama hata kodu) # 1796 - Hata koduyla günlüğe kaydedilen hata (yakalama kodu) # 1800 - Yeniden başlatma gerekiyor (Hata DEĞIL - güncelleştirme yeniden başlatmadan sonra devam edecek) # 1802 - Bilinen üretici yazılımı sorunu engellenen güncelleştirme (SkipReason'dan KI_<numarası> yakalama) # 1803 - Eşleşen KEK güncelleştirmesi bulunamadı (OEM'in PK imzalı KEK sağlaması gerekiyor) # PS Sürümü: 3.0+ | Yönetici: Sistem günlüğü için gerekli olabilir | Sistem Gereksinimleri: Yok try {     # Tüm ilgili Güvenli Önyükleme olay kimliklerini sorgula     $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 "Sistem günlüğünde Güvenli Önyükleme olayı bulunamadı"         $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 "En Son Olay Kimliği: Kullanılamıyor"         Write-Host "Demet Kimliği: Kullanılamıyor"         Write-Host "Güvenilirlik: Kullanılamıyor"         Write-Host "Olay 1801 Sayısı: 0"         Write-Host "Olay 1808 Sayısı: 0"     } else {         # 16. LatestEventId         $latestEvent = $events | Sort-Object TimeCreated -Descending | Select-Object -İlk 1         if ($null -eq $latestEvent) {             Write-Warning "En son olay belirlenemedi"             $latestEventId = $null             Write-Host "En Son Olay Kimliği: Kullanılamıyor"         } else {             $latestEventId = $latestEvent.Id             Write-Host "En Son Olay Kimliği: $latestEventId"         }

        # 17. BucketID - Olay 1801/1808'den Ayıklandı         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketId:\s*(.+)') {                 $bucketId = $matches[1]. Trim()                 Write-Host "Demet Kimliği: $bucketId"             } else {                 Write-Warning "BucketId olay iletisinde bulunamadı"                 $bucketId = $null                 Write-Host "Demet Kimliği: Olayda Bulunamadı"             }         } else {             Write-Warning "En son olay veya ileti null, BucketId ayıklanamıyor"             $bucketId = $null             Write-Host "Demet Kimliği: Kullanılamıyor"         }

        # 18. Güvenilirlik - Olay 1801/1808'den Ayıklandı         if ($null -ne $latestEvent -and $null -ne $latestEvent.Message) {             if ($latestEvent.Message -match 'BucketConfidenceLevel:\s*(.+)') {                 $confidence = $matches[1]. Trim()                 Write-Host "Güvenilirlik: $confidence"             } else {                 Write-Warning "Olay iletisinde güvenilirlik düzeyi bulunamadı"                 $confidence = $null                 Write-Host "Güvenilirlik: Olayda Bulunamadı"             }         } else {             Write-Warning "En son olay veya ileti null, Güvenilirlik ayıklanamıyor"             $confidence = $null             Write-Host "Güvenilirlik: Kullanılamıyor"         }

        # 18b. SkipReason - BucketId ile aynı olayda SkipReason'dan KI_<sayı> ayıklama         # Bu, BucketId/Confidence ile birlikte görünen Bilinen Sorun Kimliklerini yakalar (yalnızca Olay 1802'yi değil)         $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 Bilinen Sorun: $skipReasonKnownIssue" -ForegroundColor Yellow             }         }

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

        # 20. Event1808Count         $event 1808Array = @($events | Where-Object {$_. Id -eq 1808})         $event 1808Count = $event 1808Array.Count         Write-Host "Olay 1808 Sayısı: $event 1808Count"                  # Hata olayı değişkenlerini başlatma         $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                  # Yalnızca güncelleştirme tamamlanmadıysa hata olaylarını denetleyin         # Hata analizini atla: 1808 en son olaysa VEYA UEFICA2023Status "Güncelleştirildi"         $updateComplete = ($latestEventId -eq 1808) -veya ($uefica 2023Status -eq "Güncelleştirildi")                  if (-not $updateComplete) {             Write-Host "Güncelleştirme tamamlanamadı - hata olayları denetleniyor..." -ForegroundColor Yellow                          # 21. Event1795 - Üretici Yazılımı Hatası (yakalama hata kodu)             $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 -İlk 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 "Olay 1795 (Üretici Yazılımı Hatası) Sayısı: $event 1795Count" $(if ($event 1795ErrorCode) { "Code: $event 1795ErrorCode" })             }                          # 22. Event1796 - Hata Kodu Günlüğe Kaydedildi (yakalama hata kodu)             $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 -İlk 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 "Olay 1796 (Hata Günlüğe Kaydedildi) Sayısı: $event 1796Count" $(if ($event 1796ErrorCode) { "Code: $event 1796ErrorCode" })             }                          # 23. Event1800 - Yeniden Başlatma Gerekiyor (Hata DEĞIL - güncelleştirme yeniden başlatmadan sonra devam edecek)             $event 1800Array = @($events | Where-Object {$_. Id -eq 1800})             $event 1800Count = $event 1800Array.Count             $rebootPending = $event 1800Count -gt 0             if ($rebootPending) {                 Write-Host "Olay 1800 (Yeniden Başlatma Bekleniyor): Güncelleştirme yeniden başlatıldıktan sonra devam edecek" -ForegroundColor Cyan             }                          # 24. Event1802 - Bilinen Üretici Yazılımı Sorunu (SkipReason'dan KI_<sayı> yakalama)             $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 -İlk 1                 if ($latestEvent 1802.Message -match 'SkipReason:\s*(KI_\d+)') {                     $knownIssueId = $matches[1]                 }                 Write-Host "Olay 1802 (Bilinen Üretici Yazılımı Sorunu) Sayısı: $event 1802Count" $(if ($knownIssueId) { "KI: $knownIssueId" })             }                          # 25. Olay1803 - Eksik KEK Güncelleştirmesi (OEM'in PK imzalı KEK sağlaması gerekir)             $event 1803Array = @($events | Where-Object {$_. Id -eq 1803})             $event 1803Count = $event 1803Array.Count             $missingKEK = $event 1803Count -gt 0             if ($missingKEK) {                 Write-Host "Olay 1803 (Eksik KEK): OEM'in PK imzalı KEK sağlaması gerekiyor" -ForegroundColor Yellow             }         } else {             Write-Host "Güncelleştirme tamamlandı (Olay 1808 veya Durum=Güncelleştirildi) - hata analizi atlanıyor" -ForegroundColor Green         }     } } catch {     Write-Warning "Olay günlükleri alınırken hata oluştu. Yönetici ayrıcalıkları gerektirebilir: $_"     $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 "En Son Olay Kimliği: Hata"     Write-Host "Demet Kimliği: Hata"     Write-Host "Güvenilirlik: Hata"     Write-Host "Olay 1801 Sayısı: 0"     Write-Host "Olay 1808 Sayısı: 0" }

# WMI/CIM Sorguları (5 değer)

# 26. OSVersion # PS Sürümü: 3.0+ (2.0 için Get-WmiObject kullanın) | Yönetici: Hayır | Sistem Gereksinimleri: Yok try {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -veya [string]::IsNullOrEmpty($osInfo.Version)) {         Write-Warning "İşletim sistemi sürümü alınamadı"         $osVersion = "Bilinmiyor"     } else {         $osVersion = $osInfo.Version     }     Write-Host "İşletim Sistemi Sürümü: $osVersion" } catch {     # CIM bazı ortamlarda başarısız olabilir - geri dönüş kullanın     $osVersion = [System.Environment]::OSVersion.Version.ToString()     if ([string]::IsNullOrEmpty($osVersion)) { $osVersion = "Unknown" }     Write-Host "İşletim Sistemi Sürümü: $osVersion" }

# 27. LastBootTime # PS Sürümü: 3.0+ (2.0 için Get-WmiObject kullanın) | Yönetici: Hayır | Sistem Gereksinimleri: Yok try {     $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop     if ($null -eq $osInfo -veya $null -eq $osInfo.LastBootUpTime) {         Write-Warning "Son önyükleme zamanı alınamadı"         $lastBootTime = $null         Write-Host "Son Önyükleme Zamanı: Kullanılamıyor"     } else {         $lastBootTime = $osInfo.LastBootUpTime         Write-Host "Son Önyükleme Zamanı: $lastBootTime"     } } catch {     # CIM bazı ortamlarda başarısız olabilir - geri dönüş kullanın     try {         $lastBootTime = (Get-Process -Id 0 -ErrorAction SilentlyContinue). Starttime     } catch {         $lastBootTime = $null     }     if ($lastBootTime) { Write-Host "Son Önyükleme Zamanı: $lastBootTime" } else { Write-Host "Son Önyükleme Zamanı: Kullanılamıyor" } } }

# 28. BaseBoardManufacturer # PS Sürümü: 3.0+ (2.0 için Get-WmiObject kullanın) | Yönetici: Hayır | Sistem Gereksinimleri: Yok try {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -veya [string]::IsNullOrEmpty($baseBoard.Manufacturer)) {         Write-Warning "Temel kart üreticisi alınamadı"         $baseBoardManufacturer = "Bilinmiyor"     } else {         $baseBoardManufacturer = $baseBoard.Manufacturer     }     Write-Host "Temel Kart Üreticisi: $baseBoardManufacturer" } catch {     # CIM başarısız olabilir - temel kart bilgileri tamamlayıcıdır     $baseBoardManufacturer = "Bilinmiyor"     Write-Host "Temel Kart Üreticisi: $baseBoardManufacturer" }

# 29. BaseBoardProduct # PS Sürümü: 3.0+ (2.0 için Get-WmiObject kullanın) | Yönetici: Hayır | Sistem Gereksinimleri: Yok try {     $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop     if ($null -eq $baseBoard -veya [string]::IsNullOrEmpty($baseBoard.Product)) {         Write-Warning "Temel kart ürünü alınamadı"         $baseBoardProduct = "Bilinmiyor"     } else {         $baseBoardProduct = $baseBoard.Product     }     Write-Host "Temel Kart Ürünü: $baseBoardProduct" } catch {     # CIM başarısız olabilir - temel kart bilgileri tamamlayıcıdır     $baseBoardProduct = "Bilinmiyor"     Write-Host "Temel Kart Ürünü: $baseBoardProduct" }

# 30. SecureBootTaskEnabled # PS Sürümü: Tümü | Yönetici: Hayır | Sistem Gereksinimleri: Zamanlanmış Görev var # Secure-Boot-Update zamanlanmış görevinin etkinleştirilip etkinleştirilmediğini denetler $secureBootTaskEnabled = $null $secureBootTaskStatus = "Bilinmiyor" try {     $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' -veya $taskData.Status -eq 'Çalışıyor')         }     } else {         $secureBootTaskStatus = "NotFound"         $secureBootTaskEnabled = $false     }     if ($secureBootTaskEnabled -eq $false) {         Write-Host "SecureBoot Güncelleştirme Görevi: $secureBootTaskStatus (Etkin: $secureBootTaskEnabled)" -ForegroundColor Yellow     } else {         Write-Host "SecureBoot Güncelleştirme Görevi: $secureBootTaskStatus (Etkin: $secureBootTaskEnabled)" -ForegroundColor Green     } } catch {     $secureBootTaskStatus = "Hata"     $secureBootTaskEnabled = $false     Write-Host "SecureBoot Güncelleştirme Görevi: Hata denetimi - $_" -ForegroundColor Red }

# 31. WinCS Anahtar Durumu (F33E0C8E002 - Güvenli Önyükleme Sertifikası Güncelleştirmesi) # PS Sürümü: Tümü | Yönetici: Evet (sorgu için) | Sistem Gereksinimleri: WinCsFlags.exe $wincsKeyApplied = $null $wincsKeyStatus = "Bilinmiyor" try {     # WinCsFlags.exe için ortak konumları denetleyin     $wincsFlagsPath = $null     $possiblePaths = @(         "$env:SystemRoot\System32\WinCsFlags.exe",         "$env:SystemRoot\SysWOW64\WinCsFlags.exe"     )     foreach ($possiblePaths'da $p) {         if (Test Yolu $p) { $wincsFlagsPath = $p; break }     }     if ($wincsFlagsPath) {         # Sorguya özgü anahtar - yönetici hakları gerektirir         $queryOutput = & $wincsFlagsPath /query --key F33E0C8E002 2>&1         $queryOutputStr = $queryOutput -join "'n"         if ($LASTEXITCODE -eq 0) {             # Anahtarın uygulanmış olup olmadığını denetleyin ("Etkin Yapılandırma" veya benzer bir gösterge arayın)             if ($queryOutputStr -match "Active Configuration.*:.*enabled" -or $queryOutputStr -match "Configuration.*applied") {                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Uygulandı"                 Write-Host "WinCS Anahtarı F33E0C8E002: Uygulandı" -ForegroundColor Green             } elseif ($queryOutputStr -match "bulunamadı|Yapılandırma yok") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "WinCS Anahtarı F33E0C8E002: Uygulanmadı" -ForegroundColor Yellow             } else {                 # Anahtar var - durum için çıkışı denetleyin                 $wincsKeyApplied = $true                 $wincsKeyStatus = "Uygulandı"                 Write-Host "WinCS Anahtar F33E0C8E002: Applied" -ForegroundColor Green             }         } else {             # Belirli hata iletilerini denetleyin             if ($queryOutputStr -match "Access denied|administrator") {                 $wincsKeyStatus = "AccessDenied"                 Write-Host "WinCS Anahtarı F33E0C8E002: Erişim reddedildi (yönetici olarak çalıştır)" -ForegroundColor DarkGray             } elseif ($queryOutputStr -match "bulunamadı|Yapılandırma yok") {                 $wincsKeyApplied = $false                 $wincsKeyStatus = "NotApplied"                 Write-Host "WinCS Anahtarı F33E0C8E002: Uygulanmadı" -ForegroundColor Yellow             } else {                 $wincsKeyStatus = "QueryFailed"                 Write-Host "WinCS Anahtarı F33E0C8E002: Sorgu başarısız oldu" -ForegroundColor Red             }         }     } else {         $wincsKeyStatus = "WinCsFlagsNotFound"         Write-Host "WinCS Anahtarı F33E0C8E002: WinCsFlags.exe bulunamadı" -ForegroundColor Gray     } } catch {     $wincsKeyStatus = "Hata"     Write-Host "WinCS Anahtarı F33E0C8E002: Hata denetimi - $_" -ForegroundColor Red }              

# ============================================================================= # Düzeltme Algılama - Çıkış Kodu & Durum Çıkışı # =============================================================================

# Toplanan tüm envanter verilerinden derleme durumu nesnesi $status = [ordered]@{     UEFICA2023Status = $uefica 2023Status     UEFICA2023Error = $uefica 2023Hata     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     FirmwareVersion = $firmwareVersion     FirmwareReleaseDate = $firmwareReleaseDate     OSArchitecture = $osArchitecture     CanAttemptUpdateAfter = if ($canAttemptUpdateAfter -is [datetime]) { $canAttemptUpdateAfter.ToString("o") } else { "$canAttemptUpdateAfter" }     LatestEventId = $latestEventId     BucketId = $bucketId     Güvenilirlik = $confidence     BucketId olayında SkipReason'dan SkipReasonKnownIssue = $skipReasonKnownIssue # KI_<numarası>     Event1801Count = $event 1801Count     Event1808Count = $event 1808Count     # Yakalanan ayrıntıları içeren hata olayları     Event1795Count = $event 1795Count # Üretici yazılımı hata döndürdü     Event1795ErrorCode = $event 1795ErrorCode # Üretici yazılımından hata kodu     Event1796Count = $event 1796Count # Hata kodu günlüğe kaydedildi     Event1796ErrorCode = $event 1796ErrorCode # Yakalanan hata kodu     Event1800Count = $event 1800Count # Yeniden başlatma gerekiyor (Hata DEĞIL)     Olay 1800 varsa RebootPending = $rebootPending # True     Event1802Count = $event 1802Count # Bilinen üretici yazılımı sorunu     KnownIssueId = SkipReason'dan $knownIssueId # KI_<numarası>     Event1803Count = $event 1803Count # Eksik KEK güncelleştirmesi     MissingKEK = $missingKEK # OEM'in PK imzalı KEK sağlaması gerekiyor     OSVersion = $osVersion     LastBootTime = if ($lastBootTime -is [datetime]) { $lastBootTime.ToString("o") } else { "$lastBootTime" }     BaseBoardManufacturer = $baseBoardManufacturer     BaseBoardProduct = $baseBoardProduct     SecureBootTaskEnabled = $secureBootTaskEnabled     SecureBootTaskStatus = $secureBootTaskStatus     F33E0C8E002 anahtar uygulanırsa WinCSKeyApplied = $wincsKeyApplied # True     WinCSKeyStatus = $wincsKeyStatus # Uygulandı, Uygulanmadı, WinCsFlagsNotFound vb. }

# Çıkış durumu - Veri toplama için $jsonOutput = $status | ConvertTo-Json -Sıkıştır

# OutputPath sağlandıysa, dosyaya kaydedin; aksi takdirde stdout çıkışı if (-not [string]::IsNullOrEmpty($OutputPath)) {     # Validate OutputPath - Yardım isteği gibi görünüyorsa veya geçersiz karakterlere sahipse atlayın     if ($OutputPath -match '^[/\-]' -veya $OutputPath -match '[<>:"|? *]') {         Write-Host "Geçersiz OutputPath belirtildi, stdout'a çıktı" -ForegroundColor Yellow         Write-Output $jsonOutput         if ($secureBootEnabled -and $uefica 2023Status -eq "Güncelleştirildi") { exit 0 } else { exit 1 }     }          # Çıkış klasörünün var olduğundan emin olun     if (-not (Test-Path $OutputPath)) {         try {             New-Item -ItemType Directory -Path $OutputPath -Force | Out-Null         } catch {             Write-Warning "Çıkış klasörü oluşturulamadı: $OutputPath - $_"         }     }          # HOSTNAME_latest.json kaydet     $outputFile = "$($hostname)_latest.json" Join-Path $OutputPath     try {         $jsonOutput | Out-File -FilePath $outputFile -Encoding UTF8 -Force         Write-Host "JSON kaydedildiği yer: $outputFile" -ForegroundColor Green     } catch {         Write-Warning "Dosyaya yazılamadı: $outputFile - $_"         # Stdout'a geri dön         Write-Output $jsonOutput     } } else {     # Özgün davranış - stdout çıkışı     Write-Output $jsonOutput }

# Çıkış kodu: "Güncelleştirildi" playbook başına başarı değeridir if ($secureBootEnabled -and $uefica 2023Status -eq "Güncelleştirildi") {     çıkış 0 # Sorun olmadan } else {     exit 1 # With issue }

Daha fazla yardıma mı ihtiyacınız var?

Daha fazla seçenek mi istiyorsunuz?

Abonelik avantajlarını keşfedin, eğitim kurslarına göz atın, cihazınızın güvenliğini nasıl sağlayacağınızı öğrenin ve daha fazlasını yapın.