Спасибо всем за комментарии. Фразы благодарности: сказать "спасибо" очень просто! Видеооткрытка: "Огромное спасибо вам!"
У вас когда-нибудь возникало желание запустить приложение как системную службу? Думаю, что да, учитывая, что в некоторые программы такая возможность встроена по-умолчанию. А знаете ли вы, что приложение запущенное как служба, работает гораздо быстрее и занимает меньше места в памяти?
В этой статье мы рассмотрим небольшую утилиту Any Service, которая в два щелчка мышки, поможет запустить любое приложение как системную службу. Any Service является оболочкой двух стандартных утилит srvinstw и instsrv из комплекта Windows 2000 Server и для ее нормальной работы вам будут необходимы права Администратора.
Программа полностью бесплатна, занимает всего 49Кб и не требует установки. Интерфейс интуитивно понятен и снабжен детальными пояснениями в виде всплывающих подсказок.
Главное окно программы позволяет произвести первичные настройки вашей будущей службы:
В первом поле вводим полный путь к исполнительному файлу приложения, которое будет запускаться как служба. В графе "Имя службы" указываем, как будет называться наша служба. В "Описание службы" - любое понятное вам описание нового сервиса.
- Взаимодействие с рабочим столом - отметьте, если приложение имеет иконку в системном лотке;
- Автозапуск службы - отметьте, если хотите, чтобы сервис запускался автоматически;
- Запустить сразу после создания - отметьте, если хотите, чтобы служба запустилась сразу после ее создания;
Как пример работы утилиты, попробуем запустить в виде системной службы популярный файловый менеджер Total Commander .
После заполнения всех необходимых полей, нажимаем кнопку "Создать".
Все, новая служба создана и готова к работе. Можно посмотреть на результат своих действий, воспользовавшись кнопкой "Службы", которая открывает групповую оснастку.
Как видите, наша новая служба Total Commander запущена. Теперь вы можете изменять ее настройки также, как и у любой другой системной службы.
В случае, если вы захотите удалить службу, воспользуйтесь кнопкой "Удаление..." в главном окне программы. Перед вами откроется такое окно:
Находим нужную службу и жмем "Удалить". Больше сервиса Total Commander не существует.
Известные проблемы: перед первым запуском, желательно отключить антивирусную программу иначе дальнейшая работа программы будет невозможна, т.к. при первом запуске, она ищет обе утилиты (srvinstw и instsrv ) в папке %WINDIR%\System32\ и если не находит, копирует их из собственного ресурса.
Последнее обновление: 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:
LocalSystem : учетная запись предоставляет широкие привилегии на локальном компьютере и соответствует компьютеру в сети
LocalService : учетная запись соответствует пользователю без привилегий на локальном компьютере и предоставляет любому удаленному серверу учетные данные анонимного доступа
NetworkService : учетная запись предоставляет широкие локальные привилегии и также представляет любому удаленному серверу учетные данные компьютера
User : учетная запись определяется конкретным пользователем в сети
Username : определяет, под какой именно учетной записью будет запускаться служба
Password : определяет пароль для запуска службы
Account : определяет тип учетной записи. Может принимать одно из значений перечисления ServiceAccount :
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 и записывать информацию о действиях в текстовый файл.