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

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

hse2000 27-02-2009 12:38 1051227

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

Код:

Option Explicit
Dim strComputer     
Dim strNamespace     
Dim strClass         
Dim objClass       
Dim colInstances   
Dim objInstance     
strComputer = "."
strNamespace = "Root\CIMV2"
strClass = "Win32_OperatingSystem"

Set objClass = GetObject("WinMgmts:\\" & strComputer & _
                        "\" & strNamespace & ":" & strClass)
Set colInstances = objClass.Instances_

For Each objInstance In colInstances
  objInstance.Win32Shutdown (4)     
Next


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

amel27 02-03-2009 12:30 1052749

убить заданную сессию можно через штатную утилиту rwinsta, пример:
Код:

rwinsta 5 /server:MyServer
здесь "5" - номер сессии, список сессий можно получить аналогично:
Код:

qwinsta /server:MyServer
понятно, что "убить" сессию и осуществить "выход из системы" с закрытием всех программ - вещи разные, но мне неизвестны способы удаленного завершения чужих сессий... по идее, подключаться к терминальной сессии и запускать в ней любую программу должна уметь PsExec (ключ "-i"), но мне не удалось этого добиться, и судя по форуму поддержки я такой не один

Как вариант: вставить при логоне запуск скрипта, который будет крутиться в фоне каждой сессии и делать "выход" по заданному условию (файл, ключ реестра, etc.)

hse2000 02-03-2009 17:35 1052990

Тогда назревает вопрос, а можно ли пользователю приклеить статичный sessionid или sessionname?

amel27 04-03-2009 12:39 1054659

по памяти ошибся, сегодня на работе получилось вот что (с XP-RU проверил):
Код:

@Echo Off

Set SERVER=MyServer
Set KILLME=Администратор

For /F "Tokens=1,2 Skip=3 Delims= " %%i In ('qwinsta /Server:%SERVER%') Do If "%%i"=="%KILLME%" rwinsta %%j /Server:%SERVER%


hse2000 06-03-2009 18:01 1056638

вообщем вот что получается, если батник выглядит так

Код:

Set SERVER=2003test
Set KILLME=test1

For /F "Tokens=1,2 Skip=3 Delims= " %%i In ('qwinsta /Server:%SERVER%') Do If "%%i"=="%KILLME%" rwinsta %%j /Server:%SERVER%

,
test1 - имя юзера то имеем

Код:

C:\Documents and Settings\Administrator>Set SERVER=2003test

C:\Documents and Settings\Administrator>Set KILLME=test1

C:\Documents and Settings\Administrator>For /F "Tokens=1,2 Skip=3 Delims= " %i I
n ('qwinsta /Server:2003test') Do If "%i" == "test1" rwinsta %j /Server:2003test


C:\Documents and Settings\Administrator>If "rdp-tcp#8" == "test1" rwinsta test1
/Server:2003test

C:\Documents and Settings\Administrator>

видно, что rwinsta берет, не имя сессии, а имя юзера.

Если меняем %j на %i, то получается все правильно

Код:

C:\Documents and Settings\Administrator>C:\test\3.bat

C:\Documents and Settings\Administrator>Set SERVER=2003test

C:\Documents and Settings\Administrator>Set KILLME=test1

C:\Documents and Settings\Administrator>For /F "Tokens=1,2 Skip=3 Delims= " %i I
n ('qwinsta /Server:2003test') Do If "%i" == "test1" rwinsta %i /Server:2003test


C:\Documents and Settings\Administrator>If "rdp-tcp#8" == "test1" rwinsta rdp-tc
p#8 /Server:2003test

НО!!!!!! команда rwinsta тогда не отрабатывает.... пробовал до rwinsta писать goto на след. строчку, чтобы она выполнялась с новой строки, но тогда пишется session %i not found. Где может быть косяк?

Vadikan 07-03-2009 00:02 1056935

hse2000, используйте тег [code][/code], плиз.

amel27 09-03-2009 13:29 1058688

Цитата:

Цитата hse2000
видно, что rwinsta берет, не имя сессии, а имя юзера »

понятно - я пробовал на отключенных сессиях, на активных появляется долнительный столбец ID:
Код:

Set SERVER=2003test
Set KILLME=test1

For /F "Tokens=1-4 Skip=3 Delims=# " %%i In ('qwinsta /Server:%SERVER%') Do (
  If "%%i"=="rdp-tcp" (
      If "%%k"=="%KILLME%" rwinsta %%l /Server:%SERVER%
  ) Else (
      If "%%i"=="%KILLME%" rwinsta %%j /Server:%SERVER%
  )
)


hse2000 10-03-2009 14:58 1059681

спасибо, все работает. Можно скриптик добавлять в коллекцию ==)

bazik83 22-05-2010 21:21 1418960

Подскажите, как доработать скрипт если нужно отключить несколько пользователей?

amel27 23-05-2010 06:09 1419133

Цитата:

Цитата bazik83
если нужно отключить несколько пользователей »

Код:

@Echo Off

Call :KILLME server1 user1
Call :KILLME server1 user2

Exit /B

:KILLME
 For /F "Tokens=1-4 Skip=3 Delims=# " %%i In ('qwinsta /Server:%~1') Do (
 If /I "%%i"=="%~2" rwinsta %%j /Server:%~1
 If /I "%%k"=="%~2" If /I "%%i"=="rdp-tcp" rwinsta %%l /Server:%~1)
GoTo :EOF


wufer 03-06-2011 18:30 1687938

а можно сделать скрипт просто для сброса активных пользователей терминалов не перечисляя всех, например для резервного копирования баз 1с

amel27 04-06-2011 08:26 1688184

wufer, батник: http://forum.oszone.net/post-1429216-3.html


Время: 13:31.

Время: 13:31.
© OSzone.net 2001-