Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] logoff disconnected users (http://forum.oszone.net/showthread.php?t=331217)

zhuk09 14-11-2017 19:41 2777571

logoff disconnected users
 
Добрый вечер!
Много времени потратил на поиск решения logoff для disconnected users с помощь скрипта.
Посредством групповой политики отрабатывает, но не 100%. У 2-3 пользователей сессии не закрываются (((
В итоге все что нашел и что испытал
1. Log Off all Terminal Server Session Users https://support.microsoft.com/en-us/...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

эти скрипты не отрабатывают.

2. Нашел logoff скрипт, который применим для disconnected users https://stackoverflow.com/questions/...-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.
Но обязательно данные действия надо подтверждать.

Это не возможно, если автоматизировать данный скрипт через планировщик задач.

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

alpap 14-11-2017 19:48 2777572

echo y | logoff %%b - не?

zhuk09 14-11-2017 20:23 2777584

Цитата:

Цитата alpap
echo y | logoff %%b - не? »

ДА ) Спасибо за столь быстрый и правильный ответ..
Но есть небольшое но. Не сработал перевод на новую строчку, и следующий вопрос пишется там где по конвейеру передалось значение "y".

alpap 15-11-2017 02:03 2777633

Цитата:

Цитата zhuk09
Не сработал перевод на новую строчку »

добавьте его
echo y|logoff %%b& echo.

zhuk09 15-11-2017 12:04 2777713

Цитата:

Цитата alpap
добавьте его
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


После выполнении скрипта из консольного режима пользователя Backup появляется ошибка

и после этого команда query session выглядит следующим образом


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

Ошибка [7024]:Не удается завершить требуемую операцию, поскольку терминальное соединение сейчас занято, выполняя операцию одну из операций: подключение, отключение, сброс, удаление.

alpap 15-11-2017 13:39 2777730

а что хоть надо-то в идале?
вот, например, отключить всех окромя себя:
Код:

@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 2777740

Цитата:

Цитата alpap
а что хоть надо-то в идале? »

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

Цитата:

Цитата alpap
вот, например, отключить всех окромя себя: »

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

zhuk09 16-11-2017 09:05 2777894

Цитата:

Цитата zhuk09
сейчас проверю его на пользователях в состоянии Disconnected. Чуть позже напишу. »

Скрипт 100% рабочий и покрывает все потребности.
Единственно, хотелось бы модифицировать его так, что бы отключались все сессии, т.к данный скрипт будет выполняться из планировщика заданий Windows, и условие отключения всех кроме себя излишне...

alpap 16-11-2017 15:54 2777991

Цитата:

Цитата zhuk09
всех кроме себя излишне.. »

по идее так, не проверял:
Код:

@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 2912394

Подскажите, можно ли скрипт подправить, чтобы отключал (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 2923455

Цитата:

Цитата alpap
@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 2923487

Powershell:
Код:

quser | Select-String "Диск" |ForEach {logoff ($_.tostring() -split ' +')[2]}
https://www.tenforums.com/user-accou...rent-user.html

zhulamanov888@vk 27-10-2020 13:26 2937755

Вложений: 1
Цитата:

Цитата DJ Mogarych
Powershell:
Код:
quser | Select-String "Диск" |ForEach {logoff ($_.tostring() -split ' +')[2]} »

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

biggyRu 02-12-2020 12:43 2941760

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

biggyRu 04-12-2020 13:21 2941961

Попробовал то, что выкладывали раньше в этой теме, именно вот это:

@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 2941980

Цитата:

Цитата biggyRu
не выкидывать нескольких пользователей »

только если их имена не содержат пробелов:
Код:

@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

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


Время: 15:50.

Время: 15:50.
© OSzone.net 2001-