Показать полную графическую версию : [решено] скрипт с завершением сеанса определенного пользователя
не поможете скрипт подправить на завершение сессии пользователя на терминальном сервере. в скриптах я не оченть силен, смог собрать скрипт на завершение сеанса текущего пользователя
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
Выглядит так, а хочется скрипт с завершением сеанса определенного пользователя.
убить заданную сессию можно через штатную утилиту rwinsta, пример:rwinsta 5 /server:MyServer
здесь "5" - номер сессии, список сессий можно получить аналогично:
qwinsta /server:MyServer
понятно, что "убить" сессию и осуществить "выход из системы" с закрытием всех программ - вещи разные, но мне неизвестны способы удаленного завершения чужих сессий... по идее, подключаться к терминальной сессии и запускать в ней любую программу должна уметь PsExec (http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx) (ключ "-i"), но мне не удалось этого добиться, и судя по форуму поддержки я такой не один
Как вариант: вставить при логоне запуск скрипта, который будет крутиться в фоне каждой сессии и делать "выход" по заданному условию (файл, ключ реестра, etc.)
Тогда назревает вопрос, а можно ли пользователю приклеить статичный sessionid или sessionname?
по памяти ошибся, сегодня на работе получилось вот что (с 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%
вообщем вот что получается, если батник выглядит так
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. Где может быть косяк?
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%
)
)
спасибо, все работает. Можно скриптик добавлять в коллекцию ==)
Подскажите, как доработать скрипт если нужно отключить несколько пользователей?
если нужно отключить несколько пользователей »
@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
а можно сделать скрипт просто для сброса активных пользователей терминалов не перечисляя всех, например для резервного копирования баз 1с
wufer, батник: http://forum.oszone.net/post-1429216-3.html
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.