Войти

Показать полную графическую версию : [решено] logoff disconnected users


zhuk09
14-11-2017, 19:41
Добрый вечер!
Много времени потратил на поиск решения logoff для disconnected users с помощь скрипта.
Посредством групповой политики отрабатывает, но не 100%. У 2-3 пользователей сессии не закрываются (((
В итоге все что нашел и что испытал
1. Log Off all Terminal Server Session Users https://support.microsoft.com/en-us/help/259436/how-to-log-off-all-terminal-server-session-users-from-a-command-prompt
query session >session.txt
for /f "skip=1 tokens=3," %%i in (session.txt) DO logoff %%i
del session.txt
Для ОС Win2k8 и выше, необходимо пропускать 2-е подстроки в строке (skip=2) что бы не обрабатывать учетные записи служб. Например «services».
query session >session.txt
for /f "skip=2 tokens=3," %%i in (session.txt) DO logoff %%i
del session.txt

Но это все справедливо для пользователей, которые на данный момент активны в терминальной сессии, т.е есть параметры - Имя сеанса, - Пользователь, -ID сеанса.
Когда пользователь disconnected
http://s011.radikal.ru/i317/1711/fa/6fccb01e6e06.jpg (http://radikal.ru)
эти скрипты не отрабатывают.

2. Нашел logoff скрипт, который применим для disconnected users https://stackoverflow.com/questions/36715033/how-to-logoff-all-users-on-windows-from-command-line-as-a-domain-administrator
@echo off
for /f "skip=2 tokens=2,3 delims= " %%a in ('query session') DO (
echo %%a|findstr /xr "[1-9][0-9]* 0" >nul && (
logoff %%a
)
echo %%b|findstr /xr "[1-9][0-9]* 0" >nul && (
logoff %%b
)
)

Как я понял, данный скрипт производит сброс протоколов rdp-tcp и ica-tcp.
Но обязательно данные действия надо подтверждать.
http://s016.radikal.ru/i336/1711/32/3444386f1e03.jpg (http://radikal.ru)
Это не возможно, если автоматизировать данный скрипт через планировщик задач.

Модифицировать данный скрипт без подтверждения действий у меня не получилось. Жду советов и помощи в модификации скрипта.

alpap
14-11-2017, 19:48
echo y | logoff %%b - не?

zhuk09
14-11-2017, 20:23
echo y | logoff %%b - не? »
ДА ) Спасибо за столь быстрый и правильный ответ..
Но есть небольшое но. Не сработал перевод на новую строчку, и следующий вопрос пишется там где по конвейеру передалось значение "y".
http://s018.radikal.ru/i521/1711/cd/8289286083bf.jpg (http://radikal.ru)

alpap
15-11-2017, 02:03
Не сработал перевод на новую строчку »
добавьте его
echo y|logoff %%b& echo.

zhuk09
15-11-2017, 12:04
добавьте его
echo y|logoff %%b& echo. »
Теперь скрипт выглядит следующим образом
@echo off
for /f "skip=2 tokens=2,3 delims= " %%a in ('query session') DO (
echo %%a|findstr /xr "[1-9][0-9]* 0" >nul && (
echo y | logoff %%a& echo.
)
echo %%b|findstr /xr "[1-9][0-9]* 0" >nul && (
echo y | logoff %%b& echo.
)
)
Решил его проверить в более сложной ситуации:
1. 2 пользователя в состоянии disconnected
2. 1 пользователь в состоянии Active
http://s015.radikal.ru/i331/1711/5b/d83314acc414.jpg (http://radikal.ru)

После выполнении скрипта из консольного режима пользователя Backup появляется ошибка
http://s018.radikal.ru/i519/1711/0a/73d454ef6fa4.jpg (http://radikal.ru)
и после этого команда query session выглядит следующим образом
http://s019.radikal.ru/i612/1711/ac/f6cbb54ad935.jpg (http://radikal.ru)

Из всего этого можно сделать вывод, что данный скрипт производит LOGOFF только сессий в состоянии disconnected, а сессий в состоянии Active - СБРОС (о чем он собственно и пишет в предупреждении).
Ошибка [7024]:Не удается завершить требуемую операцию, поскольку терминальное соединение сейчас занято, выполняя операцию одну из операций: подключение, отключение, сброс, удаление.

alpap
15-11-2017, 13:39
а что хоть надо-то в идале?
вот, например, отключить всех окромя себя:

@echo on
for /f "skip=1 tokens=1-3" %%a in ('query user^|find /v ">"') do set/a id=%%c& cmd/v/c "if /i "%%a" neq "%Username%" (if !id!==0 (logoff %%b) else (logoff %%c))"
pause

zhuk09
15-11-2017, 14:28
а что хоть надо-то в идале? »
В идеале надо закрывать (Logoff) сессий которые в состоянии
1. Disconnected
2. Active
без всякой ругани в логах, и что САМОЕ главное - просто LOGOFF сессий, а не сброс сеанса по 2-м протоколам : rdp-tcp и ica-tcp

вот, например, отключить всех окромя себя: »
сейчас проверю его на пользователях в состоянии Disconnected. Чуть позже напишу.

zhuk09
16-11-2017, 09:05
сейчас проверю его на пользователях в состоянии Disconnected. Чуть позже напишу. »
Скрипт 100% рабочий и покрывает все потребности.
Единственно, хотелось бы модифицировать его так, что бы отключались все сессии, т.к данный скрипт будет выполняться из планировщика заданий Windows, и условие отключения всех кроме себя излишне...

alpap
16-11-2017, 15:54
всех кроме себя излишне.. »
по идее так, не проверял:

@echo off
for /f "skip=1 tokens=1-3" %%a in ('query user') do set/a id=%%c& cmd/v/c "if !id!==0 (echo logoff %%b) else (echo logoff %%c))"
pause

bulbashee
08-03-2020, 14:59
Подскажите, можно ли скрипт подправить, чтобы отключал (LogOff) всех пользователей, кроме активных ?

@echo off
for /f "skip=1 tokens=1-3" %%a in ('query user^|find /v "Active"') do logoff %%b
pause

dokxpi@vk
31-05-2020, 17:35
@echo off
for /f "skip=1 tokens=1-3" %%a in ('query user') do set/a id=%%c& cmd/v/c "if !id!==0 (echo logoff %%b) else (echo logoff %%c))"
pause »

К сожалению не работает .(

DJ Mogarych
31-05-2020, 20:20
Powershell:

quser | Select-String "Диск" |ForEach {logoff ($_.tostring() -split ' +')[2]}

https://www.tenforums.com/user-accounts-family-safety/118389-log-off-all-but-current-user.html

zhulamanov888@vk
27-10-2020, 13:26
Powershell:
Код:
quser | Select-String "Диск" |ForEach {logoff ($_.tostring() -split ' +')[2]} »
Выполняю на тестовом сервере. Хоть и видит сеанс, но отключить его не может, выдаёт ошибку о том что сеанс не найден
повершел запушен с правами администратора
выполняю не локально потому что бывает так, что мой сеанс зависает

biggyRu
02-12-2020, 12:43
А можно так:
Отключить всех disconnected на локальном сервере, кроме локальной группы "избранных". В локальной группе будут доменные пользователи.... ну очень надо(

biggyRu
04-12-2020, 13:21
Попробовал то, что выкладывали раньше в этой теме, именно вот это:

@echo on
for /f "skip=1 tokens=1-3" %%a in ('query user^|find /v ">"') do set/a id=%%c& cmd/v/c "if /i "%%a" neq "%Username%" (if !id!==0 (logoff %%b) else (logoff %%c))"
pause

Типа не выкидывать самого себя. Принципе все устраивает, но хотелось не выкидывать нескольких пользователей, как добавить пользователей? Подскажите плз

alpap
04-12-2020, 16:31
не выкидывать нескольких пользователей »
только если их имена не содержат пробелов:

@echo off
:: Не отключать следующих пользователей
set "us1=Vasya"
set "us2=Petya"
set "us3=Ulya"

for /f %%a in ('query user^|findstr /irv /c:">" /c:"%us1%" /c:"%us2%" /c:"%us3%"') do logoff %%a
pause

если наоборот, надо нескольких отключить, то достаточно:

:: Блок переменных выше
for %%a in (%us1% %us2% %us3%) do logoff %%a
pause

такое же ограничение насчет пробелов




© OSzone.net 2001-2012