Get-UserSession.psm1

function Get-UserSession {
    <#
.SYNOPSIS
    List User Session from local or remote computer. List with Active Directory SearchBase.
.DESCRIPTION
    List User session from local or remote computer. List with Active Directory SearchBase.
.PARAMETER ComputerName
    Name of server to list User Session from remote computer.
.PARAMETER ADSearchBase
    Active Directory SearchBase of server to list User Session from remote computer.
#>

    [CmdletBinding(DefaultParameterSetName = "ParS1")]
    param (
        [parameter(Position = 0, ParameterSetName = "ParS1", Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string[]] $ComputerName = "localhost",
        [parameter(ParameterSetName = "ParS2", Mandatory = $false, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string] $ADSearchBase
    )
    if ($PsVersionTable.PSVersion.Major -ge 7) {
        if ($PsVersionTable.OS -match "Windows") {
            if ($ADSearchBase) {
                try {
                    $ADSearch = New-Object System.DirectoryServices.DirectorySearcher
                    $ADSearch.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$ADSearchBase")
                    $ADSearch.Filter = "(&(objectClass=computer)(objectCategory=computer)(!useraccountcontrol:1.2.840.113556.1.4.803:=2))"
                    $ADSearchFind = $ADSearch.FindAll()
                }
                catch {
                    Write-Warning "ADSearchBase not found"
                }
                $ComputerName = $ADSearchFind | ForEach-Object -Parallel { $_.Properties.name } | Sort-Object
            }
            if ($ComputerName) {
                $ComputerName | ForEach-Object -Parallel {
                    $Computer = $_.ToUpper()
                    if (($Computer -like "localhost") -or ((Test-Connection -Count 1 -TargetName $Computer).Status -match "Success")) {
                        $Quser = quser /SERVER:$Computer 2>&1
                        if (($Quser).Count -gt 1) {
                            $QuserSelect = ($Quser | Select-Object -Skip 1 ).TrimStart().Replace(">", "")
                            foreach ($QuserItem in $QuserSelect) {
                                $Split = $QuserItem.Substring(22) -split "\s{2,}"
                                $QuserObject = [PSCustomObject]@{
                                    ComputerName = $Computer
                                    UserName     = $QuserItem.Substring(0, 21).Trim()
                                    SessionName  = $Split[0]
                                    ID           = $Split[1]
                                    Status       = $Split[2]
                                    IdleTime     = $Split[3]
                                    SessionTime  = $Split[4]
                                }
                                $QuserObject
                            }
                        }
                        else {
                            $QuserObject = [PSCustomObject]@{
                                ComputerName = $Computer
                                UserName     = $null
                                SessionName  = $null
                                ID           = $null
                                Status       = $null
                                IdleTime     = $null
                                SessionTime  = $null
                            }
                            $QuserObject
                        }
                    }
                }
            }
        }
        else {
            Write-Warning "PSVersion OS not Windows"
        }
    }
    else {
        Write-Warning "PSVersion Major not 7 or greater"
    }
}