Сервисы Windows (120
..pdfМосковский государственный технический университет имени Н.Э. Баумана
В.А. Крищенко, Н.Ю. Рязанова
СЕРВИСЫ WINDOWS
Рекомендовано Научно-методическим советом МГТУ им. Н.Э. Баумана в качестве учебного пособия по курсам
«Системное программирование – введение в операционные системы» è «Управление устройствами»
Москва Издательство МГТУ им. Н.Э. Баумана
2011
ÓÄÊ 681.3.06 ÁÁÊ 32.81
Ê82
Рецензенты:
А. А. Рощин, Н. В. Лукьянова
Крищенко В. А.
К82 Сервисы Windows : учеб. пособие / В.А. Крищенко, Н.Ю. Рязанова. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2011. – 47, [1] с.: ил.
Рассмотрены служебные программы (службы) операционных систем (ОС) Windows NT/2000/XP/Vista, работающие в режиме пользователя и занимающие в ОС Windows NT/2000/XP/Vista особое место. На службы Win32 возложены такие важнейшие системные функции, как сохранение копий отдельных файлов, управление конфигурацией сети, загрузки и обновления ОС Windows и т. п. Рассмотрены особенности работы, использования, установки и разработки служб Win32.
Для студентов 3-го и 4-го курсов, обучающихся на кафедре «Программное обеспечение ЭВМ и информационные технологии» МГТУ им. Н.Э. Баумана.
ÓÄÊ 681.3.06
ÁÁÊ 32.81
© МГТУ им. Н.Э. Баумана, 2011
Введение
В различных операционных системах (ОС) используются разные способы выполнения служебных заданий одновременно с основной работой без снижения скорости интерактивного взаимодействия с пользователем. В ОС семейства Unix для этого существуют демоны, выполняемые в фоновом режиме. В ОС Windows возможность запуска процессов, не связанных с работой интерактивного пользователя, осуществляется службами, или сервисами, в которых используются функции интерфейса (Win32 API*) и которые работают в режиме пользователя.
Заметим, что, к сожалению, термин «сервис» используется фирмой Microsoft для обозначения совершенно разных программных средств ОС Windows. Этот термин обозначает и драйверы устройств, и низкоуровневые сервисы ОС, такие как NtCreateProcess, являющиеся внутрисистемными сервисами, и собственно сервисы, т. е. серверные приложения, являющиеся процессами пользовательского режима. Последние часто называют сервисами Win32. На множественность понятия «сервис» в документации Windows обращают внимание М. Руссинович и Д. Соломон [1, с. 6]. Примером Windows-сервиса может служить Web-сервер, который должен запускаться при запуске ОС и работать независимо от того, зарегистрировался ли в ней какой-либо пользователь.
Windows-сервисы являются частью ОС и взаимодействуют с SCP-приложением (Service Control Program – программа управления сервисами) и диспетчером управления сервисами (Service Control Manager – SCM). В учебном пособии обсуждаются особенности работы и написания сервисных приложений режима пользователя, учетные записи сервисов и работа SCM.
* API (Application Interface Functions) – функция прикладного интерфейса.
3
1.СЛУЖБЫ WINDOWS
1.1.Программа – служба
Сервис, или служба, ОС Windows (Windows Service) – это Win32приложение, которое особым образом обрабатывается ОС. Службы Microsoft Windows, ранее называвшиеся службами NT, позволяют создавать исполняемые приложения, работающие длительное время и выполняющиеся в отдельной сессии ОС Windows.
Основное отличие сервиса от обычного приложения заключается во взаимодействии его с SCM. Именно влияние SCM на работу сервиса определяет его особенности:
•сервис имеет определенную структуру, которая позволяет ему принимать информацию и команды от SCM;
•сервис в общем случае не является последовательно исполняемой программой, так как имеет несколько точек входа, т. е. содержит функции, вызываемые в ответ на определенные события в ОС;
•сервис может выполняться от имени любой учетной записи независимо от наличия вошедших в систему пользователей и их числа. Этот факт оказывает влияние, не запрограммированное специально для сервисов, а являющееся следствием работы механизмов ОС, отвечающих за пользователей и их права, на принципы взаимодействия сервисов с ОС и другими программами.
Как правило, Windows-сервис не имеет пользовательского интерфейса, что позволяет создавать сервис или как GUI*-приложение (с функцией WinMain), или как консольное приложение (с функцией main).
Сервис может быть запущен несколькими способами:
•автоматически при загрузке ОС;
•пользователем через панель управления сервисами;
* GUI (Graphic User Interface) – графический интерфейс пользователя.
4
•с помощью специально написанного приложения;
•путем вызова функций управления сервисами.
Запущенный одним из перечисленных способов процесс может содержать в себе несколько сервисов, выполняющихся в различных потоках. Например, сервис Services.exe содержит около 10 других сервисов, в том числе сервисы DHCP Client, Messenger и Alerter. Потоки не имеют собственного адресного пространства и разделяют адресное пространство своего процесса. Запуск каждого процесса связан с переключением полного контекста, что расточительно с точки зрения временных затрат. Переключение потоков выполняется значительно быстрее. Но подобная оптимизация имеет один недостаток – SCM позволяет таким сервисам работать только от имени ОС. Другими словами, в настройках сервиса нельзя указать другие имя пользователя и пароль.
Управление сервисами можно осуществлять программно, обращаясь к предоставляемой SCM API, либо через соответствующую оснастку консоли управления (Microsoft Manager Console – MMC).
1.2. Три компонента сервиса
Для работы сервисов предназначены три вида компонентов ОС Windows.
1.SCM, исполняемый файл которого \Windows\System32\ Services.exe является консольным приложением. Процесс запускается автоматически в момент начальной загрузки ОС и прекращает работу в момент ее выгрузки. Очевидно, что SCM-процесс запускается с привилегиями ОС и предоставляет унифицированный и безопасный интерфейс сервисам системы. Задача SCM – управлять сервисами: запускать, настраивать, приостанавливать, продолжать и завершать их работу.
2.Сам сервис, по сути являясь Win32-приложением, содержит дополнительный код, позволяющий ему принимать информацию и команды от SCM и возвращать ему статусную информацию.
3.SCP-приложение – это Win32-приложение, которое предоставляет пользователю графический интерфейс для работы с сервисами. Такая программа позволяет пользователю управлять работой сервиса: запускать, приостанавливать, возобновлять и
5
останавливать его работу. Поскольку SCM является RPC*-серве- ром, то SCP-приложение может взаимодействовать с ним удаленно. Администратор, используя SCP-приложение на одном компьютере, может посредством SCM другого компьютера управлять работой на нем сервисов. Для этого в SCP-приложении используются специальные функции управления сервисом, позволяющие обращаться к SCM.
1.3. Особенности SCM
Сервисы, рассматриваемые в этом учебном пособии, – это процессы режима пользователя. Они похожи на процессы-демоны Unix
èмогут быть запущены автоматически при запуске ОС. Этими сервисами управляет специальный системный процесс – SCM (\Windows\System32\Services.exe), отвечающий за запуск, остановку
èвзаимодействие с процессами сервисов. Другими словами, SCM исполняется в процессе Services.exe и является консольным Win32-приложением. Место SCM в архитектуре ОС Windows показано на рис. 1.
Для взаимодействия SCM с сервисами ОС Windows предоставляет специальные API-функции, с помощью которых выполняются такие действия, как регистрация успешного запуска сервиса, ответы на запросы о состоянии сервиса, приостановка или завершение работы сервиса.
Процесс Winlogon запускает SCM на начальном этапе загрузки ОС вызовом функции SvcCtrlMain. Функция SvcCtrlMain создает синхронизирующее событие с именем SvcCtrlEvent_A3752DX и устанавливает для него состояние «занято». Затем функция SvcCtrlMain вызывает функцию SvcCreateServiceDB, которая создает базу данных сервисов SCM. Функция SvcCreateServiceDB считывает и сохраняет в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Control\ServiceGroupOrder в параметре List типа REG_MULTI_SZ список имен и порядок определенных групп сервисов. Если сервису или драйверу нужно отслеживать порядок запуска относительно других групп, то в раздел реестра этого сервиса включается параметр Group.
* RPC (Remote Procedure Call) – вызов удаленной процедуры.
6
. 1. Windows
В разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Control\Services находится база данных SCM (рис. 2). Для каждого установленного драйвера и сервиса создается запись, содержащая следующую информацию.
•Тип сервиса. Необходим для того, чтобы различать сервисы уровня пользователя и драйверы. Для сервисов уровня пользователя
âтипе указывается, выполняется ли сервис в собственном процессе или разделяет адресное пространство процесса с другими сервисами. Для драйвера указывается, является ли он драйвером ядра или драйвером файловой системы.
•Способ запуска (автоматически при старте ОС, по запросу приложения, управляющего сервисом, либо запрет запуска). В системе могут быть установлены три значения для этого поля: Авто (Automatic), Вручную (Manual), Отключено (Disabled).
•Уровнь контроля ошибок. Указывает на серьезность ошибки, если служба или драйвер не запускается при запуске ОС, и определяет действия в случае аварийного завершения сервиса или ошибки при запуске (отсутствие действий, перезапуск сервиса или перезапуск ОС).
•Полный путь к исполняемому файлу (т. е. путь к программе сервиса – файлу с расширением .EXE или драйверу с расширением .SYS).
•Информация о зависимостях, т. е. о том, какие сервисы должны быть запущены до запуска данного сервиса. Для драйвера эта информация включает в себя список драйверов, которые должны быть запущены до указанного драйвера.
•Имя учетной записи и пароль. Сервис выполняется в контексте указанной учетной записи. Если учетная запись не указана, то сервис выполняется в контексте учетной записи LocalSystem.
Для драйверов дополнительно указываются имя объекта драйвера (например, \FileSystem\Rdr или \Driver\XNS) и используемая система ввода/вывода для загрузки драйвера устройства. Если имя не задано, то система ввода/вывода создает имя по умолчанию на основе службы имен драйверов.
Ñпомощью SCP-апплета* можно установить или изменить тип запуска. Кроме этого можно посмотреть, под чьей учетной записью запускается сервис на вкладке «Вход в систему» (Log On).
* Апплет (applet, от application) – зд. прикладная мини-программа, утилита.
8
Ðèñ. 2. Редактор реестра. Просмотр ключа
Базу данных сервисов не рекомендуется изменять самостоятельно (с помощью функций работы с реестром). Вместо этого следует обращаться к API-функциям, предоставляемым SCM.
Перед запуском автоматически запускаемых сервисов (как и драйверов) SCM выполняет еще несколько действий: создает именованный канал RPC с именем \Pipe\Ntsvcs; после этого RPC запускает поток, отслеживающий приходящие по этому каналу сообщения от SCP; затем SCM освобождает свой объект типа события SvcCtrlEvent_A3752DX, сигнализируя о завершении инициализации. SCP устанавливает связь с SCM с помощью функции OpenSCManager, которая ждет перехода события SvcCtrlEvent_A3752DX в свободное состояние.
1.4. Программы управления сервисами
Для управления сервисами SCP использует API-функции, предоставляемые SCM: CreateServise, OpenService, StartService, ControlService, QueryServiceStatus, DeleteService. Для связи с SCM в SCP-приложении используется канал, созданный SCM, а связь устанавливается функцией OpenSCManager:
SC_HANDLE OpenSCManager (LPCTSTR lpMachineName. LPCTSTR lpDatabaseName, DWORD dwDesiredAccess).
Параметры вызова функции:
•lpMachineName. Указатель на строку (завершающуюся нулем), содержащую имя компьютера. Если этот параметр равен NULL или указывает на пустую строку, то функция подключается к SCM на локальной машине;
•lpDatabaseName. Указатель на строку (завершающуюся нулем), которая содержит имя открываемой базы данных SCM. Этот параметр должен быть равен SERVICES_ACTIVE_DATABASE. Если этот параметр приравнять NULL, то по умолчанию будет открыта база SERVICES_ACTIVE_DATABASE;
•dwDesiredAccess. Указывает права доступа к SCM. Перед тем как разрешить доступ с запрошенными правами, ОС проверяет права запросившего процесса и сверяет их со списком в SCM. По умол- чанию при вызове функции OpenSCManager установлено право SC_MANAGER_CONNECT.
При запросе на открытие канала связи SCP-приложение должно указать выполняемые действия. Например, если SCP-приложение
10