PowerShell: End disconnected sessions

The PowerShell script below logs off a disconnected session if the session has been idle for XX minutes, and it also excludes specific users. Additionally, the script writes a log file that includes the memory usage of the session

# Define the list of users to exclude from logoff
$excludedUsers = @("user1", "user2","user3")
# Define the maximum allowed idle time (in minutes). Minimum 60 minutes
$maxIdleMinutes = 2880

###########################################################################
# Get the list of RDP sessions
$rdpSessions = quser

# Iterate through the RDP sessions and log off users not in the excluded list
foreach ($session in $rdpSessions) {
    $sessionInfo = $session -split "\s+"
    $username = $sessionInfo[0]
    $sessionId = $sessionInfo[2]
             
          $Username        = $session.SubString(1, 20).Trim()
          $SessionName     = $session.SubString(23, 17).Trim()
          $ID             = $session.SubString(42, 2).Trim()
          $State           = $session.SubString(46, 6).Trim()
          $Idle           = $session.SubString(54, 9).Trim().Replace('+', ':')
    
          # skip disconnected, skip certain users, skip session ids with id 0
      if ($excludedUsers -notcontains $username -and $sessionId -ne "0" -and $state -eq "Disc" ) {
          $timeParts="0"        
          write-output "* $($username)"
          
         # Input time duration in the format "dd:hh:mm", "hh:mm", or "mm"
          $timeDuration = $idle
          $timeParts = $timeDuration -split ":"
          $days = 0
          $hours = 0
          $minutes = 0
          $totalMinutes = 0

      # Check the number of time parts and assign values accordingly
        if ($timeParts.Count -eq 3) {
            $days, $hours, $minutes = $timeParts
        } elseif ($timeParts.Count -eq 2) {
            $hours, $minutes = $timeParts
        } elseif ($timeParts.Count -eq 1) {
            $minutes = $timeParts
        }
                #0 would give errors during calculation, and should be excluded
               if($minutes -ne "0" -and $hours -ne "0" -and $minutes -ne "0" ) {
             
              $totalMinutes = [math]::Round(([int]::Parse($days) * 1440) + ([int]::Parse($hours) * 60) + [int]::Parse($minutes))
              Write-output  "  Idle: $($totalMinutes) minutes"
          

            $sessionProcesses = Get-WmiObject Win32_Process -Filter "SessionId = $($sessionid)"
            $totalMemoryUsage = 0
                # Iterate through the processes and calculate the total memory usage
                foreach ($process in $sessionProcesses) {
                    $totalMemoryUsage += $process.WorkingSetSize
                }
                # Convert the total memory usage to megabytes (MB)
                $totalMemoryUsageMB = [math]::Round($totalMemoryUsage / 1MB, 2)
                # Output the total memory usage for the session


            if ($totalMinutes -ge $maxIdleMinutes -and $totalMinutes -ne "0") {
     
       
        write-output " ** Killing session for $($username) : $($sessionid)"
        Write-Host "    Total Memory Usage: $(${totalMemoryUsageMB})MB"  
        Add-Content c:\support\end_disconnected_sessions.log "$(get-date) : Killing session for $($username) : $($sessionid) , idle time: $($totalMinutes) minutes , Total Memory Usage: $(${totalMemoryUsageMB})MB"
        Logoff $sessionId
} else {
        write-output " ** NOT Killing session for $($username) : $($sessionid)"
        Write-Host "    Total Memory Usage: $(${totalMemoryUsageMB})MB"  
      Add-Content c:\support\end_disconnected_sessions.log "$(get-date) : Not killing disconnected session for $($username) : $($sessionid) , idle time: $($totalMinutes) minutes , Total Memory Usage: $(${totalMemoryUsageMB})MB"
}


            }
    }
    }

Share your love