Как сделать службу из обычной программы. Запускаем приложение как системную службу

Последнее обновление: 31.10.2015

Для установки службы нам понадобится класс установщика. Для его добавления нажмем правой кнопкой мыши на проект и в контекстном меню выберем Add - > Component... . Затем в окне добавления нового элемента выберем пункт Installer Class :

По умолчанию для файла установщика генерируется название Installer1.cs. Оставим это название.

После добавления узел установщика в окне обозревателя решения (Solution Explorer) будет содержать два файла: сам файл класса Installer1 и файл дизайнера Installer1.Designer.cs. Откроем файл кода. Сейчас он выглядит так:

Using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration.Install; using System.Linq; using System.Threading.Tasks; namespace FileWatcherService { public partial class Installer1: System.Configuration.Install.Installer { public Installer1() { InitializeComponent(); } } }

Теперь изменим его следующим образом:

Using System.ComponentModel; using System.ServiceProcess; using System.Configuration.Install; namespace FileWatcherService { public partial class Installer1: Installer { ServiceInstaller serviceInstaller; ServiceProcessInstaller processInstaller; public Installer1() { InitializeComponent(); serviceInstaller = new ServiceInstaller(); processInstaller = new ServiceProcessInstaller(); processInstaller.Account = ServiceAccount.LocalSystem; serviceInstaller.StartType = ServiceStartMode.Manual; serviceInstaller.ServiceName = "Service1"; Installers.Add(processInstaller); Installers.Add(serviceInstaller); } } }

Класс установщика унаследован от класса System.Configuration.Install.Installer . Атрибут указывает на то, что класс Installer1 должен вызываться при установке сборки, то есть службы.

Он определяет ряд методов: Install() (установка), Commit() (завершает транзакцию установки), Rollback() (восстанавливает состояние компьютера до установки) и Uninstall() (удаление). При необходимости мы можем их переопределить. Но в нашем случае мы будем использовать только конструктор.

В конструкторе вызывается метод InitializeComponent() , который призван выполнять начальную инициализацию. Он определен в файле дизайнера Installer1.Designer.cs и по сути ничего не делает:

Private System.ComponentModel.IContainer components = null; private void InitializeComponent() { components = new System.ComponentModel.Container(); }

Для установки службы нам также понадобится классы ServiceInstaller и ServiceProcessInstaller . Почему именно два класса? ServiceProcessInstaller управляет настройкой значений для всех запускаемых служб внутри одного процесса (как было рассмотрено в прошлой теме, метод Main класса Program может одновременно запускать несколько служб). Класс ServiceInstaller предназначен для настройки значений для каждой из запускаемых служб. То есть если у нас запускается три службы, то для каждой службы создается свой объект ServiceInstaller. Но в нашем случае в прошлой теме мы определили только одну запускаемую службу, поэтому объекты обоих классов у нас будут только в одном экземпляре.

Через свойства оба класса позволяют задать настройки службы. Основные свойства ServiceProcessInstaller:

    Username : определяет, под какой именно учетной записью будет запускаться служба

    Password : определяет пароль для запуска службы

    Account : определяет тип учетной записи. Может принимать одно из значений перечисления ServiceAccount :

    • LocalSystem : учетная запись предоставляет широкие привилегии на локальном компьютере и соответствует компьютеру в сети

      LocalService : учетная запись соответствует пользователю без привилегий на локальном компьютере и предоставляет любому удаленному серверу учетные данные анонимного доступа

      NetworkService : учетная запись предоставляет широкие локальные привилегии и также представляет любому удаленному серверу учетные данные компьютера

      User : учетная запись определяется конкретным пользователем в сети

    HelpText : возвращает справку, содержащую информацию об установке службы

Некоторые важнейшие свойства ServiceInstaller:

    StartType : определяет, как должна запускаться служба - автоматически или вручную. Может принимать следующие значения: ServiceStartMode.Automatic (автоматический запуск), ServiceStartMode.Manual (вручную) и ServiceStartMode.Disabled (служба по умолчанию отключена)

    DelayedAutoStart : определяет, должна ли служба запускаться не сразу после загрузки операционной системы, а немного позже

    DisplayName : устанавливает имя службы, которое будет отображаться в различных утилитах управления службами

    ServiceName : имя службы, должно совпадать со значением свойства ServiceName у класса службы

То есть в нашем случае для службы установлен запуск вручную, и ей будут предоставляться широкие привилегии.

В конце оба объекта установщиков надо добавить в коллекцию Installers: Installers.Add()

Итак, у нас готов код службы и код инсталяторов. Теперь скомпилируем проект, и в проекте в папке bin/Debug у нас будет лежать исполняемый файл службы, который будет называться по имени проекта и иметь расширение exe. Например, в моем случае он называется FileWatcherService.exe.

И теперь нам надо установить службу. Для этого нам надо запустить специальную утилиту InstallUtil.exe и передать ей имя файла службы.

Утилиту InstallUtil.exe можно найти по пути C:\Windows\Microsoft.NET\Framework64\v4.0.30319 для 64-битных платформ и в C:\Windows\Microsoft.NET\Framework\v4.0.30319 для 32-битных.

Также можно вынести исполняемый файл службы в какое-нибудь другое место, например, я поместил его в папку D://servces . Тогда установка службы в командной строке будет выглядеть так:

И если мы зайдем после успешной установки в консоль служб, то сможем найти только что установленную службу.

Мы ее можем запустить, и она будет выполнять все те действия, которые мы в ней определили.

Если нам служба больше не нужна, и мы хотим ее удалить, то мы можем воспользоваться той же утилитой, передав ему флаг u:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319>InstallUtil.exe /u D://servces/FileSystemWatcher.exe

И после запуска созданная служба будет мониторить все действия с файлами в папке D://Temp и записывать информацию о действиях в текстовый файл.

Полезная информация
Недавно наша компания начала плавный переход части своих задач в облако. В частности мы активно начали использовать концепцию saas от Salesforce.com, в чем нам очень сильно помогли консультанты компания CT Consulting. Проект был признан успешным и активно продолжается.

Если говорить о приложениях очень общими словами они бывают либо непосредственно работающие с пользователем в графическим интерфейсом, либо работают в фоне в виде служб. Иногда возникает необходимость запустить определенное приложение в виде службы, однако в приложении такой возможности не предусмотрено. Как сделать это мы и рассмотрим в данной статье. В качестве примера возьмем программу uTorrent.

Дополнительно требуемое ПО

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

Для этого есть различные методы, однако одним из моих любимых является использование instsrv.exe и srvany.exe . Данные утилиты являются частью Windows 2003 resource kit, который можно скачать с сайта MS.

  • Скачиваем и устанавливаем Resource Kit в директорию по умолчанию. c:\Program Files (x86)\Windows Resource Kits\Tools\

Подготавливаем аккаунт для службы

Одним из преимуществ запуска приложения в качестве службы является то, что вы можете указать аккаунт пользователя под которым служба будет запускаться.

Обычно служебные аккаунты никогда не используются для непосредственного входа на машины. Их необходимо создавать с параметрами, предотвращающими запрос на смену пароля.

  • Создайте и залогиньтесь в систему под служебным аккаунтом.
  • Запустите приложение и сделайте необходимые изменения – для uTorrent я включаю веб-интерфейс и устанавливаю корректные настройки портов подключения.

Создание службы

При выполнении необходимых действий мы выполняем 2 основных шага. В первом мы созадем запись в реестре для оболочки службы. Во втором мы настраиваем необходимые параметры оболочки.

  • Откройте командную строку с правами администратора
  • Введите следующую команду:

C:\>"c:\Program Files (x86)\Windows Resource Kits\Tools\instsrv.exe" uTorrent " c:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe"

  • Вы должны получить сообщение "The service was successfully added!"

В данный момент вы уже создали службу, но ещё не указали что служба должна выполнять.

  • Откройте редактор реестра
  • Перейдите в HKLM\System\CurrentControlSet\Services\
  • Найдите службу, которую вы создали(uTorrent)
  • Создайте новую ветку с именем Parameters
  • В ветке Parameters создайте ключ Application
  • Укажите путь к исполняемому файлу без кавычек

В данный момент у нас уже есть необходимая служба, запускающая требуемое приложение. Далее нам необходимо её настроить.

  • Откройте консоль управления службами
  • Найдите службу uTorrent
  • На вкладке General укажите режим запуска автоматический
  • На вкладке Log On tab укажите ранее созданный служебный аккаунт

Если это локальный аккаунт используйте синтаксис.\account если доменный, то domain\account

Тестирование

Для проверки что все работает перезагрузим компьютер. Залогинимся под другим пользователем и проверим следующее:

  • Служба запущена
  • Процесс работает под служебным аккаунтом
  • Приложение работает так, как нами задумано

Интересное

Не всем по карману настоящие швейцарские часы, но козырнуть все таки хочется. Поэтому я решил, что куплю копию швейцарских часов и никому не скажу . Нашел отличный магазин с огромным выбором очень качественных копий. При чем нужно учитывать - что это не подделки, это на самом деле отличные часы, которые тоже стоят очень неплохо, поэтому если бюджет ограничен – это на самом деле отличный выбор.

Если нам необходимо запустить обыкновенное приложение в качестве службы Windows, то у нас есть как минимум два способа это сделать. Во первых есть утилиты Srvany & Instsrv из Resouce Kit, в во вторых есть очень интересное приложение под названием Non-Sucking Service Manager, которая является свободным программным обеспечением с открытым кодом может работать в операционных системах Microsoft, начиная с Windows 2000 и заканчивая Windows 8. При этом NSSM не требует установки, а взять ее можно на официальном сайте nssm.cc. Рассмотрим чуть подробнее оба способа запуска приложения в качестве службы Windows.

Способ первый – Srvany & Instsrv.

Для начала стоит убедится, что вы работаете под учетной записью администратора, в этом случае у вас не только достаточно прав для любых действий, но и созданная под этим аккаунтом служба будет продолжать работать под остальными учетными записями. Далее, копируем файлы instsrv.exe и srvany.exe в папку system32. Запyскам из командной стpоки следующую команду:

instsrv MyService c:полный_пyтьsrvany.exe (здесь MyService это указанное вами имя вновь созданной службы). Теперь, для конфигурирования службы, идем в «Панель управления», затем в раздел «Администрирование» и затем в раздел «Службы», здесь мы находим свой созданный сеpвис и щёлкаем на нём 2 pаза левой кнопкой мыши.

В появившемся окне свойств отмечаем, каким способом наша служба бyдет запyскаться: Automatic – бyдет запyскаться автоматически пpи загpyзке Windows, Manual – бyдет запyскаться только, когда вы ее запустите вpyчнyю, Disabled – не бyдет запyскаться вообще. Если нужно, чтобы запущенная служба взаимодействовала с вашим рабочим столом, то отметьте чек-бокс «Allow Service to Interact with Desktop». Теперь мы запускаем редактор реестра в ветке:

HKLM SYSTEM CurrentControlSet Service Имя_Вашей_службы

создаёте ключ с названием «Parameters» (без кавычек) и задаете для него значение «Application» (без кавычек) типа REG_SZ в котором указываете полный пyть к исполняемомy файлy, который стартует как служба. Осталось перезагрузить компьютер или запустить службу вручную.

Способ второй – Non-Sucking Service Manager.

Открываем командную строку (конечно, с правами администратора) и переходим в папку, в которую мы предварительно распаковали NSSM. Здесь мы вводим команду

nssm install наша_служба

в результате выполнения команды откроется окно инсталлятора NSSM. Для того, чтобы создать службу, нам достаточно в поле Path указать путь к исполняемому файлу и нажать кнопку «Install service». Кроме того, в поле Options мы можем указать ключи, если они необходимы для запуска службы.

Теперь перейдем к настройке некоторых дополнительных параметров. На вкладке «Shutdown» перечислены методы остановки, которые используются при штатном завершении работы службы или аварийной остановке приложения. Стоит оставить все галочки, поскольку для разных приложений срабатывают разные методы.

Далее, при настройках по умолчанию в случае падения службы, NSSM пытается снова запускать ее, но на вкладке «Exit actions» можно указать, какое действие будет выполняться в случае нештатного завершения работы приложения и выставить задержку перед автоматическим перезапуском приложения. На вкладке «Environment» мы можем задать для службы новые переменные окружения, или же переопределить существующие.

На тот случай, если мы хотим не пользоваться графической оболочкой, можно сразу создать службу из командной строки командой:

nssm install notepad ?полный_путь_к_исполнаемому_файлусам_файл.exe?

Для удаления службы вводим команду:

nssm remove наша_служба

и подтверждаем ее удаление, если ввести команду:

nssm remove notepad confirm

то и подтверждение запрашиваться не будет.

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

(Пока оценок нет)

Можно ли запустить клиентское приложение в качестве службы? Не каждое консольное приложение сможет запуститься как служба, а программы с графическим интерфейсом в принципе не умеют работать подобным образом. Но возможность запустить приложение как службу все же есть, и поможет нам в этом программа с оригинальным названием Non-Sucking Service Manager .

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

Для демонстрации возможностей NSSM попробуем запустить Блокнот в качестве службы на .

Создание службы

Для создания службы с именем 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. Не самое красивое, но вполне соответствующее своему названию


Иногда ошибки services.exe и другие системные ошибки EXE могут быть связаны с проблемами в реестре Windows. Несколько программ может использовать файл services.exe, но когда эти программы удалены или изменены, иногда остаются "осиротевшие" (ошибочные) записи реестра EXE.

В принципе, это означает, что в то время как фактическая путь к файлу мог быть изменен, его неправильное бывшее расположение до сих пор записано в реестре Windows. Когда Windows пытается найти файл по этой некорректной ссылке (на расположение файлов на вашем компьютере), может возникнуть ошибка services.exe. Кроме того, заражение вредоносным ПО могло повредить записи реестра, связанные с Windows XP. Таким образом, эти поврежденные записи реестра EXE необходимо исправить, чтобы устранить проблему в корне.

Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей services.exe не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!

В связи с подобным риском мы настоятельно рекомендуем использовать надежные инструменты очистки реестра, такие как %%product%% (разработанный Microsoft Gold Certified Partner), чтобы просканировать и исправить любые проблемы, связанные с services.exe. Используя очистку реестра , вы сможете автоматизировать процесс поиска поврежденных записей реестра, ссылок на отсутствующие файлы (например, вызывающих ошибку services.exe) и нерабочих ссылок внутри реестра. Перед каждым сканированием автоматически создается резервная копия, позволяющая отменить любые изменения одним кликом и защищающая вас от возможного повреждения компьютера. Самое приятное, что устранение ошибок реестра может резко повысить скорость и производительность системы.


Предупреждение: Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.

Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с services.exe (например, Windows XP):

  1. Нажмите на кнопку Начать .
  2. Введите "command " в строке поиска... ПОКА НЕ НАЖИМАЙТЕ ENTER !
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER .
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да .
  6. Черный ящик открывается мигающим курсором.
  7. Введите "regedit " и нажмите ENTER .
  8. В Редакторе реестра выберите ключ, связанный с services.exe (например, Windows XP), для которого требуется создать резервную копию.
  9. В меню Файл выберите Экспорт .
  10. В списке Сохранить в выберите папку, в которую вы хотите сохранить резервную копию ключа Windows XP.
  11. В поле Имя файла введите название файла резервной копии, например "Windows XP резервная копия".
  12. Убедитесь, что в поле Диапазон экспорта выбрано значение Выбранная ветвь .
  13. Нажмите Сохранить .
  14. Файл будет сохранен с расширением.reg .
  15. Теперь у вас есть резервная копия записи реестра, связанной с services.exe.

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



 

Пожалуйста, поделитесь этим материалом в социальных сетях, если он оказался полезен!