Public/Get-HorizonDisconnectedSessions.ps1
|
#Requires -Version 5.1 <# .SYNOPSIS Returns disconnected VMware Horizon sessions. .DESCRIPTION Retrieves disconnected Horizon sessions using Get-HorizonSessions and filters them based on disconnect duration. .PARAMETER HoursDisconnected Minimum number of hours the session has been disconnected. .PARAMETER UserName Filter by username. .PARAMETER MachineName Filter by machine name. .EXAMPLE Get-HorizonDisconnectedSessions .EXAMPLE Get-HorizonDisconnectedSessions -HoursDisconnected 4 .EXAMPLE Get-HorizonDisconnectedSessions -UserName l.cross .NOTES Project : Enterprise-HorizonToolkit Author : Malik Oseni Version : 1.0.0 #> Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' function Get-HorizonDisconnectedSessions { [CmdletBinding()] [OutputType([PSCustomObject])] param( [Parameter()] [ValidateRange(0, 720)] [int] $HoursDisconnected = 0, [Parameter()] [string] $UserName, [Parameter()] [string] $MachineName ) begin { Write-HorizonLog ` -Message 'Starting Get-HorizonDisconnectedSessions.' ` -Level Information $Now = Get-Date } process { Write-Verbose 'Retrieving disconnected Horizon sessions.' $SessionParameters = @{ State = 'DISCONNECTED' } if ($PSBoundParameters.ContainsKey('UserName')) { $SessionParameters.UserName = $UserName } if ($PSBoundParameters.ContainsKey('MachineName')) { $SessionParameters.MachineName = $MachineName } $Sessions = @(Get-HorizonSessions @SessionParameters) Write-HorizonLog ` -Message "$($Sessions.Count) disconnected Horizon session(s) retrieved." ` -Level Information Write-Verbose 'Filtering disconnected sessions.' $DisconnectedSessions = @(foreach ($Session in $Sessions) { # # Skip sessions that have never disconnected # if ($null -eq $Session.DisconnectTime) { continue } # # Calculate how long the session has been disconnected # $DisconnectedHours = [math]::Round( ( $Now - $Session.DisconnectTime ).TotalHours, 2 ) # # Apply threshold filter # if ($DisconnectedHours -lt $HoursDisconnected) { continue } # # Return immutable enterprise object # [PSCustomObject]@{ PSTypeName = 'Enterprise.Horizon.DisconnectedSession' SessionId = $Session.SessionId UserName = $Session.UserName MachineName = $Session.MachineName MachineDNS = $Session.MachineDNS DesktopPool = $Session.DesktopPool DesktopName = $Session.DesktopName DesktopType = $Session.DesktopType DesktopSource = $Session.DesktopSource SessionState = $Session.SessionState SessionType = $Session.SessionType Protocol = $Session.Protocol StartTime = $Session.StartTime DisconnectTime = $Session.DisconnectTime DurationMinutes = $Session.DurationMinutes IdleMinutes = $Session.IdleMinutes HoursDisconnected = $DisconnectedHours ClientName = $Session.ClientName ClientType = $Session.ClientType ClientAddress = $Session.ClientAddress ClientVersion = $Session.ClientVersion AgentVersion = $Session.AgentVersion SecurityGateway = $Session.SecurityGateway SecurityGatewayAddress = $Session.SecurityGatewayAddress SecurityGatewayLocation = $Session.SecurityGatewayLocation BrokeredRemotely = $Session.BrokeredRemotely ResourcedRemotely = $Session.ResourcedRemotely ForeverSession = $Session.ForeverSession Unauthenticated = $Session.Unauthenticated } }) Write-HorizonLog ` -Message "$($DisconnectedSessions.Count) disconnected session(s) matched the requested criteria." ` -Level Information Write-Verbose 'Returning enterprise disconnected session objects.' return $DisconnectedSessions } end { Write-HorizonLog ` -Message 'Get-HorizonDisconnectedSessions completed successfully.' ` -Level Information Write-Verbose 'Get-HorizonDisconnectedSessions completed.' } } |