Public/Functions/Get-SessionsXml.ps1
<#
.SYNOPSIS Returns the Session.xml Updates that have been applied to an Operating System .DESCRIPTION Returns the Session.xml Updates that have been applied to an Operating System .LINK https://osd.osdeploy.com/module/functions/general/get-osdsessions #> function Get-SessionsXml { [CmdletBinding()] param ( [Parameter(ValueFromPipelineByPropertyName = $true)] #Specifies the full path to the root directory of the offline Windows image that you will service #Or Path of the Sessions.xml file #If this value is not set, the running OS Sessions.xml will be processed [string]$Path = "$env:SystemRoot\Servicing\Sessions\Sessions.xml", #Returns the KBNumber [string]$KBNumber ) begin {} process { #================================================= # Set Sessions.xml #================================================= $SessionsXml = $Path #================================================= # Mount Path #================================================= if ($SessionsXml -notmatch 'Sessions.xml') { $SessionsXml = "$Path\Windows\Servicing\Sessions\Sessions.xml" } #================================================= # Test-Path #================================================= if (!(Test-Path "$SessionsXml")) {Write-Warning "Cannot find Sessions.xml at $Path"; Break} Write-Verbose $SessionsXml #================================================= # Process Sessions.xml #================================================= [xml]$XmlDocument = Get-Content -Path "$SessionsXml" $SessionsXml = $XmlDocument.SelectNodes('Sessions/Session') | ForEach-Object { $Started = [datetime]::ParseExact($_.Started,'yyyy/MM/dd/HH:mm:ss',$null) $Complete = [datetime]::ParseExact($_.Complete,'yyyy/MM/dd/HH:mm:ss',$null) $Duration = New-TimeSpan -Start $Started -End $Complete New-Object -Type PSObject -Property @{ Started = $Started Complete = $Complete Duration = $Duration KBNumber = $_.Tasks.Phase.package.name TargetState = $_.Tasks.Phase.package.targetState Id = $_.Tasks.Phase.package.id Client = $_.Client Status = $_.Status } } $SessionsXml = $SessionsXml | Where-Object {$_.Id -like "Package*"} $SessionsXml = $SessionsXml | Sort-Object Complete $SessionsXml = $SessionsXml | Select-Object -Property Id, Started, Complete, Duration, KBNumber, TargetState, Client, Status | Sort-Object Complete #================================================= # KBNumber #================================================= if ($KBNumber) {$SessionsXml = $SessionsXml | Where-Object {$_.KBNumber -match $KBNumber}} #================================================= # Return $SessionsXml #================================================= #if ($GridView.IsPresent) {$SessionsXml = $SessionsXml | Select-Object -Property * | Out-GridView -PassThru -Title 'Select Updates'} Return $SessionsXml } end {} } |