Net, установки служби windows

Будь-яка служба повинна конфигурироваться в системному реєстрі. Всі служби розміщуються в розділі HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services. Переглядати що містяться в системному реєстрі запису можна за допомогою утиліти regedit. Тут містяться відомості про тип служби, її видимій частині імені, шляхи до її виконуваного файлу, конфігурації запуску і т.д. На малюнку для прикладу показано, як в системному реєстрі виглядає конфігурація служби W3SVC:

Net, установки служби windows

Подібна конфігурація може забезпечуватися за допомогою класів установників з простору імен System.ServiceProcess.

Щоб додати до служби програму установки, необхідно переключитися на подання візуального конструктора в Visual Studio і вибрати в контекстному меню пункт Add Installer (Додати установник). В результаті створюється новий клас ProjectInstaller, а також екземпляри класів ServiceInstaller і ServiceProcessInstaller.

клас Installer

Клас ProjectInstaller успадкований від System.Configuration.Install.Installer. Цей клас є базовим для всіх спеціальних установників. За допомогою класу Installer можна створювати процедури установки, засновані на транзакціях. У разі невдалого завершення такої процедури стає можливим відкат до попереднього стану і скасування всіх змін, які були проведені після початку процедури.

Усередині конструктора класу ProjectInstaller викликається метод InitializeComponent ():

Класи ProcessInstaller і ServiceInstaller

Всередині коду реалізації InitializeComponent () створюються екземпляри класів ServiceProcessInstaller і ServiceInstaller. Обидва ці класу успадковані від ComponentInstaller. який, в свою чергу, успадкований від класу Installer.

Класи, успадковані від ComponentInstaller, можуть використовуватися для настройки процесу установки. Не слід забувати про те, що процес служби може передбачати запуск більш ніж однієї служби. Клас ServiceProcessInstaller може застосовуватися для настройки процесу, який буде відповідати за визначення значень для всіх запускаються усередині даного процесу служб, а клас ServiceInstaller - налаштовувати кожну з цих служб, тобто для кожної служби повинен застосовуватися окремий екземпляр ServiceInstaller. При наявності трьох запускаються всередині процесу служб буде потрібно додати, відповідно, три екземпляри ServiceInstaller.

Тут видно, що ServiceProcessInstaller виробляє установку програми, яка реалізує клас ServiceBase. Клас ServiceProcessInstaller має властивості, призначені для всього процесу. Нижче наведено короткий опис цих властивостей, до яких надається доступ всім службам всередині процесу:

Вказує, від імені якої облікового запису користувача повинна запускатися служба в разі установки властивості Account в ServiceAccount.User.

Дозволяє вказувати тип облікового запису служби.

Являє собою доступне тільки для читання властивість, яке повертає довідковий текст щодо установки імені користувача та пароля.

Процес, застосовуваний для запуску служби, може бути визначений у властивості Account класу ServiceProcessInstaller з використанням перерахування ServiceAccount. Нижче наведено короткий опис всіх значень, які можуть встановлюватися для властивості Account.

ServiceInstaller - це клас, який необхідний всім службам. Для кожної служби всередині процесу він підтримує такі властивості: StartType, DisplayName, ServiceName і ServicesDependedOn. Короткий опис цих властивостей наведено нижче:

Установка цього значення вказує, що служба повинна використовувати високо привілейовану обліковий запис користувача в локальній системі і виступати в ролі комп'ютера в мережі.

Подібно LocalService, це значення вказує, що облікові дані комп'ютера повинні передаватися віддалених серверів, але на відміну від LocalSystem, вона має на увазі, що в локальній системі служба повинна діяти від імені непривілейованої облікового запису користувача. Як неважко здогадатися з назви, це значення має застосовуватися тільки для тих служб, які потребують доступу до мережевих ресурсів.

Це значення вказує, що будь-якому віддаленого сервера повинні надаватися анонімні облікові дані і служба повинна мати в локальній системі тими ж привілеями, що і служба NetworkService.

Установка для властивості Account значення ServiceAccount.User означає, що користувач може визначати обліковий запис, який має використовуватися в даній службі.

Властивість StartType вказує, повинна служба запускатися вручну або автоматично. Можливі значення: ServiceStartMode.Automatic, ServiceStartMode.Manual, ServiceStartMode.Disabled. У разі установки для цієї властивості значення ServiceStartMode.Disabled служба запускатися не буде. Такий варіант може бути зручний для тих служб, які не повинні запускатися в системі. Наприклад, установка даної властивості в Disabled може знадобитися, якщо якийсь апаратний контролер не доступний.

У разі якщо для властивості StartType встановлене не Automatic, це властивість ігнорується. Воно вказує, чи повинна служба запускатися не відразу ж після завантаження системи, а трохи пізніше. Це властивість з'явилося в .NET 4 і підтримується, починаючи з Windows Vista.

Це властивість вказує, як має виглядати відображається користувачам дружнє ім'я служби. Це ім'я буде також відображатися і в засобах, що дозволяють управляти службою і здійснювати моніторинг її роботи.

Це властивість вказує, як має взагалі виглядати ім'я служби. Його значення має збігатися зі значенням ServiceName всередині класу ServiceBase в програмі служби. Саме з його допомогою конфігурація ServiceInstaller буде асоціюватися з необхідною програмою служби.

Це властивість вказує, який набір служб повинен запускатися перед запуском цієї служби. Завдяки йому, при запуску служби спочатку будуть автоматично запускатися зазначені залежні служби і тільки потім сама служба.

Змінивши ім'я служби в успадкованому від ServiceBase класі, не забудьте змінити і значення властивості ServiceName в об'єкті ServiceInstaller!

На стадії тестування краще встановлювати для властивості StartType значення Manual. Тоді при неможливості зупинити службу (наприклад, через присутність в ній дефекту) перезапустити систему все одно буде виходити. У разі установки для StartType значення Automatic служба буде автоматично запускатися знову навіть після перезавантаження системи. Упевнившись, що служба дійсно працює коректно, значення цієї властивості можна буде легко поміняти.

клас ServiceInstallerDialog

Ще одним класом установника в просторі імен System.ServiceProcess.Design є ServiceInstallerDialog. Цей клас можна застосовувати, якщо необхідно, щоб під час установки служби системний адміністратор вводив ім'я користувача і пароль облікового запису, яка повинна для неї використовуватися. Якщо встановити властивість Account класу ServiceProcessInstaller в ServiceAccount.User, а властивості Username і Password - в null, то під час процесу установки на екрані буде відображатися діалогове вікно Set Service Login (Встановити реєстраційну інформацію для служби). У цьому вікні також є можливість скасувати процес установки.

утиліта installutil

Після додавання класів установників в проект за допомогою утиліти installutil.ехе можна спробувати встановити і видалити службу. Ця утиліта дозволяє проводити встановлення будь-якої збірки, яка має клас Installer. Для виконання установки він викликає метод Install () класу, успадкованого від Installer, а для видалення раніше встановленої збірки - відповідно, метод Deinstall ().

Команди, які можна використовувати для установки і видалення даної прикладу служби, виглядають наступним чином:

Якщо процес установки завершився невдачею, обов'язково загляньте в журнали установки Installutil.InstallLog і <имя_службы>.InstallLog. Часто в них вдається виявити корисну інформацію на зразок повідомлення "The specified service already exists" ( "Зазначена служба вже існує").

Схожі статті