Приверженцам командной строки нравится возможность управлять службами Windows с помощью приглашения командной строки на ввод, но до недавнего времени в нашем распоряжении были лишь команды Net Start, Net Pause, Net Continue и Net Stop, то есть «запустить», «приостановить», «продолжить» и «остановить» работу сетевой службы.

Если есть желание узнать больше о службах, запускаемых с командной строки, необходимо исследовать возможности инструмента SC (sc.exe), который реализован в операционной системе Windows XP и более новых версиях.

Как он выглядит?

Команды SC задаются в соответствии со следующей структурой:

sc [] []

где необязательный параметр servername просто указывает на систему, в которой будет выполняться команда, параметр command — это особая подкоманда SC (например, pause, start, create, delete), параметр servicename — внутреннее имя службы, а параметр options относится к любым ключам, которых требует подкоманда. Простой пример:

sc server1 stop Lanmaserver

подключается к системе server1 и останавливает службу сервера, имеющую внутреннее служебное имя lanmanserver. Если нужно остановить службу сервера локально, параметр servername лучше опустить.

Внутреннее имя

Как видно из примера, необходимо знание внутреннего имени службы. Если предположить, что высвечиваемое имя для службы файлового сервера — Server, и попробовать команду

sc stop server

SC выдаст ошибку. Работает только параметр lanmanserver. Внутреннее имя также называется key name, потому что lanmanserver — это наименование раздела реестра внутри HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices, где операционная система Windows хранит информацию об этой особой службе. Если известно более приемлемое отображаемое имя, такое как Server для службы файлового сервера или DNS для службы сервера DNS Server, можно использовать команду getkeyname для преобразования отображаемого имени в ключевое имя. Например, чтобы найти ключевое имя для службы сервера DNS Server, можно задействовать команду

sc getkeyname

Выполнение этой команды покажет, что ключевое имя службы сервера DNS Server — DNS. Кстати, для SC это значения не имеет. Данный процесс можно пускать в обратном порядке и по ключевому имени получать более подходящее отображаемое имя при помощи команды getdisplayname.

Как он работает?

Диспетчер SC имеет четыре команды, которые соответствуют упомянутым выше сетевым командам: start, stop, pause и continue. Например, чтобы приостановить работу службы сервера, можно ввести

sc pause server

Команда SC stop ведет себя несколько иначе, чем в оснастке MMC (Microsoft Management), и не так, как команда Net Stop, которая понимает, что служба Computer Browser зависит от службы сервера. Оснастка и команда Net Stop спрашивают, нужно ли остановить работу службы Computer Browser, в то время как SC просто не выполнит операцию с сообщением

A stop control has been sent to a service that other running services are dependent on

Другими словами, в этом примере SC действует не так «разумно», как другие команды.

Однако с помощью команды enumdepend можно определить, какие еще службы зависят от данной службы:

sc enumdepend Lanmanserver

В ответ SC представит отчет о том, что служба DNS и служба браузера зависят от службы сервера. Но эта информация будет в кратком формальном виде. Например, можно использовать команду query, чтобы запросить службу о ее текущем состоянии. Запрос службы сервера

sc query Lanmanserver

возвращает информацию, которая показана на экране. Это основной способ вывода информации диспетчером SC о работе службы.

Создание служб

Рассмотрим одну из подкоманд диспетчера служб — ту, что позволяет создавать новые службы.

Предположим, нам необходимо установить новую службу, которая каждые несколько минут перехватывает изображения Web-камеры и отправляет их по определенному адресу. Эта служба распространяется бесплатно и не имеет хорошей документации. Все, что о ней известно, — это название wcmail.exe и то, что она была расположена по адресу C:wcwcmail.exe. Простейшая установочная команда диспетчера SC — sc create Webimagemailer binpath= C:wcwcmail.exe

на которую диспетчер служб ответит кратким сообщением

/SC/CreateService SUCCESS.

Эта команда выполняет несколько задач. В частности, она создает подраздел под названием Web imagemailer в разделе HKEY_ LOCAL_ MASHINESYSTEMCurrentControlSetServices. Внутри этого подраздела диспетчер служб SC создает другие подразделы под названиями Enum («Перечень») и Security («Безопасность») — такие разделы имеет в реестре большинство служб. Внутри этих подразделов имеется некоторое количество параметров для настройки, которые устанавливает диспетчер SC, но возможность для их точной настройки появится несколько позже. Один из этих параметров, ImagePath, содержит местоположение службы, которое было установлено в SC через ключ binpath= parameter. Диспетчер SC ведет себя несколько странно по отношению к своим параметрам, в данном случае требуется пробел между параметром и знаком равенства.

Экран. Запрос команды output
Исследование встроенных служб в MMC показывает, что теперь имеется служба под названием Webimagemailer, запускающаяся вручную и работающая в рамках локальной системы. Здесь можно было бы задействовать параметр start= parameter, который использует boot, system, auto, demand (ключи диспетчера SC для запуска вручную) или disabled — для настроек запуска. Таким же образом возможно использование параметра obj= username для задания учетной записи, от имени которой функционирует диспетчер SC. Также необходимо уделять внимание проблеме безопасности и не запрашивать малоизвестную службу, которая выполняется в рамках локальной системы. Можно было бы ввести учетную запись под названием, скажем, Webcamguy с паролем swordfish и только самые необходимые разрешения для того, чтобы wcmail.exe выполнила работу, и ничего более. Но раз уж мы занялись этим делом, имя Webimagemailer выглядит несколько неуклюже на фоне уже существующих служб. Воспользовавшись ключом displayname= «descriptive name», можно изменить его.

Еще одна попытка

Итак, теперь нам нужно создать модернизированную команду, которая будет работать лучше. Чтобы удалить первую попытку и освободить место для следующей, требуется набрать

sc delete Webimagemailer

Эта команда помечает службу для удаления; для достижения результата требуется перезагрузиться. Теперь можно добавить новый тип запуска, учетную запись службы и отображаемое имя:

sc create webimagemailer binpath= C:wcwcmail.exe
start= auto displayname=
obj= .webcamguy password= swordfish

Обратите внимание, важно оставить пробел после знака равенства.

Точная настройка

Предположим, что служба отлично работает, но если вы по каким-то причинам отсоедините от компьютера Web-камеру и потом забудете подключить ее обратно, то будете получать сообщение

At least one service or driver failed during startup

всякий раз при загрузке компьютера. Служба Webcam удобна, но не настолько важна, чтобы позволить ей надоедать беспрестанными напоминаниями о том, что Web-камера не подключена. Поэтому лучше убрать это сообщение.

В данной ситуации следует воспользоваться ключом error= parameter. Система Windows следит за тем, как запускаются службы, и можно настроить ответ операционной системы на несостоявшийся запуск четырьмя способами: обычный, режим по умолчанию; выводит сообщение на экран и начинает работу Windows в нормальном режиме; игнорирующий — просто отправляет сообщение в журнал событий; требовательный — распознает службу или драйвер по степени значимости и запускает перезагрузку операционной системы в последней известной хорошей конфигурации; и, наконец, критический, — вынуждает систему Windows осуществить перезагрузку до последней известной удачной конфигурации, но предписывает выдавать «синий экран», если драйвер или служба все еще не загружены.

Итак, следует удалить службу, перезагрузиться, добавить параметр error= ignore — и все должно быть в порядке. По крайней мере, до тех пор, пока не настанет необходимость решать определенные проблемы со взаимозависимостью служб.

Три подкоманды для SC

Продвинемся немного глубже. Предположим, что Webimagemailer не запускается до тех пор, пока не заработает служба распознавания изображений WIA (Windows Image Acquisition) с ключевым именем stisvc. В терминологии служб это означает, что Webimagemailer зависит от stisvc. Чтобы Webimagemailer получил инструкцию ожидания запуска stisvc, прежде чем начать работу, следует добавить параметр depend= stisvc. Необходимо помнить, что диспетчер SC требует оставлять пробел между знаком равенства и значением параметра. Чтобы определить, какая служба находится в зависимости от некоторых других служб, нужно составить список ключевых имен служб, разделенных левой наклонной чертой. Например, чтобы создать службу Webimagemailer и задать запуск служб stisvc и webclient до начала ее работы, следует набрать

sc create webimagemailer binpath= C:wcwcmail.exe
start= auto displayname=
obj= .webcamguy password= swordfish
error= ignore depend= stisvc/webclient

Раз уж мы затронули вопрос о зависимостях, можно воспользоваться тремя подкомандами SC — enumdepends, qc и config, чтобы запросить о них диспетчер SC. Если требуется определить, какие службы будут зависеть от данной службы, можно набрать

sc enumpend

Теперь, чтобы увидеть, какие службы находятся в зависимости от службы сервера под названием lanmanserver, надо напечатать

sc enumdepend Lanmanserver

Запуск такой команды на моем тестовом сервере Windows 2003, например, показывает, что службы Netlogon, Dfs, а также службы браузера компьютера находятся в зависимости от службы сервера.

Для завершения и определения зависимостей сервера можно воспользоваться подкомандой qc, как показано ниже

sc qc Lanmanserver

Эта команда выдает девять строчек информации о службе, одна из которых DEPENDENCIES. При запуске этой команды выясняется, что сервер не зависит ни от каких служб. Чтобы узнать, какие службы имеют более одной зависимости, можно протестировать диспетчер на службе Netlogon. Мы увидим, что служба Netlogon для начала работы требует запуска служб и сервера, и Workstation.

Иногда зависимости бывают более сложными. Например, некоторые службы могут начать работу, только если запущена одна из трех других служб. Запуск всех трех необязателен, вполне достаточно одной. Можно проинструктировать Windows по поводу такой динамики, информируя систему о том, что данная служба находится в зависимости от группы служб. В системе Windows имеется целый ряд таких служб, как, например, SCSI CDROM Class, SCSI miniport, Parallel arbitrator, NetBIOSGroup, NDIS, а также службы первичного диска и многие другие. Все эти службы и драйверы можно увидеть в списке групп, набрав

sc query type= service?driver?all group=

Например, чтобы посмотреть все службы и драйверы в группе служб первичного диска, нужно набрать

sc query type= all group=

Названия групп значения не имеют. Можно добавлять службы в имеющиеся группы или создавать новые группы служб, добавив команду group= groupname в команду SC Create или используя SC Config для сохранения службы в какую-либо группу. Например, чтобы добавить службу Webimagemailer в новую группу под названием unimportant, надо набрать

sc config webimagemailer group= unimportant

Однако нельзя поместить службу или драйвер в более чем одну группу служб.

Кроме того, можно сделать так, чтобы не происходила загрузка службы Webimagemailer без необходимой группы служб. Чтобы определить фиктивную группу Webstartup, воспользуемся параметром depends= webstartup. Чтобы указать Windows, что Webstartup — это группа, а не еще одна служба, следует перед ее именем поставить знак «плюс». Например, для перенастройки службы Webimagemailer на зависимость от группы запуска Webstartup, надо набрать

sc config webimagemailer depends= +webstartup

Таким образом, мы выяснили, как использовать зависимости и группы для более детального управления порядком загрузки службы. И теперь никто не удивится, почему я был так доволен, когда несколько лет назад обнаружил диспетчер SC.

Марк Минаси - Редактоp Windows IT Pro, MCSE и автор книги Mastering Windows Server 2003 (издательство Sybex). mark@minasi.com