PDA

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


hse2000
27-02-2009, 12:38
не поможете скрипт подправить на завершение сессии пользователя на терминальном сервере. в скриптах я не оченть силен, смог собрать скрипт на завершение сеанса текущего пользователя

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
убить заданную сессию можно через штатную утилиту rwinsta, пример:rwinsta 5 /server:MyServer
здесь "5" - номер сессии, список сессий можно получить аналогично:
qwinsta /server:MyServer
понятно, что "убить" сессию и осуществить "выход из системы" с закрытием всех программ - вещи разные, но мне неизвестны способы удаленного завершения чужих сессий... по идее, подключаться к терминальной сессии и запускать в ней любую программу должна уметь PsExec (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx) (ключ "-i"), но мне не удалось этого добиться, и судя по форуму поддержки я такой не один

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

hse2000
02-03-2009, 17:35
Тогда назревает вопрос, а можно ли пользователю приклеить статичный sessionid или sessionname?

amel27
04-03-2009, 12:39
по памяти ошибся, сегодня на работе получилось вот что (с 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
вообщем вот что получается, если батник выглядит так

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
hse2000, используйте тег , плиз.

amel27
09-03-2009, 13:29
видно, что 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
спасибо, все работает. Можно скриптик добавлять в коллекцию ==)

bazik83
22-05-2010, 21:21
Подскажите, как доработать скрипт если нужно отключить несколько пользователей?

amel27
23-05-2010, 06:09
если нужно отключить несколько пользователей »


@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
а можно сделать скрипт просто для сброса активных пользователей терминалов не перечисляя всех, например для резервного копирования баз 1с

amel27
04-06-2011, 08:26
wufer, батник: http://forum.oszone.net/post-1429216-3.html




© OSzone.net 2001-2012