Ö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 |
|
|
22 Şubat 2026, Saat 2026, İstanbul |
|
|
13 Şubat 2026, İstanbul |
|
Ö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 }