Public/MSCatalog.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 } Block-PSModuleNotInstalled -ModuleName MSCatalog Get-MSCatalogUpdate -Search (Get-SystemFirmwareResource) -SortBy LastUpdated -Descending | Select-Object LastUpdated,Title,Version,Size,Guid -First 1 -ErrorAction Ignore } 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 } #======================================================================= # Block #======================================================================= Block-PSModuleNotInstalled -ModuleName MSCatalog #======================================================================= # Get-SystemFirmwareUpdate <# Write-Host -ForegroundColor DarkGray "UEFI Firmware PNPDeviceID: $($SystemFirmwareUpdate.PNPDeviceID)" $PNPDeviceGuid = Convert-PNPDeviceIDtoGuid -PNPDeviceID $SystemFirmwareUpdate.PNPDeviceID Write-Host -ForegroundColor DarkGray "UEFI Firmware Guid: $PNPDeviceGuid" $CatalogUpdate = Get-MSCatalogUpdate -Search $PNPDeviceGuid -SortBy LastUpdated -Descending |` Select-Object LastUpdated,Title,Version,Size,Guid -First 1 -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 "Could not find a UEFI Firmware update for this HardwareID" } } else { Write-Warning "Could not find a UEFI Firmware HardwareID" } } function Save-MsUp { [CmdLetBinding()] param ( [ValidateSet('x64','x86')] [string]$Architecture = 'x64', #Filter by UpdateBuild Property [ValidateSet(1507,1511,1607,1703,1709,1803,1809,1903,1909,2004,'20H2','21H1')] [string]$Build = '21H1', #Filter by UpdateGroup Property [ValidateSet('Cumulative Update')] [string]$UpdateGroup = 'Cumulative Update', #Filter by UpdateOS Property [ValidateSet('Windows 10')] [string]$OperatingSystem = 'Windows 10', [ValidateSet('Preview')] [string[]]$Include, [String] $DestinationDirectory = "$env:TEMP\MSCUpdate" ) #======================================================================= # 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 } #======================================================================= # Block #======================================================================= Block-PSModuleNotInstalled -ModuleName MSCatalog #======================================================================= # Details #======================================================================= Write-Host -ForegroundColor DarkGray "OperatingSystem: $OperatingSystem" Write-Host -ForegroundColor DarkGray "Architecture: $Architecture" Write-Host -ForegroundColor DarkGray "Build: $Build" Write-Host -ForegroundColor DarkGray "UpdateGroup: $UpdateGroup" #======================================================================= # Go #======================================================================= $CatalogUpdate = Get-MSCatalogUpdate -Search "$OperatingSystem $Architecture $Build $UpdateGroup" -SortBy "Title" -AllPages -Descending |` Where-Object Title -NotMatch 'Dynamic' |` Where-Object Title -NotMatch '.NET' |` Sort-Object LastUpdated -Descending |` Select-Object LastUpdated,Classification,Title,Size,Guid if ($Include -contains 'Preview') { Write-Host -ForegroundColor DarkGray "Include Preview Updates: True" } else { Write-Host -ForegroundColor DarkGray "Include Preview Updates: False" $CatalogUpdate = $CatalogUpdate | Where-Object {$_.Title -notmatch 'Preview'} } $CatalogUpdate = $CatalogUpdate | Out-GridView -Title 'Select a Microsoft Update to download' -PassThru foreach ($Update in $CatalogUpdate) { Save-UpdateCatalog -Guid $Update.Guid -DestinationDirectory $DestinationDirectory } if ($CatalogUpdate) { explorer.exe $DestinationDirectory } } |