Data de publicação original: 17 de novembro de 2025
ID do KB: 5072718
|
Data da alteração |
Alterar descrição |
|
13 de fevereiro de 2026 |
|
Script de coleta de dados de inventário de inicialização segura de exemplo
Copie e cole este script de exemplo e modifique conforme necessário para seu ambiente: o script de Coleta de Dados de Inventário de Inicialização Segura de Exemplo.
<# . SINOPSE Detecta status de atualização de certificado de Inicialização Segura para monitoramento em toda a frota.
.DESCRIPTION Este script de detecção coleta status de inicialização segura, valores de registro de atualização de certificado, e informações do dispositivo. Ele gera uma cadeia de caracteres JSON para monitoramento e relatórios.
Compatible with Intune Remediations, GPO-based collection, and other management tools. Nenhum script de correção é necessário – isso é apenas monitoramento.
Exit 0 = "Without issue" (certificates updated) Saída 1 = "Com problema" (certificados não atualizados – somente informativos)
Source: https://support.microsoft.com/en-us/topic/sample-secure-boot-inventory-data-collection-script-d02971d2-d4b5-42c9-b58a-8527f0ffa30b ID do KB: 5072718
.NOTES Caminhos de registro por 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 IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, FITNESS PARA UM PROPÓSITO ESPECÍFICO E NÃO VIOLAÇÃO. EM NENHUM EVENTO DEVE O AUTORES OU DETENTORES DE DIREITOS AUTORAIS SÃO RESPONSÁVEIS POR QUALQUER DECLARAÇÃO, DANOS OU OUTROS RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, TORT OU DE OUTRA FORMA, DECORRENTE DE, FORA OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS TRANSAÇÕES NO SOFTWARE.#>
# 1. HostName Versão # PS: Tudo | Administração: Não | Requisitos do sistema: nenhum try { $hostname = $env:COMPUTERNAME if ([string]::IsNullOrEmpty($hostname)) { Write-Warning "Nome do host não pôde ser determinado" $hostname = "Desconhecido" } Write-Host "Nome do host: $hostname" } catch { Write-Warning "Nome do host de recuperação de erro: $_" $hostname = "Erro" Write-Host "Nome do host: $hostname" }
# 2. CollectionTime Versão # PS: Tudo | Administração: Não | Requisitos do sistema: nenhum try { $collectionTime = Get-Date se ($null -eq $collectionTime) { Write-Warning "Não foi possível recuperar a data/hora atual" $collectionTime = "Desconhecido" } Write-Host "Hora da Coleção: $collectionTime" } catch { Write-Warning "Data/hora de recuperação de erro: $_" $collectionTime = "Erro" Write-Host "Hora da Coleção: $collectionTime" }
# Registry: Secure Boot Main Key (3 values)
# 3. SecureBootEnabled # Versão PS: 3.0+ | Administração: pode ser necessário | Requisitos do sistema: uefi/sistema capaz de inicialização segura try { $secureBootEnabled = Confirm-SecureBootUEFI -ErrorAction Stop Write-Host "Inicialização segura habilitada: $secureBootEnabled" } catch { Write-Warning "Não é possível determinar status de inicialização segura por meio de cmdlet: $_" # Tente o fallback do registro try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\State" -Name UEFISecureBootEnabled -ErrorAction Stop $secureBootEnabled = [bool]$regValue.UEFISecureBootEnabled Write-Host "Inicialização segura habilitada: $secureBootEnabled" } catch { Write-Warning "Não é possível determinar o status de Inicialização Segura por meio do registro. O sistema pode não dar suporte a UEFI/Inicialização Segura.". $secureBootEnabled = $null Write-Host "Inicialização segura habilitada: não disponível" } }
# 4. HighConfidenceOptOut Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name HighConfidenceOptOut -ErrorAction Stop $highConfidenceOptOut = $regValue.HighConfidenceOptOut Write-Host "Alta Confiança Opt Out: $highConfidenceOptOut" } catch { Write-Warning "Chave de registro HighConfidenceOptOut não encontrada ou inacessível" $highConfidenceOptOut = $null Write-Host "Alta confiança opt out: Not Available" }
# 5. AvailableUpdates Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot" -Name AvailableUpdates -ErrorAction Stop $availableUpdates = $regValue.AvailableUpdates se ($null -ne $availableUpdates) { # Converter em formato hexadecimal $availableUpdatesHex = "0x{0:X}" -f $availableUpdates Write-Host "Atualizações disponível: $availableUpdatesHex" } else { Write-Host "Disponível Atualizações: Não Disponível" } } catch { Write-Warning "AvailableUpdates registry key not found or inaccessible" $availableUpdates = $null Write-Host "Atualizações disponível: não disponível" }
# Registry: Servicing Key (3 values)
# 6. UEFICA2023Status Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum 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 Status: $uefica 2023Status" } catch { Write-Warning "Chave do Registro de Status da UEFI do Windows UEFI 2023 não encontrada ou inacessível" $uefica 2023Status = $null Write-Host "Windows UEFI CA 2023 Status: Não Disponível" }
# 7. UEFICA2023Error Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023Error -ErrorAction Stop $uefica 2023Error = $regValue.UEFICA2023Error Write-Host "Erro da UEFI CA 2023: $uefica 2023Error" } catch { Write-Warning "UEFICA2023Error registry key not found or inaccessible" $uefica 2023Error = $null Write-Host "Erro da UEFI CA 2023: não disponível" }
# 9. UEFICA2023ErrorEvent Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing" -Name UEFICA2023ErrorEvent -ErrorAction Stop $uefica 2023ErrorEvent = $regValue.UEFICA2023ErrorEvent Write-Host "Evento de Erro da UEFI CA 2023: $uefica 2023ErrorEvent" } catch { $uefica 2023ErrorEvent = $null Write-Host "Evento de erro UEFI CA 2023: não disponível" }
# Registry: Device Attributes (7 values)
# 10. OEMManufacturerName Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMManufacturerName -ErrorAction Stop $oemManufacturerName = $regValue.OEMManufacturerName se ([string]::IsNullOrEmpty($oemManufacturerName)) { Write-Warning "OEMManufacturerName está vazio" $oemManufacturerName = "Desconhecido" } Write-Host "Nome do fabricante do OEM: $oemManufacturerName" } catch { Write-Warning "Chave de registro OEMManufacturerName não encontrada ou inacessível" $oemManufacturerName = $null Write-Host "Nome do fabricante do OEM: não disponível" }
# 10. OEMModelSystemFamily Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelSystemFamily -ErrorAction Stop $oemModelSystemFamily = $regValue.OEMModelSystemFamily se ([string]::IsNullOrEmpty($oemModelSystemFamily)) { Write-Warning "OEMModelSystemFamily está vazio" $oemModelSystemFamily = "Desconhecido" } Write-Host "Família do Sistema de ModeloS OEM: $oemModelSystemFamily" } catch { Write-Warning "Chave do registro OEMModelSystemFamily não encontrada ou inacessível" $oemModelSystemFamily = $null Write-Host "Família do Sistema de ModeloS OEM: Não Disponível" }
# 11. OEMModelNumber Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name OEMModelNumber -ErrorAction Stop $oemModelNumber = $regValue.OEMModelNumber se ([string]::IsNullOrEmpty($oemModelNumber)) { Write-Warning "OEMModelNumber está vazio" $oemModelNumber = "Desconhecido" } Write-Host "Número do modelo OEM: $oemModelNumber" } catch { Write-Warning "Chave do registro OEMModelNumber não encontrada ou inacessível" $oemModelNumber = $null Write-Host "Número do modelo OEM: não disponível" }
# 12. FirmwareVersion Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareVersion -ErrorAction Stop $firmwareVersion = $regValue.FirmwareVersion se ([string]::IsNullOrEmpty($firmwareVersion)) { Write-Warning "FirmwareVersion está vazio" $firmwareVersion = "Desconhecido" } Write-Host "Versão do firmware: $firmwareVersion" } catch { Write-Warning "Chave de registro firmwareVersion não encontrada ou inacessível" $firmwareVersion = $null Write-Host "Versão do firmware: não disponível" }
# 13. FirmwareReleaseDate Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name FirmwareReleaseDate -ErrorAction Stop $firmwareReleaseDate = $regValue.FirmwareReleaseDate se ([string]::IsNullOrEmpty($firmwareReleaseDate)) { Write-Warning "FirmwareReleaseDate está vazio" $firmwareReleaseDate = "Desconhecido" } Write-Host "Data de lançamento do firmware: $firmwareReleaseDate" } catch { Write-Warning "Chave de registro FirmwareReleaseDate não encontrada ou inacessível" $firmwareReleaseDate = $null Write-Host "Data de lançamento do firmware: não disponível" }
# 14. OSArchitecture Versão # PS: Tudo | Administração: Não | Requisitos do sistema: nenhum try { $osArchitecture = $env:PROCESSOR_ARCHITECTURE if ([string]::IsNullOrEmpty($osArchitecture)) { # Tente o fallback do registro $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 não pôde ser determinada" $osArchitecture = "Desconhecido" } Write-Host "Arquitetura do sistema operacional: $osArchitecture" } catch { Write-Warning "Erro ao recuperar OSArchitecture: $_" $osArchitecture = "Desconhecido" Write-Host "Arquitetura do sistema operacional: $osArchitecture" }
# 15. CanAttemptUpdateAfter (FILETIME) Versão # PS: Tudo | Administração: pode ser necessário | Requisitos do sistema: nenhum try { $regValue = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecureBoot\Servicing\DeviceAttributes" -Name CanAttemptUpdateAfter -ErrorAction Stop $canAttemptUpdateAfter = $regValue.CanAttemptUpdateAfter # Converter FILETIME em UTC DateTime — o registro armazena como REG_BINARY (byte[]) ou REG_QWORD (long) se ($null -ne $canAttemptUpdateAfter) { try { se ($canAttemptUpdateAfter -is [byte[]]) { $fileTime = [BitConverter]::ToInt64($canAttemptUpdateAfter, 0) $canAttemptUpdateAfter = [DateTime]::FromFileTime($fileTime). ToUniversalTime() } elseif ($canAttemptUpdateAfter -is [long]) { $canAttemptUpdateAfter = [DateTime]::FromFileTime($canAttemptUpdateAfter). ToUniversalTime() } } catch { Write-Warning "Não foi possível converter CanAttemptUpdateAfter FILETIME em DateTime" } } Write-Host "Pode tentar atualizar após: $canAttemptUpdateAfter" } catch { Write-Warning "Chave de registro CanAttemptUpdateAfter não encontrada ou inacessível" $canAttemptUpdateAfter = $null Write-Host "Pode tentar atualizar depois: não disponível" }
# Event Logs: System Log (5 values)
# 16-20. Event Log queries # Versão PS: 3.0+ | Administração: pode ser necessário para o log do sistema | Requisitos do sistema: nenhum try { $allEventIds = @(1801, 1808) $events = @(Get-WinEvent -FilterHashtable @{LogName='System'; ID=$allEventIds} -MaxEvents 20 -ErrorAction Stop)
if ($events.Count -eq 0) { Write-Warning "Nenhum evento de Inicialização Segura (1801/1808) encontrado no log do sistema" $latestEventId = $null $bucketId = $null $confidence = $null $event 1801Count = 0 $event 1808Count = 0 Write-Host "ID de evento mais recente: não disponível" Write-Host "ID do bucket: não disponível" Write-Host "Confiança: Não Disponível" Write-Host "Contagem do Evento 1801: 0" Write-Host "Contagem do Evento 1808: 0" } else { # 16. LatestEventId $latestEvent = $events | Sort-Object TimeCreated -Descending | Select-Object -Primeiro 1 se ($null -eq $latestEvent) { Write-Warning "Não foi possível determinar o evento mais recente" $latestEventId = $null Write-Host "ID do evento mais recente: não disponível" } else { $latestEventId = $latestEvent.Id Write-Host "ID do evento mais recente: $latestEventId" }
# 17. BucketID - Extracted from Event 1801/1808 se ($null -ne $latestEvent -e $null -ne $latestEvent.Message) { se ($latestEvent.Message -match 'BucketId:\s*(.+)') { $bucketId = $matches[1]. Trim() Write-Host "ID do bucket: $bucketId" } else { Write-Warning "BucketId não encontrado na mensagem de evento" $bucketId = $null Write-Host "ID do bucket: não encontrada no evento" } } else { Write-Warning "O último evento ou mensagem é nulo, não é possível extrair BucketId" $bucketId = $null Write-Host "ID do bucket: não disponível" }
# 18. Confidence - Extracted from Event 1801/1808 se ($null -ne $latestEvent -e $null -ne $latestEvent.Message) { se ($latestEvent.Message -match 'BucketConfidenceLevel:\s*(.+)') { $confidence = $matches[1]. Trim() Write-Host "Confiança: $confidence" } else { Write-Warning "nível de confiança não encontrado na mensagem de evento" $confidence = $null Write-Host "Confiança: não encontrada no evento" } } else { Write-Warning "O último evento ou mensagem é nulo, não é possível extrair Confiança" $confidence = $null Write-Host "Confiança: Não Disponível" }
# 19. Event1801Count $event 1801Array = @($events | Where-Object {$_. Id -eq 1801}) $event 1801Count = $event 1801Array.Count Write-Host "Contagem do Evento 1801: $event 1801Count"
# 20. Event1808Count $event 1808Array = @($events | Where-Object {$_. Id -eq 1808}) $event 1808Count = $event 1808Array.Count Write-Host "Contagem do Evento 1808: $event 1808Count" } } catch { Write-Warning "Logs de eventos de recuperação de erro. Pode exigir privilégios de administrador: $_" $latestEventId = $null $bucketId = $null $confidence = $null $event 1801Count = 0 $event 1808Count = 0 Write-Host "ID do evento mais recente: erro" Write-Host "ID do bucket: erro" Write-Host "Confiança: Erro" Write-Host "Contagem do Evento 1801: 0" Write-Host "Contagem do Evento 1808: 0" }
# WMI/CIM Queries (4 values)
# 21. OSVersion # Versão PS: 3.0+ (use Get-WmiObject para 2.0) | Administração: Não | Requisitos do sistema: nenhum try { $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop se ($null -eq $osInfo -ou [string]::IsNullOrEmpty($osInfo.Version)) { { Write-Warning "Não foi possível recuperar a versão do sistema operacional" $osVersion = "Desconhecido" } else { $osVersion = $osInfo.Version } Write-Host "Versão do sistema operacional: $osVersion" } catch { Write-Warning "Versão do sistema operacional de recuperação de erro: $_" $osVersion = "Desconhecido" Write-Host "Versão do sistema operacional: $osVersion" }
# 22. LastBootTime # Versão PS: 3.0+ (use Get-WmiObject para 2.0) | Administração: Não | Requisitos do sistema: nenhum try { $osInfo = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop se ($null -eq $osInfo -ou $null -eq $osInfo.LastBootUpTime) { Write-Warning "Não foi possível recuperar a última hora de inicialização" $lastBootTime = $null Write-Host "Última hora de inicialização: não disponível" } else { $lastBootTime = $osInfo.LastBootUpTime Write-Host "Última Hora de Inicialização: $lastBootTime" } } catch { Write-Warning "Recuperação de erro na última hora de inicialização: $_" $lastBootTime = $null Write-Host "Última Hora de Inicialização: Não Disponível" }
# 23. BaseBoardManufacturer # Versão PS: 3.0+ (use Get-WmiObject para 2.0) | Administração: Não | Requisitos do sistema: nenhum try { $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop se ($null -eq $baseBoard -ou [string]::IsNullOrEmpty($baseBoard.Manufacturer)) { { Write-Warning "Não foi possível recuperar o fabricante do quadro de base" $baseBoardManufacturer = "Desconhecido" } else { $baseBoardManufacturer = $baseBoard.Manufacturer } Write-Host "Fabricante do Quadro de Base: $baseBoardManufacturer" } catch { Write-Warning "Fabricante de base de recuperação de erro: $_" $baseBoardManufacturer = "Desconhecido" Write-Host "Fabricante do Quadro de Base: $baseBoardManufacturer" }
# 24. BaseBoardProduct # Versão PS: 3.0+ (use Get-WmiObject para 2.0) | Administração: Não | Requisitos do sistema: nenhum try { $baseBoard = Get-CimInstance Win32_BaseBoard -ErrorAction Stop se ($null -eq $baseBoard -ou [string]::IsNullOrEmpty($baseBoard.Product)) { { Write-Warning "Não foi possível recuperar o produto de baseboard" $baseBoardProduct = "Desconhecido" } else { $baseBoardProduct = $baseBoard.Product } Write-Host "Produto de Base: $baseBoardProduct" } catch { Write-Warning "Produto de base de recuperação de erro: $_" $baseBoardProduct = "Desconhecido" Write-Host "Produto de base: $baseBoardProduct" }
# ============================================================================= # Detecção de correção – Código de saída & saída de saída de status # =============================================================================
# Build status object from all collected inventory data $status = [ordenado]@{ UEFICA2023Status = $uefica 2023Status UEFICA2023Error = $uefica 2023Error UEFICA2023ErrorEvent = $uefica 2023ErrorEvent AvailableUpdates = if ($null -ne $availableUpdates) { $availableUpdatesHex } else { $null } Nome do host = $hostname CollectionTime = if ($collectionTime -is [datetime]) { $collectionTime.ToString("o") } else { "$collectionTime" } } SecureBootEnabled = $secureBootEnabled HighConfidenceOptOut = $highConfidenceOptOut 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 Confiança = $confidence Event1801Count = $event 1801Count Event1808Count = $event 1808Count OSVersion = $osVersion LastBootTime = if ($lastBootTime -is [datetime]) { $lastBootTime.ToString("o") } else { "$lastBootTime" } BaseBoardManufacturer = $baseBoardManufacturer BaseBoardProduct = $baseBoardProduct }
# Output the status - For data aggregation Write-Output ($status | ConvertTo-Json -Compress)
# Exit code: "Updated" is the success value per the playbook se ($secureBootEnabled -e $uefica 2023Status -eq "Atualizado") { saída 0 # Sem problemas } else { saída 1 # Com problema }