Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #122, ФЕВРАЛЬ 2009 г.

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

Сергей «grinder» Яремчук (grinder@ua.fm, tux.in.ua)




Операционные системы семейства Windows, в том числе и серверных версий, всегда ассоциировались с графическим интерфейсом, который считается более понятным при настройках, не говоря уже о простоте освоения новичками. Возможностям командной строки в различных руководствах редко уделяется внимание, и часто через некоторое время админ с удивлением обнаруживает, что многие операции удобнее производить именно из консоли.

Диспетчер сервера в консоли

Диспетчер сервера (Server Manager), появившийся в Win2k8, заменил десяток утилит из группы Computer Management в Win2k3. Это очень удобный инструмент, – в одном месте собраны все настройки. Но кроме графического Server Manager, в состав сервера входит и командная утилита ServerManagerCmd.exe, при помощи которой также можно управлять рядом настроек. Например, чтобы с ее помощью просмотреть список всех ролей и компонентов, имеющихся на сервере, используем параметр '-query/-q'.

> servermanagercmd -query
[x] Веб-сервер <IIS> [Web-Server]

В ответ получим довольно большой список. Установленные роли и компоненты будут отмечены крестиком и визуально выделены зеленым цветом. Результат выполнения команды можно сохранить в файл формата XML, указав последним аргументом его имя:

> servermanagercmd -query c:\Query.xml

Внутри образованного файла будет несколько десятков строк вроде этой:

<Role DisplayName="DHCP-сервер" Installed="false" Id="DHCP" />

Последним в описании роли или компонента в квадратных скобках идет идентификатор команды [command-Id]. Чтобы установить или удалить роль/компонент, достаточно узнать идентификатор и затем использовать в качестве значения параметра. Например, установим роль файлового сервера. Находим его идентификатор и вводим:

> servermanagercmd –install FS-FileServer

Но нужно быть внимательным при выборе Id. Возьмем такие, казалось бы, похожие строки:

Веб-сервер IIS (Web-Server)
Веб-сервер (Web-WebServer)

При установке Web-Server будут автоматически добавлены все роли, относящиеся к IIS, – то есть ASP, ASP.NET, CGI, Web Security и другие. Дополнительные компоненты для Web-WebServer необходимо указать самостоятельно.

Дабы уберечь админа от лишних экспериментов, предусмотрен полезный параметр '-whatIf' («А что если»). При его использовании само действие выполняться не будет, но покажут все Id, которые планируются к установке/удалению, а также дополнительную информацию (потребуется ли перезагрузка). В последнем случае, чтобы не производить перезагрузку вручную, просто добавляем ключ '-restart' к вызову ServerManagerCmd. Некоторые роли или компоненты требуют наличия других компонентов. Чтобы установить все зависимости, добавь '-allSubFeatures/-a'.
Удалить выбранный Id можно так:

> servermanagercmd –remove Web-Server –restart –resultPath result.xml

Параметр '–resultPath/-rp' позволяет сохранить результат выполнения в файл, что будет полезно для дальнейшего анализа. Ключи '-install' и '-remove' можно использовать только к одному компоненту. Для одновременной установки и/или удаления нескольких ролей более эффективно применять ключ '-inputPath' с указанием XML-файла с настройками (его формат аналогичен полученному при помощи '-query').

Добавлю, что утилита ServerManagerCmd в Server Core отсутствует, а одновременное использование графической и командной оболочек Server Manager вызовет ошибку.

Полезные параметры Netsh

Об утилите Netsh (network shell) написано довольно много, а, учитывая ее важность и отличия реализации в разных версиях Windows, со временем напишут еще больше. Появилась Netsh в процессе создания Win2k под влиянием продукции Cisco (тогда Microsoft и Cisco Systems имели общие интересы). С ее помощью легко можно просмотреть и изменить сетевые настройки как локальных, так и удаленных систем, управлять настройками WFAS (Windows Firewall with Advanced Security), диагностировать и восстанавливать работу сетевого интерфейса и многое другое. Утилита может работать в автономном и пакетном (то есть, запуск набора команд из сценария) режимах. Группы настроек, относящихся к конкретному сетевому компоненту, в терминологии Netsh называются контекстом. Доступные контексты реализуются посредством подключения DLL, и в разных версиях Windows их свойства и возможности несколько отличаются, поэтому руководства для Netsh от других систем к Win2k8 подходят лишь частично. Чтобы получить помощь по доступным контекстам, открываем консоль CMD.exe и вводим «netsh /?».

Получив список контекстов (в Win2k8 их 15, остальные - вспомогательные команды), идем дальше. Например, чтобы узнать команды контекста interface, вводим «netsh interface /?».

Как вариант, все команды можно вводить, перемещаясь по контексту к субконтекстам и параметрам. Другими словами, сначала вводим «netsh» и, получив приглашение консоли «netsh>», вводим следующую команду, – после чего вид приглашения изменится. Чтобы вернуться на уровень вверх, набираем две точки: «..». Также нужно знать, что Netsh работает в одном из двух режимов: интерактивный (online) и автономный (offline). В online все команды выполняются сразу после того, как закончен их ввод. Режим offline позволяет ввести несколько настроек, а затем все их одновременно активировать, введя последней команду commit (отмена - flush) или переключившись в online-режим. Чтобы узнать, в каком режиме сейчас находится Netsh, используем "show mode". Для установки требуемого режима введи online или offline. Например, посмотрим текущие настройки интерфейсов:

netsh> interface
netsh interface> show interface

Сценарий конфигурации интерфейсов смотрим при помощи «interface dump», при необходимости перенаправляя вывод в файл:

> netsh interface dump > C:\interface.txt
> more C:\interface.txt

Полученный таким образом файл можно использовать как шаблон для настройки других компьютеров сети. Для того чтобы указать утилите на файл сценариев, используем флаг '–f'.

Для удобства Netsh предлагает возможность задания псевдонимов (alias), которыми можно заменить длинные команды. Например, зададим псевдоним showip, позволяющий получить IP-адрес интерфейса:

netsh> alias showip interface ipv4 show ipaddresses

Проверяем:

netsh> showip

Чтобы установить IP-адрес интерфейса, вместо show используем set:

netsh> interface ipv4 set address name="имя интерфейса, полученное при помощи showip" static 192.168.0.10 255.255.255.0 192.168.0.1

В этом примере интерфейсу задан IP-адрес 192.168.0.10 с соответствующей сетевой маской и шлюзом 192.168.0.1. Динамический адрес задается проще:

netsh> interface ipv4 set address "Local Area Connection" source=dhcp

Заменив в этом примере set на add, можно указать сетевому интерфейсу второй IP-адрес:

netsh> interface ipv4 add address 234.234.234.234 255.255.255.0

В Сети нетрудно найти несколько ресурсов, предлагающих в удобной форме сгенерировать нужную команду для Netsh. Например, по адресу platformlabs.com/bag/net.htm находится генератор команд для привязки IP-адресов к сетевому интерфейсу.

При помощи Netsh можно управлять настройками не только локальной, но и одновременно нескольких удаленных машин. В этом случае используется ключ '–r' (или команда «set machine»), после которого указываются WINS/UNC/DNS имена или IP-адреса. Для доступа используем ключ '–u' – после него задаем учетную запись, от имени которой будем производить действие, и '–p' – для пароля:

> netsh -r Win1 \\test server.ru -u administrator -p MyPassw0rd showip

В этом примере мы запросили сетевые настройки на трех системах, на которые указали при помощи WINS/UNC/DNS имен. Аналогично происходит работа и в других контекстах. Используя справку и немного поэкспериментировав, разобраться во всем легко. Мы же подробнее рассмотрим настройку WFAS.

Настройка WFAS при помощи Netsh

Контексты advfirewall и firewall позволяют просматривать и управлять настройками встроенного в Win2k8 межсетевого экрана. В WFAS встроено три профиля: доменный (Domain), частный (Private) и общий (Public). Чтобы просмотреть их установки, вводим следующие команды:

netsh> advfirewall show allprofiles
netsh> advfirewall show currentprofile

Контекст firewall (он же advfirewall firewall) непосредственно отвечает за правила брандмауэра. WFAS после установки уже имеет целый ряд заранее подготовленных правил:

netsh> firewall show rule name=all

Приготовься, вывод будет очень большой, поэтому для анализа лучше задать перенаправление в файл. Для каждого правила будут показаны его имя, статус (включено/выключено), направление, профиль, локальный/удаленный адрес и порт. Взяв любое из них, можно на его основе легко создать собственные правила.
Для установки нового правила используется команда «add rule». Например, блокируем входящие соединения на VNC-порт (по умолчанию от 5900 до 5906):

netsh> firewall add rule name="Block In VNC" dir=in localport=5900-5906 action=block

Тем, кто создавал правила при помощи графической утилиты, назначение основных параметров должно быть понятно. Так, ключ name задает имя правилу (должно быть уникальным, all зарезервировано). Если создать несколько правил с одним именем, то они будут рассматриваться как одно правило. Скажем, вместо одного, можно задать семь правил name="Block In VNC", индивидуально указывая localport. Направление трафика (входящий или исходящий) задается при помощи dir=in|out. На действие при совпадении указывает action=allow|block|bypass (в последнем случае разрешаются только авторизованные подключения). Кроме показанных параметров, правило позволяет задать: программу (program=полный_путь), сервис (service=краткое_имя), локальный (localip) или удаленный (remoteip) IP-адрес, тип интерфейса (interfacetype), протокол (protocol) и другие. Для удаления правила используется ключ delete.

Также как и для остальных контекстов, параметр dump позволяет просмотреть и сохранить сценарий настройки в файл. Затем его можно использовать как шаблон в других системах.

Не менее полезными являются команды субконтекста «netsh firewall set». К примеру, чтобы полностью отключить брандмауэр, достаточно ввести:

netsh> firewall set opmode disable

Для включения, соответственно, меняем disable на enable. Используя netsh, очень просто открыть или закрыть порт:

netsh> firewall set portopening 80 "Веб-сервер"

По умолчанию порт открывается (mode=ENABLE). Чтобы закрыть доступ к порту, используем mode=DISABLE. Можно ограничить доступ к порту только из определенных IP-адресов или сетей:

netsh> firewall set portopening 110 "Локальная POP3 почта" CUSTOM 192.168.0.0/24

Теперь доступ к порту 110 открыт только для компьютеров из сети 192.168.0.0. Аналогично портам есть возможность блокировки разрешения/доступа для определенных программ – «set allowedprogram». При помощи «set logging» настраивается журналирование работы WFAS.

Служба удаленного управления WinRM

В Vista, Win2k3 R2 и Win2k8 включены мощные средства командной строки, предлагающие системным администраторам улучшенные возможности удаленного управления и удаленного выполнения программ на машинах с Windows. Речь идет о службе удаленного управления WinRM (Windows Remote Management) и ее клиентской части WinRS (Windows Remote Shell).

Перед использованием следует узнать, что служба WinRM должна быть запущена на обеих системах, участвующих в управлении, а все узлы должны быть членами одного домена. Подключение производится через стандартные порты 80/443 (HTTP/S), что не требует перестройки правил межсетевого экрана. Если порты уже «заняты» IIS, то это не помеха, так как WinRM способен обнаружить «свой» код в потоке. Для выполнения задач используется база данных инструментария управления Windows - WMI (Windows Management Instrumentation).

В Win2k8 WinRM уже установлен, но по умолчанию не включен. Проверим это и перейдем к настройке:

> winrm enumerate winrm/config/Listener
> winrm quickconfig

Собственно, будет задан всего один вопрос - хотим ли разрешить удаленный доступ. Отвечаем «y», утилита сообщит об активации WinRM и создании правила исключения для Windows Firewall. Для проверки работы можно снова выполнить первую команду, которая выведет данные о новом Listener.
Для подключения к серверу WinRM используем утилиту winrs, указав через ключ '-r' имя машины и в скобках – команды, которые нужно выполнить. Формат вызова такой:

winrs -r:[http|https://]"ServerName": –u:Domain\Username –p:Password команда

По умолчанию используется http, локальный узел и текущие учетные записи. Вот так мы получим вывод ipconfig на локальной системе:

> winrs ipconfig

А теперь выполним ту же команду на удаленной системе server.com через 80-ый порт:

> winrs -r:server.com ipconfig

Остановить выполнение команды с внушительным выводом можно при помощи комбинации <Ctrl+C> или <Ctrl+Break>.
Удалить созданный WinRM можно следующим образом:

> winrm delete winrm/config/listener?IPAdress=*+Transport=HTTP

Полезные мелочи

Кроме специфических для Win2k8, никуда не делись стандартные утилиты, которые будут полезны в повседневной работе. Так, ipconfig используется для просмотра настроек сетевых интерфейсов и обновления параметров DHCP и DNS. Чтобы получить текущие настройки адаптеров, достаточно запустить утилиту без дополнительных аргументов. Ключ '/all' позволит увидеть чуть большее количество параметров. Для просмотра содержимого DNS-кэша используй ключ '/displaydns'. В результате получаем таблицу с данными: имя узла, адрес, срок жизни и так далее. Чтобы очистить DNS-кэш, вводим:

> ipconfig /flushdns

При настройке правил WFAS может понадобиться информация о привязке программ и служб к открытым портам. Получить список открытых портов можно при помощи команды netstat. Ключей у нее много, для нашей задачи полезными будут четыре:

  • a – отображение всех подключений и портов в режиме ожидания (TIME_WAIT);
  • n – вывод адресов и номеров портов в числовом формате;
  • b – исполняемый файл, участвующий в создании соединения;
  • o – показывать идентификатор процесса.

Смотрим:

> netstat -anbo
UDP 0.0.0.0:123 *:* 1024 W32Time [svchost.exe]

Периодически следует запускать эту команду, чтобы контролировать изменения, происходящие в системе. При ручном контроле можно использовать команду find, чтобы отобрать информацию по определенному критерию:

> netstat –anbo | find "LISTENING"

Как вариант, можно сохранить вывод в файл, а затем сравнить старый и новый файл при помощи утилиты fc. Например, так:

> netstat –a > netstat-01.12.08.txt
> netstat –a > netstat-01.01.09.txt
> fc netstat-01.12.08.txt netstat-01.01.09.txt

Без параметров tasklist выведет таблицу всех процессов. Используя дополнительные ключи, можно узнать больше о процессе с нужным PID:

> tasklist /SVC /FI "PID eq 1024"

В результате получим список служб (ключ '/SVC'), связанных с процессом, имеющим идентификатор 1024.

INFO

  • Возможности командной строки в Windows Server 2008 существенно изменились.
  • Сервис WinRM использует стандартные 80 и 443 порты.
  • Подробности о возможностях cmd.exe можно узнать из статьи «Меняем окна на консоль» в X_05_2007 (www.xakep.ru/magazine/xa/101/154/1.asp).

WWW

  • Подробнее все параметры ServerManagerCmd описаны в документе «Server Manager Technical Overview Appendix», доступном на TechNet – technet.microsoft.com/en-us/library/cc875805.aspx.
  • По адресу platformlabs.com/bag/net.htm находится онлайн-генератор команд для привязки IP-адреса к сетевому интерфейсу.
Содержание