원래 게시 날짜: 2025년 11월 17일
KB ID: 5072718
샘플 보안 부팅 인벤토리 데이터 수집 스크립트
이 샘플 스크립트를 복사하여 붙여넣고 사용자 환경에 필요한 대로 수정합니다. 샘플 보안 부팅 인벤토리 데이터 수집 스크립트입니다.
Sample_Secure_Boot_Inventory_Data_Collection_script
# 1. HostName # PS 버전: 모두 | 관리: 아니요 | 시스템 요구 사항: 없음 try { $hostname = $env:COMPUTERNAME if ([string]::IsNullOrEmpty($hostname)) { Write-Warning "호스트 이름을 확인할 수 없습니다." $hostname = "알 수 없음" } Write-Host "호스트 이름: $hostname" } catch { Write-Warning "호스트 이름을 검색하는 동안 오류가 발생했습니다. $_" $hostname = "오류" Write-Host "호스트 이름: $hostname" }
# 2. CollectionTime # PS 버전: 모두 | 관리: 아니요 | 시스템 요구 사항: 없음 try { $collectionTime = Get-Date if ($null -eq $collectionTime) { Write-Warning "현재 날짜/시간을 검색할 수 없음" $collectionTime = "알 수 없음" } Write-Host "컬렉션 시간: $collectionTime" } catch { Write-Warning "날짜/시간 검색 오류: $_" $collectionTime = "오류" Write-Host "컬렉션 시간: $collectionTime" }
# Registry: Secure Boot Main Key (3 values)
# 3. SecureBootEnabled # PS 버전: 3.0 이상 | 관리: 필요할 수 있음 | 시스템 요구 사항: UEFI/보안 부팅 가능 시스템 try { $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction 중지 Write-Host "보안 부팅 사용: $secureBootEnabled" } catch { Write-Warning "cmdlet을 통해 보안 부팅 상태 확인할 수 없음: $_" # 레지스트리 대체 시도 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop $secureBootEnabled = [bool]$regValue.UEFISecureBootEnabled Write-Host "보안 부팅 사용: $secureBootEnabled" } catch { Write-Warning "레지스트리를 통해 보안 부팅 상태 확인할 수 없습니다. 시스템에서 UEFI/보안 부팅을 지원하지 않을 수 있습니다." $secureBootEnabled = $null Write-Host "보안 부팅 사용: 사용할 수 없음" } }
# 4. HighConfidenceOptOut # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop $highConfidenceOptOut = $regValue.HighConfidenceOptOut Write-Host "높은 신뢰도 옵트아웃: $highConfidenceOptOut" } catch { Write-Warning "HighConfidenceOptOut 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $highConfidenceOptOut = $null Write-Host "높은 신뢰도 옵트아웃: 사용할 수 없음" }
# 5. AvailableUpdates # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop $availableUpdates = $regValue.AvailableUpdates if ($null -ne $availableUpdates) { # 16진수 형식으로 변환 $availableUpdatesHex = "0x{0:X}" -f $availableUpdates Write-Host "사용 가능한 업데이트: $availableUpdatesHex" } else { Write-Host "사용 가능한 업데이트: 사용할 수 없음" } } catch { Write-Warning "AvailableUpdates 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $availableUpdates = $null Write-Host "사용 가능한 업데이트: 사용할 수 없음" }
# Registry: Servicing Key (3 values)
# 6. UEFICA2023Status # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Status -ErrorAction Stop $uefica 2023Status = $regValue.UEFICA2023Status Write-Host "UEFI CA 2023 상태: $uefica 2023Status" } catch { Write-Warning "UEFICA2023Status 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $uefica 2023Status = $null Write-Host "UEFI CA 2023 상태: 사용할 수 없음" }
# 7. UEFICA2023Capable # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Capable -ErrorAction Stop $uefica 2023Capable = $regValue.UEFICA2023Capable Write-Host "UEFI CA 2023 지원: $uefica 2023Capable" } catch { Write-Warning "UEFICA2023Capable 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $uefica 2023Capable = $null Write-Host "UEFI CA 2023 지원: 사용할 수 없음" }
# 8. UEFICA2023Error # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop $uefica 2023Error = $regValue.UEFICA2023Error Write-Host "UEFI CA 2023 오류: $uefica 2023Error" } catch { Write-Warning "UEFICA2023Error 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $uefica 2023Error = $null Write-Host "UEFI CA 2023 오류: 사용할 수 없음" }
# Registry: Device Attributes (7 values)
# 9. OEMManufacturerName # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\DeviceAttributes" -Name OEMManufacturerName -ErrorAction Stop $oemManufacturerName = $regValue.OEMManufacturerName if ([string]::IsNullOrEmpty($oemManufacturerName)) { Write-Warning "OEMManufacturerName이 비어 있습니다." $oemManufacturerName = "알 수 없음" } Write-Host "OEM 제조업체 이름: $oemManufacturerName" } catch { Write-Warning "OEMManufacturerName 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $oemManufacturerName = $null Write-Host "OEM 제조업체 이름: 사용할 수 없음" }
# 10. OEMModelSystemFamily # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\DeviceAttributes" -Name OEMModelSystemFamily -ErrorAction Stop $oemModelSystemFamily = $regValue.OEMModelSystemFamily if ([string]::IsNullOrEmpty($oemModelSystemFamily)) { Write-Warning "OEMModelSystemFamily가 비어 있습니다." $oemModelSystemFamily = "알 수 없음" } Write-Host "OEM 모델 시스템 패밀리: $oemModelSystemFamily" } catch { Write-Warning "OEMModelSystemFamily 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $oemModelSystemFamily = $null Write-Host "OEM 모델 시스템 패밀리: 사용할 수 없음" }
# 11. OEMModelNumber # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\DeviceAttributes" -Name OEMModelNumber -ErrorAction Stop $oemModelNumber = $regValue.OEMModelNumber if ([string]::IsNullOrEmpty($oemModelNumber)) { Write-Warning "OEMModelNumber가 비어 있음" $oemModelNumber = "알 수 없음" } Write-Host "OEM 모델 번호: $oemModelNumber" } catch { Write-Warning "OEMModelNumber 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $oemModelNumber = $null Write-Host "OEM 모델 번호: 사용할 수 없음" }
# 12. FirmwareVersion # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\DeviceAttributes" -Name FirmwareVersion -ErrorAction Stop $firmwareVersion = $regValue.FirmwareVersion if ([string]::IsNullOrEmpty($firmwareVersion)) { Write-Warning "FirmwareVersion이 비어 있음" $firmwareVersion = "알 수 없음" } Write-Host "펌웨어 버전: $firmwareVersion" } catch { Write-Warning "FirmwareVersion 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $firmwareVersion = $null Write-Host "펌웨어 버전: 사용할 수 없음" }
# 13. FirmwareReleaseDate # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\DeviceAttributes" -Name FirmwareReleaseDate -ErrorAction Stop $firmwareReleaseDate = $regValue.FirmwareReleaseDate if ([string]::IsNullOrEmpty($firmwareReleaseDate)) { Write-Warning "FirmwareReleaseDate가 비어 있음" $firmwareReleaseDate = "알 수 없음" } Write-Host "펌웨어 릴리스 날짜: $firmwareReleaseDate" } catch { Write-Warning "FirmwareReleaseDate 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $firmwareReleaseDate = $null Write-Host "펌웨어 릴리스 날짜: 사용할 수 없음" }
# 14. OSArchitecture # PS 버전: 모두 | 관리: 아니요 | 시스템 요구 사항: 없음 try { $osArchitecture = $env:PROCESSOR_ARCHITECTURE if ([string]::IsNullOrEmpty($osArchitecture)) { # 레지스트리 대체 시도 $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\DeviceAttributes" -Name OSArchitecture -ErrorAction Stop $osArchitecture = $regValue.OSArchitecture } if ([string]::IsNullOrEmpty($osArchitecture)) { Write-Warning "OSArchitecture를 확인할 수 없음" $osArchitecture = "알 수 없음" } Write-Host "OS 아키텍처: $osArchitecture" } catch { Write-Warning "OSArchitecture를 검색하는 동안 오류가 발생했습니다. $_" $osArchitecture = "알 수 없음" Write-Host "OS 아키텍처: $osArchitecture" }
# 15. CanAttemptUpdateAfter (FILETIME) # PS 버전: 모두 | 관리: 필요할 수 있음 | 시스템 요구 사항: 없음 try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter # 유효한 숫자인 경우 FILETIME을 DateTime으로 변환 if ($null -ne $canAttemptUpdateAfter -and $canAttemptUpdateAfter -is [long]) { try { $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter) } catch { Write-Warning "CanAttemptUpdateAfter FILETIME을 DateTime으로 변환할 수 없음" } } Write-Host "다음에 업데이트를 시도할 수 있습니다: $canAttemptUpdateAfter" } catch { Write-Warning "CanAttemptUpdateAfter 레지스트리 키를 찾을 수 없거나 액세스할 수 없음" $canAttemptUpdateAfter = $null Write-Host "다음에 업데이트를 시도할 수 있음: 사용할 수 없음" }
# Event Logs: System Log (5 values)
# 16-20. Event Log queries # PS 버전: 3.0 이상 | 관리: 시스템 로그에 필요할 수 있음 | 시스템 요구 사항: 없음 try { $allEventIds = @(1801, 1808) $events = @(Get-WinEvent -FilterHashtable @{LogName='System'; ID=$allEventIds} -MaxEvents 20 -ErrorAction Stop)
if ($events.Count -eq 0) { Write-Warning "시스템 로그에 보안 부팅 이벤트 없음(1801/1808)이 없음" $latestEventId = $null $bucketId = $null $confidence = $null $event 1801Count = 0 $event 1808Count = 0 Write-Host "최신 이벤트 ID: 사용할 수 없음" Write-Host "버킷 ID: 사용할 수 없음" Write-Host "신뢰도: 사용할 수 없음" Write-Host "이벤트 1801 개수: 0" Write-Host "이벤트 1808 개수: 0" } else { # 16. LatestEventId $latestEvent = $events | Sort-Object TimeCreated -Descending | Select-Object -First 1 if ($null -eq $latestEvent) { Write-Warning "최신 이벤트를 확인할 수 없음" $latestEventId = $null Write-Host "최신 이벤트 ID: 사용할 수 없음" } else { $latestEventId = $latestEvent.Id Write-Host "최신 이벤트 ID: $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]. Trim() Write-Host "버킷 ID: $bucketId" } else { Write-Warning "이벤트 메시지에서 BucketId를 찾을 수 없음" $bucketId = $null Write-Host "버킷 ID: 이벤트에서 찾을 수 없음" } } else { Write-Warning "최신 이벤트 또는 메시지가 null이면 BucketId를 추출할 수 없습니다." $bucketId = $null Write-Host "버킷 ID: 사용할 수 없음" }
# 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]. Trim() Write-Host "신뢰도: $confidence" } else { Write-Warning "이벤트 메시지에서 신뢰 수준을 찾을 수 없음" $confidence = $null Write-Host "신뢰도: 이벤트에서 찾을 수 없음" } } else { Write-Warning "최신 이벤트 또는 메시지가 null이면 신뢰도를 추출할 수 없습니다." $confidence = $null Write-Host "신뢰도: 사용할 수 없음" }
# 19. Event1801Count $event 1801Array = @($events | Where-Object {$_. Id -eq 1801}) $event 1801Count = $event 1801Array.Count Write-Host "이벤트 1801 개수: $event 1801Count"
# 20. Event1808Count $event 1808Array = @($events | Where-Object {$_. Id -eq 1808}) $event 1808Count = $event 1808Array.Count Write-Host "이벤트 1808 개수: $event 1808Count" } } catch { Write-Warning "이벤트 로그를 검색하는 동안 오류가 발생했습니다. 관리자 권한이 필요할 수 있음: $_" $latestEventId = $null $bucketId = $null $confidence = $null $event 1801Count = 0 $event 1808Count = 0 Write-Host "최신 이벤트 ID: 오류" Write-Host "버킷 ID: 오류" Write-Host "신뢰도: 오류" Write-Host "이벤트 1801 개수: 0" Write-Host "이벤트 1808 개수: 0" }
# WMI/CIM Queries (4 values)
# 21. OSVersion # PS 버전: 3.0 이상(2.0에 Get-WmiObject 사용) | 관리: 아니요 | 시스템 요구 사항: 없음 try { $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction 중지 if ($null -eq $osInfo -또는 [string]::IsNullOrEmpty($osInfo.Version)) { Write-Warning "OS 버전을 검색할 수 없음" $osVersion = "알 수 없음" } else { $osVersion = $osInfo.Version } Write-Host "OS 버전: $osVersion" } catch { Write-Warning "OS 버전 검색 오류: $_" $osVersion = "알 수 없음" Write-Host "OS 버전: $osVersion" }
# 22. LastBootTime # PS 버전: 3.0 이상(2.0에 Get-WmiObject 사용) | 관리: 아니요 | 시스템 요구 사항: 없음 try { $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction 중지 if ($null -eq $osInfo -또는 $null -eq $osInfo.LastBootUpTime) { Write-Warning "마지막 부팅 시간을 검색할 수 없음" $lastBootTime = $null Write-Host "마지막 부팅 시간: 사용할 수 없음" } else { $lastBootTime = $osInfo.LastBootUpTime Write-Host "마지막 부팅 시간: $lastBootTime" } } catch { Write-Warning "마지막 부팅 시간을 검색하는 동안 오류가 발생했습니다. $_" $lastBootTime = $null Write-Host "마지막 부팅 시간: 사용할 수 없음" }
# 23. BaseBoardManufacturer # PS 버전: 3.0 이상(2.0에 Get-WmiObject 사용) | 관리: 아니요 | 시스템 요구 사항: 없음 try { $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction 중지 if ($null -eq $baseBoard -또는 [string]::IsNullOrEmpty($baseBoard.Manufacturer)) { Write-Warning "베이스보드 제조업체를 검색할 수 없음" $baseBoardManufacturer = "알 수 없음" } else { $baseBoardManufacturer = $baseBoard.Manufacturer } Write-Host "베이스보드 제조업체: $baseBoardManufacturer" } catch { Write-Warning "베이스보드 제조업체를 검색하는 중 오류 발생: $_" $baseBoardManufacturer = "알 수 없음" Write-Host "베이스보드 제조업체: $baseBoardManufacturer" }
# 24. BaseBoardProduct # PS 버전: 3.0 이상(2.0에 Get-WmiObject 사용) | 관리: 아니요 | 시스템 요구 사항: 없음 try { $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction 중지 if ($null -eq $baseBoard -또는 [string]::IsNullOrEmpty($baseBoard.Product)) { Write-Warning "베이스보드 제품을 검색할 수 없음" $baseBoardProduct = "알 수 없음" } else { $baseBoardProduct = $baseBoard.Product } Write-Host "베이스보드 제품: $baseBoardProduct" } catch { Write-Warning "베이스보드 제품 검색 오류: $_" $baseBoardProduct = "알 수 없음" Write-Host "베이스보드 제품: $baseBoardProduct"}