Private/operatingsystem/Get-OSDCoreOperatingSystems.ps1
|
<#=================================================================================
Get-OSDCoreOperatingSystems ================================================================================ - Retrieves all operating system records from Microsoft catalogs - Uses Get-CoreOperatingSystems records and extracts OS build, version, architecture, language, and activation information - Returns sorted array of operating system objects ================================================================================ .SYNOPSIS Retrieves all operating system records from the OSDCloud catalog .DESCRIPTION Imports operating system metadata from Get-CoreOperatingSystems, then parses file names and catalog properties to extract OS build numbers, versions, architecture, language codes, and download information. .PARAMETER None This function does not accept parameters. .EXAMPLE PS C:\> Get-OSDCoreOperatingSystems Returns all available operating system records .EXAMPLE PS C:\> Get-OSDCoreOperatingSystems | Where-Object { $_.OSName -eq 'Windows 11' } Returns only Windows 11 operating systems .EXAMPLE PS C:\> Get-OSDCoreOperatingSystems | Group-Object OperatingSystem Groups operating systems by major version .NOTES Author: OSDeploy Version: 1.0 GitHub: https://github.com/OSDeploy .LINK https://www.osdeploy.com/ =================================================================================#> function Get-OSDCoreOperatingSystems { [CmdletBinding()] [OutputType([pscustomobject[]])] param () $ErrorActionPreference = 'Stop' $records = @() $mctRecords = Get-CoreOperatingSystems if (-not $mctRecords) { return $records } foreach ($node in ($mctRecords | Sort-Object FileName, LanguageCode, Architecture)) { Write-Verbose "[$(Get-Date -Format s)] [$($MyInvocation.MyCommand.Name)] Processing $($node.FileName)" if ([string]::IsNullOrWhiteSpace($node.FileName) -or $node.FileName.Length -lt 5) { continue } #================================================= # OSBuild # Get the OSBuild from the FileName $OSBuild = $node.FileName.Substring(0, 5) #================================================= # OperatingSystem / OSName / OSVersion # 19045 = Windows 10 22H2 # 22000 = Windows 11 21H2 # 22621 = Windows 11 22H2 # 22631 = Windows 11 23H2 # 26100 = Windows 11 24H2 # 26200 = Windows 11 25H2 # 28000 = Windows 11 26H1 switch ($OSBuild) { '19045' { $OSName = 'Windows 10'; $OSVersion = '22H2' } '22000' { $OSName = 'Windows 11'; $OSVersion = '21H2' } '22621' { $OSName = 'Windows 11'; $OSVersion = '22H2' } '22631' { $OSName = 'Windows 11'; $OSVersion = '23H2' } '26100' { $OSName = 'Windows 11'; $OSVersion = '24H2' } '26200' { $OSName = 'Windows 11'; $OSVersion = '25H2' } '28000' { $OSName = 'Windows 11'; $OSVersion = '26H1' } default { continue } } #================================================= # OSBuildVersion # Combination of <OSBuild>.<Sub> # Extract from FileName #================================================= $fileNameParts = $node.FileName -split '\.' if ($fileNameParts.Count -lt 2) { continue } $OSBuildVersion = "$($fileNameParts[0]).$($fileNameParts[1])" #================================================= # OSArchitecture # Avoids confusion between x64 releases (amd64/arm64) #================================================= if ($node.Architecture -match 'x64') { $OSArchitecture = 'x64' } elseif ($node.Architecture -match 'arm64') { $OSArchitecture = 'arm64' } else { $OSArchitecture = 'x86' continue } #================================================= # OSActivation #================================================= if ($node.FileName -match 'clientconsumer_ret') { $OSActivation = 'Retail' } elseif ($node.FileName -match 'CLIENTBUSINESS_VOL') { $OSActivation = 'Volume' } else { $OSActivation = 'Unknown' continue } #================================================= # Win10 / Win11 #================================================= if ($OSName -eq 'Windows 10') { $Win10 = $true $Win11 = $false } elseif ($OSName -eq 'Windows 11') { $Win10 = $false $Win11 = $true } else { $Win10 = $false $Win11 = $false } #================================================= # OSD Module Properties #================================================= # DisplayName should be in the format "Win11-25H2-amd64" $DisplayName = "$OSName $OSVersion $OSArchitecture $($node.LanguageCode) $OSActivation $OSBuildVersion" #================================================= # ObjectProperties #================================================= <# Status : ReleaseDate : 2023-12-04 Name : Windows 10 22H2 x64 ar-sa Retail 19045.3803 Version : Windows 10 ReleaseID : 22H2 Architecture : x64 Language : ar-sa Activation : Retail Build : 19045.3803 FileName : 19045.3803.231204-0204.22h2_release_svc_refresh_CLIENTCONSUMER_RET_x64FRE_ar-sa.esd ImageIndex : ImageName : Url : http://dl.delivery.mp.microsoft.com/filestreamingservice/files/39d366c6-bb66-4938-9a78-0670eda8304d/19045.3803.231204-0204.22h2_release_svc_refresh_CLIENTCONSUMER_RET_x64FRE_ar-sa.esd SHA1 : 2119ef0efd432f98cdccdf525cd17fcceacef111 UpdateID : Win10 : True Win11 : False #> $records += [pscustomobject]@{ Status = $null ReleaseDate = $null Name = $DisplayName Version = $OSName ReleaseID = $OSVersion Architecture = $OSArchitecture Language = $node.LanguageCode Activation = $OSActivation Build = $OSBuildVersion FileName = $node.FileName ImageIndex = $node.ImageIndex ImageName = $node.ImageName Url = $node.FilePath SHA1 = $node.Sha1 SHA256 = $node.Sha256 UpdateID = $node.UpdateID Win10 = $Win10 Win11 = $Win11 } } $records = $records | Sort-Object -Property Url -Unique $records = $records | Sort-Object -Property Name return $records } |