div.main {margin-left: 20pt; margin-right: 20pt}
9 недокументированных команд Terminal Server
Марк МИНАСИ
Операционная система Windows NT Server 4.0, Terminal Server Edition
выпускается уже год, и сетевые администраторы разносят ее по всему миру NT.
Специалисты компании Microsoft разрабатывали Terminal Server, надеясь
заинтересовать своим продуктом пользователей Citrix WinFrame, которым требуется
тонкий клиент, работающий с NT 4.0. Надо отметить, что Terminal Server привлек
внимание многих потребителей WinFrame, и круг администраторов, работающих в
многопользовательской среде NT, значительно расширился.
В состав Terminal Server входят все графические инструментальные средства
администрирования, которые присутствуют в NT. Утилиты NT, поддерживающие
интерфейс «указал и выбрал», в том числе User Manager, Server Manager и NT
Explorer, намного упрощают изучение возможностей управления систем Terminal
Server. Эти инструментальные средства, имеющие графический пользовательский
интерфейс, незаменимы для начинающих администраторов и прекрасно подходят для
реализации небольших проектов, но администраторам крупных сетей необходимы
решения, поддерживающие интерфейс командной строки.
Опытные администраторы NT знают, что существенным недостатком этой ОС
является отсутствие в её интерфейсе командной строки аналогов утилит с
графическим интерфейсом. Администрирование сети NT из командной строки без
инструментария Microsoft Windows NT Server 4.0 Resource Kit, такого как
Addusers, Rmtshare и Xcacls, попросту невозможно. WinFrame всегда предоставлял
лучший инструментарий командной строки, чем NT, но Terminal Server включает в
себя большую часть функций WinFrame. Насколько мне известно, специалисты
Microsoft не добавили в документацию описание инструментариев командной строки
Terminal Server, но работая со своими системами Terminal Server, я обнаружил ряд
полезных утилит. Поскольку в своей сети я использую RDP, в этой статье речь
пойдет о командах Terminal Server, которые работают как с RDP, так и с
протоколом Independent Computing Architecture (ICA) в WinFrame.
Как узнать, где работает пользователь
Инструментарий Query User предоставляет вам информацию о пользовательских
соединениях с системой Terminal Server. Хотите узнать, подключился ли
пользователь, имеющий в NT имя пользователя janesmith, к серверу Shipboard? В
командной строке на машине Terminal Server в домене Shipboard нужно набрать query user janesmith /server:shipboard
Если Джейн Смит не зарегистрировалась на сервере Shipboard, то Terminal
Server в качестве ответа выдаст сообщение No User exists for janesmith
(«Пользователя с именем janesmith не существует»). Если же она
зарегистрировалась на сервере Shipboard, вы получите о ней информацию. В
частности, вы увидите ее имя пользователя, ее имя сеанса Terminal Server (строка
типа rdp-TCP#1), ее идентификатор сеанса (число, которое идентифицирует сеанс),
длительность простоя в минутах и время регистрации на сервере. Идентификатор
сеанса, который предоставляет Query User, имеет особое значение; он вам нужен
для работы с другими утилитами командной строки Terminal Server. Синтаксис
команды Query User выглядит следующим образом. query user [<идентификатор>]
[/server:<имя сервера>]
Переменная «идентификатор» может быть именем пользователя, именем сеанса или
идентификатором сеанса. Любой из этих трех идентификаторов дает команде Query
User достаточно информации, чтобы найти сессию конкретного пользователя. Если вы
наберете query user
без идентификатора, вы получите список пользователей, зарегистрированных на
вашем сервере. (Можно использовать альтернативную утилиту Terminal Server,
называемую Qwinsta, для того, чтобы получить список всех сеансов сервера, в том
числе не только сессий активных пользователей, но и других сеансов, которые
система запускает для своих целей.)
Без параметра /server: утилита Query User выводит информацию о пользователях,
зарегистрированных на сервере, где вы сами работаете. Для того чтобы передать
запрос на другой сервер, добавьте выражение /server: и имя сервера, информацию о
котором хотите получить. Например, для того, чтобы удаленно запросить список
пользователей, работающих с сервером по имени Pungo, вы набираете query user /server:pungo
Мне не удалось найти способ обратиться к Terminal Server с тем, чтобы
организовать поиск конкретного пользователя на каждом сервере из группы
серверов. Такое впечатление, что в принципе невозможно обратиться к Terminal
Server с запросом «посмотри, зарегистрирован ли пользователь с именем janesmith
на какой-либо из систем Terminal Server этого домена».
Как найти машину, на которой работает Terminal Server
Если вам нужно найти пользователя и вам неизвестно, к какой системе Terminal
Server он подключен, вы должны обратиться с запросом отдельно к каждой системе
Terminal Server в домене. Утилита Qappsrv может помочь в решении данной задачи,
поскольку она предоставляет имена всех машин Terminal Server в вашем домене.
Утилита Qappsrv имеет следующий синтаксис. qappsrv [/address] [/domain:<имя домена>]
Опция /domain используется только в том случае, если вы обращаетесь с
запросом не к тому домену, в котором работаете сами. Опция /address предлагает
два фрагмента информации о каждом сервере в домене: его MAC-адрес и таинственное
поле Network. Когда я набирал в командной строке qappsrv /address
то получал корректные MAC-адреса своих серверов, но столбец Network всегда
оставался пустым. Я предположил, что в нем указывается сетевой номер IPX, и поле
оставалось пустым, поскольку моя сеть использует TCP/IP.
Как отключить пользователя от системы Terminal Server
Предположим, вы ищете Джейн Смит, поскольку обнаружили, что она использует
оборудование компании в целях, противоречащих интересам компании, и вы хотите
отключить ее от сервера. Для этого вам потребуется идентификатор сеанса или имя
сеанса Джейн Смит, поэтому сначала с помощью Query User нужно найти один из этих
параметров. После этого вы готовы ее отключить.
Если Джейн работает с сервером Kempsville и ее идентификатор сеанса равен 10,
вы можете отключить ее от сервера в домене с помощью команды disconn 10 /server:kempsville
Вы скажете, что это некорректно? Возможно. Но вам не стоит беспокоиться о
том, что в приложении, с которым работала Джейн, будут потеряны данные. Утилита
Disconn завершает сеанс Terminal Server конкретного пользователя, но не
завершает программу, с которой пользователь работал. Если Джейн сможет доказать
беспочвенность ваших обвинений, она восстановит соединение и продолжит свою
работу с того момента, где та была прервана.
Утилита Disconn защищает работу пользователя, которого вы отключили от
сервера, но она сохраняет все данные в системе Terminal Server. Если же
отключения оказалось недостаточно и вы хотите закрыть сеанс, используйте утилиту
Reset. Чтобы отключить Джейн Смит и закрыть все ее приложения в Terminal Server,
наберите команду reset session 10 /server:kempsville
Утилита Reset завершает работу программ прерванного сеанса и не спрашивает
пользователей, нужно ли сохранить их данные перед отключением. Так что
используйте Reset с осторожностью.
Как вы могли заметить, утилиты Disconn и Reset имеют одинаковый синтаксис:
disconn <идентификатор>
[/server:<имя сервера>]
и
reset session < идентификатор>
[/server:< имя сервера>]
Обе утилиты требуют, чтобы в качестве идентификатора использовался или
идентификатор сеанса пользователя, или имя сеанса; Disconn и Reset не могут
идентифицировать сессию по имени пользователя. Как и Query User, утилиты Disconn
и Reset предусматривают указание параметра /server: тогда и только тогда, когда
вы инициируете команду с удаленного сервера.
Как попросить пользователя закончить работу
Допустим, у вас нет никаких доказательств некорректного поведения Джейн Смит.
Вы просто предполагаете, что она поступает неэтично и хотите попросить ее
отключиться, чтобы можно было проанализировать сложившуюся ситуацию. Каким
образом вы можете послать ей сообщение в реальном времени? Инструментарий
командной строки Msg в Terminal Server передает сообщения и даже ждет ответа
пользователя.
Msg имеет следующий синтаксис. msg <идентификатор>
[/time:<секунды>] [/w]
[/server:<имя сервера>]
<сообщение>
Msg обладает множеством параметров. В качестве идентификатора Msg допускает
имя пользователя, идентификатор сеанса, имя сеанса или имя файла, перед которым
ставится символ @. Как и многие другие утилиты командной строки в Terminal
Server, утилита Msg запускается на сервере, с которым вы работаете в том случае,
если параметр /server: не указан.
Вы можете использовать Msg для того, чтобы послать сообщение Джейн, набрав
следующую строку.
msg janesmith Джейн, мы собираемся выключить сервер. Пожалуйста, заканчивай
работу.
Или вы можете использовать опцию /w, чтобы убедиться в том, что Джейн
прочитала адресованное ей сообщение. Если же вы наберете строку
msg janesmith /w Джейн, мы собираемся выключить сервер. Пожалуйста,
заканчивай работу.
то в командной строке вашей системы Terminal Server приглашение не появится
до тех пор, пока Джейн не ответит, или пока не истечет время ожидания утилиты
Msg. По умолчанию время ожидания равно 60 с, но вы можете указать другое время
(в секундах) с помощью параметра /time:. Например, чтобы дать Джейн две минуты
на ответ, нужно набрать следующую строку: msg janesmith /w /time:120 Джейн,
мы собираемся выключить сервер.
Пожалуйста, заканчивай работу.
Вы можете обратится ко всем пользователям сервера, указав в качестве
идентификатора в командной строке Msg символ *. msg * Всем немедленно отключиться
от сервера.
Можно также послать сообщение пользователям по списку, указав имена
интересующих вас пользователей в файле ASCII, расположив каждое из них на
отдельной строке. Затем вы указываете символ @ и имя этого файла в качестве
идентификатора в командной строке утилиты Msg. Например, чтобы послать сообщения
нескольким пользователям, нужно создать файл ASCII с именем manyfolks, где
перечислены пользователи, которые должны выйти из системы, и набрать следующую
команду. msg @manyfolks
Всех просим закончить работу с сервером.
Единственная проблема, возникающая при передаче сообщений нескольким
пользователям, состоит в том, что если вы добавляете опцию /w, то утилита Msg
работает последовательно. Утилита посылает сообщение первому пользователю в
списке и ждет от него ответа или истечения времени ожидания, после чего посылает
сообщение второму адресату и так далее.
Как не допустить регистрации на сервере новых пользователей
Единственный безопасный способ отключить сервер файлов NT — приостановить
исполняемую на машине службу Server. В этом случае невозможно будет
устанавливать новые соединения с сервером, но при этом не прервется работа тех
пользователей, которые уже зарегистрировались на нем. После приостановки сервиса
следует разослать пользователям сообщения и прежде, чем выключать службу Server,
убедиться, что все пользователи вышли из системы.
Каким образом сообщить системе Terminal Server о том, что необходимо
запретить создание новых соединений, не отключая при этом тех пользователей,
которые уже работают? В состав операционной системы входит служба Terminal
Server, но она не позволяет приостановить работу службы. Попытка уменьшить число
серверных соединений в License Manager для Terminal Server тоже не дает нужного
эффекта. Но инструментарий командной строки Change Logon в Terminal Server
позволяет добиться того же результата, что и приостановка службы Server в NT.
Откройте командную строку в системе Terminal Server и наберите change logon /disable
Сервер будет отвечать отказом на все попытки зарегистрироваться на нем, но
это действие не затронет пользователей, которые уже поддерживают сеанс работы с
данным сервером. Вы можете добавить параметр /server: с тем, чтобы разрешить
Change Logon работать на удаленной системе. Когда ваша система снова будет
готова поддерживать новые соединения, опять воспользуйтесь утилитой Change
Logon, но опцию /disable замените на опцию /enable.
Удаленная перезагрузка системы Terminal Server
Утилита Shutdown позволяет удаленно отключать или перезагружать систему
Terminal Server. Утилита Shutdown имеет следующий синтаксис. shutdown /server:<имя сервера> /reboot
или shutdown /server:<имя сервера> /powerdown
Если в команде указана параметр /reboot, то Shutdown перезагружает сервер.
Параметр /powerdown приведет к отключению компьютера, если в системе есть
драйверы NT Advanced Power Management (APM); в противном случае параметр
/powerdown выключит все серверные процессы и выведет на экран сообщение Click to
restart («Для включения системы нажмите любую клавишу»).
Добавляя временной параметр, вы можете с помощью Shutdown уведомить
пользователей и по истечении указанного периода времени завершить их сеансы.
Например, после команды shutdown 120 /server:princessanne /reboot
Terminal Server сообщит всем пользователям, работающим с сервером с названием
PrincessAnne, о его отключении, подождет 120 секунд, а затем перезагрузит
машину.
Как узнать, кто работает с приложением
Предположим, ваш сервер ведет себя не так, как вы рассчитывали. Вы
подозреваете, что многие пользователи запустили Wtsquake (гипотетическая версия
игры Quake для Terminal Server), и в этой игре задействовано слишком много
ресурсов процессора сервера. Что делать? Вы можете использовать инструментарий
Qprocess в Terminal Server. Qprocess сообщает, какой из процессов работает в
системе Terminal Server в каждый момент времени.
Вы можете использовать Qprocess по-разному. Во-первых, можно выяснить, с
какой программой работает конкретный пользователь. Идентификатором пользователя
для Qprocess может быть имя пользователя, имя сеанса или идентификатор сеанса.
Если вы предполагаете, что Джейн Смит слишком много играет в Wtsquake, наберите
командную строку qprocess janesmith
чтобы выяснить, какую именно программу она запускает. В ответ на такую
команду Terminal Server перечислит все процессы, которые запускает Джейн, и для
каждого процесса укажет его идентификатор. Запомните идентификатор каждого
процесса, который вы хотите прекратить.
Если в списке процессов Qprocess, относящихся к Джейн, вы увидите имя файла
Wtsquake — wtsqk.exe и захотите выяснить, кто еще играет в эту игру на вашей
системе Terminal Server, можете опять использовать утилиту Qprocess, указав в
качестве идентификатора имя процесса. Qprocess не различает процесс и программу.
Программа может содержать один или несколько процессов, но большинство
клиентских приложений содержит только один процесс, поэтому, как правило, в
качестве идентификатора для Qprocess вы можете указать имя файла программы,
обязательно с расширением. Если вы набрали строку qprocess wtsqk.exe
то утилита Qprocess сообщит список игроков в Wtsquake, работающих на вашем
сервере.
Как закрыть приложение
После того как вы узнали, кто играет в Wtsquake, с помощью утилиты Kill в
Terminal Server можно прекратить игру обнаруженных пользователей. Утилита Kill
позволяет найти и удалить все экземпляры процесса или прервать экземпляр
процесса конкретного пользователя. В простейшем виде Kill выглядит следующим
образом. kill <идентификатор>
В качестве значения идентификатора утилита разрешает использовать
идентификатор процесса или имя процесса. Когда вы вводите имя процесса в Kill,
используйте только первую часть имени процесса; расширение файла указывать не
нужно. Если вы используете Kill, указывая имя процесса, например, kill wordpad
вы завершаете только процессы, выполняемые в вашем сеансе Terminal Server.
Чтобы Terminal Server смог найти и завершить все процессы с данным именем во
всех сеансах системы Terminal Server, используйте опцию /a. Команда kill wordpad /a
прекращает WordPad в сеансах всех пользователей на сервере, с которым вы
работаете. Kill также имеет параметр a /server:, который вы можете использовать
для того, чтобы утилита сработала на удаленном сервере.
Каким образом можно отключить WordPad какого-то конкретного пользователя?
Во-первых, с помощью Query User найдите идентификатор сессии этого пользователя.
После чего укажите параметр /ID: следующим образом kill wordpad /ID:<номер сессии>
Наконец, можно добавить параметр /v, при использовании которого утилита Kill
указывает конкретный экземпляр процесса перед тем, как его уничтожить.
Администрирование через командную строку
Наступит день, когда администраторы смогут выполнять практически все функции
администрирования NT из командной строки. Когда это произойдет, вы получите
возможность полностью администрировать крупную сеть с помощью программирования
пакетного исполнения и оболочки. NT пока далека от того, чтобы выполнять все
административные функции из командной строки, но возможности Terminal Server
позволяют администраторам крупных сетей надеяться на светлое будущее. Если вы
используете Terminal Server, изучите недокументированные возможности командной
строки, имеющиеся в этой ОС. Все приведенные выше команды имеют множество
параметров — намного больше, чем можно рассказать в рамках одной статьи. Чтобы
более подробно узнать о возможностях каждой из описанных мной утилит, после
каждой из команд укажите параметр /?.
Об авторе
Марк Минаси — редактор Windows NT Magazine, MCSE, и автор книги
Mastering Windows NT Server 4.0 (издательство Sybex). С ним можно связаться по
адресу mark@minasi.com.
|