Logoff отключившихся пользователей после x-минут простоя

Есть скрипт, который отключает пользователя после 15 минут простоя, как мне сделать, чтобы он отключал только отключившихся пользователей, а не всех, ведь например некоторые пользователи просто сворачивают окно

#Путь к списку серверов RDS в формате txt
$path_list_srv = "c:\server.txt"
#Время позволенное на АФК ( МИНУТЫ )
$Idle_minutes = 15
# VIP
[array]$excep_login_list
$excep_login_list = Get-Content -Path "c:\vip.txt"
#Загрузка списка серверов
$Servers = $Null
$Servers = Get-Content -Path $path_list_srv
#Если список серверов пуст то выход
if ($Servers -eq $Null) {exit}
 
foreach($Srv in $Servers){
 
    #Получаем данные с сервера RDS о сессиях 
    $List_i = $Null
    $List_i =  quser /server:$Srv
 
    #Обработка данных сессий
    foreach ($i in $List_i){
    Get-Variable -Name "u_*" | Clear-Variable
    $u_array = $i -split " " | ? {$_}
    $u_login = $u_array[0]
    $u_session = $u_array[1]
    $u_Idle_t = $u_array[$u_array.count-3] 
 
    #Преобразование idle time в временной формат
    if ($u_Idle_t -ne $Null){
      $u_Idle_t = $u_Idle_t -replace "\+",":" -replace "\.","0:0" -replace "Disc","0:0"
      if($u_Idle_t -like "*:*"){
        $u_Idle_t = [timespan]"$($u_Idle_t)"
        }elseif($u_Idle_t -eq "." -or $u_Idle_t -eq "none"){
        $u_Idle_t = [timespan]"0:0"
        }else{
        $u_Idle_t = [timespan]"0:$($u_Idle_t)"
      }
      #FIX БАГА
      if ( [int]$u_Idle_t.Days -gt 1000){$u_Idle_t = New-TimeSpan}
    }
    #Если ВИП
    if ( ($excep_login_list | Where-Object {$_ -eq $u_login}) -ne $NUll){$u_Idle_t = New-TimeSpan}

 
    #Если idle time превышает заданный интервал то сессия отключается
     if ([int]$u_Idle_t.TotalMinutes -ge $Idle_minutes){
      write-host -ForegroundColor yellow $Srv : $u_login / $u_Idle_t.TotalMinutes
      logoff /SERVER:$Srv $u_session
      }ELSE{write-host -ForegroundColor green $Srv : $u_login / $u_Idle_t.TotalMinutes}
 
    }
}

Ответы (1 шт):

Автор решения: OlegK

Можно взять готовый кусок отсюда создав из него модуль https://github.com/bkuppens/powershell/blob/master/Logoff-DisconnectedSession.ps1 либо надергав то, что нужно.

function Get-Sessions
{
   $queryResults = query session
   $starters = New-Object psobject -Property @{"SessionName" = 0; "UserName" = 0; "ID" = 0; "State" = 0; "Type" = 0; "Device" = 0;}
   foreach ($result in $queryResults)
   {
      try
      {
         if($result.trim().substring(0, $result.trim().indexof(" ")) -eq "SESSIONNAME")
         {
            $starters.UserName = $result.indexof("USERNAME");
            $starters.ID = $result.indexof("ID");
            $starters.State = $result.indexof("STATE");
            $starters.Type = $result.indexof("TYPE");
            $starters.Device = $result.indexof("DEVICE");
            continue;
         }

         New-Object psobject -Property @{
            "SessionName" = $result.trim().substring(0, $result.trim().indexof(" ")).trim(">");
            "Username" = $result.Substring($starters.Username, $result.IndexOf(" ", $starters.Username) - $starters.Username);
            "ID" = $result.Substring($result.IndexOf(" ", $starters.Username), $starters.ID - $result.IndexOf(" ", $starters.Username) + 2).trim();
            "State" = $result.Substring($starters.State, $result.IndexOf(" ", $starters.State)-$starters.State).trim();
            "Type" = $result.Substring($starters.Type, $starters.Device - $starters.Type).trim();
            "Device" = $result.Substring($starters.Device).trim()
         }
      } 
      catch 
      {
         $e = $_;
         Write-Output "ERROR: " + $e.PSMessageDetails
      }
   }
}

$DisconnectedSessions = Get-Sessions | ? {$_.State -match $IncludeStates -and $_.UserName -ne ""} | Select ID, UserName
foreach ($session in $DisconnectedSessions)
{
   logoff /SERVER:$Srv $session.ID
}
→ Ссылка