Scripts/Get-BPASession.ps1

function Get-BPASession {
    <#
        .SYNOPSIS
            Gets AutoMate BPA user sessions.
 
        .DESCRIPTION
            Get-BPASession returns open SMC sessions from AutoMate BPA. This function uses the audit event log to determine which sessions are open.
            The results of this function could be inaccurate if a session wasn't closed property, or if audit events have aged out since the last server start.
 
        .PARAMETER BPAServer
            The AutoMate BPA management server.
 
        .EXAMPLE
            # Gets all user sessions
            Get-BPASession
 
        .NOTES
            Author(s): : David Seibel
            Contributor(s) :
            Date Created : 11/16/2017
            Date Modified : 02/27/2018
 
        .LINK
            https://github.com/davidseibel/PoshBPA
    #>

    [CmdletBinding()]
    param (
        [ValidateNotNullOrEmpty()]
        [string]$BPAServer
    )
    $servers = @()
    if ($BPAServer) {
        $servers += $BPAServer 
    } else {
        $servers += $global:BPAConnectionInfo.Server
    }

    $result = @()
    foreach ($server in $servers) {
        # Get events starting when the management server last started
        $mgtServer = Get-BPAServer -Type Management -BPAServer $server -Verbose:$VerbosePreference
        $uptimeDays = [int]($mgtServer.Uptime.Split(".")[0])
        $uptimePart2 = $mgtServer.Uptime.Split(".")[1]
        $uptimeHours = [int]($uptimePart2.Split(":")[0])
        $uptimeMinutes = [int]($uptimePart2.Split(":")[1])
        $uptimeSeconds = [int]($uptimePart2.Split(":")[2])
        $uptime = New-TimeSpan -Days $uptimeDays -Hours $uptimeHours -Minutes $uptimeMinutes -Seconds $uptimeSeconds
        $filterSet = @()
        $filterSet += @{Property = "EventType"; Comparator = "="; Value = [BPAAuditEventType]::UserConnectedSmc.value__}
        $filterSet += @{Property = "EventType"; Comparator = "="; Value = [BPAAuditEventType]::UserDisconnectedSmc.value__}
        $events = Get-BPAAuditEvent -FilterSet $filterSet -FilterSetMode Or -StartDate (Get-Date).Subtract($uptime) -BPAServer $server -Verbose:$VerbosePreference

        $connectEvents = ($events | Group-Object SessionID | Where-Object {$_.Count -eq 1}).Group | Where-Object {$_.EventType -eq [BPAAuditEventType]::UserConnectedSmc.value__}

        foreach ($connectEvent in $connectEvents) {
            $eventData = @{}
            $connectEvent.Data.Split("|") | ForEach-Object {$eventData.Add($_.Split(":")[0],$_.Split(":")[1])}

            $result = [PSCustomObject]@{
                ID = $connectEvent.SessionID
                UserID = $connectEvent.UserID
                User = $eventData["User"]
                Machine = $eventData["MachineName"]
                IPAddress = $eventData["IP"]
                OSUser = $eventData["OSUser"]
                StartDateTime = $connectEvent.EventDateTime
                Duration = New-Timespan -Start $connectEvent.EventDateTime
                Type = [BPAConstructType]::MachineConnection.value__
                TypeName = [BPAConstructType]::MachineConnection
                BPAServer = $server
            }
            $result.PSObject.TypeNames.Insert(0,"BPAConstructType.UserSession")
            $result
        }
    }
}