Главная » 2009»Июль»3 » Универсальный диспетчер служб Service Controller
Универсальный диспетчер служб Service Controller
02:08
Универсальный диспетчер служб Service Controller Марк
Минаси
Приверженцам командной строки нравится возможность
управлять службами 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_MACHINE\SYSTEM\CurrentControlSet\Services, гдеоперационнаясистема 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:\wc\wcmail.exe. Простейшая установочная команда
диспетчера SC — sc create Webimagemailer
binpath= C:\wc\wcmail.exe
на которую диспетчер служб ответит кратким
сообщением
/SC/CreateService SUCCESS.
Эта команда выполняет несколько задач. В частности,
она создает подраздел под названием Web imagemailer в разделе HKEY_ LOCAL_
MASHINE\SYSTEM\CurrentControlSet\Services. Внутри этого подраздела диспетчер
служб SC создает другие подразделы под названиями Enum («Перечень») и Security
(«Безопасность») — такие разделы имеет в реестре большинство служб. Внутри этих
подразделов имеется некоторое количество параметров для настройки, которые
устанавливает диспетчер SC, но возможность для их точной настройки появится
несколько позже. Один из этих параметров, ImagePath, содержит местоположение
службы, которое было установлено в SC через ключ binpath= parameter. Диспетчер
SC ведет себя несколько странно по отношению к своим параметрам, в данном
случае требуется пробел между параметром и знаком равенства.
Исследование встроенных служб в MMC показывает, что теперь имеется
служба под названием Webimagemailer, запускающаяся вручную и работающая в
рамках локальной системы. Здесь можно было бы задействовать параметр start=
parameter, который использует boot, system, auto, demand (ключи диспетчера SC
для запуска вручную) или disabled — для настроек запуска. Таким же образом
возможно использование параметра obj= username для задания учетной записи, от
имени которой функционирует диспетчер SC. Также необходимо уделять внимание
проблеме безопасности и не запрашивать малоизвестную службу, которая
выполняется в рамках локальной системы. Можно было бы ввести учетную запись под
названием, скажем, Webcamguy с паролем swordfish и только самые необходимые
разрешения для того, чтобы wcmail.exe выполнила работу, и ничего более. Но раз
уж мы занялись этим делом, имя Webimagemailer выглядит несколько неуклюже на
фоне уже существующих служб. Воспользовавшись ключом displayname= «descriptive
name», можно изменить его.
Еще одна попытка
Итак, теперь нам нужно создать модернизированную
команду, которая будет работать лучше. Чтобы удалить первую попытку и
освободить место для следующей, требуется набрать
sc delete Webimagemailer
Эта команда помечает службу для удаления; для
достижения результата требуется перезагрузиться. Теперь можно добавить новый
тип запуска, учетную запись службы и отображаемое имя:
Обратите внимание, важно оставить пробел после
знака равенства.
Точная настройка
Предположим, что служба отлично работает, но если
вы по каким-то причинам отсоедините от компьютера 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 — 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
Config.
Принцип действия команды SC Config
Возможности команды SC Config в основном такие же, как
у команды SC Create, о которой было рассказано в прошлых
статьях. Типовойсинтаксискомандывыглядиттак:
Пример, который наглядно показывает эффективность команды:
с тех пор как в пакете Windows Server 2003 SP1 и Windows XP SP2
служба Messenger была отключена, я довольно часто получаю по электронной
почте сообщения от пользователей, которые уверены в необходимости этой
службы. Некоторым пользователям кажется очень удобной команда Net Send. Чтобы
настроить службу Messenger для автоматического запуска при начальной загрузке
компьютера, следует набрать команду:
sc config messenger option= auto
Особенность синтаксиса SC — необходимость в пробелах
между знаком равенства и значением параметра. Другие возможные параметры:
boot, system, demand (вручную) и disabled.
Кстати, в Windows Vista имеется еще один параметр —
delayed-auto, который отображает режим задержанного старта службы операционной
системы. Реализация служб с задержанным запуском отражает решение компании
Microsoft, предусматривающее, что многие службы должны запускаться автоматически,
но не обязательно немедленно. Для Microsoft важно, чтобы операционная система
Vista была запущена и готова к работе как можно быстрее,
а операционные системы XP и Windows 2000 загружаются медленно отчасти
потому, что приходится ждать автозапуска служб, которые всегда запускаются
безотлагательно.
Другие полезные параметры команды SC Config: password, error,
depend и, возможно, obj. Я уже рассказывал о параметрах obj
и password. В одной из предыдущих статей речь шла об их использовании
для создания новой службы: obj= позволяет указать учетную запись для запуска
службы с применением команды SC Config, так же как параметр obj= задает
учетную запись службы в команде SC Create. Учетная запись службы меняется
нечасто, но иногда приходится менять пароли учетных записей, и для этого
можно задействовать параметр password=. Если у службы с именем
myservice есть учетная запись, пароль которой должен быть изменен на swordfish,
сообщить об этом операционной системе можно следующим образом:
sc config myservice password= swordfish
Параметр error= можно применить, чтобы управлять работой
Windows в случае сбоя службы. Создавая новую службу, можно настроить
операционную систему на переход в один из четырех режимов в случае
отказа службы: ignore — сбой просто регистрируется в журнале событий;
normal — выдача сообщения, подтверждающего отказ службы, но работа системы
продолжается; severe — система перезагружается в последней исправной
конфигурации и предпринимается попытка продолжить работу; critical —
система перезагружается, служба запускается повторно и в случае
нового отказа возникает «голубой экран». Можно настроить Windows так, чтобы
операционная система не функционировала, если не работает служба myservice
(естественно, к этой мере следует прибегать лишь в крайних случаях):
sc config myservice error= critical
У утилиты SC Config есть еще одна особенность, которая
заслуживает внимания. В трех предыдущих статьях отмечалось, что в тех
случаях, когда для команды можно указать более одной пары параметр/значение, пары
разделяются косой чертой. В качестве примера приводился метод
с параметром depend=. То же самое относится и к синтаксису
команды SC в Vista. Однако в команде SC Config несколько параметров
разделяются просто пробелами. Это типично для сценариев, но плохо сочетается
с остальными синтаксическими правилами команды SC. Например, объединить
две последние команды в одну можно следующим образом:
Требуется управлять службой из командной линии, чтобы
использовать командный файл? Как задействовать текстовый интерфейс для
дистанционной настройки системы через канал связи с малой пропускной
способностью? Возможно, для решения этих задач достаточно освоить командную
строку, чтобы работать с будущим продуктом Server Core, управление
функционированием которого осуществляется исключительно из командной строки.
Какими бы ни были потребности пользователя, команда SC пригодится всегда.