Неможливо вийти з системи, відключити або скинути користувача сервера терміналів у виробничому середовищі


19

Я шукаю кілька ідей щодо відключення, виходу з системи чи скидання сеансу користувача на термінальному сервері 2008 року (не в змозі ввійти як користувач як повністю заблокований). Це виробниче середовище, тому перезавантажувати сервер чи робити щось загальносистемне поки що не виникає сумніву. Будь-які хитрості Пауершелла, які допоможуть нам у цьому?

Ми намагалися відключити, вимкнути користувача та скинути сеанс, а також знищити процеси сеансу безпосередньо з того ж сервера терміналів (від менеджера завдань, менеджера служб терміналів та монітора ресурсів) без результатів.

Довідка!


ОНОВЛЕННЯ. Ми закінчили перезавантаження сервера, оскільки не спрацювали інші спроби, про які ми могли б подумати. Я залишаю це питання відкритим, сподіваючись, що хтось може отримати більше інформації про цю проблему, і це потенційні виправлення


2
У мене точно така ж проблема на моїх серверах терміналів Windows 2008 R2 SP1. Вони просто випадково зависають, і користувачі не можуть вийти з системи або ввійти на сервер. Я не можу увійти в localy як локальний адміністратор або адміністратор домену. Єдиний спосіб підключитися до сервера - це використовувати compmgmt.msc, але навіть тут я не бачу жодних проблем у журналах подій. На якомусь етапі я отримую повідомлення про те, що служба IMA не відповідає, і сервер був видалений з ферми. Єдиний спосіб вирішити це - перезавантажити сервер Hard. Вимкніть живлення та знову ввімкніть його. Я не зміг звузити причину цього ні до чого, і я



1
Потенційно корисні посилання для тих, хто стикається з цією проблемою вперед
JohnLBevan

Відповіді:


7

Що для мене вирішило цю саму проблему, це знищити всі процеси, що працюють під заблокованим обліковим записом з-під диспетчера завдань, і тоді я зміг просто вийти з цього облікового запису (з облікового запису адміністратора).

Потім користувач зміг увійти в систему під обліковим записом.

Не потрібно було перезавантажувати і не потрібно було завантажувати сторонне програмне забезпечення.


-Дякую, врятувало мене від перезавантаження сервера! Дійсно не хотів усіх виганяти протягом робочого дня через 1 затриманий сеанс.
MAW74656

Чи безпечно вбивати ці процеси? Мій користувач має csrss.exe, dwm.exe, LoginUI.exeі winlogon.exe. Я думав, що вбивство winlogon.exeспричинить BSOD…
binki

6

Я хочу поділитися способом скидання облікового запису без необхідності перезавантаження сервера. Перш за все вам потрібно мати доступ адміністратора до сервера. Я використовую наступний варіант входу: mstsc / v: ім'я сервера / консолі / адміністратора для доступу до сервера. Потім у «Менеджері таксів Windows» перейдіть на вкладку « Користувачі » та перейдіть до клацання правою кнопкою миші на обліковий запис, який ви хочете «Вийти», виберіть вихід із системи. Це повинно звільнити заблокований сеанс, який використовується цим обліковим записом.


1
крім цього не завжди. Плюс ОП сказали, що вже пробували це.
BeowulfNode42

У цьому питанні кнопка Вийти в диспетчері завдань → Користувачі нічого не роблять.
бінкі

5

Проста відповідь - запустити підвищений командний рядок і ввести "Taskmgr", і тоді це дозволить відміняти сеанси на вкладці USERS. Це не спрацює, не перебуваючи на підвищеному сеансі.


Випробувано і це рішення спрацювало.
Перемогти

1
Не для мене. Також не можна використовувати taskmanager як адміністратор, щоб знищити будь-який процес користувача.
BeowulfNode42

3

Ви можете запустити cmd, зробити сеанс запиту , перевірити ідентифікатор сеансу, який потрібно вбити, а потім зробити сеанс скидання . Наприклад, якщо з сеансу запиту ви виявите, що ім'я сесії rdp-tcp # 1 є тим, кого ви хочете вбити, то ви можете виконати скидання сеансу rdp-tcp # 1 і вбити його.


Дякую, але і це не допомогло.
l0c0b0x

Коли я запускаю, reset session 9ця команда просто висить. Моя сесія продовжує мати чотири запущені процеси , не відрекомендувавшись бути активним: crss.exe, dwm.exe, LogonUI.exe, і winlogon.exe. i.imgur.com/cFM62RA.png та query session 9виводи No User exists for 9.
binki

3

Я припускаю, що те саме сталося сьогодні і на моєму термінальному сервері Win2008R2. Симфоми були: 1. Він зателефонував мені з повідомленням, яке "підключається", просто навісне ". Він просто простий користувач, тому я не можу очікувати детального опису проблеми. 2. Пробований сеанс відключення / скидання (що зазвичай допомагає в цих випадках) - не спрацював. Сеанс все ще висить у списку зі статусом "відключений". 3. Намагався вбити всі процеси для цього користувача - не допомогло. Сесія зберігається і відмовляється вбити.

Рішення було - підключіться як користувач (увійдіть зі своїми обліковими записами, якщо ви можете скинути його пароль або скористайтеся якоюсь віддаленою допомогою, щоб побачити, що відбувається на його комп’ютері) і побачити, що відбувається у вікні входу. Під час підключення я натискав на кнопку "Деталі" клієнта RDP - і ось це було повідомлення про помилку, що winlogon зробив щось не так, він чекав, коли користувач натисне на кнопки "повторити / проігнорувати / тощо", і оскільки це всемогутній winlogon викликав все це дивна поведінка.

ps Я не міг знайти жодного способу дійсно змусити вбити сеанс :(


Це зафіксувало це для мене! Він чекав, коли користувач вирішить відключити іншого користувача або натиснути скасувати. Я натиснув скасувати, і тепер той користувач, який застряг на вкладці "Диспетчер завдань", зник. Спасибі!
binki

Ось як виглядала моя ситуація, коли це було проблемою: i.imgur.com/W6eO5wW.png i.imgur.com/EpPwyJc.png i.imgur.com/cFM62RA.png Також я використовую Windows Server 2016
binki

3

Ми просто мали подібну проблему з нашим сервером віддаленого робочого столу Windows Server 2008 R2. Сеанс користувача показав "Активний", коли дивився на диспетчер RDS, але не мав асоційованого ідентифікатора # сеансу або підключеного пристрою (обидва були порожніми).

Усі вищевказані хитрощі не вирішили проблему. Під час підключення як відповідного користувача з'явилося повідомлення про помилку, в якому зазначається, що сервер терміналів зайнятий, і спробувати знову пізніше або звернутися до адміністратора.

Ми також завершили перезавантаження сервера.


2

У мене була така ж проблема в Windows Server 2016. Користувач не зміг увійти.

Тому я спробував виконати наступні кроки для відключення сесії-сироти:

  1. в CLI qwinsta перераховує всі доступні сеанси, неактивні та активні, є один відключений сеанс (званий "getr." на скріншоті) без імені користувача, але ідентифікатор сеансу.

показуйте активні сеанси та вбивайте їх

  1. з ідентифікатором сеансу (7) від 1. Я намагався вбити цей сеанс будь-яким сеансом скидання 7 (fyi: rwinsta - псевдонім для сеансу скидання)

  2. він працював протягом одного сеансу, але наступного разу це просто не дало ефекту, тому я відкрив диспетчер завдань та вкладку користувача. Там ви знайдете один розширюваний список, призначений кожному користувачеві віддаленого робочого столу - в одному списку в ньому не було імені користувача і було показано лише 4 виконані завдання.

  3. Я спробував очевидний: Вихід з користувача. Без жодного ефекту.

намагаються вийти з користувача

  1. Тому я спробував закінчити ці 4 завдання, призначені цьому користувачеві. Будьте уважні, тому що деякі завдання, головне csrss.exe, коли вони будуть вбиті, також призведуть до перезавантаження системи. Я пропустив їх і просто вбив кілька очевидних завдань RDP.

Після кроку / спробу 4 навіть останній сесійний збір був убитий, і користувач зміг увійти знову

  1. Якщо це все ще не працює, спробуйте це рішення з іншого питання : Коли ви підключаєтесь до клієнта RDP, натисніть кнопку "деталі". Там ви побачите помилку, і навіть можете натиснути спробувати або проігнорувати .

Чи можете ви бути більш конкретними щодо того, які процеси ви вбили, а які не вбити? Я думаю, що мені слід пропустити, winlogon.exeале не впевнений у таких LoginUI.exe, як csrss.exe, і dwm.exe.
бінкі

Симптоми другого сеансу у вас звучали схоже на моє та serverfault.com/a/176080/164429 . Ви, ймовірно, можете додати "Підключення" як крок, щоб спробувати більш повне рішення і, можливо, навіть уникнути необхідності вбивати процеси.
бінкі

@binki це має бути "csrss.exe" - якщо ви вб'єте цей процес, система перезапуститься.
Н.Р.

1

Можливо, варто перевірити, що у користувача немає спливаючого вікна з обліковими записами, прихованого за вікном віддаленого робочого столу, з клавішею alt +.

Колектив мав те саме питання; не вдалося вийти з системи або скинути його, і всі його процеси було вимкнено вручну. Коли я спробував отримати доступ до gui для системи, яку він віддаляв ВІД, я виявив скриньку облікових даних, що ховалася за віддаленим сеансом.


1

У мене така ж ситуація: Windows Server 2008 R2 із службами віддаленого робочого столу, з'єднання RDP, встановлене для виходу з користувачів після того, як сеанс неактивний або відключений протягом 3 годин, а деякі сесії залишаються заблокованими. Я намагався вийти з них і з віддаленим менеджером робочого столу, і з qwinsta / quser, без успіху.

Ось як я це вирішив:

  1. Я знайшов ідентифікатор сеансу qwinsta.
  2. Я знайшов PID winlogon.exeдля висітого сеансу query process /ID:yourid.
  3. Я вбив процес taskkill /f /PID yourPID.

Шлях. Я б хотів, щоб інакше було знайти рішення, щоб цього не сталося.


1

Що для мене працювало:

  • увійдіть на сервер
  • відкритий менеджер завдань
  • шукайте користувача на вкладці користувача
  • клацніть правою кнопкою миші, підключіться, введіть пароль користувача, я побачив екран "Будь ласка, зачекайте"
  • натисніть клавішу alt, яка вийшла з сервера і відключилась від користувача

1

У мене виникла ця проблема із заблокованими користувачами програми віддаленого робочого столу. Я написав цей сценарій Powershell, щоб запустити заплановане завдання, щоб вийти з користувачів, які показали, що відключені більше 2 хвилин. Єдина необхідна редакція - це SERVERNAME, яку я встановив для виключення сервера віддаленого робочого столу, однак ви можете виключити будь-який сервер, який вам подобається, або взагалі жоден.

Мій сценарій був написаний для Windows Server 2012 R2, до речі ...

Сценарій робить це:

  • Отримує список усіх сеансів користувача віддаленого робочого столу.
  • Ігнорує будь-які сеанси, на яких не написано "STATE_DISCONNECTED".
  • Ігнорує брокерський сервер (або будь-який інший сервер)
  • Ігнорує будь-які сеанси без єдиного ідентифікатора сесії
  • Ігнорує будь-які сеанси, які не мають часу відключення
  • Для тих сеансів, які мають час відключення, він перевіряє поточний час, і якщо різниця в часі між тепер і часом відключення становить більше X хвилин (в даному випадку 2), вбиває процес winlogon.
  • Він також намагається видати команду відключення (це, швидше за все, не вдасться після того, як буде знищено процес winlogon).

Це працює для мене! Я сподіваюся, що це допоможе комусь іншому! :)

CLS
$RD = Get-RDUserSession | select ServerName, UserName, SessionState, DisconnectTime, UnifiedSessionId, SessionId #Get details about the sessions
foreach ($item in $RD) {
    $UsessionID = $item.UnifiedSessionId -as [int] 
    $sessionID = $item.SessionId -as [int] 
    if ($item.SessionState -eq "STATE_DISCONNECTED" -and $item.ServerName -ne "SERVERNAME" -and $item.DisconnectTime -ne $null -and $item.UnifiedSessionId -ne $null){
        $TimeDiff = New-TimeSpan -start $item.DisconnectTime -end (Get-Date) #check time difference between disconnect time and now. If time is greater than 2 minutes....
        if ($TimeDiff.Minutes -gt 2) {
            #Kill winlogon session for the user
            Get-WmiObject -ComputerName $item.Servername -query "select * from win32_process where name='winlogon.exe'" | Where-Object {$_.SessionId -eq $SessionId} | %{$_.terminate()}
            #Log off user if session still exists (will fail if user kicked)
            Invoke-RDUserLogoff -HostServer $item.ServerName -UnifiedSessionID $UsessionID -Force -erroraction 'silentlycontinue'
            }
         }
      }

Або якщо ви віддаєте перевагу версію, яку ви можете бачити, що відбувається на екрані:

 CLS
    $RD = Get-RDUserSession | select ServerName, UserName, SessionState, DisconnectTime, UnifiedSessionId, SessionId
    foreach ($item in $RD) {
        $UsessionID = $item.UnifiedSessionId -as [int]
        $sessionID = $item.SessionId -as [int]
        if ($item.SessionState -eq "STATE_DISCONNECTED" -and $item.ServerName -ne "SERVERNAME" -and $item.DisconnectTime -ne $null -and $item.UnifiedSessionId -ne $null){
            #On Screen Output
            write-host " Name : " $Item.UserName -ForegroundColor "yellow" -NoNewline
            write-host " Unified Session Id : " $UsessionID -ForegroundColor "darkcyan" -NoNewline
            write-host " User Session Id : " $sessionID -ForegroundColor "darkyellow" -NoNewline
            write-host " Session State : " $item.SessionState -ForegroundColor "magenta" -NoNewline
            write-host " Server : " $item.ServerName -ForegroundColor "cyan" -NoNewline
            write-host " Disconnect Time : " $item.DisconnectTime -ForegroundColor "gray" 
            #End On Screen Output
            $TimeDiff = New-TimeSpan -start $item.DisconnectTime -end (Get-Date)
            if ($TimeDiff.Minutes -lt 2) {
                write-host " Disconnected for less than 2 minutes" -ForegroundColor "Green"}
            else {
                write-host " Disconnected for more than 2 minutes" -ForegroundColor "Red" -BackgroundColor "darkyellow"
                write-host " Killing session : " $item.ServerName " ID : " $UsessionID $item.UserName -ForegroundColor "Red"
                #Kill Process "Winlogon.exe" for the user (this should kill the session)
                Get-WmiObject -ComputerName $item.Servername -query "select * from win32_process where name='winlogon.exe'" | Where-Object {$_.SessionId -eq $SessionId} | %{$_.terminate()}
                #Logout User (if session still exists)
                Invoke-RDUserLogoff -HostServer $item.ServerName -UnifiedSessionID $UsessionID -Force -erroraction 'silentlycontinue'
                Write-host " Done! " -ForegroundColor "Green" -BackgroundColor "blue"
                }
             }
          }

1

Створіть файл у блокноті та назвіть його findsession.cmd. Розмістіть команду Запит сесії / сервера: ім'я сервера | find / i "% 1" та збережіть у каталозі. Створіть інший файл під назвою resetsession.cmd і поставте команду Скидання сесії% 1 / сервер:% 2 та збережіть.

У командному рядку перейдіть до dir, в якому ви зберегли ці файли, і введіть ім'я користувача findsession (логін користувача, якого ви намагаєтесь знайти). Натисніть Enter, і вам слід побачити ідентифікатор для входу та сеансу. Введіть resetsession.cmd ID імені сервера, і він буде скинути цей сеанс. Я використовую це щодня, і це дуже швидко для пошуку користувачів та скидання їх сеансів.


будь ласка, використовуйте параметри форматування тексту для виділення команд і посилення читабельності. Це хороша відповідь, але будь ласка, відредагуйте її.
Марко

Немає сенсу писати пакетні файли, коли команди такі короткі, і вам все одно доведеться передавати їх аргументи
binki

1
  1. Знайдіть ідентифікатор сеансу за допомогою qwinsta.
  2. Вбийте всі процеси під час сеансу taskkill /FI "SESSION eq 1" /F, припускаючи, що ідентифікатор сеансу, який ви хотіли закінчити, повернувся з qwinsta, був 1.

Це працювало на Server 2012 версії 6.2, збірка 9200, я б очікував, що він буде працювати у всіх версіях Windows.


1

Цей скрипт power-shell працював для мене, він навіть дає хороший файл журналу. Я отримав це звідси. : Я сподіваюся, що це допоможе комусь іншому, оскільки інші відповіді мали багато передумов і не спрацювали для мене.

    # .SYNOPSIS
    #   Checks for disconnected sessions and logs off the disconnected user sessions.

    #.DESCRIPTION
    #   Checks for disconnected sessions and logs off the disconnected user sessions.

    #.NOTES
    #   File Name: Logoff-DisconnectedSession.ps1
    #   Author   : Bart Kuppens
    #   Version  : 1.1

    #.EXAMPLE
    #   PS > .\Logoff-DisconnectedSession.ps1


    function Ensure-LogFilePath([string]$LogFilePath)
    {
     if (!(Test-Path -Path $LogFilePath)) {New-Item $LogFilePath -ItemType directory >> $null}
    }

    function Write-Log([string]$message)
    {
       Out-File -InputObject $message -FilePath $LogFile -Append
    }

    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-Log "ERROR: " + $e.PSMessageDetails
          }
       }
    }

    Ensure-LogFilePath($ENV:LOCALAPPDATA + "\DisconnectedSessions")
    $LogFile = $ENV:LOCALAPPDATA + "\DisconnectedSessions\" + "sessions_" + $([DateTime]::Now.ToString('yyyyMMdd')) + ".log"

    [string]$IncludeStates = '^(Disc)$'
    Write-Log -Message "Disconnected Sessions CleanUp"
    Write-Log -Message "============================="
    $DisconnectedSessions = Get-Sessions | ? {$_.State -match $IncludeStates -and $_.UserName -ne ""} | Select ID, UserName
    Write-Log -Message "Logged off sessions"
    Write-Log -Message "-------------------"
    foreach ($session in $DisconnectedSessions)
    {
       logoff $session.ID
       Write-Log -Message $session.Username
    }
    Write-Log -Message " "
    Write-Log -Message "Finished"  

Редагувати:
Спочатку цей сценарій використовувався для виходу з системи та закриття всіх "відключених" сеансів. У нас є кілька додатків термінальних серверів з багатьма користувачами та обмеженими ліцензіями. Відключені сесії залишатимуться відкритими дуже довго, а іноді залишатимуться відкритими нескінченно. Це призвело до невикористаних сеансів, які б зайняли частину ліцензій, а інші користувачі в результаті не зможуть підключитися.

  • Я запускаю сценарій за допомогою запланованого завдання, щоб регулярно перевіряти та
    відключати сеанси на деяких своїх серверах. Він працює автономно,
    не потребуючи взаємодії.
  • Я використовую його в операційних системах Windows 2008 R2 Server та Windows 2012 R2 Server.
  • Він закриває лише сеанси, які були відключені.
  • Він оновлює файл "журналу" з користувачами або сеансами, які він відключив.

Чи можете ви пояснити, що це робить?
Конрад Гаєвський

1
Привіт, Конраде, я трохи відредагував відповідь і сподіваюся, що вона пояснить, що робить сценарій. В основному сценарій закриває всі відключені сеанси, які залишаються відкритими після відключення віддаленого користувача від сервера.
9953-дів-37

0

Можливо, процес все ще працює, блокуючи процес виходу з системи. Перевірте все ще запущені процеси для постраждалого користувача. Тоді вбийте процес по черзі, щоб побачити, як відьма викликає проблему.

Перевірте також HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Runключ реєстру, що запускаються лише потрібні процеси. У 64 біт це HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run.


0

Ви можете завантажити інструмент " Провідник процесів " від Microsoft і використовувати його для вирішення вашої проблеми. Якщо у вас є ідентифікатори сеансу, ви можете знайти їх відповідні процеси. Тоді, якщо сеанс користувача відключено, ви можете вбити процес за допомогою Провідника процесів.


0

Не зовсім те саме середовище (у нас є 2012r2), але перезапуск служби Hyper-V Virtual Machine Management (VMMS) випустив з'єднання для мене.


0

Вам потрібно натиснути на процес і показати процес від усіх користувачів, і тоді ви зможете відключитися.

чому б не створити політику сеансу під конфігурацією хоста віддаленого робочого столу, закінчення відключеного або простою сеансу через певний інтервал.


0

Моє виправлення: в іншій мережі sever я підключився до проблемного сервера за допомогою інструмента Computer Computer, на відкритих сесіях я клацнув правою кнопкою миші та закрив кожен відкритий файл, після чого зміг підключитися через mstsc


0

ви завжди можете використовувати паттерн з власної локальної машини та робити це віддалено

Invoke-command -computername <servername> -Credential (get-credential) { 
    $session = ((quser | ? { $_ -match <username> }) -split ' +' )[2]
    logoff $session
} 

Щоб зробити вашу відповідь ще кориснішою, було б корисно надати основне пояснення, як працює ця команда. Не всі можуть бути достатньо досвідченими з PowerShell, щоб зрозуміти це. Дякуємо за ваш внесок.
Я кажу, відновіть Моніку

-1

На жаль, Моє сеанс користувача відключено. Диспетчер завдань не показав жодних процесів, що виконуються як користувач. Я не зміг вийти з користувача із диспетчера завдань. Я спробував скинути команду id сеансу і закінчився заморожуванням. Мені довелося ввійти в систему в інший сеанс як адміністратор, видалити обліковий запис і знову створити новий.


-1

Ви намагалися вийти з користувача від диспетчера служб віддаленого робочого столу? Перейдіть у розділ Адміністративні інструменти -> Послуги віддаленого робочого столу -> Диспетчер служб віддаленого робочого столу та вийдіть із сеансу. Це може спрацювати.


-1

Перейдіть у вікно запуску та натисніть своє ім’я

Дивіться зразок тут


Я думаю, що це повторення кількох інших відповідей тут (більшість з яких є досить детальнішими) - наприклад, сервер по умолчанню.com/a/804638/402709 . Це може допомогти вдосконалити вашу відповідь, щоб розширити її на деякий контекст та власний досвід.
iwaseatenbyagrue

Я так не думаю, але насолоджуюся.
syb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.