Иногда может потребоваться взять исполняемый файл и зарегистрировать его в качестве службы Windows. Для этого есть несколько способов, я обычно пользуюсь двумя из них.
Sc.exe
Для создания и службы из командной строки можно использовать программу SC (Sc.exe). SC представляет из себя утилиту командной строки, которая реализует вызовы ко всем функциям интерфейса прикладного программирования (API) управления службами Windows. С ее помощью можно производить любые действия со службами — просматривать состояние, управлять (запускать, останавливать и т.п.), изменять параметры, а также создавать новые службы.
При создании службы с помощью SC нет необходимости вручную создавать записи в реестре и затем перезагружать компьютер, чтобы обеспечить обновление базы данных диспетчером служб. Также SC позволяет указать имя удаленного компьютера, что дает возможность управлять службами как на локальном, так и на удаленном компьютере.
Для создания нового сервиса запускаем команду Sc create. Она создает запись службы в реестре и в базе данных диспетчера служб. Sc create имеет следующий синтаксис:
sc create [ServiceName] [binPath= ] <параметр1= > <параметр2= >
ServiceName — указывает имя, которое будет присвоено разделу службы в реестре. Имейте в виду, что это имя отличается от отображаемого имени службы (имени, которое отображается в оснастке «Services»);
binPath — указывает путь к исполняемому файлу службы.
Для примера создадим службу MyService, укажем отображаемое имя My New Service, зададим тип службы и поставим ее на авто-запуск:
Sc create MyService binPath=C:MyServiceMyService.exe DisplayName=″My New Service″ type=own start=auto
Затем откроем оснастку «Services» и посмотрим результат.
Изменять параметры уже созданной службы можно командой Sc config. Например, мне не понравилось отображаемое имя службы и я хочу его изменить:
Sc config MyService DisplayName=″My Service″
Ну и полностью удалить службу можно вот так:
Sc delete MyService
PowerShell
PowerShell может почти все 🙂 , в том числе и управлять службами Windows. Создать новую службу можно с помощью командлета New-Service. Создадим такой же сервис, как и в предыдущем примере, только добавим к нему описание (Description):
New-Service -Name MyService -BinaryPathName C:MyServiceMyService.exe`
-DisplayName ″My New Service″ -Description ″Very Important Service !!!″
Изменить параметры службы можно командлетом Set-Service:
Set-Service -Name MyService -Description ″Not Very Important Service″ -StartupType Manual
В принципе PowerShell имеет примерно такой же функционал как и Sc.exe, разве что позволяет добавить описание. А вот для удаления служб в PS простого способа нет, придется воспользоваться вот такой конструкцией:
(Get-WmiObject win32_service -Filter ″name=′MyService′″).delete()
Поэтому лично я предпочитаю использовать Sc.exe.
Службы в Windows — особые процессы, выполняемые в фоновом режиме, в том числе от учетной записи «СИСТЕМА», которые могут быть запущены в том числе до входа в систему. При желании вы можете создать свою собственную службу, которая будет работать таким же образом.
В этой инструкции подробно о том, как создать службу в Windows 11 или Windows 10 средствами системы, ограничениях методов и одном дополнительном способе заставить работать ваш процесс в качестве службы.
Создание службы в командной строке
Первый способ — использование команды командной строки для создания своей службы, шаги будут следующими:
- Запустите командную строку от имени Администратора (способы запуска командной строки от Администратора).
- Используйте команду, заменив текстовые описания и пути на свои:
sc create Имя_службы binPath="C:service-file.exe" DisplayName= "Описание_службы" type=own start=auto
- После нажатия Enter вы получите сообщение: CreateService: успех, что означает, что служба была успешно создана.
В указанной команде используются следующие параметры:
- binPath — путь к исполняемому файлу службы.
- DisplayName — отображаемое в списке служб имя службы.
- start — тип запуска, возможные значения: boot, auto, demand (значение по умолчанию), disabled, delayed-auto
- type — тип службы, по умолчанию own, возможны другие значения: share (делит исполняемый файл с другими службами), kernel (драйвер), filesys (драйвер файловой системы), interact (интерактивная служба с возможность взаимодействия с пользователем, поддержка этого типа служб прекращается).
После создания службы вы сможете увидеть её в списке служб (Win+R — services.msc), а автоматический запуск произойдет при следующей перезагрузке системы.
Создание службы в Windows PowerShell
Создать службу можно и в PowerShell, запущенном от имени администратора (или в Терминале Windows). Базовый вариант команды с параметрами по умолчанию:
New-Service -Name "Имя_Службы" -BinaryPathName '"C:путь_к_файлу параметры_запуска"'
Расширенный вариант с указанием описания и типа запуска:
New-Service -Name MyService -BinaryPathName '"C:путь_к_файлу параметры_запуска"' -DisplayName "Имя_службы" -Description "Описание службы" -StarupType "Automatic"
В случае, если выполняется запуск исполняемого файла без параметров, а путь не содержит пробелов, использование кавычек не обязательно, например:
-BinaryPathName C:remontka.exe
При создании служб в PowerShell доступны и ряд дополнительных параметров, описанных в официальной справке на сайте Майкрософт.
Удаление созданной службы
Удалить созданную службы вы можете также в командной строке, запущенной от имени Администратора с помощью команды:
sc delete Имя_службы
Или в Windows PowerShell:
Remove-Service -Name MyService
После выполнения указанных команд созданная вами служба будет удалена из Windows.
Созданная служба не работает, варианты решения
Из описания можно предположить, что любой файл .exe может быть службой, однако, при попытке добавить свои фоновые утилиты и заставить их работать в виде службы рядовые пользователи обычно сталкиваются с ситуацией, когда процесс запускается, а затем закрывается сам. А при запуске службы вручную через некоторое время сообщает, что служба не ответила на запрос своевременно или о других ошибках.
Причина в том, что исполняемые файлы служб — не совсем обычные программы, они, помимо прочего, обмениваются данными с системой. Если ваш EXE не отвечает на соответствующие запросы системы, Windows «делает вывод» о том, что со службой что-то не так.
Как быть, если вы всё-таки настойчиво хотите использовать свой прикладной исполняемый файл в качестве службы?
- Использовать планировщик заданий и запуск от соответствующего пользователя — это не будет в полной мере службой, но почти то, что нужно.
- Ранее существовала программа RunAsSvc, позволяющая запускать любые процессы в качестве службы, но для современных ОC он не применима, а разработка была прекращена.
- Использовать инструменты INSTSRV.EXE и SRVANY.EXE из Windows Server 2003 Resource Kit Tools при создании службы Windows.
Создание пользовательской службы с помощью INSTSRV.EXE и SRVANY.EXE
Последний вариант из приведённого выше списка рассмотрим подробнее. Шаги будут следующими:
- Загрузите (вероятнее всего, придется найти в Интернете на сторонних сайтах) Windows Server 2003 Resource Kit полностью или только файлы INSTSRV.EXE и SRVANY.EXE, располагаем их у себя на диске, в моем примере путь — C:Windows
- В командной строке от имени администратора используйте команду (пути меняем на свои):
C:Windowsinstsrv.exe Имя_службы C:Windowssrvany.exe
- Если вы получили сообщение о том, что The service was successfully added, всё прошло успешно. Теперь требуется запустить редактор реестра (Win+R — regedit).
- В редакторе реестра перейдите по пути
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices
и найдите раздел с вашим именем службы. Нажимаем по нему правой кнопкой мыши и выбираем пункт «Создать» — «Раздел», задаем имя «Parameters» для раздела.
- Выберите созданный раздел, нажмите правой кнопкой мыши в правой панели редактора реестра и создайте новый строковый параметр с именем Application
- Дважды нажмите по параметру и в поле «Значение» укажите путь к вашему файлу exe для запуска службы.
Закройте редактор реестра — служба создана, её можно запустить из services.msc или она будет автоматически запущена после перезагрузки компьютера.
Учитывайте, что во всех приведенных примерах служба по умолчанию запускается с учетной записью «СИСТЕМА». В некоторых случаях это может приводить к неправильной работе. В этом случае может иметь смысл зайти в свойства службы в services.msc и изменить параметры на вкладке «Вход в систему».
Службами в Windows называются процессы, стартующие вместе с системой, не имеющие графического интерфейса и работающие в фоновом режиме, причем большинство служб запускается и работают независимо от того, вошел ли пользователь в свою учетную запись или нет. Эту особенность операционной системы можно использовать в практических целях, например, создать собственную службу, которая станет отслеживать изменения в реестре или отправку пакетов TCP/IP.
В статье от 07 декабря 2020 года мы уже рассматривали процедуру создания служб в Windows 10, предлагая использовать для этой цели стороннюю утилиту Non-Sucking Service Manager, укомплектованную простейшим графическим интерфейсом.
Сегодня мы предлагаем познакомиться со способами создания служб исключительно средствами операционной системы. Используйте их, если в качестве службы вам нужно установить процесс исполняемого файла EXE, так как для назначения службами процессов скриптов всё же удобнее использовать Non-Sucking Service Manager.
Командная строка
Для создания служб в Windows можно использовать встроенную консольную утилиту sc.exe, предназначением которой как раз является добавление, удаление, опрос и конфигурирование системных служб.
Запустите командную строку от имени администратора и выполните в ней команду следующего вида:
sc create MyService binPath=»C:service.exe» DisplayName= «ServiceName» type=own start=auto
Как нетрудно догадаться, C:service.exe – это путь к исполняемому файлу службы, ServiceName – отображаемое имя (псевдоним), а MyService – фактическое имя службы, к которому нужно будет обращаться в процессе настройки службы. Параметр type задает статус, в параметр start – тип запуска.
В данном примере служба имеет статус «Отключена», а тип запуска у нее выставлен «Автоматически», в чем можно убедиться, открыв свойства добавленной службы в оснастке управления службами.
Если служба станет больше не нужна, вы всегда сможете ее удалить командой:
sc delete MyService
PowerShell
Средствами создания и управления службами обладает также и консоль PowerShell.
Запустите ее от имени администратора и выполните следующую команду:
New-Service -Name MyService -BinaryPathName C:service.exe -DisplayName «ServiceName» -Description » Service Description»
Ключевыми параметрами являются -Name и -BinaryPathName: первый принимает произвольное имя устанавливаемой службы, а второй – путь к исполняемому файлу службы.
Параметры -DisplayName и -Description являются дополнительными, они задают отображаемое имя и описание службы.
А вот с удалением службы в PowerShell не всё так однозначно.
Если у вас установлена консоль шестой или более новой версии, службу можно будет удалить командой:
Remove-Service -Name MyService
В противном случае придется использовать вот такую хитрую конструкцию, где MyService – имя службы:
(Get-WmiObject win32_service -Filter «name=’MyService'»).delete()
Для тех, кто не в курсе: узнать текущую версию PowerShell можно командой host, билд будет указан в строке Version.
И возвращаясь к службам отметим, что между службами, созданными в командной строке и PowerShell, нет никакой разницы, поэтому для их удаления в том и другом случае вы можете использовать команду sc delete MyService.
Загрузка…
Содержание
- Способ 1: Консольная утилита sc.exe
- Способ 2: Консоль «PowerShell»
- Способ 3: Сторонние программы
- Вопросы и ответы
Способ 1: Консольная утилита sc.exe
Назначить любой процесс системной службой в Windows 10 можно с помощью маленькой консольной утилиты sc.exe, входящей в состав операционной системы. Для обращения к ней можно использовать как классическую «Командную строку», так и консоль «PowerShell».
- Запустите от имени администратора «Командную строку» или «PowerShell». Первую можно открыть из поиска Windows, вторую – из контекстного меню кнопки «Пуск».
- Сформируйте команду следующего вида:
sc create MyService binPath="C:MyService.exe" DisplayName= "MyNewService" type=own start=auto
. В качестве параметра MyService binPath укажите свой путь к исполняемому файлу создаваемой службы, а в качестве параметра DisplayName — имя службы, которое станет отображаться в оснастке управления службами. - Вставьте сформированную команду в консоль и нажмите клавишу ввода.
Готово, осталось только проверить корректность создания службы в системной оснастке «Службы», запустить которую можно командой services.msc
в диалоговом окошке, вызванном клавишами Win + R.
Способ 2: Консоль «PowerShell»
Необходимыми средствами создания служб в Windows 10 располагает другой штатный инструмент – консоль «PowerShell».
- Запустите «PowerShell» от имени администратора.
- Сформируйте команду вида
New-Service -Name MyService -BinaryPathName C:MyService.exe -DisplayName "Отображаемое имя службы" -Description "Описание службы"
. Имя и описание службы могут быть произвольными. - Вставьте команду в консоль и нажмите клавишу ввода.
Проверьте корректность работы в оснастке управления службами, там же ее можно настроить.
Способ 3: Сторонние программы
Также для создания собственных служб в Windows 10 можно использовать специализированные сторонние утилиты, например Non-Sucking Service Manager. Утилита работает через «Командную строку», но у нее также имеется и графический интерфейс.
Скачать Non-Sucking Service Manager с официального сайта
- Скачайте архив с утилитой с сайта разработчика и распакуйте в удобное расположение — к примеру, поместите исполняемый файл nssm.exe в корень системного диска.
- Запустите «Командную строку» от имени администратора.
- Выполните команду
C:nssm.exe install MyService
, где MyService – название создаваемой службы. - В открывшемся окошке инсталлятора в поле «Patch» укажите полный путь к исполняемому файлу службы и нажмите кнопку «Install service».
- Служба будет установлена, подтверждением чему станет появление окошка с уведомлением «Service *Name* installed successfully!». Нажмите в нем «OK» и закройте «Командную строку».
Остальные поля в окошке инсталлятора службы заполнять не обязательно, кроме тех случаев, когда в качестве службы устанавливается командный файл, например CMD, BAT или PS1. В этом случае в поле «Patch» указывается путь к приложению-обработчику, а в поле «Arguments» – путь к файлу скрипта.
Еще статьи по данной теме:
Помогла ли Вам статья?
Как создаются службы в Windows
Иногда требуется исполняемый файл зарегистрировать в качестве службы Windows. Имеется пара способов это сделать:
Для создания и службы из командной строки можно использовать программу SC (Sc.exe). SC представляет из себя утилиту командной строки, которая реализует вызовы ко всем функциям интерфейса прикладного программирования (API) управления службами Windows. С ее помощью можно производить любые действия со службами — просматривать состояние, управлять (запускать и останавливать), изменять параметры, а также создавать новые службы.
При создании службы с помощью SC нет необходимости вручную создавать записи в реестре и затем перезагружать компьютер, чтобы обеспечить обновление базы данных диспетчером служб. Также SC позволяет указать имя удаленного компьютера, что дает возможность управлять службами как на локальном, так и на удаленном компьютере.
Для создания нового сервиса запускаем команду Sc create. Она создает запись службы в реестре и в базе данных диспетчера служб. Sc create имеет следующий синтаксис:
sc create [ServiceName] [binPath= ]
ServiceName — указывает имя, которое будет присвоено разделу службы в реестре. Имейте в виду, что это имя отличается от отображаемого имени службы (имени, которое отображается в оснастке «Services»);
binPath — указывает путь к исполняемому файлу службы.
Для примера создадим службу MyService, укажем отображаемое имя My New Service, зададим тип службы и поставим ее на авто-запуск:
Sc create MyService binPath=C:MyServiceMyService.exe DisplayName=″My New Service″ type=own start=auto
Затем откроем оснастку «Services» и посмотрим результат.
Изменять параметры уже созданной службы можно командой Sc config. Например, не понравилось отображаемое имя службы:
Sc config MyService DisplayName=″My Service″
Или полностью удалить службу:
Sc delete MyService
Источник
Создание службы в Windows 10
Бывает, что имеется некий исполняемый файл, который необходимо зарегистрировать в системе как службу Windows 10. Существует множество различных способов, которые позволяют это сделать. Сейчас мы рассмотрим два основных и проверенных метода создания службы Windows.
Создание службы с помощью программы Sc.exe
Первый способ позволяет создавать службы, используя утилиты, работающие через командную строку. В данном случае, используется инструмент sc.exe. Он позволяет взаимодействовать с функциями API и выполнять операции со службами Windows 10. Несмотря на то, что данная программа даже не обладает графическим интерфейсом, она является мощным инструментом и может контролировать состояние служб, создавать, редактировать и управлять ими.
Если создавать службу, с помощью sc.exe, то не возникает необходимости в изменении параметров реестра и списка служб в диспетчере. Кроме того, утилита способна работать со службами на локальном компьютере, и выполнять те же действия на удаленных машинах.
Чтобы создать новый сервис, откройте командную строку от имени администратора и запустите команду «Sc create». Она запишет новую службу к базе диспетчера служб. Синтаксис команды представлен следующим образом:
- ServiceName — данным параметром определяется имя раздела службы в реестре;
Данное имя не совпадает с тем именем, которое будет отображаться диспетчере (например, в Services). - BinPath — в этом параметре записываем путь, где хранится исполняемый файл.
Чтобы было понятнее, в качестве примера, мы создадим службу «MySevice». При этом, отображаемое имя будет «My New Service». Указываем тип службы и включаем автозапуск:
Sc create MyService binPath=C:MyServiceMyService.exe DisplayName=″My New Service″ type=own start=auto
Теперь откройте оснастку «Services» и взгляните на то, что получилось:
Параметры службы, которая уже была создана и запущена, можно изменить при помощи команды Sc config. К примеру, мы заменим имя службы, которое отображается как:
Sc config MyService DisplayName=″My Service″
А еще можно избавиться от службы полным ее удалением. Для этого используйте такую команду:
С помощью утилиты PowerShell
Ну а с помощью такого мощного инструмента, как PowerShell можно хоть горы двигать. Он обладает большими возможностями и способен работать с различными службами. Здесь, для добавления новой службы, существует специальная команда «New -Service». Давайте попробуем новую службу, как и в прошлом примере, будем использовать те же имена и значения, только добавим дополнительный параметр, в виде описания. И так, команда, для создания нового сервиса, выглядит следующим образом:
New-Service -Name MyService -BinaryPathName C:MyServiceMyService.exe` -DisplayName ″My New Service″ -Description ″Very Important Service . ″
Для изменения параметров служб, существует команда «Set -Service»:
Set-Service -Name MyService -Description ″Not Very Important Service″ -StartupType Manual
Если не считать дополнительную возможность добавления описаний к службам, PowerShell обладает таким же функционалом, как и утилита Sc.exe. Но есть один маленький минус — здесь нет простой команды для удаления службы. Поэтому приходиться использовать такой вот, немного мудреный, код:
(Get-WmiObject win32_service -Filter ″name=′MyService′″).delete()
Источник
Практическое руководство. Создание служб Windows How to: Create Windows Services
При создании службы можно использовать шаблон проекта Visual Studio, который называется Служба Windows. When you create a service, you can use a Visual Studio project template called Windows Service. Этот шаблон автоматически выполняет основную часть работы, ссылаясь на необходимые классы и пространства имен, устанавливая наследование от базового класса для служб и переопределяя некоторые методы, которые вы обычно хотите переопределять. This template automatically does much of the work for you by referencing the appropriate classes and namespaces, setting up the inheritance from the base class for services, and overriding several of the methods you’re likely to want to override.
Шаблон проекта «Службы Windows» в экспресс-выпуске Visual Studio отсутствует. The Windows Services project template is not available in the Express edition of Visual Studio.
Для создания функциональной службы необходимо выполнить, как минимум, следующее: At a minimum, to create a functional service you must:
Задайте свойство ServiceName. Set the ServiceName property.
Создайте установщики, необходимые для приложения службы. Create the necessary installers for your service application.
Переопределите и задайте код для методов OnStart и OnStop для настройки режимов поведения службы. Override and specify code for the OnStart and OnStop methods to customize the ways in which your service behaves.
Создание приложения службы Windows To create a Windows Service application
Создайте проект Служба Windows. Create a Windows Service project.
Инструкции по созданию службы без использования шаблона см. в разделе Практический пример. Создание служб программным способом. For instructions on writing a service without using the template, see How to: Write Services Programmatically.
В окне Свойства задайте для своей службы свойство ServiceName. In the Properties window, set the ServiceName property for your service.
Значение ServiceName свойства всегда должно соответствовать имени, указанному в классах установщика. The value of the ServiceName property must always match the name recorded in the installer classes. При изменении этого свойства необходимо также обновить свойство ServiceName классов установщика. If you change this property, you must update the ServiceName property of installer classes as well.
Установите любые из следующих свойств для определения режима работы службы. Set any of the following properties to determine how your service will function.
Свойство. Property | Параметр Setting |
---|---|
CanStop | True , чтобы указать, что служба может принимать запросы на останов работы; false для предотвращения останова службы. True to indicate that the service will accept requests to stop running; false to prevent the service from being stopped. |
CanShutdown | True , чтобы указать, что служба хочет принимать уведомления о выключении компьютера, на котором она работает, позволяя ему вызывать процедуру OnShutdown. True to indicate that the service wants to receive notification when the computer on which it lives shuts down, enabling it to call the OnShutdown procedure. |
CanPauseAndContinue | True , чтобы указать, что служба может принимать запросы на приостановку или возобновление выполнения; false для предотвращения приостановки и возобновления работы службы. True to indicate that the service will accept requests to pause or to resume running; false to prevent the service from being paused and resumed. |
CanHandlePowerEvent | True , чтобы указать, что служба может обрабатывать уведомления об изменениях состояния питания компьютера; false , чтобы не сообщать службе об этих изменениях. True to indicate that the service can handle notification of changes to the computer’s power status; false to prevent the service from being notified of these changes. |
AutoLog | True для внесения информационных записей в журнал событий приложения, когда служба выполняет некоторое действие; false для отключения этой функции. True to write informational entries to the Application event log when your service performs an action; false to disable this functionality. Дополнительные сведения см. в разделе Практическое руководство. Запись сведений о службах в журнал. For more information, see How to: Log Information About Services. Примечание. По умолчанию свойство AutoLog имеет значение true . Note: By default, AutoLog is set to true . |
Когда CanStop или CanPauseAndContinue имеют значение false , диспетчер служб будет отключать пункты меню, отвечающие за остановку, приостановку или возобновление работы службы. When CanStop or CanPauseAndContinue are set to false , the Service Control Manager will disable the corresponding menu options to stop, pause, or continue the service.
Откройте редактор кода и введите данные для выполнения операций для процедур OnStart и OnStop. Access the Code Editor and fill in the processing you want for the OnStart and OnStop procedures.
Переопределите все прочие методы, для которых необходимо определить функциональные возможности. Override any other methods for which you want to define functionality.
Добавить установщики, необходимые для приложения службы. Add the necessary installers for your service application. Дополнительные сведения см. в разделе Практическое руководство. Добавление установщиков в приложение-службу. For more information, see How to: Add Installers to Your Service Application.
Скомпилируйте проект, выбрав в меню Сборка пункт Собрать решение. Build your project by selecting Build Solution from the Build menu.
Не нажимайте клавишу F5 для запуска проекта — таким способом нельзя запустить проект службы. Do not press F5 to run your project — you cannot run a service project in this way.
Установите службу. Install the service. Дополнительные сведения см. в разделе Практическое руководство. Установка и удаление служб. For more information, see How to: Install and Uninstall Services.
Источник
Создание службы для Windows
Последнее обновление: 16.10.2019
Одним из важнейших компонентов ОС 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; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using 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; using System.ServiceProcess; using System.IO; using 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 void OnStart(string[] args) { logger = new Logger(); Thread loggerThread = new Thread(new ThreadStart(logger.Start)); loggerThread.Start(); } protected override void OnStop() { logger.Stop(); Thread.Sleep(1000); } } 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); } } public void Stop() { 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, FileSystemEventArgs 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); } private void RecordEntry(string fileEvent, string filePath) { lock (obj) { using (StreamWriter writer = new StreamWriter("D:\templog.txt", true)) { 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:Temphello.txt 30.07.2015 12:15:55 файл D:Temphello.txt был изменен 30.07.2015 12:15:55 файл D:Temphello.txt был изменен 30.07.2015 12:16:01 файл D:Temphello.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); }
Однако самого класса службы еще недостаточно. Нам необходимо еще создать устанощик службы.