Как сбросить терминальную сессию windows 2012

Зависание RDP сессии. как завершить сессию пользователя, по ряду причин, одна из таких, это просто ее зависание. После чего человек и подключиться не может

Обновлено 16.04.2019

User logoДобрый день! Уважаемые читатели и гости IT портала Pyatilistnik.org. Вчера я вас научил определять номер и ID сеанса пользователя на RDS ферме или терминальном сервере. Там я вам рассказывал, что это нужно в случаях, когда вам необходимо завершить сессию пользователя, по ряду причин, одна из таких, это просто ее зависание. После чего человек и подключиться не может заново и не может выйти из своего сеанса. Вы как администратор, должны уметь решать проблему с зависшими RDP сессиями, ниже я покажу свои методы и алгоритмы.

Описание проблемы

Есть RDS ферма из 15 хостов подключений на Windows Server 2012 R2. Сервера на то они и сервера, что работают постоянно. Если у вас на ферме не настроены тайм ауты времени беспрерывной работы, то пользователи могут неделями или месяцами висеть в авторизованных подключениях. Логично предположить, что это не очень хорошо и ведет к различным последствиям, одно из которых, это полное зависание сеанса, при котором человек не может подключиться к терминальному серверу и видит сообщение «Работает служба профилей пользователей» или еще вариант «Не удается завершить требуемую операцию», я уже не говорю про повреждение пользовательского профиля. В результате того, что RDS брокеры видят. что пользователь уже залогинен, они не дают ему переподключиться к другому Session Host серверу, даже если вы закроете на текущем новые подключения. Пока вы не сделаете выход пользователя из системы для этой сессии, она так и будет мешать. Давайте разбираться, как это делать.

Методы завершения сессии пользователя не терминале

Существует несколько методов позволяющие выкинуть пользователя с сервера.

  • Завершить сессию пользователя (Сделать log off) вы можете из оснастки управления RDS фермой
  • Разлогинить пользователя можно и на самом терминальном сервере из диспетчера задач
  • Выход пользователя можно выполнить из утилиты командной строки rwinsta
  • Утилита командной строки log off
  •  Утилита reset session
  • * Командлет Stop-TSSession

Как выкинуть пользователя из оснастки управления RDS

И так, у меня есть мой любимый, тестовый пользователь в Active Directory, по имени Барбоскин Геннадий Викторович. Предположим, что он зашел на терминальный стол и нам по причине зависания его сессии, нужно сделать ему выход. Первый метод, это использование оснастки по управлению RDS фермой, я вам рассказывал, как ее собирать. Открываем раздел с вашей коллекцией RDS фермы. В поисковом фильтре указываем логин или фамилию нужного сотрудника. В результате получаем хост, где он работает.

выход пользователя

Щелкаем по нему правым кликом. В контекстном меню будет пункт «Выйти», это и соответствует завершению сессии (Log off). Так же есть пункт «Отключиться», если выберите его, то пользователь будет выброшен с терминального сервера, но его сессия останется на нем, данная операция равносильна тому, если пользователь просто нажал в окне с названием терминального сервера крестик.

как выкинуть пользователя-03

После того, как вы выбрали пункт «Выйти», начнется корректное завершение сессии пользователя на RDS ферме. Сам пользователь увидит сообщение «Работает служба профилей пользователей» и у него закроется окно без ошибки.

Второй метод разлогинить пользователя на терминальном сервере

Второй метод, похож на первый, за исключением того, что нам необходимо залогиниться на нужный сервер, открыть оснастку «Диспетчер задач» и уже из него произвести выход пользователя. Сказано сделано, о том, как вам попадать на нужного участника RDS фермы я рассказывал. Далее щелкаем правым кликом по области пуска и из контекстного меню выбираем пункт «Диспетчер задач». Кстати, вызвать «Диспетчер задач» можно и через сочетание клавиш CTRL+SHIFT+ESC.

как выкинуть пользователя-04

Находим нужного нам пользователя и щелкаем по нему правым кликом, в контекстном меню. нас будет интересовать пункт «Выйти». Выбираем его и завершаем сессию пользователя.

Выход пользователя в диспетчере задач

Бывает так, что первые два метода не помогают в случаях, когда пользовательская сессия зависает на терминальном сервере, вы вроде бы из графического интерфейса делаете выход, но оно не отрабатывает. В таких случаях нужно использовать утилиты командной строки или PowerShell

Использование утилиты RWINSTA

Если вы попали в ситуацию, когда графические методы не позволяют вам произвести выход пользователя из системы, а это необходимо, то вам на помощь придут утилиты из командной строки. RWINSTA — это встроенная в Windows утилита, которая позволяет сбрасывать сессии, по ID и имени сеанса. Первым делом вам нужно вычислить или ID сессии или ее имя, я вам рассказывал, о всех известных мне методах. можете ознакомиться. Я выберу утилиту qwinsta. Пишем команду:

qwinsta | findstr barboskin.g (Локально)

или удаленно qwinsta /server:имя сервера | findstr barboskin.g

В моем примере имя сеанса rdp-tcp#172 и ее ID 515. Пишем команду:

rwinsta rdp-tcp#172 /server:localhost или rwinsta 515 /server:localhost

Использование утилиты RWINSTA

И в первом и во втором случае, пользователь будет разлогинен с данного сервера. Данную команду можно запускать удаленно, со своего рабочего места, главное, чтобы были права на log off. Данный метод меня ни раз выручал в моей практике, например случай с зависшей сессией на Windows Server 2016, где вместо логина пользователя было имя (4).

Как отключить пользователя через reset session

Завершить сессию пользователя можно и с помощью утилиты командной строки Reset Session. В текущем примере у моего Барбоскина Геннадия Викторовича имя сеанса rdp-tcp#16 с его ID 11. Данную утилиту можно применять как локально на самом терминальном сервере, так и на своей рабочей станции, тут так же есть ключ /server.

reset session rdp-tcp#16 или reset session 11

Как отключить пользователя через reset session

Подробнее про утилиту reset session вы можете почитать на сайте Microsoft — https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/reset-session

Как отключить пользователя через logoff

Разлогинить пользовательскую учетную запись и даже зависшую, можно и через утилиту командной строки «LogOff». В данном примере у Геннадия Барбоскина имя сессии rdp-tcp#43. В командной строке от имени администратора введите:

logoff rdp-tcp#43 /server:localhost (Имя сервера можно менять) или logoff 54 /server:localhost

Как отключить пользователя через logoff

Выход пользователя через командлет Stop-TSSession

Есть такой замечательный командлет Stop-TSSession. Посмотрим на сервере ID и имя сеанса, для этого в открытой оболочке PowerShell введите:

В итоге я вижу, что у пользователя barboskin.g SessionID 3. Далее пишем

Stop-TSSession 3 или принудительно Stop-TSSession 3 -Force

Выход пользователя через командлет Stop-TSSession

Соглашаемся с тем, что будет производиться log off для данного пользователя. Проверяем, что сессия завершена. Можно вот таким простеньким скриптом из планировщика задач, разлогинивать сессии:

Import-Module PSTerminalServices
Get-TSSession -ComputerName SERVER_NAME -filter {$_.sessionID -ne 0 -AND $_.sessionID -ne 1 -AND $_.sessionID -ne 65536}| Stop-TSSession –Force

Выход пользователя через командлет Stop-TerminalSession

Данный командлет устанавливается отдельно, совместно с пакетом Pscx. Первым делом посмотрим локально или удаленно идентификаторы сессии пользователя, для которого мы хотим сделать log off. Выполняем команду:

Get-TerminalSession -ComputerName имя сервера

Get-TerminalSession

Нужный мне ID сеанса 427. Далее воспользуемся командлетом Stop-TerminalSession, чтобы выкинуть пользователя и завершить его сессию.

Stop-TerminalSession -ComputerName имя сервера -Id 427 -Force

Stop-TerminalSession

Как видите сессия 427 больше не существует, и у нас с помощью командлета Stop-TerminalSession получилось выкинуть пользователя из RDS сеанса. На этом у меня все. Остались вопросы, то пишите их в комментариях. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Задача дать поддержке права для сброса сессии с фермы терминалов RDS.

Сначала надо создать группу и поместить туда всех людей кто будет сбрасывать сессии и подключаться.

Назавём её Terminal Servers Administrators

Теперь делаем скрипт и добавляем в него наши хосты фермы и группу которую сделали

$Group = "domenTerminal Servers Administrators"
$Servers = @(
   "Host-RDSH1", 
"Host-RDSH2",
"Host-RDSH3",
"Host-RDSH4",
"Host-RDSH5"
)
ForEach ($Server in $Servers) {
    #Делегируем право на теневые сессии
    $WMIHandles = Get-WmiObject `
        -Class "Win32_TSPermissionsSetting" `
        -Namespace "rootCIMV2terminalservices" `
        -ComputerName $Server `
        -Authentication PacketPrivacy `
        -Impersonation Impersonate
    ForEach($WMIHandle in $WMIHandles)
    {
        If ($WMIHandle.TerminalName -eq "RDP-Tcp")
        {
        $retVal = $WMIHandle.AddAccount($Group, 2)
        $opstatus = "успешно"
        If ($retVal.ReturnValue -ne 0) {
            $opstatus = "ошибка"
        }
        Write-Host ("Делегирование прав на теневое подключение группе " +
            $Group + " на сервере " + $Server + ": " + $opstatus + "`r`n")
        }
    }
}

Теперь делаем скрипт на Powershell с помощью которого будет производиться поиск сессии на терминальной ферме и потом будет выбор убить сессию или подключиться

$Servers = @(
    "Host-RDSH1",	
"Host-RDSH2",	
"Host-RDSH3",	
"Host-RDSH4",	
"Host-RDSH5"
)

function Invoke-RDPSessionLogoff {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName,
        [parameter(Mandatory=$true, Position=1)][String]$SessionID
    )
    $ErrorActionPreference = "Stop"
    logoff $SessionID /server:$ComputerName /v 2>&1
}

function Invoke-RDPShadowSession {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName,
        [parameter(Mandatory=$true, Position=1)][String]$SessionID
    )
    $ErrorActionPreference = "Stop"
    mstsc /shadow:$SessionID /v:$ComputerName /control 2>&1
}

Function Get-LoggedOnUser {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName="localhost"
    )
    $ErrorActionPreference = "Stop"
    Test-Connection $ComputerName -Count 1 | Out-Null
    quser /server:$ComputerName 2>&1 | Select-Object -Skip 1 | ForEach-Object {
        $CurrentLine = $_.Trim() -Replace "s+"," " -Split "s"
        $HashProps = @{
            UserName = $CurrentLine[0]
            ComputerName = $ComputerName
        }
        If ($CurrentLine[2] -eq "Disc") {
            $HashProps.SessionName = $null
            $HashProps.Id = $CurrentLine[1]
            $HashProps.State = $CurrentLine[2]
            $HashProps.IdleTime = $CurrentLine[3]
            $HashProps.LogonTime = $CurrentLine[4..6] -join " "
            $HashProps.LogonTime = $CurrentLine[4..($CurrentLine.GetUpperBound(0))] -join " "
        }
        else {
            $HashProps.SessionName = $CurrentLine[1]
            $HashProps.Id = $CurrentLine[2]
            $HashProps.State = $CurrentLine[3]
            $HashProps.IdleTime = $CurrentLine[4]
            $HashProps.LogonTime = $CurrentLine[5..($CurrentLine.GetUpperBound(0))] -join " "
        }
        New-Object -TypeName PSCustomObject -Property $HashProps |
        Select-Object -Property UserName, ComputerName, SessionName, Id, State, IdleTime, LogonTime
    }
}
$UserLogin 
$UserLogin=123
while ($UserLogin){
$UserLogin = Read-Host -Prompt "Vvedite login pol'zovatelya"
Write-Host "Poisk RDP-sessij pol'zovatelya na serverah..."
$SessionList = @()
ForEach ($Server in $Servers) {
    $TargetSession = $null
    Write-Host "  Opros servera $Server"
    Try {
        $TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
    }
    Catch {
        Write-Host "Oshibka: " $Error[0].Exception.Message -ForegroundColor Red
        Continue
    }
    If ($TargetSession) {
        Write-Host "   Najdena sessiya s ID $($TargetSession.ID) na servere $Server" -ForegroundColor Yellow
        Write-Host "    CHto budem delat'?"
        Write-Host "      1 - podklyuchit'sya k sessii"
        Write-Host "      2 - zavershit' sessiyu"
        Write-Host "      3 - drygoi polzovatel"
        Write-Host "      0 - exit"
        $Action = Read-Host -Prompt "Vvedite dejstvie"
        If ($Action -eq "1") {
            Invoke-RDPShadowSession -ComputerName $Server -SessionID $TargetSession.ID
        }
        ElseIf ($Action -eq "2") {
            Invoke-RDPSessionLogoff -ComputerName $Server -SessionID $TargetSession.ID}
        

        ElseIf ($Action -eq "3") {break}
        
          ElseIf ($Action -eq "0") {exit}

        }
   
    Else {
        Write-Host "    sessij ne najdeno"
        }
}
}

После этого я Powershell скрипт завернул exe с помощью PS2EXE-GUI.

Как сбросить терминальные сессии на терминальной ферме RDS windows 2012-2016 без прав администратора

что бы не морочиться с правами на выполнение powershell

И опубликовал в remoteapp и дал права только на группу Terminal Servers Administrators

Как сбросить терминальные сессии на терминальной ферме RDS windows 2012-2016 без прав администратора

Как сбросить терминальные сессии на терминальной ферме RDS windows 2012-2016 без прав администратора

Как сбросить терминальные сессии на терминальной ферме RDS windows 2012-2016 без прав администратора

Немножко обновлённый скрипт:

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8")

function Invoke-RDPSessionLogoff {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName,
        [parameter(Mandatory=$true, Position=1)][String]$SessionID
    )
    $ErrorActionPreference = "Stop"
    logoff $SessionID /server:$ComputerName /v 2>&1
}

function Invoke-RDPShadowSession {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName,
        [parameter(Mandatory=$true, Position=1)][String]$SessionID
    )
    $ErrorActionPreference = "Stop"
    mstsc /shadow:$SessionID /v:$ComputerName /control 2>&1
}

Function Get-LoggedOnUser {
    Param(
        [parameter(Mandatory=$True, Position=0)][String]$ComputerName="localhost"
    )
    $ErrorActionPreference = "Stop"
    Test-Connection $ComputerName -Count 1 | Out-Null
    quser /server:$ComputerName 2>&1 | Select-Object -Skip 1 | ForEach-Object {
        $CurrentLine = $_.Trim() -Replace "s+"," " -Split "s"
        $HashProps = @{
            UserName = $CurrentLine[0]
            ComputerName = $ComputerName
        }
        If ($CurrentLine[2] -eq "Disc") {
            $HashProps.SessionName = $null
            $HashProps.Id = $CurrentLine[1]
            $HashProps.State = $CurrentLine[2]
            $HashProps.IdleTime = $CurrentLine[3]
            $HashProps.LogonTime = $CurrentLine[4..6] -join " "
            $HashProps.LogonTime = $CurrentLine[4..($CurrentLine.GetUpperBound(0))] -join " "
        }
        else {
            $HashProps.SessionName = $CurrentLine[1]
            $HashProps.Id = $CurrentLine[2]
            $HashProps.State = $CurrentLine[3]
            $HashProps.IdleTime = $CurrentLine[4]
            $HashProps.LogonTime = $CurrentLine[5..($CurrentLine.GetUpperBound(0))] -join " "
        }
        New-Object -TypeName PSCustomObject -Property $HashProps |
        Select-Object -Property UserName, ComputerName, SessionName, Id, State, IdleTime, LogonTime
    }
}

$Servers = Get-Content -Path "servers.txt" -Encoding "UTF8"

While ($true) {
    $UserLogin = Read-Host -Prompt "Введите логин пользователя"
    Write-Host "Поиск RDP-сессий пользователя на серверах..."
    $SessionList = @()
    ForEach ($Server in $Servers) {
        $TargetSession = $null
        Write-Host "  Опрос сервера $Server"
        Try {
            $TargetSession = Get-LoggedOnUser -ComputerName $Server | Where-Object {$_.UserName -eq $UserLogin}
        }
        Catch {
            Write-Host "Ошибка: " $Error[0].Exception.Message -ForegroundColor Red
            Continue
        }
        If ($TargetSession) {
            Write-Host "    Найдена сессия с ID $($TargetSession.ID) на сервере $Server" -ForegroundColor Yellow
            Write-Host "    Что будем делать?"
            Write-Host "      1 - подключиться к сессии"
            Write-Host "      2 - завершить сессию"
            Write-Host "      0 - ничего"
            $Action = Read-Host -Prompt "Введите действие"
            If ($Action -eq "1") {
                Invoke-RDPShadowSession -ComputerName $Server -SessionID $TargetSession.ID
            }
            ElseIf ($Action -eq "2") {
                $toLog = @()
                $logItem = [ordered]@{
                    Login = $UserLogin
                    Server = $Server
                    ExitType = "Kick"
                    Timestamp = Get-Date -Format "yyyy-MM-dd-hh-mm-ss"
                }
                $toLog += New-Object PSObject -Property $logItem
                $toLog | Export-CSV -Path "C:rdshlog.csv" -Encoding "UTF8" -Force -NoTypeInformation -Append
                Invoke-RDPSessionLogoff -ComputerName $Server -SessionID $TargetSession.ID
            }
            Break
        }
        Else {
            Write-Host "    сессий не найдено"
        }
    }
}

Similar Posts:

Article No :: KB00007

In the Windows Servers, by default, there are only two remote desktop sessions allowed (until you have taken an RDP license). In multiple situations, you find that you can’t connect/login into the server via RDP/MSTSC because two sessions are already active or in disconnected mode. You get the error msg «Remote Desktop Disconnected», «This computer can’t connect to the remote computer.»

Permission/Access required — You must be the part of the local administrator group of the remote server to kill/reset the disconnected or active sessions.

Applies to — Windows Server 2016, Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2, Windows Server 2008

Query the Remote Server for Current Terminal Sessions

QWinSta — Displays information about sessions on a Remote Desktop Session Host (RD Session Host) server

First, we query to list the sessions on the remote server.

Command for Query the Server Sessions is

qwinsta /server:[ServerIP/Hostname]

Example:

qwinsta /server:192.168.40.1

qwinsta /server:myServer.Contoso.com or myserver.contoso.local

Output of Command

C:>qwinsta /server:myServer.contoso.com

SESSIONNAME USERNAME ID STATE TYPE DEVICE

0 Disc rdpwd

ica-tcp 65536 Listen wdica

rdp-tcp 65537 Listen rdpwd

console 16 Conn wdcon

ica-tcp#966 avijitd 10 Active wdica

ica-tcp#969 deepakk 1 Active wdica

Note: Please take a note of the session ID from the Query command. In the above example, if i have to disconnect the session of User «avijitd» then the session id is «10».

Logoff/Kill the Remote Desktop Sessions

RWinSta — Enables you to reset (delete) a session on a Remote Desktop Session Host (rd Session Host) server.

Command for Release the Server Sessions

rwinsta [Session ID] /server:[Server IP]

Example: We will kill/logoff the remote session of user «avijitd» whose session ID is «10»

rwinsta 10 /server:192.168.40.1

rwinsta 10 /server:myServer.Contoso.com or myserver.contoso.local

Note: RWinsta command does not return anything.

If you liked this article, do share the same. You can also Buy me a Coffee using Paypal at «paypal.me/duttaavijit«, This is purely a volunteer effort. THANK YOU !!!

Some good books related to Windows Hacks and Microsoft Azure Cloud. Do check it out.

#KillRemoteSession #RemoteDesktopSession #QWinSta #RWinSta #LogoffRemoteSession #WindowsServer #RDPSession #MSTSCSession #Server

Описание проблемы

В Windows Server 2012 R2 существует ферма RDS из 15 узлов подключения. Для этого нужны серверы и серверы, которые работают постоянно. Если в вашей ферме не настроены тайм-ауты времени безотказной работы, пользователи могут зависать на авторизованных соединениях на недели или месяцы. Логично предположить, что это не очень хорошо и приводит к различным последствиям, одним из которых является полная блокировка сеанса, когда человек не может подключиться к терминальному серверу и видит сообщение «Служба профилей пользователей запущена» или другое «Может не завершить запрошенную операцию », я не говорю о повреждении профиля пользователя. В результате того, что брокеры RDS видят, что пользователь уже вошел в систему, они не позволяют ему повторно подключаться к другому серверу узла сеанса, даже если вы закрываете новые подключения на текущем. Пока вы не выйдете из системы для этого сеанса, он все равно будет мешать. Давайте узнаем, как это сделать.

Методы завершения сессии пользователя не терминале

Есть несколько способов удалить пользователя с сервера.

  • вы можете завершить сеанс пользователя (выйти из системы) из оснастки управления фермой RDS
  • Вы также можете выйти из системы с самого терминального сервера из диспетчера задач
  • Пользователь может выйти из программы командной строки rwinsta
  • Отключите утилиту командной строки
  •  Утилита восстановления сеанса
  • * Командлет Stop-TSSession

Как выкинуть пользователя из оснастки управления RDS

Итак, у меня есть любимый тестовый пользователь Active Directory Барбоскин Геннадий Викторович. Предположим, он подошел к терминальному столу, и из-за блокировки его сеанса нам нужно его вытащить. Первый способ – использовать оснастку управления фермой RDS, я уже говорил вам, как ее создать. Откройте раздел с вашей коллекцией фермы RDS. Введите логин или фамилию нужного сотрудника в поисковый фильтр. В итоге получаем хост, на котором он работает.

выход пользователя

Щелкните по нему правой кнопкой мыши. В контекстном меню появится пункт «Выйти», что соответствует окончанию сеанса (Выход). Также есть пункт «Отключить», если вы его выберете, пользователь будет выгнан с терминального сервера, но его сессия останется на нем, эта операция эквивалентна тому, если пользователь только что нажал на крестик в окне с именем терминального сервера.

как кикнуть пользователя-03

После выбора пункта «Отключить» сеанс пользователя в ферме RDS отключится нормально. Пользователь сам увидит сообщение «Служба профилей пользователей запущена» и окно закроется без ошибок.

Второй метод разлогинить пользователя на терминальном сервере

Второй метод аналогичен первому, за исключением того, что вам нужно войти на требуемый сервер, открыть оснастку диспетчера задач и выйти из системы пользователя. Сказав это, я рассказал вам, как добраться до нужного члена фермы RDS. Затем щелкните правой кнопкой мыши в области запуска и выберите в контекстном меню пункт «Диспетчер задач». Кстати, вы также можете вызвать «Диспетчер задач» с помощью сочетания клавиш CTRL + SHIFT + ESC.

как удалить пользователя-04

Находим нужного нам пользователя и кликаем по нему правой кнопкой, в интересующем нас контекстном меню пункт «Выход». Выбираем его и завершаем сеанс пользователя.

Выход пользователя из системы в диспетчере задач

Так бывает, что первые два метода не помогают в тех случаях, когда сеанс пользователя зависает на сервере терминалов, кажется, что вы делаете выход из графического интерфейса, но это не работает. В этих случаях вам нужно использовать командную строку или утилиты PowerShell

Использование утилиты RWINSTA

Если вы окажетесь в ситуации, когда графические методы не позволяют вывести пользователя из системы, а это необходимо, утилиты командной строки придут вам на помощь. RWINSTA – это встроенная утилита Windows, которая позволяет восстанавливать сеансы на основе идентификатора сеанса и имени сеанса. Прежде всего, вам нужно вычислить либо идентификатор сеанса, либо его имя, как я вам сказал, обо всех известных мне методах, с которыми вы можете ознакомиться. Выберу утилиту qwinsta. Пишем команду:

qwinsta | findstr barboskin.g (местный)

или удаленно qwinsta / server: имя сервера | findstr barboskin.g

В моем примере имя сеанса – rdp-tcp # 172, а его идентификатор – 515. Мы пишем команду:

rwinsta rdp-tcp # 172 / сервер: localhost или rwinsta 515 / сервер: localhost

Использование утилиты RWINSTA

И в первом, и во втором случае пользователь будет отключен от этого сервера. Эту команду можно запускать удаленно с вашего рабочего места, если у вас есть право выйти из системы. Этот метод мне не раз помогал в моей практике, например, случай с заблокированным сеансом на Windows Server 2016, где вместо имени пользователя было имя (4).

Как отключить пользователя через reset session

вы также можете завершить сеанс пользователя с помощью утилиты командной строки Reset Session. В текущем примере у моего Геннадия Викторовича Барбоскина имя сеанса rdp-tcp # 16 с его ID 11. Эту утилиту можно использовать как локально на самом терминальном сервере, так и на вашей рабочей станции, также есть ключ / сервер.

восстановить сеанс rdp-tcp # 16 или восстановить сеанс 11

Как отключить пользователя через сеанс восстановления

Вы можете узнать больше об утилите восстановления сеанса на веб-сайте Microsoft: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/reset-session

Как отключить пользователя через logoff

Вы также можете выйти из учетной записи пользователя или даже из заблокированной с помощью утилиты командной строки «LogOff». В этом примере Геннадий Барбоскин имеет имя сеанса rdp-tcp # 43. В командной строке от имени администратора введите:

logoff rdp-tcp # 43 / server: localhost (имя сервера можно изменить) или logoff 54 / server: localhost

Как отключить пользователя через выход

Выход пользователя через командлет Stop-TSSession

Есть замечательный командлет Stop-TSSession. Давайте посмотрим на идентификатор сервера и имя сеанса, для этого в открытом PowerShell введите:

Get-TSSession | FT

В результате я вижу, что пользователь barboskin.g имеет SessionID 3. Итак, введите

Принудительный стоп-TSSession 3 или Stop-TSSession 3-Force

Выход пользователя из системы с помощью командлета Stop-TSSession

Мы согласны с тем, что для этого пользователя будет выполнен выход. Проверяем, что сессия закончилась. Вы можете отключать сеансы с помощью такого простого скрипта из планировщика:

Модуль импорта PSTerminalServices
Get-TSSession -ComputerName SERVER_NAME -filter {$ _.IDsession -ne 0 -AND $ _.IDsession -ne 1 -AND $ _.IDsession -ne 65536} | Stop-TSSession – Force

Выход пользователя через командлет Stop-TerminalSession

Этот командлет устанавливается отдельно с пакетом Pscx. Прежде всего, мы видим локально или удаленно идентификаторы сеанса пользователя, для которого мы хотим выйти. Выполняем команду:

Get-TerminalSession – имя сервера ComputerName

Get-TerminalSession

Мне нужен идентификатор сеанса 427. Затем мы воспользуемся командлетом Stop-TerminalSession, чтобы выгнать пользователя и завершить его сеанс.

Stop-TerminalSession -ComputerName имя сервера -Id 427 -Force

Stop-TerminalSession

Как видите, сеанс 427 больше не существует, и мы смогли исключить пользователя из сеанса RDS с помощью командлета Stop-TerminalSession.

Сброс RDP сессий

На терминальном сервере Windows пользователи часто любят закрывать сессию не через Завершение сеанса, а простым нажатием на крестик. Что ведет к исчерпанию количество сессий и невозможность зайти на сервер для сбрасывания не нужных сессий.

Что делаем:

1.Открываем командную строку и смотрим какие сессии открыты


C:>qwinsta /server:servername
и видим:

SESSIONNAME       USERNAME                 ID  STATE   TYPE
console                                     0  Conn    wdcon
rdp-tcp#1403      petrov                    1  Active  rdpwd
rdp-tcp                                 65536  Listen  rdpwd
                  vasechkin                 2  Disc    rdpwd
rdp-tcp#1367      sidorov                 314  Active  rdpwd
rdp-tcp#1401      ivanov                  328  Active  rdpwd
rdp-tcp#1400      ivanova                 326  Active  rdpwd
rdp-tcp#1406      sidorova                331  Active  rdpwd
                                         332  Idle
                                         333  Idle
Total sessions created: 1408
Total sessions disconnected: 539
Total sessions reconnected: 603

Пользователь vasechkin (сессия №2) мешает нам, поэтому отключаем его командой


C:>rwinsta 91 /server:servername

Заходим на сервер и закрываем ненужные сессии

get used to the old world ‘terminal session manager’ but spent past hour trying to figure out equivalent in windows 2012 r2, all i need is to terminate my session on another server (as it is stuck somehow), google a bit but all I find is to how to setup the service, I just need a simple tool, or even a command line

please help!

asked Aug 16, 2015 at 22:56

TOMMY WANG's user avatar

There doesn’t seem to be equivalent tooling built into Win2k12, as it has been partially replaced by the Remote Desktop Management Server components, but does not give you a nice listing of sessions anywhere I’ve seen.

The easiest way for most users would be to use the Task Manager’s User tab. you can usually boot users from there.
For CLI, You can end the session via the command line, using quser and logoff (list sessions with quser, and logoff the session id you desire). you can use psexec if you need a remote cli connection to the server.

PS C:Windowssystem32> quser
 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
>SomeUser              console             1  Active      none   8/16/2015 5:29 PM
PS C:Windowssystem32> logoff <sessionID>

There are many good ideas on this thread over at serverfault as well, including power shell commands (Get-RDUserSession/Disconnect-RDUser), RDC command line utilities (qwinsta/rwinsta), and even options to make tsadmin.msc work if copied from an older server.

Or you can try a third party tool like one of these (just examples, not recommendations):

  • http://lizardsystems.com/wiki/terminal_services_manager/index
  • https://gallery.technet.microsoft.com/Administration-Remote-dcbdc028

Community's user avatar

answered Aug 16, 2015 at 23:24

Frank Thomas's user avatar

Frank ThomasFrank Thomas

34.2k3 gold badges75 silver badges95 bronze badges

Reset session — сброс сеансов на сервере

Команда терминального сервера  Reset session позволяет сбросить (удалить) сеансы с сервера терминалов. А для вывода расширенных сведений о сеансах используется команда Query session.

Синтаксис команды Reset session

reset session {имя_сеанса|код_сеанса} [/server:имя_сервера] [/v]

Параметры Reset session

  • имя_сеанса —  Отображает имя сбрасываемого сеанса. Для определения имени сеанса используйте команду query session.
  • код_сеанса —  Отображает код сбрасываемого сеанса. /server:имя_сервера —  Определяет сервер терминалов, содержащий сбрасываемый сеанс. В противном случае используется текущий сервер терминалов.
  • /v —  Отображает сведения о выполненных действиях.
  • /? —  Отображает справку в командной строке.

  Примечания по  команде Reset session

  • Всегда можно сбросить собственный сеанс, но для сброса сеанса других пользователей необходимо иметь разрешение «Полный доступ».
  • Необходимо знать, что сброс пользовательского сеанса без предупреждения может привести к потере данных этого сеанса.
  • Сбросить сеанс необходимо только в случае неисправности или при отсутствии ответа.
  • Параметр /server необходимо использовать только при вводе команды query session с удаленного сервера.

Понравилась статья? Поделить с друзьями:
  • Как сворачивать окна в windows 10 на клавиатуре
  • Как сворачивать игру в windows 10 на рабочий стол
  • Как сворачивать все окна в windows 10
  • Как сбросить тему в windows 10 на стандартную
  • Как свободно перемещать ярлыки на рабочем столе windows 10