Public/03_Services/Get-VBRDSUserInformation.ps1
|
# ============================================================ # FUNCTION : Get-VBRDSUserInformation # VERSION : 1.0.2 # CHANGED : 10-04-2026 -- Initial VB-compliant release # AUTHOR : Vibhu Bhatnagar # PURPOSE : Collect RDS user session information # ENCODING : UTF-8 with BOM # ============================================================ <# .SYNOPSIS Collects active RDS user session information from local or remote Remote Desktop Session Host servers. .DESCRIPTION Get-VBRDSUserInformation retrieves detailed information about active RDS user sessions from local or remote Remote Desktop Session Host servers. Returns structured objects containing session details, user information, and connection metadata. .PARAMETER ComputerName Target RDS server(s). Defaults to local machine. Accepts pipeline input. Supports multiple servers and fully-qualified domain names. .PARAMETER Credential Alternate credentials for remote RDS server access. .EXAMPLE Get-VBRDSUserInformation Retrieves active RDS sessions from the local server. .EXAMPLE Get-VBRDSUserInformation -ComputerName RDS-HOST01 Retrieves active RDS sessions from remote server RDS-HOST01. .EXAMPLE 'RDS-HOST01','RDS-HOST02' | Get-VBRDSUserInformation -Credential (Get-Credential) Retrieves active RDS sessions from multiple servers using pipeline input. .OUTPUTS [PSCustomObject]: ComputerName, UserName, SessionId, SessionState, HostServer, ClientName, ClientIP, LogonTime, Status, CollectionTime .NOTES Version : 1.0.2 Author : Vibhu Bhatnagar Modified : 10-04-2026 Category : Services #> function Get-VBRDSUserInformation { [CmdletBinding()] param( [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [Alias('Name', 'Server', 'Host')] [string[]]$ComputerName = $env:COMPUTERNAME, [PSCredential]$Credential ) process { foreach ($computer in $ComputerName) { try { # Step 1 -- Define the RDS session collection script block $ScriptBlock = { Get-RDUserSession -ErrorAction SilentlyContinue | Select-Object -Property UserName, SessionId, SessionState, HostServer, ClientName, ClientIP, LogonTime } # Step 2 -- Determine if local or remote execution if ($computer -eq $env:COMPUTERNAME) { # Step 3 -- Execute locally $UserSessions = & $ScriptBlock } else { # Step 4 -- Execute remotely $UserSessions = Invoke-Command -ComputerName $computer -Credential $Credential -ScriptBlock $ScriptBlock } # Step 5 -- Return each session as a separate object if ($UserSessions) { foreach ($session in $UserSessions) { [PSCustomObject]@{ ComputerName = $computer UserName = $session.UserName SessionId = $session.SessionId SessionState = $session.SessionState HostServer = $session.HostServer ClientName = $session.ClientName ClientIP = $session.ClientIP LogonTime = $session.LogonTime Status = 'Success' CollectionTime = (Get-Date).ToString('dd-MM-yyyy HH:mm:ss') } } } else { # Step 6 -- No sessions found but no error [PSCustomObject]@{ ComputerName = $computer UserName = $null SessionId = $null SessionState = $null HostServer = $null ClientName = $null ClientIP = $null LogonTime = $null Status = 'Success' CollectionTime = (Get-Date).ToString('dd-MM-yyyy HH:mm:ss') } } } catch { # Step 7 -- Return error object [PSCustomObject]@{ ComputerName = $computer UserName = $null SessionId = $null SessionState = $null HostServer = $null ClientName = $null ClientIP = $null LogonTime = $null Error = $_.Exception.Message Status = 'Failed' CollectionTime = (Get-Date).ToString('dd-MM-yyyy HH:mm:ss') } } } } } |