Public/Get-OSMedia.ps1

<#
.SYNOPSIS
Returns all Operating Systems in OSBuilder\OSMedia
 
.DESCRIPTION
Returns all Operating Systems in OSBuilder\OSMedia in a PowerShell Custom Object
 
.LINK
https://www.osdeploy.com/osbuilder/docs/functions/osmedia/get-osmedia
 
.PARAMETER FullDetails
Displays Microsoft Update information for Adobe, SSU, and LCU. LCU requires Sessions.xml
 
.PARAMETER GridView
Displays results in PowerShell ISE GridView with an added PassThru Parameter. This can also be displayed with the following command
Get-OSMedia | Out-GridView
#>

function Get-OSMedia {
    [CmdletBinding()]
    PARAM (
        [switch]$FullDetails,
        [switch]$GridView
    )

    BEGIN {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) BEGIN" -ForegroundColor Green

        #===================================================================================================
        Write-Verbose '19.1.1 Initialize OSBuilder'
        #===================================================================================================
        Get-OSBuilder -CreatePaths -HideDetails

        #===================================================================================================
        Write-Verbose '19.1.1 Gather All Updates'
        #===================================================================================================
        $CatalogsXmls = @()
        $ImportCatalog = @()
        $AllUpdates = @()

        $CatalogsXmls = Get-ChildItem "$OSBuilderContent\Updates" Cat*.xml -Recurse
        foreach ($CatalogsXml in $CatalogsXmls) {
            $ImportCatalog = Import-Clixml -Path "$($CatalogsXml.FullName)"
            $AllUpdates += $ImportCatalog
        }
        $AllUpdates = $AllUpdates | Select-Object -Property *

        #===================================================================================================
        Write-Verbose '19.1.1 Gather All OSMedia'
        #===================================================================================================
        $AllOSMedia = @()
        $AllOSMedia = Get-ChildItem -Path "$OSBuilderOSMedia" -Directory | Select-Object -Property * | Where-Object {Test-Path $(Join-Path $_.FullName "info\xml\Get-WindowsImage.xml")}

        $null = $OSMedia
    }

    PROCESS {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) PROCESS" -ForegroundColor Green

        $OSMedia = foreach ($Item in $AllOSMedia) {
            #===================================================================================================
            #Write-Verbose '19.1.1 Get Windows Image Information'
            #===================================================================================================
            Write-Verbose "OSMedia Full Path: $($Item.FullName)"
            
            $OSMWindowsImage = @()
            $OSMWindowsImage = Import-Clixml -Path "$($Item.FullName)\info\xml\Get-WindowsImage.xml"
            
            $OSMVersion = $($OSMWindowsImage.Version)
            Write-Verbose "Version: $OSMVersion"

            $OSMImageName = $($OSMWindowsImage.ImageName)
            Write-Verbose "ImageName: $OSMImageName"

            $OSMArch = $OSMWindowsImage.Architecture
            if ($OSMArch -eq '0') {$OSMArch = 'x86'}
            if ($OSMArch -eq '6') {$OSMArch = 'ia64'}
            if ($OSMArch -eq '9') {$OSMArch = 'x64'}
            if ($OSMArch -eq '12') {$OSMArch = 'x64 ARM'}
            Write-Verbose "Arch: $OSMArch"

            $OSMEditionId = $($OSMWindowsImage.EditionId)
            Write-Verbose "EditionId: $OSMEditionId"

            $OSMInstallationType = $($OSMWindowsImage.InstallationType)
            Write-Verbose "InstallationType: $OSMInstallationType"

            $OSMMajorVersion = $($OSMWindowsImage.MajorVersion)
            Write-Verbose "MajorVersion: $OSMMajorVersion"

            $OSMMinorVersion = $($OSMWindowsImage.MinorVersion)
            Write-Verbose "MinorVersion: $OSMMinorVersion"

            $OSMBuild = $($OSMWindowsImage.Build)
            Write-Verbose "Build: $OSMBuild"

            $OSMLanguages = $($OSMWindowsImage.Languages)
            Write-Verbose "Languages: $OSMLanguages"

            $OperatingSystem = ''
            if ($OSMMajorVersion -eq 6 -and $OSMInstallationType -eq 'Client') {$OperatingSystem = 'Windows 7'}
            if ($OSMMajorVersion -eq 10 -and $OSMInstallationType -eq 'Client') {$OperatingSystem = 'Windows 10'}
            if ($OSMMajorVersion -eq 10 -and $OSMInstallationType -eq 'Server' -and $OSMImageName -like "*2016*") {$OperatingSystem = 'Server 2016'}
            if ($OSMMajorVersion -eq 10 -and $OSMInstallationType -eq 'Server' -and $OSMImageName -like "*2019*") {$OperatingSystem = 'Server 2019'}

            $OSMUBR = $($OSMWindowsImage.UBR)
            Write-Verbose "UBR: $OSMUBR"

            #===================================================================================================
            #Write-Verbose '19.1.1 Gather Registry Information'
            #===================================================================================================
            $OSMRegistry = @()
            if (Test-Path "$($Item.FullName)\info\xml\CurrentVersion.xml") {
                Write-Verbose "Registry: $($Item.FullName)\info\xml\CurrentVersion.xml"
                $OSMRegistry = Import-Clixml -Path "$($Item.FullName)\info\xml\CurrentVersion.xml"
            } else {
                Write-Verbose "Registry: $($Item.FullName)\info\xml\CurrentVersion.xml (Not Found)"
            }
            [string]$OSMReleaseId = $($OSMRegistry.ReleaseId)

            if ($OSMBuild -eq 7600) {$OSMReleaseId = 7600}
            if ($OSMBuild -eq 7601) {$OSMReleaseId = 7601}
            if ($OSMBuild -eq 10240) {$OSMReleaseId = 1507}
            if ($OSMBuild -eq 14393) {$OSMReleaseId = 1607}
            if ($OSMBuild -eq 15063) {$OSMReleaseId = 1703}
            if ($OSMBuild -eq 16299) {$OSMReleaseId = 1709}
            if ($OSMBuild -eq 17134) {$OSMReleaseId = 1803}
            if ($OSMBuild -eq 17763) {$OSMReleaseId = 1809}

            Write-Verbose "ReleaseId: $OSMReleaseId"

            if ($FullDetails.IsPresent) {

                #===================================================================================================
                #Write-Verbose '19.1.1 Gather Package Information'
                #===================================================================================================
                $OSMPackage = @()
                if (Test-Path "$($Item.FullName)\info\xml\Get-WindowsPackage.xml") {
                    Write-Verbose "Packages: $($Item.FullName)\info\xml\Get-WindowsPackage.xml"
                    $OSMPackage = Import-Clixml -Path "$($Item.FullName)\info\xml\Get-WindowsPackage.xml"
                } else {
                    Write-Verbose "Packages: $($Item.FullName)\info\xml\Get-WindowsPackage.xml (Not Found)"
                }

                #===================================================================================================
                #Write-Verbose '19.1.1 Gather Sessions Information'
                #===================================================================================================
                $OSMSessions = @()
                $OSMSessionsXml = @()
                
                if (Test-Path "$($Item.FullName)\Sessions.xml") {
                    Write-Verbose "Sessions: $($Item.FullName)\Sessions.xml"
                    [xml]$OSMSessionsXml = Get-Content -Path "$($Item.FullName)\Sessions.xml"
                    $OSMSessions = $OSMSessionsXml.Sessions.Session.Tasks.Phase.package | Where-Object {$_.targetState -eq 'Installed'} | Sort-Object id
                } else {
                    Write-Verbose "Sessions: $($Item.FullName)\Sessions.xml (Not Found)"
                }

                #===================================================================================================
                #Write-Verbose '19.1.1 Get Latest Adobe Security Update'
                #===================================================================================================
                $LatestAdobe = @()
                $LatestAdobe = $AllUpdates | Sort-Object -Property DatePosted -Descending
                $LatestAdobe = $LatestAdobe | Where-Object {$_.Category -eq 'Adobe'}
                $LatestAdobe = $LatestAdobe | Where-Object {$_.KBTitle -like "*$OSMReleaseId*"}
                $LatestAdobe = $LatestAdobe | Where-Object {$_.KBTitle -like "*$($Arch)*"}
                $LatestAdobe = $LatestAdobe | Where-Object {$_.KBTitle -like "*$OperatingSystem*"}
                $LatestAdobe = $LatestAdobe | Select-Object -First 1

                $InstalledAdobe = $OSMPackage | Where-Object {$_.PackageName -like "*$($LatestAdobe.KBNumber)*"}
                if ($null -eq $InstalledAdobe) {
                    Write-Verbose "LatestAdobe: $($LatestAdobe.KBTitle) (Not Installed)"
                    #$LatestAdobe = "KB$($LatestAdobe.KBNumber)"
                    $LatestAdobe = ''
                } else {
                    Write-Verbose "LatestAdobe: $($LatestAdobe.KBTitle) (Installed)"
                    $LatestAdobe = 'Latest'
                }

                if ($OSMMajorVersion -eq 6) {$LatestAdobe = 'None'}
                #===================================================================================================
                #Write-Verbose '19.1.1 Get Latest Servicing Stack Update'
                #===================================================================================================
                $LatestSSU = @()
                $LatestSSU = $AllUpdates | Sort-Object -Property DatePosted -Descending
                $LatestSSU = $LatestSSU | Where-Object {$_.Category -eq 'Servicing'}
                $LatestSSU = $LatestSSU | Where-Object {$_.KBTitle -like "*$OSMReleaseId*"}
                $LatestSSU = $LatestSSU | Where-Object {$_.KBTitle -like "*$($Arch)*"}
                $LatestSSU = $LatestSSU | Where-Object {$_.KBTitle -like "*$OperatingSystem*"}
                $LatestSSU = $LatestSSU | Select-Object -First 1

                $InstalledSSU = $OSMPackage | Where-Object {$_.PackageName -like "*$($LatestSSU.KBNumber)*"}
                if ($null -eq $InstalledSSU) {
                    Write-Verbose "LatestSSU: $($LatestSSU.KBTitle) (Not Installed)"
                # $LatestSSU = "KB$($LatestSSU.KBNumber)"
                    $LatestSSU = ''
                } else {
                    Write-Verbose "LatestSSU: $($LatestSSU.KBTitle) (Installed)"
                    $LatestSSU = 'Latest'
                }

                #===================================================================================================
                #Write-Verbose '19.1.1 Get Latest Cumulative Update'
                #===================================================================================================
                $LatestLCU = @()
                $LatestLCU = $AllUpdates | Sort-Object -Property DatePosted -Descending
                $LatestLCU = $LatestLCU | Where-Object {$_.Category -eq 'Cumulative'}
                $LatestLCU = $LatestLCU | Where-Object {$_.KBTitle -like "*$OSMReleaseId*"}
                $LatestLCU = $LatestLCU | Where-Object {$_.KBTitle -like "*$($Arch)*"}
                $LatestLCU = $LatestLCU | Where-Object {$_.KBTitle -like "*$OperatingSystem*"}
                $LatestLCU = $LatestLCU | Select-Object -First 1

                $InstalledLCU = $OSMSessions | Where-Object {$_.name -like "*$($LatestLCU.KBNumber)*"}

                if (!(Test-Path "$($Item.FullName)\Sessions.xml")) {
                    Write-Verbose "LatestLCU: Sessions.xml required for validation"
                    $LatestLCU = 'Unknown'
                } elseif ($null -eq $InstalledLCU) {
                    Write-Verbose "LatestLCU: $($LatestLCU.KBTitle) (Not Installed)"
                    $LatestLCU = ''
                } else {
                    Write-Verbose "LatestLCU: $($LatestLCU.KBTitle) (Installed)"
                    $LatestLCU = 'Latest'
                }

                #===================================================================================================
                #Write-Verbose '19.1.1 Object Properties'
                #===================================================================================================
                $ObjectProperties = @{
                    MediaType           = $Item.Parent
                    Name                = $Item.Name
                    ImageName           = $OSMImageName
                    EditionId           = $OSMEditionId
                    Arch                = $OSMArch
                    MajorVersion        = $OSMMajorVersion
                    ReleaseId           = $OSMReleaseId
                    Build               = [string]$OSMBuild
                    UBR                 = $OSMUBR
                    Servicing           = $LatestSSU
                    Cumulative          = $LatestLCU
                    Adobe               = $LatestAdobe
                    FullName            = $Item.FullName
                    ModifiedTime        = [datetime]$OSMWindowsImage.ModifiedTime
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
                Write-Verbose ""

            } else {

                $ObjectProperties = @{
                    MediaType           = $Item.Parent
                    Name                = $Item.Name
                    ImageName           = $OSMImageName
                    EditionId           = $OSMEditionId
                    Arch                = $OSMArch
                    MajorVersion        = $OSMMajorVersion
                    ReleaseId           = $OSMReleaseId
                    Build               = [string]$OSMBuild
                    UBR                 = $OSMUBR
                    FullName            = $Item.FullName
                    ModifiedTime        = [datetime]$OSMWindowsImage.ModifiedTime
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
                Write-Verbose ""
            
            }
        }
        
        #===================================================================================================
        #Write-Verbose '19.1.1 Output'
        #===================================================================================================
        if ($FullDetails.IsPresent) {
            if ($GridView.IsPresent) {$OSMedia | Select-Object MediaType,Name,ImageName,EditionId,Arch,MajorVersion,ReleaseId,Build,UBR,Servicing,Cumulative,Adobe,FullName,ModifiedTime | Out-GridView -PassThru -Title 'OSMedia'}
            else {$OSMedia | Select-Object MediaType,Name,ImageName,EditionId,Arch,MajorVersion,ReleaseId,Build,UBR,Servicing,Cumulative,Adobe,FullName,ModifiedTime}
            
        } else {
            if ($GridView.IsPresent){$OSMedia | Select-Object MediaType,Name,ImageName,EditionId,Arch,MajorVersion,ReleaseId,Build,UBR,FullName,ModifiedTime | Out-GridView -PassThru -Title 'OSMedia'}
            else {$OSMedia | Select-Object MediaType,Name,ImageName,EditionId,Arch,MajorVersion,ReleaseId,Build,UBR,FullName,ModifiedTime}
        }
    }

    END {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) END" -ForegroundColor Green
    }
}