Запуск програми як служби windows (через nssm)
Чи можна запустити клієнтську програму в якості служби? Чи не кожне консольний додаток зможе запуститися як служба, а програми з графічним інтерфейсом в принципі не вміють працювати подібним чином. Але можливість запустити додаток як службу все ж є, і допоможе нам в цьому програма з оригінальною назвою Non-Sucking Service Manager.
Для демонстрації можливостей 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, можна обійтися і без підтвердження.

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


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

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

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