Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/246: Рейтинг темы: голосов - 246, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 02.02.2013
Сообщений: 38
1

Выполнить LOGOFF для всех пользователей, кроме себя

03.02.2013, 00:05. Показов 49904. Ответов 42
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Решил попросить помощи экспертов, так как не могу находить ответ на мой вопрос нигде...

Задача такова:

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


Как вы видите здесь 2 аналогические учетки под именем "test1". Одна активная ( моя ), другая неактивная. Возможно ли программно выполнить Log Off всех аналогических учетках кроме своей активной? Помогите пожалуйста разобраться
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2013, 00:05
Ответы с готовыми решениями:

Disconnect / Logoff отключенных ЛОКАЛЬНЫХ пользователей из ПК
Добрый день коллеги, знатоки. в силу определенных сложностей и процессов, появилась задача, которую...

Число совершенно,если она равна сумме всех своих делителей кроме самого себя
Число совершенно,если она равна сумме всех своих делителей кроме самого себя. Пример :6=1+2+3...

Как вывести всех пользователей, привязанных к роли, кроме текущего (того, кто тоже в этой роли)?
Есть роль User (identity).Текущий пользователь заходит в приложение и видит список всех...

Logoff пользователей на "терминалке" с исключением по текстовому файлу
Добрый день, прошу помочь со скриптом на PowerShell нужно сделать "logoff" пользователей на...

42
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
23.02.2013, 01:08 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Slackerok Посмотреть сообщение
10 аналогических учеток оставленных незакрытыми
Как это будет выглядеть в session.txt чтобы отличить от Вашей учетки?
1
1 / 1 / 0
Регистрация: 02.02.2013
Сообщений: 38
23.02.2013, 02:08  [ТС] 22
Активен / Отключен , нет?
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
23.02.2013, 02:59 23
Slackerok, Вам лучше знать.
Значит делаю для всех ID, у которых нет надписи "Активно".

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@echo off
Setlocal EnableDelayedExpansion
 
chcp 437 >nul
::// Вариации: токен 1 или 2 - это имя пользователя; токен 2 или 3 - ID
for /f "skip=2 tokens=1-4" %%a in ('query session') DO (
  Call :FindToken "%%c"
  if !errorlevel!==0 (set "user=%%b"& set "ID=%%c"& set "status=%%d") else (set "user=%%a"& set "ID=%%b"& set "status=%%c")
  set flag=false
  if "%username%" neq "!user!" (set flag=true) else (if "!status!" neq "Active" set flag=true)
  if !flag!==true (logoff !ID!& Echo user=!user! ID=!ID! Status=!status! was log off.)
)
pause
Exit /B
 
:://Возвращает 1, если в токене № 3 есть нечисловые символы
:FindToken
echo.%~1|>nul findstr /R "[^0-9]"&& exit /B 1
exit /b 0
3
1 / 1 / 0
Регистрация: 02.02.2013
Сообщений: 38
23.02.2013, 21:32  [ТС] 24
Спасибо огромное!!!! Скрипт работает как часики!!!
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 11
11.02.2015, 23:46 25
Подскажите, пытаюсь модифицировать Ваш скрипт под свои потребности. Цель - отключать всех неадминистративных неактивных пользователей у которых не запущен 1С. Если исключить logoff из кода, то выводит правильных пользователей. Но если оставить эту команду - уходит в рекурсию и бесконечно выводит только первого пользователя удовлетворяющего условиям... Как исправить?
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@echo off
chcp 437 > nul
Setlocal EnableDelayedExpansion
set imagename=1cv7.exe
 
::// Вариации: токен 1 или 2 - это имя пользователя; токен 2 или 3 - ID
for /f "skip=2 tokens=1-4" %%a in ('query session') DO (
    Call :FindToken "%%c"
    if !errorlevel!==0 (set "user=%%b"& set "ID=%%c"& set "status=%%d") else (set "user=%%a"& set "ID=%%b"& set "status=%%c")
    set flag=false
    if "!user!" neq "Administrator" (
        echo not admin
        if "!status!"=="Disc" set flag=true
        if !flag!==true (
            echo disc
            tasklist /fi  "IMAGENAME eq %imagename%" /fi "USERNAME eq !user!" | find /i "%imagename%"
            if errorlevel 1 (
                Echo user=!user! ID=!ID! Status=!status! was log off.
                logoff !ID!         
            )
        )
    )
)
pause
Exit /B
 
:://Возвращает 1, если в токене № 3 есть нечисловые символы
:FindToken
echo.%~1|>nul findstr /R "[^0-9]"&& exit /B 1
exit /b 0
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
12.02.2015, 00:06 26
Bash
1
2
query session > users.txt
explorer "."
Скиньте сюда получившийся файлик users.txt, загляну.
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 11
12.02.2015, 08:04 27
Код
 
SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
 services                                    0  Disc                        
>rdp-tcp#0         Administrator        2  Active  rdpwd               
                   manager1                  3  Disc                        
                   manager2                  4  Disc                        
                   manager3                  7  Disc                        
 console           manager4                  9  Active                      
 rdp-tcp                                 65536  Listen
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 11
13.02.2015, 09:31 28
Еще раз озвучиваю проблему:
Если в изначальном коде удалить строку logoff !ID!, то выводится конечное число действий, которое соответствует действительности, а именно указанным выше условиям:
Код
not admin
not admin
disc
user=manager1 ID=3 Status=Disc was log off.
not admin
not admin
disc
user=manager2 ID=5 Status=Disc was log off.
not admin
disc
1cv7.exe                      5892                            7     21*636 K
not admin
Press any key to continue . . .
Но если добавить logoff !ID!, то процесс зацикливается:
Код
not admin
not admin
disc
user=manager1 ID=3 Status=Disc was log off.
not admin
not admin
disc
user=manager1 ID=3 Status=Disc was log off.
not admin
not admin
disc
user=manager1 ID=3 Status=Disc was log off.
........ и т.д.
Что не так?
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
13.02.2015, 12:01 29
Очевидно, что проблема с logoff.
Если написать вариации:
Bash
1
2
logoff "!ID!"
echo logoff "!ID!"
Рекурсии в коде принципиально нет.
Сотрите @echo off и выполните из консоли: этотбат.cmd > 1.log
Что будет видно по логу?
0
0 / 0 / 0
Регистрация: 23.05.2014
Сообщений: 11
14.02.2015, 16:08 30
По логу видно что logoff !ID! не выполняет свою функцию. Опять переходит в начало цикла и пытается отключить уже проверенного пользователя. И так до бесконечности...
Пауза после операции logoff не выполняется.

Если ID = 5, то
echo logoff !ID! выводит logoff 5
echo logoff "!ID!" выводит logoff "5"
Причем если пользователь с кодом 5 есть, то команда logoff 5 работает корректно...
0
0 / 0 / 0
Регистрация: 26.02.2015
Сообщений: 1
26.02.2015, 17:33 31
Помогите в следующей проблеме.
Мне нужно делать логофф определенным пользователям на терминальном сервере.
Пример:
Есть сервер с ОС Windows 2003
Есть учетки: admin, ivanov, petrov и sidorov.
К примеру нужно ежедневно в 12-00 делать логофф только для учеток ivanov и sidorov.
Расписание я сам настрою через планировщик.
Помогите, как написать bat-ник, который будет завершать сеанс только определенным учеткам.
P.S. По той причине что logoff понимает только имя сеанса или id сеанса, а не понимает имя залогиненой учетки, у меня и возникла проблема.
Заранее спасибо!
0
8 / 5 / 3
Регистрация: 13.02.2013
Сообщений: 294
22.07.2015, 11:38 32
Dragokas, честно говоря, мало понял ваш скрипт, только моментами. Не могли бы Вы к каждой строчке приложить комментарий. Скидывать код в .bat? Если не сложно пошагово напишите(для ламеров) что и за чем делать. Буду очень благодарен!
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
22.07.2015, 13:05 33
Четно говоря не вижу особого смысла в этом.
Если совсем не поняли сейчас, то и с комментариями ситуация не особо улучшиться.
Лучше напишите, что нужно и что не получается.
1
0 / 0 / 0
Регистрация: 23.07.2015
Сообщений: 2
23.07.2015, 14:36 34
Классный скрипт!
А можно сделать так, чтобы пассивные сессии закрывались не в момент выполнения скрипта, а по прошествии определённого времени (например, двух часов)?
То есть, перейдя из статуса Active в Disconnected, начинался бы отсчёт времени, а по пришествии двух часов (если конечно пользователь не вернулся в систему) его сессия автоматически отключается…

Добавлено через 15 минут
В дополнение:
На одном сайте я нашёл такую утилиту idlelogoff, но к сожалению у неё есть один серьёзный недостаток – она закрывает не только сессии со статусом Disconnected (по прошествии заданного времени) но и активную сессию, если в ней не было сделано за это время какое-либо действие.
0
0 / 0 / 0
Регистрация: 23.07.2015
Сообщений: 2
28.07.2015, 07:53 35
Dragokas,
Если можно, помогите, пожалуйста. Вы можете изменить скрипт так, чтобы он закрывал недействующие сессии через определённое время?
0
1 / 1 / 0
Регистрация: 26.02.2016
Сообщений: 2
24.03.2016, 16:49 36
Всем привет, автору респект.)

Отвечаю на крайний поставленный вопрос, тем более, что у меня так же возникла подобная необходимость.
Задача у меня была схожая.
1. Выявить не активных пользователей на терминальном сервере
2. Если через пол часа пользовательская сессия продолжает быть не активной - logoff

Для данных целей были созданы 2 скрипта на основе скрипта автора.
1-й выявляет не активных пользователей и записывает их во временный файл + создает задачу в шедуллере
с запуском 2-го скрипта со временем исполнения через 30 минут от текущего.
2-й скрипт открывает временный файл со списком пользователей к разлогиниванию (если онный существует)
и проверяет их по списку - если пользователь продолжает быть не активным - logoff.

Первый скрипт загнал так же в шедулер с выполнением каждые 5 минут.
В первом скрипте необходимо поменять переменные admin и pass на свои.


1-й скрипт userlogoff.bat
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@echo off
 
Setlocal EnableDelayedExpansion
SetLocal EnableExtensions
 
chcp 866>nul
set user= & set ID= & set status= 
set admin=username
set pass=password
set sysID=65536
set mt=%time%
set dt=30
 
for /f "tokens=1-2 delims=:" %%a in ("%mt: =0%") do set /a "t=(1%%a-100)*60+(1%%b-100)+(dt %% 1440)", "t+=(t>>31) & 1440", "hh=(t/60 %% 24)+100", "mm=(t %% 60)+100"
set offtime=%hh:~-2%:%mm:~-2%
set t=%offtime::=.%
 
for /f "skip=3 tokens=1-4" %%a in ('query session')  do (
call :FindToken %%c
if /i Errorlevel 1 (
 
      set user=%%b
      set ID=%%c
      set status=%%d
      
    ) else (
    
      set user=%%a
      set ID=%%b
      set status=%%c)
    
  if "!user!" neq "" (
  if "!ID!" lss "!sysID!" (     
  if "!status!" neq "Активно" (
  if "!user!" neq "!admin!" (
  
  echo !user! !ID! >> C:\Windows\Scripts\ulogoff-!t!
  set user= & set ID= & set status= 
  
  ))))
  
)
 
 if exist C:\Windows\Scripts\ulogoff-%t% (
 schtasks /create /ru "domain\%admin%" /rp %pass% /sc once /tn "ulogoff-%t%" /tr "C:\Windows\scripts\logoff.bat %t%" /st "%offtime%" /rl highest >> C:\Windows\Logs\userlogoff.log
 )
 
exit /b
 
:FindToken
echo %~1 | >nul 2>&1 findstr /r [^0-9] && exit /b 1
exit /b 0
2-й скрипт logoff.bat
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@echo off
Setlocal EnableDelayedExpansion
chcp 866>nul
 
set name=ulogoff-%~1
 
if exist C:\Windows\Scripts\%name% (
for /f "tokens=1,2" %%a in (c:\windows\scripts\%name%)  do (
set user=%%a
set ID=%%b
 
for /f "skip=1 tokens=1-4" %%a in ('query session %user%')  do (
 
call :FindToken %%c
if /i Errorlevel 1 (
      set status=%%d
    ) else (
      set status=%%c)
 
  if "!ID!" neq "" (      
  if "!status!" neq "Активно" (
  logoff !ID!
  echo !date! !time! user=!user! ID=!ID! status=non-active was log off >> C:\Windows\Logs\userlogoff.log
  set user= & set ID= & set status= 
  ))
))
 
del C:\Windows\Scripts\%name%
schtasks /delete /tn "%name%" /f
)
 
exit /b
 
:FindToken
echo %~1 | >nul 2>&1 findstr /r [^0-9] && exit /b 1
exit /b 0
1
1 / 1 / 0
Регистрация: 26.02.2016
Сообщений: 2
26.03.2016, 09:31 37
Что то я накосячил со своими скриптами. Они конечно работают, но логика не правильная.
Получается что если пользователь не активен и 1-й скрипт его пометил как "не активного" и после этого в течении полу часа, скажем через 20 минут он заходил снова на терминалку и вышел, то 2-й скрипт все равно его терминирует.

Наверно нужно, чтобы в случае, если пользователь снова заходил на терминал в течении определенного времени, то он бы удалялся из списка на logoff и/или время разлогинивания добавлялось относительно последнего входа.

Думаю надо сделать так.
1. Скрипт формирует временный файл с не активными пользователями следующего формата:
"имя пользователя" "ID" "время logoff" (где время logoff - текущее+время через которое он должен быть разлогинен. В моем случае - 30 минут).

2. Второй скрипт, или тот же, проверяет временный файл (если он существует) и проверяет:
- если пользователь активен в текущей сессии, но он присутствует в файле на logoff - удаляет его из файла.

3. Второй скрипт, или то же, открывает файл со списком пользователей на logoff и
- если время на logoff (третья колонка в файле) совпадает с текущим - logoff пользователя.

Данный скрипт должен запускаться через шедуллер каждую минуту.
Как то так. Есть мысли у кого?
0
0 / 0 / 1
Регистрация: 26.03.2016
Сообщений: 3
26.03.2016, 13:39 38
вот так работает (win2012 eng)

Windows Batch file
1
for /f "skip=1 tokens=1,2,3" %%a in ('query user') DO if "%%a" neq ">administrator" logoff %%c
Тут я имя юзера жестко прописал, т.к. %username% выводит его с большой буквы, а query user с маленькой (ниасилил я перевести их в один регистр).
Так-же по хорошему в query user текущий пользователь помечается символом ">" перед именем (например для того, если несколько юзеров Administrator залогинено), но я так-же неасилил его ">" вырезать и сравнивать, т.к. он типа спец символ и его батник не хочет как именно символ, а я незнаю.
0
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
26.03.2016, 14:26 39
Ramka2, так хотелось?
Windows Batch file
1
for /f "skip=1 tokens=1-3 delims=> " %%a in ('query user') do if /i "%%a" neq "%Username%" echo logoff %%c
.
1
0 / 0 / 1
Регистрация: 26.03.2016
Сообщений: 3
26.03.2016, 15:41 40
Да, так и вправду лучше :-)
Ключ /I, если он указан, задает сравнение текстовых строк без учета регистра.

А совсем в идеале хотелось брать из вывода комманды

Код
C:\Scripts>query user
 ПОЛЬЗОВАТЕЛЬ          СЕАНС              ID  СТАТУС  БЕЗДЕЙСТВ. ВРЕМЯ ВХОДА
>administrator         rdp-tcp#151         2  Активно          .  26.03.2016 14:29
 koroleva              rdp-tcp#1           3  Активно          .  26.03.2016 14:43
всех, у кого нету символа ">" (этим символом текущий юзер отмечается).

Добавлено через 59 минут
Если пользователь не активен, а отключен, то у него нет ничего в колонке СЕАНС.
В результате колонки "сдвигаются".
Вот тут у koroleva ID указан во второй колнке, а у administrator ID в третьей (т.к. мы берем по разделителю пробел).
Код
 ПОЛЬЗОВАТЕЛЬ          СЕАНС              ID  СТАТУС  БЕЗДЕЙСТВ. ВРЕМЯ ВХОДА
>administrator         rdp-tcp#7           2  Активно          .  26.03.2016 14:29
 koroleva                                  3  Диск            .  26.03.2016 15:16
Поэтому изменил, что логофить из колонки №2.
Т.е. получается, что он логофит либо по имени сеанса (если юзер активен), либо по ID (если юзер отключен).

Windows Batch file
1
for /f "skip=1 tokens=1-3" %%a in ('query user') do if /i "%%a" neq ">%Username%" echo logoff %%b
Вроде работает как надо.
И при этом я сравниваю первую колонку с ">%Username%", т.е. по идее, если залогинен Admin и еще раз Admin, то оставит только текущего, т.к. текущий в выводе комманды будет ">Admin", а другого Admin успешно разлогофит.

Если хочется оставить все экземпляры "себя", то тогда как выше писал ALPAP (знак ">" считаем разделителем)
Windows Batch file
1
for /f "skip=1 tokens=1-3 delims=> " %%a in ('query user') do if /i "%%a" neq "%Username%" echo logoff %%b
0
26.03.2016, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2016, 15:41
Помогаю со студенческими работами здесь

Для группы пользователей закрыть доступ ко всем файлам , кроме их документов на терминальном сервере
Имеется терминальный сервер,требуется для группы пользователей закрыть доступ ко всем файлам ,...

Сделать для всех текстов 12рх, кроме h1.h6
Сделал в начале * {font-size: 12px;}, но это ведь влияет на h1..h6. Подскажите что-нибудь, кроме...

Написать функцию, которая вычисляет количество всех атомов в списке(кроме NIL) с учетом всех подсписков всех уровней вложенности
Написать функцию, которая вычисляет количество всех атомов в списке(кроме NIL) с учетом всех...

Софт для очистки мусора (Temp,Cache) для всех пользователей
Здравствуйте! Ищу софт для очистки временных файлов, кеша браузеров, и другого мусора....

Отключить сеть для одного из пользователей windows (не для всех)
Есть две учётные записи: администратор и пользователь. Можно ли как-то полностью закрыть доступ к...

Событие для всех div class, кроме одного
Добрый день! На сайте при нажатии на <div class="box" id="1"> открывается <div class="texture...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru