Під яким користувачем запускаються служби у windows. Служби Windows. Що таке служби

Режими роботи

У більшості випадків службам заборонено взаємодію з консоллю або робочим столом користувачів (як локальних, так і віддалених), проте для деяких служб можливе виключення - взаємодія з консоллю (сесією з номером 0, в якій зареєстрований користувач локально або під час запуску служби mstscіз ключем /console).

Існує кілька режимів для служб:

  • заборонено до запуску;
  • ручний запуск (за запитом);
  • автоматичний запуск під час завантаження комп'ютера;
  • автоматичний (відкладений) запуск (введений у Windows Vista та Windows Server 2008);
  • обов'язкова служба/драйвер (автоматичний запуск та неможливість (для користувача) зупинити службу).

Фоновий режим

Запуск, зупинення та зміна служб Windows

Служби та їх атрибути можуть бути змінені в консолі керування MMC:

У різних версіях операційних системможуть бути присутніми одні служби та інші. Деякі програми та програми, які встановлюються окремо, також можуть створювати свої служби.

Список служб операційних систем Microsoft Windows

Ім'я, що виводиться Ім'я служби Функції Опис
DHCP-клієнт Dhcp Реєструє та оновлює IP-адреси та DNS-записи для цього комп'ютера. Якщо ця служба зупинена, комп'ютер не зможе отримувати динамічні IP-адреси та виконувати оновлення DNS.
DNS-клієнт Dnscache Служба DNS-клієнта (dnscache) кешує імена DNS (Domain Name System) та реєструє повне ім'я даного комп'ютера. Якщо служба зупинена, роздільна здатність імен DNS триватиме. Однак результати черг імен DNS не будуть кешуватися, а ім'я комп'ютера не буде зареєстровано.
KtmRm для координатора розподілених транзакцій KtmRm Координує транзакції між MSDTC та диспетчером транзакцій ядра (Kernel Transaction Manager - KTM).
ReadyBoost EMDMgmt ReadyBoost Підтримка підвищення продуктивності системи за допомогою технології ReadyBoost.
Superfetch SysMain Superfetch Підтримує та покращує продуктивність системи.
Windows Audio Audiosrv Управління засобами роботи зі звуком для програм Windows. Якщо цю службу зупинено, аудіопристрої та ефекти не будуть правильно працювати.
Windows CardSpace idsvc Забезпечує надійну можливість створення, керування та розкриття цифрових посвідчень.
Автоматичне оновлення WUAUSERV Включає завантаження та встановлення оновлень Windows. Якщо служба вимкнена, то на цьому комп'ютері не можна буде використовувати можливості автоматичного оновленняабо веб-сайт Windows Update.

Список служб, створюваних програмами та програмами Microsoft

Список служб, створюваних програмами та програмами інших виробників

Див. також

Список служб Windows

Посилання

  • pcs.suite101.com/article.cfm/index_of_services: Index of Windows XP Services - Index of the Services running on Windows XP operating system
  • Як видалити службу в Windows Vistaабо Windows XP
  • Служби Windows XP (укр.)

Wikimedia Foundation. 2010 .

Дивитись що таке "Служби Windows" в інших словниках:

    Windows SharePoint Services (WSS) безкоштовне доповненнядо Microsoft Windows Server 2003 та 2008, що реалізує повнофункціональну веб платформу з підтримкою наступних можливостей: Система керування контентом Засоби для спільної роботи.

    Розробник Microsoft Сімейство ОС Windows … Вікіпедія

    Компонент Microsoft Windows … Вікіпедія


Служба Windows NT (Windows NT service) - спеціальний процес, що має уніфікований інтерфейс для взаємодії з операційною системою Windows NT. Служби поділяються на два типи - служби Win32, що взаємодіють з операційною системою за допомогою диспетчера управління службами (Service Control Manager - SCM), та драйвера, що працюють за протоколом драйвера пристрої Windows NT. Далі в цій статті ми обговорюватимемо лише служби Win32.

Застосування служб

Однією з найважливіших властивостей служби є неінтерактивність. Типова служба - це непомітна для звичайного користувача робота у фоновому режимі. В силу цього служби найбільше підходять для реалізації наступних типів додатків:

  • Сервера в архітектурі клієнт-сервер (наприклад, MS SQL, MS Exchange Server)
  • Мережеві служби Windows NT (Server, Workstation);
  • Серверні (в сенсі функціональності) компоненти розподілених програм (наприклад, всілякі програми моніторингу).

Основні властивості служб

Від звичайної програми Win32 службу відрізняють три основні властивості. Розглянемо кожну з них.

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

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

І, нарешті, можливість роботи у довільному безпековому контексті. Контекст безпеки Windows NT визначає сукупність прав доступу процесу до різних об'єктів системи та даних. На відміну від звичайної програми Win32, яка завжди запускається в контексті безпеки користувача, зареєстрованої на даний момент у системі, для служби контекст безпеки її виконання можна визначити заздалегідь. Це означає, що для служби можна визначити набір прав доступу до об'єктів системи заздалегідь і тим самим обмежити сферу її діяльності. Стосовно служб існує спеціальний вид контексту безпеки, що використовується за умовчанням і називається Local System. Служба, запущена в цьому контексті, має права лише на ресурси локального комп'ютера. Жодні мережеві операції не можуть бути здійснені з правами Local System, оскільки цей контекст має сенс тільки на локальному комп'ютеріі не розпізнається іншими комп'ютерами мережі.

Взаємодія служби з іншими програмами

Будь-яка програма, яка має відповідні права, може взаємодіяти зі службою. Взаємодія, в першу чергу, передбачає зміну стану служби, тобто переведення її в один із трьох станів - працююче (Запуск), призупинення (Пауза), зупинка та здійснюється за допомогою подачі запитів SCM. Запити бувають трьох типів - повідомлення від служб (фіксація їх станів), запити, пов'язані зі зміною конфігурації служби чи отриманням інформації про неї та запити додатків зміну стану службы.

Для управління службою необхідно в першу чергу одержувати її дескриптор за допомогою функції Win32 API OpenService. Функція StartService запускає службу. У разі потреби зміна стану служби здійснюється викликом функції ControlService.

База даних служби

Інформація про кожну службу зберігається в реєстрі - у ключі HKLM\SYSTEM\CurrentControlSet\Services\ServiceName. Там містяться такі відомості:

  • Тип служби. Вказує на те, чи реалізована в цьому додатку лише одна служба (ексклюзивна) або їх у додатку кілька. Ексклюзивна служба може працювати у будь-якому контексті безпеки. Декілька служб всередині однієї програми можуть працювати тільки в контексті LocalSystem.
  • Тип запуску. Автоматичний – служба запускається при старті системи. На вимогу – служба запускається користувачем вручну. Деактивований – служба не може бути запущена.
  • Ім'я модуля, що виконується (EXE-файл).
  • Порядок запуску щодо інших служб. У деяких випадках для коректної роботи служби потрібно, щоб було запущено одну або кілька інших служб. У цьому випадку реєстр містить інформацію про служби, що запускаються перед даною.
  • Контекст безпеки виконання служби ( мережеве ім'ята пароль). За промовчанням контекст безпеки відповідає LocalSystem.

Програми, яким потрібно отримати інформацію про якусь службу або змінити той чи інший параметр служби, по суті повинні змінити інформацію в базі даних служби в реєстрі. Це можна зробити за допомогою відповідних функцій Win32 API:

  • OpenSCManager, CreateService, OpenService, CloseServiceHandle – для створення (відкриття) служби;
  • QueryServiceConfig, QueryServiceObjectSecurity, EnumDependentServices, EnumServicesStatus - для отримання інформації про службу;
  • ChangeServiceConfig, SetServiceObjectSecurity, LockServiceDatabase, UnlockServiceDatabase, QueryServiceLockStatus - для зміни конфігураційної інформації служби.

Внутрішній пристрій служби.

Для того, щоб додаток повинен бути влаштований відповідним чином, а саме - включати певний набір функцій (в термінах C++) з певною функціональністю. Розглянемо коротко кожну їх.

Функція main

Як відомо, функція main - точка входу будь-якого консольного Win32 програми. При запуску служби перш за все починає виконуватися код цієї функції. Протягом 30 секунд з моменту старту функція main повинна обов'язково викликати StartServiceCtrlDispatcher для встановлення з'єднання між програмою та SCM. Усі комунікації між будь-якою службою цієї програми та SCM здійснюються всередині функції StartServiceCtrlDispatcher, яка завершує роботу лише після зупинки всіх служб у додатку.

Функція ServiceMain

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

Отримавши управління, ServiceMain насамперед має зареєструвати обробник запитів до служби, функцію Handler, свою для кожної зі служб у додатку. Після цього ServiceMain зазвичай слідують якісь дії для ініціалізації служби - виділення пам'яті, читання даних тощо. Ці дії повинні обов'язково супроводжуватись повідомленнями SCM про те, що служба все ще перебуває в процесі старту і жодних збоїв не сталося. Повідомлення надсилаються за допомогою дзвінків функції SetServiceStatus. Усі виклики, крім останнього, мають бути з параметром SERVICE_START_PENDING, а останній - з параметром SERVICE_RUNNING. Періодичність викликів визначається розробником служби, виходячи з наступних умов: тривалість тимчасового інтервалу між двома сусідніми викликами SetServiceStatus не повинна перевищувати значення параметра dwWaitHint, переданого SCM при першому з двох викликів. Інакше SCM, не отримавши під час чергового повідомлення, примусово зупинить службу. Такий спосіб дозволяє уникнути ситуації служби на старті внаслідок виникнення тих чи інших збоїв (згадаємо, що служби зазвичай неінтерактивні і можуть запускатися без користувача). Звичайна практика у тому, що після завершення чергового кроку ініціалізації відбувається повідомлення SCM.

Функція Handler

Як згадувалося вище, Handler - це прототип callback-функции, обробника запитів до служби, своєї кожної служби у додатку. Handler викликається, коли служба надходить запит (запуск, призупинення, відновлення, зупинка, повідомлення поточного стану) і виконує необхідні відповідно до запиту дії, після чого повідомляє новий стан SCM.

Один запит слід відзначити особливо - запит, що надходить після завершення роботи системи (Shutdown). Цей запит сигналізує про необхідність виконати деініціалізацію та завершитися. Майкрософт стверджує, що для завершення роботи кожній службі виділяється 20 секунд, після чого вона зупиняється примусово. Проте тести показали, що це умова виконується який завжди і служба примусово зупиняється до закінчення цього часу.

Система безпеки служб

Будь-яка дія над службами потребує наявності відповідних прав у додатку. Всі програми мають права на з'єднання з SCM, перерахування служб і перевірку заблокованості БД служби. Реєструвати в системі нову службу або блокувати БД служби можуть лише додатки, які мають адміністративні права.

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

  • Всі користувачі мають права SERVICE_QUERY_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS, SERVICE_INTERROGATE та SERVICE_USER_DEFINED_CONTROL;
  • Користувачі, що входять до групи Power Users та обліковий запис LocalSystem, додатково мають права SERVICE_START, SERVICE_PAUSE_CONTINUE та SERVICE_STOP;
  • Користувачі, що входять до груп Administrators та System Operators, мають право SERVICE_ALL_ACCESS.

Служби та інтерактивність

За промовчанням інтерактивні служби можуть виконуватися лише у контексті безпеки LocalSystem. Це пов'язано з особливостями виведення на екран монітора у Windows NT, де існує, наприклад, такий об'єкт як "Desktop", для роботи з яким потрібно мати відповідні права доступу, яких може не виявитись у довільній облікового запису, відмінний від LocalSystem. Незважаючи на те, що в переважній більшості випадків це обмеження є несуттєвим, проте іноді існує необхідність створити службу, яка виводила б інформацію на екран монітора і при цьому виконувалася б у контексті безпеки відмінному від LocalSystem, наприклад, серверна компонента програми для запуску програм на віддаленому комп'ютері.

Фрагмент коду з . ілюструє таку можливість.

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

Приклад служби (ключові фрагменти)

Розглянемо з прикладу ключові фрагменти докладання мовою З++, реалізує службу Windows NT. Для наочності несуттєві частини коду опущені.

Функція main

В показаний код функції main.

Функція ServiceMain

Особливістю коду, що міститься в ServiceMain, є те, що часто неможливо заздалегідь передбачити час виконання тієї чи іншої операції, особливо якщо врахувати, що її виконання відбувається в операційній системі з багатозадачністю, що витісняє. Якщо операція триватиме довше за вказаний у параметрі виклику SetServiceStatus інтервал часу, служба не зможе вчасно надіслати наступне повідомлення, внаслідок чого SCM зупинить її роботу. Прикладами потенційно операцій можуть бути виклики функцій роботи з мережею при великих таймутах або одноразове читання великої кількостіінформації з повільного носія. Крім того, такий підхід абсолютно не застосовується при налагодженні служби, оскільки виконання програми у налагоджувачі супроводжується великими паузами, необхідними розробнику.

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

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

Функція Handler

В показаний код функції Handler та допоміжних потоків. Для запитів "Stop" і "Shutdown" використовується алгоритм коректного зупинки служби, аналогічний тому, який використовується при старті служби, з тією різницею, що замість параметра SERVICE_START_PENDING SetserviceStatus передається параметр SERVICE_STOP_PENDING, а замість SERVICE_RUNNING - SERVICE_STOPPED.

В ідеалі для запитів "Pause" та "Continue" також слід використовувати цей підхід. Допитливий читач легко зможе реалізувати його, спираючись на дані приклади.

Висновок

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


// Функція, аналог MessageBox Win32 API int ServerMessageBox(RPC_BINDING_HANDLE h, LPSTR lpszText, LPSTR lpszTitle, UINT fuStyle) (DWORD dwThreadId; HWINSTA hwinstaSave; ні об'єкти "Window station " і "Desktop". GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); до користувача // об'єктах "Window station" і "Desktop". RpcImpersonateClient(h); hwinstaUser), hdeskUser = OpenDesktop("Default", 0, FALSE, MAXIMUM_ALLOWED); RpcRevertToSelf(); if (hdeskUser == NULL) ( SetProcessWindowStation(hwinstaSave); ) SetThreadDesktop(hdeskUser); // Виводимо просте текстове вікно. result = MessageBox(NULL, lpszText, lpszTitle, fuStyle); // Відновлюємо збережені об'єкти // "Window station" та "Desktop". SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); return result; ) void main() ( SERVICE_TABLE_ENTRY steTable = ( (SERVICENAME, ServiceMain), (NULL, NULL) ); // Встановлюємо з'єднання з SCM. Усередині цієї функції // відбувається прийом і диспетчеризація запитів. StartServiceCtrlDispatcher(steTable); ) void WINAPI ServiceMain (DWORD dwArgc, LPSTR *psArgv) ( // Відразу реєструємо обробник запитів. hSS = RegisterServiceCtrlHandler(SERVICENAME, ServiceHandler); sStatus.dwCheckPoint = 0; sStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE ficExitCode = 0;sStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS sStatus.dwWaitHint = 0 sStatus.dwWin32ExitCode = NOERROR // Для ініціалізації служби викликається функція InitService(); , що служба в процесі ініціалізації.// Для синхронізації потоку створюється подія.// Після цього запускається робочий потік, для //синхронізації якого також// створюється подія. hSendStartPending = CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE hSendStartThread; DWORD dwThreadId; hSendStartThread = CreateThread(NULL, 0, SendStartPending, NULL, 0, &dwThreadId); //Тут проводиться вся ініціалізація служби. InitService(); SetEvent(hSendStartPending); if(WaitForSingleObject(hSendStartThread, 2000) != WAIT_OBJECT_0) ( TerminateThread(hSendStartThread, 0); ) CloseHandle(hSendStartPending); CloseHandle(hSendStartThread); hWork = CreateEvent(NULL, TRUE, FALSE, NULL); hServiceThread = CreateThread(NULL, 0, ServiceFunc, 0, 0, &dwThreadId); sStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hSS, &sStatus); ) // Функція потоку, що секунду посилає повідомлення SCM // про те, що процес ініціалізації йде. Робота функції // завершується, коли встановлюється // подія hSendStartPending. DWORD WINAPI SendStartPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_START_PENDING; sStatus.dwWaitHint = 2000; // "Засинаємо" на 1 секунду // Якщо подія // в подію // в ініціалізація служби не // закінчилася), посилаємо чергове повідомлення, // встановивши максимальний інтервал часу // в 2 секунди, для того, щоб був запас часу до // наступного повідомлення while (true) .dwCheckPoint++;if(WaitForSingleObject(hSendStartPending, 1000)!=WAIT_TIMEOUT) break; ) sStatus.dwCheckPoint = 0; return 0;) // Функція, що ініціалізує службу. Читання даних // розподіл пам'яті і т.п. void InitService() (...) // Функція, що містить код служби. DWORD WINAPI ServiceFunc(LPVOID) ( while (true) ( ​​if (!bPause) ( // Тут міститься код, який зазвичай // виконує якісь циклічні операції... ) if (WaitForSingleObject(hWork, 1000)!=WAIT_TIMEOUT ) Break; StopPending = CreateEvent(NULL, TRUE, FALSE, NULL), hSendStopThread = CreateThread(NULL, 0, SendStopPending, NULL, 0, & dwThreadId), SetEvent(hWork); ) SetEvent(hSendStopPending), CloseHandle(hServiceThread), CloseHandle(hWork); dwCurrentState = SERVICE_STOPPED;SetServiceStatus( hSS, &sStatus); break; case SERVICE_CONTROL_PAUSE: bPause = true; sStatus.dwCurrentState = SERVICE_PAUSED; SetServiceStatus(hSS, &sStatus); break; case SERVICE_CONTROL_CONTINUE: bPause = true; sStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hSS, &sStatus); break; case SERVICE_CONTROL_INTERROGATE: SetServiceStatus(hSS, &sStatus); break; default: SetServiceStatus(hSS, &sStatus); break; ) ) // Функція потоку, аналогічна SendStartPending // для зупинки служби. DWORD WINAPI SendStopPending(LPVOID) ( sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_STOP_PENDING; ngleObject(hSendStopPending, 1000)! =WAIT_TIMEOUT) break;) sStatus.dwCheckPoint = 0; return 0;

Як запустити програму у вигляді служби Windows

Чи можна запустити клієнтську програму як службу? В одній із я описував способи створення служби Windows штатними засобами ОС. Однак не кожна консольна програма зможе запуститися як служба, а програми з графічним інтерфейсом у принципі не вміють працювати подібним чином. Але можливість запустити додаток як службу все ж таки є, і допоможе нам у цьому програма з оригінальною назвою Non-Sucking Service Manager.

NSSM являє собою вільне програмне забезпеченняз відкритим кодомі підтримує всі операційні системи Microsoft, починаючи з Windows 2000 і закінчуючи Windows 8. NSSM не вимагає інсталяції, достатньо його завантажити та розпакувати. У дистрибутив входять версії для 32- та 64-розрядних ОС. Взяти програму можна з сайту nssm.cc, на даний момент остання стабільна версія 2.21.1, яку я і використовуватиму.

Для демонстрації можливостей NSSM спробуємо запустити Блокнот Windowsяк служба Windows 8.1.

Створення служби

Для створення служби з ім'ям notepadзапускаємо командну консоль, переходимо до папки з розпакованим NSSM (для 64-розрядної Windows) і вводимо команду nssm install notepad , яка відкриває вікно графічного інсталятора NSSM. Щоб створити службу, достатньо в полі Path вказати шлях до файлу, що виконується, і натиснути кнопку «Install service». Додатково у полі Options можна вказати ключі, необхідні для запуску служби.

Також на етапі створення нової служби можна зазначити деякі додаткові параметри.

На вкладці Shutdown перелічені методи зупинки та тайм-аути, які використовуються при штатному завершенні роботи або аварійній зупинці програми. Коли NSSM отримує команду зупинки (напр. при завершенні роботи програми), він намагається зупинити контрольований додаток штатним чином. Якщо ж програма не відповідає, то NSSM може примусово завершити всі процеси та підпроцеси цієї програми.

Усього є чотири етапи завершення роботи програми, і за умовчанням вони використовуватимуться в такому порядку:

На першому етапі NSSM намагається згенерувати та відправити подію Ctrl+C.Цей спосіб добре працює для консольних додатків або скриптів, але не застосовується для графічних додатків;
Потім NSSM визначає всі вікна, створені додатком, і надсилає їм повідомлення WM_CLOSE, що ініціює вихід із програми;
Третім етапом NSSM обчислює всі потоки, створені додатком, і надсилає їм повідомлення WM_QUIT, яке буде отримано, якщо програма має чергу повідомлень потоку;
І як останній засіб NSSM може викликати метод TerminateProcess(), примусово завершивши роботу програми.

Можливо відключити деякі або навіть усі методи, проте для різних додатківспрацьовують різні методи і для коректного завершення роботи програми рекомендується залишити все як є.

За умовчанням під час падіння служби NSSM намагається рестартувати її. На вкладці «Exit actions» можна змінити автоматичну дію під час нештатного завершення роботи програми, а також виставити затримку перед автоматичним перезапуском програми.

На вкладці "Input/Output (I/O)" можна задати перенаправлення введення\виводу програми у вказаний файл.

На вкладці «Environment» можна встановити нові змінні оточення для служби або перевизначити існуючі.

Також можна не користуватися графічною оболонкою і одразу створити службу в консолі такою командою:

nssm install notepad "C:\Windows\system32\notepad.exe"

Управління службою

Після створення служби за допомогою NSSM зайдемо в оснастку Services та знайдемо службу notepad. Як бачите, на вигляд вона нічим не відрізняється від інших служб, ми також можемо її запустити, зупинити або змінити режим запуску. Однак зверніть увагу, що як виконуваний файл вказано nssm.exe.

А якщо зайти в Task Manager, то ми побачимо наступну картину: як основний (батьківський) процес запущено NSSM, служба notepad запущена як його дочірній процес, і вже в цьому дочірньому процесі запущено додаток Блокнот.

Видалення служби

Для видалення служби вводимо команду nssm remove notepad та підтверджуємо її видалення. А ввівши команду nssm remove notepad confirm, можна обійтися і без підтвердження.

Запуск служби в інтерактивному режимі

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

Для того, щоб запустити службу в інтерактивному режимі, треба в оснастці Служби відкрити її властивості і на вкладці «Вхід до системи» відзначити чекбокс «Дозволити взаємодію з робочим столом».

А далі починаються чудеса Служба, запущена в інтерактивному режимі, відкривається в ізольованому сеансі (session 0). Потрапити в цей сеанс можна лише за допомогою служби виявлення інтерактивних служб (ui0detect), яка відстежує запуск інтерактивних служб на комп'ютері та видає оповіщення. У Windows 7\Server 2008 ця служба активна за замовчуванням, а у Windows 8\Server 2012 вона відключена і не відображається в графічному оснащенні Служби (принаймні я її там не знайшов). Більше того, якщо ви все ж таки знайдете цю таємничу службу і спробуєте її запустити, то отримаєте повідомлення про помилку.

А річ у тому, що для її запуску потрібно дозволити запуск інтерактивних служб на комп'ютері. Тому відкриваємо редактор реєстру, знаходимо в розділі HKLM\System\CurrentControlSet\Control\Windows параметр типу DWORD з ім'ям NoInteractiveServicesі ставимо його значення в 0 .

Після чого відкриваємо консоль PowerShell і стартуємо службу виявлення командою:

Start-Service -Name ui0detect

Переконавшись, що служба виявлення запущена, рестартуємо службу notepad, і отримуємо ось таке віконце. Вибираємо пункт «Подивитися повідомлення»

і потрапляємо в нульовий сеанс, у якому працює наша програма. Далі робимо з ним необхідні дії і повертаємося назад.

Таке цікаве рішення для запуску додатків у вигляді служб Windows. Не найкрасивіше, але цілком відповідне своїй назві 🙂

Останнє оновлення: 31.10.2015

Одним з найважливіших компонентів Windows є служби. Фактично це окремі програми, які не мають графічного інтерфейсу та виконують різні завдання у фоновому режимі. Служби можуть бути запущені як при старті операційної системи, так і в будь-який інший момент роботи користувача. Найпоширенішим прикладом служб є різні веб-сервери, які у фоновому режимі прослуховують певний порт на наявність підключень, і якщо підключення є, то взаємодіють із ними. Це можуть бути також різні допоміжні послуги оновлень для інших встановлених програм, які звертаються до сервера, щоб дізнатися, чи є Нова версіяпрограми. Загалом ми можемо відкрити панель служб і самі побачити всі встановлені та запущені служби:

Розглянемо, як створювати свої служби C#. Як завдання, що реалізується, виберемо спостереження за змінами в певній папці у файловій системі. Тепер створимо для її виконання службу.

Спочатку створимо новий проект, який матиме тип Windows Service. Назвемо проект FileWatcherService:

Після цього Visual Studio генерує проект, який має все потрібне. Хоча в принципі нам необов'язково вибирати саме цей тип проекту, можна було б створити проект бібліотеки класів, а потім у ньому визначити всі необхідні класи.

Отже, новий проект виглядає так:

Тут також є файл Program.cs і є власне вузол служби Service1.cs.

Служба представляє звичайне додаток, але вона не запускає сама по собі. Всі виклики та звернення до неї проходять через менеджер керування службами (Service Control Manager або SCM). Коли служба запускається автоматично при старті системи або вручну, то SCM звертається до методу Main у класі Program:

Static class Program ( static void Main() ( ServiceBase ServicesToRun; ServicesToRun = new ServiceBase ( new Service1() ); ServiceBase.Run(ServicesToRun); ) )

Метод Main за замовчуванням визначений таким чином, щоб запускати відразу кілька служб, які визначені в масиві ServicesToRun. Однак за промовчанням проект містить лише одну службу Service1. Сам запуск здійснюється за допомогою методу Run: ServiceBase.Run(ServicesToRun).

Сама служба, що запускається, представлена ​​вузлом Service1.cs. Однак, насправді це не простий файл коду. Якщо ми відкриємо цей вузол, побачимо в ньому файл дизайнера служби Service1.Designer.cs і клас Service1.

Клас Service1 власне представляє службу. За замовчуванням він має наступний код:

Using System; використовуючи System.Collections.Generic; використовуючи System.ComponentModel; використовуючи System.Data; використовуючи System.Diagnostics; використовуючи System.Linq; використовуючи System.ServiceProcess; використовуючи System.Text; використовуючи System.Threading.Tasks; namespace FileWatcherService ( public partial class Service1: ServiceBase ( public Service1() ( InitializeComponent(); ) protected override void OnStart(string args) ( ) protected override void OnStop() ( ) ) )

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

Після того, як SCM викличе метод Main і зареєструє службу, відбувається безпосередній виклик через запуск методу OnStart.

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

Крім цих двох методів у класі служби можна перевизначити ще кілька методів базового класу ServiceBase:

    OnPause : викликається при зупинці служби

    OnContinue : викликається при відновленні роботи служби після її призупинення

    OnShutdown: викликається при завершенні роботи Windows

    OnPowerEvent : викликається при зміні режиму живлення

    OnCustomCommand : викликається при отриманні службою команди користувача від Менеджера Управління Службами (Service Control Manager / SCM)

У конструкторі класу Service1 викликається метод InitializeComponent() , визначений у файлі дизайнера Service1.Designer.cs:

Namespace FileWatcherService ( partial class Service1 ( private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) ( if (disposing && (components != null))) ( components.Dispose(); ) base.Dispose(disposing ); ) private void InitializeComponent() ( components = new System.ComponentModel.Container(); this.ServiceName = "Service1"; ) ) )

Єдине, що треба в ньому відзначити, це встановлення назви служби (властивість ServiceName):

This.ServiceName = "Service1";

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

Тепер змінимо код служби наступним чином:

Using System; використовуючи System.ServiceProcess; using System.IO; використовуючи System.Threading; namespace FileWatcherService ( public partial class Service1: ServiceBase ( Logger logger; public Service1() ( InitializeComponent(); this.CanStop = true; this.CanPauseAndContinue = true; this.AutoLog = true; ) protected override logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start));loggerThread.Start(); ) class Logger ( FileSystemWatcher watcher; object obj = new object(); bool enabled = true; public Logger() ( watcher = new FileSystemWatcher("D:\\Temp"); watcher.Deleted += Watcher_Deleted; watcher.Created + = Watcher_Created; watcher.Changed += Watcher_Changed; watcher.Renamed += Watcher_Renamed; ) public void Start() ( watcher.EnableRaisingEvents = true; while(enabled) ( Thread.Sleep(1000); watcher.EnableRaisingEvents = false; enabled = false; ) // перейменування файлів private void Watcher_Renamed(object sender, RenamedEventArgs e) ( string fileEvent = "перейменований в " + e.FullPath; string filePath = e.OldFullPath; RecordEntry(fileEvent, filePath); ) // зміна файлів private void Watcher_Changed(object sender, FileSystemEventArgs e) (string fileEvent = "змінений"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // створення файлів private void Watcher_Created(object sender, FileSystem e) ( string fileEvent = "створений"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); ) // видалення файлів private void Watcher_Deleted(object sender, FileSystemEventArgs e) ( string fileEvent = "віддалений"; string filePath = e.FullPath; RecordEntry(fileEvent, filePath); writer.WriteLine(String.Format("(0) файл (1) був (2)", DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"), filePath, fileEvent)); writer. Flush(); ) ) ) ) )

Ключовим класом, що інкапсулює всю функціональність, є клас Logger. За допомогою об'єкта FileSystemWatcher він вестиме моніторинг змін у папці D://Temp. У методі Start() встановлюється, що ми відстежуватимемо зміни через об'єкт FileSystemWatcher. І вся робота йтиме, поки булева змінна enabled дорівнює true . А метод Stop() дозволить завершити роботу класу.

Події FileSystemWatcher дозволяють відстежувати всі зміни в папці, що спостерігається. При цьому вестиметься запис змін до файлу templog.txt. Щоб не було перегонів ресурсів за файл templog.txt, до якого вносяться записи про зміни, процедура запису блокується заглушкою lock(obj) .

У результаті після створення, зміни, перейменування та видалення файл лога міститиме щось на кшталт:

30.07.2015 12:15:40 файл D:\Temp\Новий текстовий документ.txt був створений 30.07.2015 12:15:46 файл D:\Temp\Новий текстовий документ.txt був перейменований на D:\Temp\hello. txt 30.07.2015 12:15:55 файл D:\Temp\hello.txt був змінений 30.07.2015 12:15:55 файл D:\Temp\hello.txt був змінений 30.07.2015 12:16:01 файл \Temp\hello.txt був видалений

У самому класі служби Service1 у конструкторі встановлюється ряд опцій:

This.CanStop = true; // службу можна зупинити this.CanPauseAndContinue = true; // службу можна призупинити, а потім продовжити this.AutoLog = true; // служба може вести запис у лог

У методі OnStart() для запуску об'єкта Logger викликається новий потік:

Protected override void OnStart(string args) ( logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); )

Новий потік потрібен, тому що поточний потік обробляє лише команди SCM і повинен повертатися з методу OnStart якнайшвидше.

Коли від менеджера SCM надходить команда на зупинку служби, спрацьовує метод OnStop, який викликає метод logger.Stop(). Додаткова затримка дозволить потоку логера зупинитися:

Protected override void OnStop() ( logger.Stop(); Thread.Sleep(1000); )

Проте самого класу служби ще замало. Нам необхідно ще створити установник служби.

Або робочим столом користувачів (як локальних, так і віддалених), однак для деяких служб можливий виняток - взаємодія з консоллю (сесією з номером 0, в якій зареєстрований користувач локально або під час запуску служби) mstscіз ключем /console).

Існує кілька режимів для служб:

  • заборонено до запуску;
  • ручний запуск (за запитом);
  • автоматичний запуск під час завантаження комп'ютера;
  • автоматичний (відкладений) запуск (введений у Windows Vista та Windows Server 2008);
  • обов'язкова служба/драйвер (автоматичний запуск та неможливість (для користувача) зупинити службу).

Фоновий режим

Запуск, зупинення та зміна служб Windows

Служби та їх атрибути можуть бути змінені в консолі керування MMC:

У різних версіях операційних систем можуть бути одні служби та відсутні інші. Деякі програми та програми, які встановлюються окремо, також можуть створювати свої служби.

Список служб операційних систем Microsoft Windows

Ім'я, що виводиться Ім'я служби Функції Опис
DHCP-клієнт Dhcp Реєструє та оновлює IP-адреси та DNS-записи для цього комп'ютера. Якщо ця служба зупинена, комп'ютер не зможе отримувати динамічні IP-адреси та виконувати оновлення DNS.
DNS-клієнт Dnscache Служба DNS-клієнта (dnscache) кешує імена DNS (Domain Name System) та реєструє повне ім'я цього комп'ютера. Якщо служба зупинена, роздільна здатність імен DNS триватиме. Однак результати черг імен DNS не будуть кешуватися, а ім'я комп'ютера не буде зареєстровано.
KtmRm для координатора розподілених транзакцій KtmRm Координує транзакції між MSDTC та диспетчером транзакцій ядра (Kernel Transaction Manager - KTM).
ReadyBoost EMDMgmt ReadyBoost Підтримка підвищення продуктивності системи за допомогою технології ReadyBoost.
Superfetch SysMain Superfetch Підтримує та покращує продуктивність системи.
Windows Audio Audiosrv Керування засобами роботи зі звуком для Windows. Якщо цю службу зупинено, аудіопристрої та ефекти не будуть правильно працювати.
Windows CardSpace idsvc Забезпечує надійну можливість створення, керування та розкриття цифрових посвідчень.
Автоматичне оновлення WUAUSERV Включає завантаження та інсталяцію оновлень Windows. Якщо службу вимкнено, на цьому комп'ютері неможливо використовувати автоматичне оновлення або веб-сайт Windows Update.
Віддалений виклик процедур (RPC) RpcSs Забезпечує зіставлення кінцевих точок та інших служб RPC.

Список служб, створюваних програмами та програмами Microsoft

Приклади служб, створюваних програмами та програмами інших виробників

Ім'я, що виводиться Ім'я служби Функції Опис
ESET HTTP Server EhttpSrv антивірусний захист ESET HTTP Server, компонент