Служби Windows NT. Огляд

Зміст курсової роботи

 

1. Завдання на курсову роботу

2. Ідея розв’язку задачі та теоретичне обгрунтування її вибору

3. Опис функцій, які використовувалися для програмної реалізації служби

Висновки

Література

Програмна реалізація

 



Завдання на курсову роботу

 

Розробити службу Win32, яка перевантажує комп’ютер не відразу, а через деякий час, щоб користувач міг завершити почату роботу.

 



Ідея розв’язку задачі та теоретичне обгрунтування її вибору

Теоретичні відомості

 

Служби – це життєво важлива і разом з тим таємнича частина Windows. Якщо раніше ви вже працювали з Windows або адміністрували системи працюючі під цією ОС, то мабуть ви вже зустрічалися зі службами. Що ж це таке? Сама проста відповідь: служба – це програма, яка працює не в контексті користувача. Іншими словами, служби продовжують працювати тоді, коли один користувач відключається від системи і до неї підключається інший користувач. Служби – це єдина категорія програм, які можуть робити в такому режимі.

В Windows служби використовуються для розв’язку багатьох важних задач, наприклад, існує служба, яка дозволяє вам підключатися до комп’ютера, очевидно, що така програма повинна продовжувати працювати навіть в випадку коли до системи не підключено ні одного користувача. Інші служби забезпечують сумісний доступ до диску і принтеру, а також являються допоміжними по відношенню до драйверів дискових пристроїв.

З точки зору програміста, служби – це звичайні програми, які мають засіб зв’язку з диспетчером служб SCM (Service Control Manager). Диспетчер SCM – це внутрішній механізм Windows, який здійснює керування службами. В Windows NT 4 користувач взаємодіє з SCM за допомогою аплету Services Control Panel. В Windows 2000 ту ж функцію виконує один із модулів консолі ММС. Список функцій які зв’язані зі службами, приведений в таблиці 1.

Як і будь-яка інша консольна програма, служба має функцію main. Одна програма може забезпечити роботу одної служби, а може включати в себе зразу декілька служб. Функція main заповнює масив, який описує всі служби, які підтримує програма. Масив передається службою StartServiceCtrlDispatcher. Для кожної служби, яка входить в склад файла, який використовується, цей масив містить текстовий ідентифікатор і точку входу.

Точка входу служби нагадує собою функцію main. Це функція, яка приймає звичайні аргументи argc і argv.

 

Таблиця 1. Функції служб.

Функція Призначення
ChangeServiceConfig Змінити конфігурацію
ChangeServiceConfig2 Змінити додаткову конфігурацію (Win2000)
CloseServiceHandle Закриває службу або дескриптор SCM
ControlService Посилає службі керуючий запит
CreateService Створює службу
DeleteService Видаляє службу
EnumDependentServices Визначає служби, які потребує та чи інша служба
EnumServicesStatus Послідовно перебирає служби в базі даних SCM
GetServiceDisplayName Повертає ім’я дисплея
GetServiceKeyName Повертає ключ реєстру для даної служби
LockServiceDatabase Блокує базу даних SCM
OpenSCManager Відкриває SCM
OpenService Відкриває існуючу службу
QueryServiceConfig Повертає конфігурацію служби
QueryServiceConfig2 Повертає додаткову конфігурацію служби (Win2000)
QueryServiceLockStatus Повертає інформацію про статус блокування SCM
QueryServiceObjectSecurity Повертає інформацію про захист служби
QueryServiceStatus Повертає стан служби
RegisterServiceCtrlHandler Реєструє функцію керування службою
SetServiceBits Настроює прапори, які пов’язанні зі службою
SetServiceObjectSecurity Настроює захист доступу до служби
SetServiceStatus Встановлює стан служби
StartService Запускає службу
StartServiceCtrlDispatcher Реєструє службу в SCM
UnlockServiceDatabase Деблокує базу даних SCM

 

В процесі звернення SCM до функції, яка є точкою входу служби, важливу роль грає структура SERVICE_STATUS. Більшість служб зберігають статичну копію цієї структури і відновлюють її в випадку необхідності. Функція, яка є точкою входу, використовує виклик RegisterServiceCtrlHandler для того, щоб зареєструвати обробник, який призначений для взаємодії SCM зі службою. Крім цього підпрограма ініціалізації служби звертається до виклику SetServiceStatus для того, щоб проінформувати SCM про поточний стан служби (служба може знаходитися в одному із станів: ініціалізація, функціонування або зупинка). Якщо ініціалізація потребує більше ніж декілька секунд, то потрібно виконати її в окремому програмному потоці.

Створення окремого програмного потоку потрібне також в випадку, якщо ви хочете створити службу, яка буде працювати виключно в фоновому режимі. Наприклад, якщо ви хочете розробити службу, яка кожну годину видає звуковий сигнал, який імітує роботу години каз боєм, то вам потрібно створити програмний потік, який буде слідкувати за часом і видавати звуковий потік.

Диспетчер SCM звертається до обробника також в випадку, якщо потрібно визначити поточний стан служби. Крім цього служба визначає інші спеціальні види запитів, які можна адресувати службі за допомогою виклику ControlService (цей виклик є частиною диспетчера SCM). Звичайно ж, для того щоб направити службі запит, необхідно мати необхідні полномочиями.

Встановлення служб

Щоб встановити службу, необхідно добавити в реєстр декілька записів. Частіше за все ця процедура виконується за допомогою SCM. Для цього необхідно відкрити SCM (за допомогою виклику OpenSCManager), а потім звернутися до виклику CreateService. В якості аргументів цей виклик приймає ім’я файлу, в якому міститься служба, а також іншу необхідну інформацію. При цьому в реєстр вносяться всі необхідні записи.

Виклик CreateService використовує 13 аргументів, що може визвати легкий переляк в тих програмістів, які не мали з ним діла (список цих аргументів приведений в табл.2). Насправді звернутися до цієї функції зовсім не важко. Діло в тому, що при зверненні до CreateService більшості аргументів можна присвоїти значення за замовчуванням. Параметр dwServiceType може мати одне із значень: SERVICE_WIN32_OWN_PROCESS (у випадку, якщо в файлі, який виповнює, міститься тільки одна служба) або SERVICE_WIN32_SHARE_PROCESS (у випадку, якщо в події файлу, який виконує, входять декілька служб). Інші прапори дозволяють вказувати є служба драйвером ядра чи драйвером файлової системи.

 

Таблиця2. Аргументи виклику CreateService

Аргумент Тип Опис
hSCManager SC_HANDLE Обробник для SCM
lpServiceName LPCTSTR Коротке ім’я служби
lpDisplayName LPCTSTR Ім’я служби, яке відображається
dwDesiredAccess DWORD Рівень доступу до служби, який потребується
dwServiceType DWORD Тип
dwStartType DWORD Коли запускати службу
dwErrorControl DWORD Що робити, якщо служба не запрацювала
lpBinaryPathName LPCTSTR Ім’я файлу, в якому міститься служба
lpLoadOrderGroup LPCTSTR Ім’я групи служб, які запускаються одночасна
lpdwTagId DWORD Порядок завантаження в групі
lpDependencles LPCTSTR Показник на масив імен служб, які потрібні для роботи даної служби
lpServiceStartName LPCTSTR Ім’я облікового запису, який буде використовуватися при запуску служби (NULL відповідає обліковому запису LocalSystem)
lpPassword LPCTSTR Пароль для облікового запису (якщо потребується)

 

Служби NT.

В принципі сервери можуть працювати безкінечно довго, обслуговувати при цьому велику кількість клієнтів, які підключаються, відправляють запити, отримують відповіді і відключаються. Таким чином, ці „сервери” можуть давати неперервні послуги, тобто бути службами, але для повної ефективності служби повинні бути керуючими.

Служби NT в Windows NT і 2000 дають можливість перетворити сервери в служби, які можна буде запускати по команді або при запуску системи, призупиняти, відновлювати і завершати. Служби NT дозволяють навіть наглядати за „станом здоров’я” служби. В кінці кінців, будь-які серверні системи потрібно перетворювати в служби NT, особливо якщо вони будуть інтенсивно використовуватися в організації або замовниками. А Windows 2000/NT є багато служб, наприклад керування telnet і обліковими записами безпеки, а також драйвери пристроїв. На панелі керування можна визвати програму адміністрування, яка відображає повний набір служб.

Програма JobShell дає елементарні засоби керування серверами, які дозволяють запускати сервер під керуванням завданням і відправляти сигнал завершення. Служби NT набагато складніше і надійніше. Для того, щоб продемонструвати це функція JobShell буде модифікована так, щоб вона могла керувати службами NT.

Також тут буде показано, як перетворити даний консольний додаток в службу NT і як встановити цю службу, керувати нею і контролювати її. Описується також реєстрація подій, завдяки якої служба може фіксувати свої дії в журналі.

Служби Windows NT. Огляд.

Служби NTпрацюють під керуванням диспетчера керування службами (Service Control Manager - SCM). Для перетворення консольного додатку, такого як serverNT чи serverSK, в службу NT, потрібно виконати три основні дії, в результаті яких програма переходить під керування SCM.

1. Створити нову точку входу main(), яка буде реєструвати службу в SCM, інформуючи про точки входу і імена логічних служб.

2. Перетворювати попередню функцію точки входу main() в ServiceMain(), яка буде реєструвати обробник керування служби і інформувати SCM про його стан. Другий код зберігається практично без змін.

3. створити обробник керування служби, який буде відповідати на команди SCM.

Описавши ці три етапи, ми будемо по мірі необхідності давати додаткову інформацію по створенню, запуску служб і керуванню ними. Далі ці дії описанні краще.

Функція main().

Задача нової функції main(), яку викликає SCM, полягає в реєструванні служби і в запуску диспетчера керування службою. Для цього потрібно визвати функцію StartServiceCtrlDispatcher з ім’ям (іменами) і точкою (точками) входу однієї або декількох логічних служб.

 

BOOL StartServiceCtrlDispatcher (

LPSERVICE_TABLE_ENTRY lpServiceStartTable)

 

Єдиний параметр lpServiceStartTable є адресою масиву SERVICE_TABLE_ENTRY, кожен елемент якого містить ім’я і точку входу логічної служби. Кінець масиву позначається парою елементів з значеннями NULL.

Виклик StartServiceCtrlDispatcher в головному потоці процесу служби приводить до приєднання потоку до SCM в формі потоку диспетчера керування службою SCM не повертає керування, поки всі служби не будуть закінчені. Але потрібно замітити, що в цей момент логічні служби фактично ще не запускаються.

В прикладі 1 показана проста головна програма служби, яка містить одну логічну службу.

Приклад 1. Програма main: головна точка входу служби.

 

#include “EvryThng.h”

void WINAPI ServiceMain (DWORD argc, LPTSTR argv []);

static LPTSTR ServiceName = _T (“SocketCommandLineService”);

/* головна процедура, яка запускає диспетчер керуваня службою. */

VOID _tmain (int argc, LPTSTR argv [])

{

SERVICE_TABLE_ENTRY DispatchTable [] =

{

{ ServiceName, SeviceMain },

{ NULL, NULL }

};

if (!StartServiceCtrlDispatcher (DispatchTable))

ReportErrjr (_T

(“Не вдалося запустити диспетчер керування службою.”),

1, TRUE);

/*Servoce<aom () не буде працювати, поки її не запустить SCM.*/

/*Повернення назад відбувається тільки після завершення всіх служб.*/

return;

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: