Public/MsUpCat/SystemFirmware.ps1
function Convert-PNPDeviceIDtoGuid { [CmdLetBinding()] param ( [Parameter(Mandatory = $true)] [string]$PNPDeviceID ) #$GuidPattern = '{[-0-9A-F]+?}' #($DeviceID | Select-String -Pattern $GuidPattern -AllMatches | Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value) $GuidPattern = '\{?(([0-9a-f]){8}-([0-9a-f]){4}-([0-9a-f]){4}-([0-9a-f]){4}-([0-9a-f]){12})\}?' ($PNPDeviceID | Select-String -Pattern $GuidPattern -AllMatches | Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value) } function Get-SystemFirmwareDevice { [CmdLetBinding()] param () Get-CimInstance -ClassName Win32_PnpEntity | Where-Object ClassGuid -eq '{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}' | Where-Object Caption -match 'System' } function Get-SystemFirmwareResource { [CmdLetBinding()] param () $UefiFirmwareDevice = Get-SystemFirmwareDevice if ($UefiFirmwareDevice) { Convert-PNPDeviceIDtoGuid -PNPDeviceID $UefiFirmwareDevice.PNPDeviceID } } function Get-SystemFirmwareUpdate { #======================================================================= # MSCatalog PowerShell Module # Ryan-Jan # https://github.com/ryan-jan/MSCatalog # This excellent work is a good way to gather information from MS # Catalog #======================================================================= if (!(Get-Module -ListAvailable -Name MSCatalog)) { Install-Module MSCatalog -Force } #======================================================================= # Make sure the Module was installed #======================================================================= if (Get-Module -ListAvailable -Name MSCatalog -ErrorAction Ignore) { if (Test-WebConnectionMsUpCat) { Get-MSCatalogUpdate -Search (Get-SystemFirmwareResource) -SortBy LastUpdated -Descending | Select-Object LastUpdated,Title,Version,Size,Guid -First 1 } else { Write-Warning "Get-SystemFirmwareUpdate: Could not reach https://www.catalog.update.microsoft.com/" } } else { Write-Warning "Get-SystemFirmwareUpdate: Could not install required PowerShell Module MSCatalog" } #======================================================================= } function Install-SystemFirmwareUpdate { [CmdLetBinding()] param ( [String] $DestinationDirectory = "C:\Drivers\SystemFirmwareUpdate" ) #======================================================================= # Blocks #======================================================================= Block-StandardUser #======================================================================= # MSCatalog PowerShell Module # Ryan-Jan # https://github.com/ryan-jan/MSCatalog # This excellent work is a good way to gather information from MS # Catalog #======================================================================= if (!(Get-Module -ListAvailable -Name MSCatalog)) { Install-Module MSCatalog -Force -ErrorAction Ignore } #======================================================================= if (Test-Path 'C:\Windows' -PathType Container) { if (Test-WebConnectionMsUpCat) { if (Get-Module -ListAvailable -Name MSCatalog -ErrorAction Ignore) { $SystemFirmwareUpdate = Get-SystemFirmwareUpdate if ($SystemFirmwareUpdate.Guid) { Write-Host -ForegroundColor DarkGray "$($SystemFirmwareUpdate.Title) version $($SystemFirmwareUpdate.Version)" Write-Host -ForegroundColor DarkGray "Version $($SystemFirmwareUpdate.Version) Size: $($SystemFirmwareUpdate.Size)" Write-Host -ForegroundColor DarkGray "Last Updated $($SystemFirmwareUpdate.LastUpdated)" Write-Host -ForegroundColor DarkGray "UpdateID: $($SystemFirmwareUpdate.Guid)" Write-Host -ForegroundColor DarkGray "" } if ($SystemFirmwareUpdate) { $SystemFirmwareUpdateFile = Save-UpdateCatalog -Guid $SystemFirmwareUpdate.Guid -DestinationDirectory $DestinationDirectory if ($SystemFirmwareUpdateFile) { expand.exe "$($SystemFirmwareUpdateFile.FullName)" -F:* "$DestinationDirectory" Remove-Item $SystemFirmwareUpdateFile.FullName | Out-Null if ($env:SystemDrive -eq 'X:') { Add-WindowsDriver -Path 'C:\' -Driver "$DestinationDirectory" } else { if (Test-Path "$DestinationDirectory" -PathType Container) { Get-ChildItem "$DestinationDirectory" -Recurse -Filter "*.inf" | ForEach-Object { PNPUtil.exe /Add-Driver $_.FullName /install } } } } else { Write-Warning "Install-SystemFirmwareUpdate: Could not find a UEFI Firmware update for this HardwareID" } } else { Write-Warning "Install-SystemFirmwareUpdate: Could not find a UEFI Firmware HardwareID" } } else { Write-Warning "Install-SystemFirmwareUpdate: Could not install required PowerShell Module MSCatalog" } } else { Write-Warning "Install-SystemFirmwareUpdate: Could not reach https://www.catalog.update.microsoft.com/" } } else { Write-Warning "Install-SystemFirmwareUpdate: Could not locate C:\Windows" if ($env:SystemDrive -eq 'X:') { Write-Warning "Make sure that Bitlocker encrypted drives are unlocked and suspended first" } } #======================================================================= } function Save-SystemFirmwareUpdate { [CmdLetBinding()] param ( [String] $DestinationDirectory = "$env:TEMP\SystemFirmwareUpdate" ) #======================================================================= # MSCatalog PowerShell Module # Ryan-Jan # https://github.com/ryan-jan/MSCatalog # This excellent work is a good way to gather information from MS # Catalog #======================================================================= if (!(Get-Module -ListAvailable -Name MSCatalog)) { Install-Module MSCatalog -Force -ErrorAction Ignore } #======================================================================= if (Test-WebConnectionMsUpCat) { if (Get-Module -ListAvailable -Name MSCatalog -ErrorAction Ignore) { $SystemFirmwareUpdate = Get-SystemFirmwareUpdate if ($SystemFirmwareUpdate.Guid) { Write-Host -ForegroundColor DarkGray "$($SystemFirmwareUpdate.Title) version $($SystemFirmwareUpdate.Version)" Write-Host -ForegroundColor DarkGray "Version $($SystemFirmwareUpdate.Version) Size: $($SystemFirmwareUpdate.Size)" Write-Host -ForegroundColor DarkGray "Last Updated $($SystemFirmwareUpdate.LastUpdated)" Write-Host -ForegroundColor DarkGray "UpdateID: $($SystemFirmwareUpdate.Guid)" Write-Host -ForegroundColor DarkGray "" } if ($SystemFirmwareUpdate) { $SystemFirmwareUpdateFile = Save-UpdateCatalog -Guid $SystemFirmwareUpdate.Guid -DestinationDirectory $DestinationDirectory if ($SystemFirmwareUpdateFile) { expand.exe "$($SystemFirmwareUpdateFile.FullName)" -F:* "$DestinationDirectory" Remove-Item $SystemFirmwareUpdateFile.FullName | Out-Null if ($env:SystemDrive -eq 'X:') { #Write-Host -ForegroundColor DarkGray "You can install the firmware by running the following command" #Write-Host -ForegroundColor DarkGray "Add-WindowsDriver -Path C:\ -Driver $DestinationDirectory" } else { #Write-Host -ForegroundColor DarkGray "Make sure Bitlocker is suspended first before installing the Firmware Driver" if (Test-Path "$DestinationDirectory\firmware.inf") { #Write-Host -ForegroundColor DarkGray "Right click on $DestinationDirectory\firmware.inf and Install" } } } else { Write-Warning "Save-SystemFirmwareUpdate: Could not find a UEFI Firmware update for this HardwareID" } } else { Write-Warning "Save-SystemFirmwareUpdate: Could not find a UEFI Firmware HardwareID" } } else { Write-Warning "Save-SystemFirmwareUpdate: Could not install required PowerShell Module MSCatalog" } } else { Write-Warning "Save-SystemFirmwareUpdate: Could not reach https://www.catalog.update.microsoft.com/" } #======================================================================= } |