Public/PageService/Get-CWCLastContact.ps1
function Get-CWCLastContact { [CmdletBinding()] [OutputType([boolean], ParameterSetName = ('Quiet'))] [OutputType([datetime])] param( [Parameter(Mandatory = $True)] [guid]$GUID, [parameter(ParameterSetName = 'Quiet')] [switch]$Quiet, [int]$Seconds, [string]$Group = 'All Machines' ) # Time conversion $origin = New-Object -Type DateTime -ArgumentList 1970, 1, 1, 0, 0, 0, 0 $epoch = $((New-TimeSpan -Start $(Get-Date -Date '01/01/1970') -End $(Get-Date)).TotalSeconds) $Body = ConvertTo-Json @(@($Group), $GUID) Write-Verbose $Body $Endpoint = 'Services/PageService.ashx/GetSessionDetails' try { $WebRequestArguments = @{ Endpoint = $Endpoint Body = $Body Method = 'Post' } $SessionDetails = Invoke-CWCWebRequest -Arguments $WebRequestArguments } catch { return $_ } if ($SessionDetails -eq 'null' -or !$SessionDetails) { Write-Warning 'Machine not found.' return $null } # Filter to only guest session events if ($SessionDetails.Connections.PSObject.Properties.Name -Contains 'Events') { $GuestSessionEvents = ($SessionDetails.Connections | Where-Object { $_.ProcessType -eq 2 }).Events } else { $GuestSessionEvents = $SessionDetails.Events } if ($GuestSessionEvents) { # Get connection events $LatestEvent = ($GuestSessionEvents | Where-Object { $_.EventType -in (10, 11) } | Sort-Object time)[0] if ($LatestEvent.EventType -eq 10) { # Currently connected if ($Quiet) { return $True } else { return Get-Date } } else { # Time conversion hell :( $TimeDiff = $epoch - ($LatestEvent.Time / 1000) $OfflineTime = $origin.AddSeconds($TimeDiff) $Difference = New-TimeSpan -Start $OfflineTime -End $(Get-Date) if ($Quiet -and $Difference.TotalSeconds -lt $Seconds) { return $True } elseif ($Quiet) { return $False } else { return $OfflineTime } } } else { return Write-Error 'Unable to determine last contact.' } } |