Как написать сервис windows

Обновлено: 30.06.2024

Аннотация: Данный материал был написан после того, как попытка создать сервис по материалу, изложенному в MSDN, многократно заставляла задумываться над тем, что же хотели сделать авторы и, почему именно так, а не так, как надо. В результате этого, появилось это рабочее обобщение, которым автор и сам теперь пользуется, когда возникает необходимость создания или модернизации сервисов.

Глава 1. Создать сервис это просто

Службы Windows (Windows NT services) - процессы, обладающие унифицированным интерфейсом для взаимодействия с операционными системами Windows серии NT. Службы делятся на два типа - службы Win32, взаимодействующие с операционной системой посредством диспетчера управления службами (Service Control Manager - SCM), и драйвера, работающие по протоколу драйвера устройства (далее речь идет о службах Win32). Службы работают в фоновом режиме, и их работа скрыта от пользователя. В силу этого они идеально подходят для реализации серверных процессов в архитектуре клиент-сервер, сетевых служб, программ мониторинга и спорадически выполняемых программ.

Написать функциональный код и код событий OnStart и OnStop.

Создать установщики для службы (ProjectInstaller - для установки процесса и ServiceInstaller - для службы или служб проекта).

Создать исполняемый файл.

Создать проект установки.

Параграф 1. Создание проекта службы

После нажатия кнопки OK проект решения Service будет создан. Cозданные файлы проекта несколько отличны от тех, что были в Visual Studio 2003. Их имена (см. Рис.1. и директорию проекта):
- Имя_Проекта.sln,
- Имя_Проекта.csproj,
- Servece1.Designer.cs,
- Service1.cs,
- Service1.resx.

Файл AssemblyInfo.cs "переехал" в папку Properties.

Рис.1. Создание проекта решения службы

На данном этапе нас интересует файл с именем Service1.cs. Service - имя класса проекта, наследника класса System.ServiceProcess.ServiceBase.

Класс содержит конструктор класса, функцию main и функции методов OnStart и OnStop. Методы OnPause (), и OnContinue () также могут быть включены в проект (их код может быть дописан вручную, но методы не являются обязательными).

Код инициализации компонент в Visual Studio 2005 перемещен в файл Servece1.Designer.cs, как и метод Dispose:

В контекстном меню дизайнера формы (вкладка проекта Service1.cs [Design], правый клик мышки) выбираем пункт Properties (если вкладка не видна - дважды кликнем мышкой по имени файла Servece1.cs в Solutation Explorer). Устанавливаем свойства(Рис.2.):
- ServiceName (имя проекта) - MyFirstService,
- AutoLog - True.

Рис.2. Установка свойств сервиса

Здесь можно изменить и отображаемое имя сервиса (свойство ServiceName).

На этом проект решения сервиса создан.

Параграф 2. Написание функционального кода сервиса

Добавим пространство имен:

Объявим в классе Service1 StreamWriter:

Коды обработчиков событий запишем следующим образом:

Позже мы добавим нашему сервису другую функциональность.

Параграф 3. Создание установщиков для службы

На вкладке Service1.cs [Design] вызываем вновь контекстное меню и пункт Add Instaler. В проект добавляется класс компонента, содержащий два установщика:
- ProjectInstaller - для установки службы и
- ServiceInstaller - для установки связанного со службой процесса.

Для ServiceInstaller1 отображаем его свойства (контекстное меню Properties) и задаем:
- ServiceName - MyFirstService,
- ServerType - Automatic.

Для ServiceProcessInstaller1 устанавливаем значение Account в LocalSystem (Рис.3.).

Рис.3. Создание установщика для службы

Параграф 4. Создание исполняемого файла для службы

В Solution Explorer выбираем пункт Properties для узла MyFirstServices. В диалоговом окне выбираем вкладку Application. Для пункта Startup object выбираем в выпадающем списке MyFirstService.Programm (Рис.4.).

Рис.4. Установка свойств для программы установки

Рис.5. Необходимость установки сервиса

Параграф 5. Создание проекта установки для службы

В меню File выбираем пункт Add Project и New Project. В диалоговом окне Add New Project в окне Project Types выбираем вкладку Other Project Types ветвь Setup and Deployment, в окне Templates - Setup Project, задаем Name и Location - оба параметра непринципиальны(Рис.6.).

Рис.6. Добавление проекта решения установки службы

Проект установки добавлен в решение и мы его видим в Solutation Explorer.

Кроме того на вкладке File System (FirstServices) мы можем видеть сборку файлов для установки "File System on Target Machine" (Рис.7.).

Рис.7. Создание проекта решения установки службы

Следующее, что нужно сделать - это определить для установки директорию для проекта службы Windows.

Выбираем узел File System on Target Machine (если по какой либо причине мы не видим дерево папок, то можно его отобразить через контекстное меню узла FirstServices, пункт View/File System), в его контекстном меню выбираем Add Special Folder и System Folder. Имя System Folder появилось в ветви узла File System on Target Machine.

В контекстном меню System Folder выбираем Add, Project Output\Primary Output (Рис.8.).

Рис.8. Определение директории для службы

Выбираем пункт View для узла FirstServices пункт Custom Action, слева в окне откроются по умолчанию четыре возможных действия для инсталлятора: Install, Commit, Rollback и Uninstall. Для Install и Uninstall через их контекстное меню выполняем пункт Add Custom Action и указываем System Folder (Рис.9.).

Рис.9. Определение действий инсталлятора

Практически, мы определили не только действие, но и объект этого действия - Primary output from MyFirstService (Active). В данные узлы пользовательских действий (Install и Uninstall) будет добавлен основной выходной файл проекта. В свойствах можно изменить для файла CustomInstaller, значение true сообщает инсталлятору, что используется класс инсталлятора (Рис.10.).

Рис.10. Определение действий инсталлятора

Теперь можно построить проект инсталлятора, вызвав для узла FirstServices в Solutation Explorer пункт Build.

Параграф 6. Установка, активизация и удаление службы

Для установки службы в Solutation Explorer выбираем проект установки (FirstServices) и в контекстном меню пункт Install. В результате, будет запущен Setup Wizard. На втором шаге его работы зададим системную папку Windows - C:\WINDOWS\system32\. После окончания работы Setup Wizard служба будет установлена.

Чтобы запустить и остановить службу откроем диспетчер управления службами (в Windows XP - Start/Programm/Administrative Tools/Services). Имя нашей службы MyFirstService будет отображено в окне Services, и можно обычным образом запустить наш сервис через контекстное меню пункт Start (кроме того, служба автоматически будет запускаться при перегрузке компьютера).

Наш сервис (служба) создал файл Service1.log в "C:\windows\System32\ и выполнил в него запись о своем старте. При останове сервиса запись будет выполнена вновь.

Службу можно устанавливать и удалять, используя файлы setup.exe и FirstServices.msi, которые после построения установщика находятся в каталоге, где был создан проект инсталлятора В данном примере в C:\. \FirstService\Debug\ и, кроме того, этих двух файлов достаточно для установки службы из любой директории любого компьютера.

На данном этапе мы выполнили все требуемые шаги и проверили нашу службу в работе. Далее, можно выполнить построение проекта в режиме Release (меню Build, Configuration Manager, Release). setup.exe и FirstServices.msi, после построения установщика будут находятся в каталоге C:\. \FirstServices\bin\Release). Далее возможно наполнять функциональность службы по своему усмотрению.

Удаления сервиса с компьютера выполняется как и обычного приложения Windows - (Settings/Control Panel/Add on Remove Programs).

Одним из важнейших компонентов ОС Windows являются службы. Фактически это отдельные приложения, которые не имеют графического интерфейса и которые выполняют различные задачи в фоновом режиме. Службы могут быть запущены при старте операционной системы, так и в любой другой момент работы пользователя. Распространенным примером служб являются различные веб-серверы, которые в фоновом режиме прослушивают определенный порт на наличие подключений, и если подключения имеются, то взаимодействуют с ними. Это могут быть также различные вспомогательные сервисы обновлений для других установленных программ, которые обращаются к серверу, чтобы узнать, есть ли новая версия приложения. В общем то мы можем открыть панель служб и сами увидеть все установленные и запущенные службы:

Вначале создадим новый проект, который будет иметь тип Windows Service . Назовем проект FileWatcherService:

Проект Windows Service в Visual Studio 2015

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

Итак, новый проект выглядит следующим образом:


Здесь также есть файл Program.cs и есть собственно узел службы Service1.cs .

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

Сама запускаемая служба представлена узлом Service1.cs. Однако на самом деле это не простой файл кода. Если мы откроем этот узел, то увидим в нем файл дизайнера службы Service1.Designer.cs и класс Service1.

Класс Service1 собственно представляет службу. По умолчанию он имеет следующий код:

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

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

Когда в консоли служб или через командную строку мы посылаем команду на остановку службы, то SCM обращается к методу OnStop для ее остановки.

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

OnPause : вызывается при приостановке службы

OnContinue : вызывается при возобновлении работы службы после ее приостановки

OnShutdown : вызывается при завершении работы Windows

OnPowerEvent : вызывается при изменении режима электропитания

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

В конструкторе класса Service1 вызывается метод InitializeComponent() , который определен в файле дизайнера Service1.Designer.cs:

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

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

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

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

События FileSystemWatcher позволяют отслеживать все изменения в наблюдаемой папке. При этом будет вестись запись изменений в файл templog.txt. Чтобы не было гонки ресурсов за файл templog.txt, в который вносятся записи об изменениях, процедура записи блокируется заглушкой lock(obj) .

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

В самом классе службы Service1 в конструкторе устанавливается ряд опций:

В методе OnStart() для запуска объекта Logger вызывется новый поток:

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

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

Однако самого класса службы еще недостаточно. Нам необходимо еще создать устанощик службы.

Эта документация не относится к последней версии службы Windows. Последние сведения о службах Windows с использованием BackgroundService, а также о шаблоне рабочей службы см. в следующих статьях:

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

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

В Visual Studio в меню Файл последовательно выберите пункты Создать > Проект (или нажмите клавиши CTRL+SHIFT+N), чтобы открыть окно Новый проект.

Шаблон приложения Windows в диалоговом окне нового проекта Visual Studio

В поле Имя введите MyNewService, а затем нажмите кнопку ОК.

Откроется вкладка Проект (Service1.cs [Проект] или Service1.vb [Проект] ).

Этот шаблон проекта содержит класс компонента с именем Service1 , наследуемый от System.ServiceProcess.ServiceBase. В нем собран основной служебный код, в том числе код для запуска службы.

Переименование службы

Измените имя службы с Service1 на MyNewService.

В обозревателе решений выберите файл Service1.cs или Service1.vb, а затем выберите в контекстном меню команду Переименовать. Переименуйте файл в MyNewService.cs или MyNewService.vb и нажмите клавишу ВВОД.

Появится всплывающее окно, предлагающее переименовать все ссылки на элемент кода Service1.

Выберите Да.

Запрос на переименование

На вкладке Проект выберите в контекстном меню пункт Свойства. В окне Свойства измените значение ServiceName на MyNewService.

Свойства службы

В меню Файл выберите команду Сохранить все.

Добавление компонентов в службу

В этом разделе к службе Windows будет добавлен настраиваемый журнал событий. Компонент EventLog — это пример типа компонента, который можно добавить в службу Windows.

Добавление возможности работы с настраиваемым журналом событий

В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Показать конструктор.

На панели элементов разверните раздел Компоненты и перетащите компонент EventLog на вкладку Service1.cs [Проект] или Service1.vb [Проект] .

В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Просмотреть код.

Добавьте оператор using в файл MyNewService.cs (если его еще нет) или оператор Imports в файл MyNewService.vb для пространства имен System.Diagnostics.

В меню Файл выберите команду Сохранить все.

Определение действий при запуске службы

В редакторе кода для файла MyNewService.cs или MyNewService.vb найдите метод OnStart. Пустое определение метода было автоматически добавлено при создании проекта в Visual Studio. Добавьте код, с помощью которой запись сохраняется в журнале событий при запуске службы:

Опрос

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

Для создания простого механизма опроса используйте компонент System.Timers.Timer. Таймер через определенные интервалы времени генерирует событие Elapsed, при возникновении которых служба может выполнять отслеживание. Компонент Timer используется следующим образом:

  • Задайте свойства компонента Timer в методе MyNewService.OnStart .
  • Запустите таймер, вызвав метод Start.
Настройка механизма опроса.

Чтобы настроить механизм опроса, добавьте следующий код в событие MyNewService.OnStart :

Добавьте оператор using в файл MyNewService.cs или оператор Imports в файл MyNewService.vb для пространства имен System.Timers.

В классе MyNewService добавьте метод OnTimer для обработки события Timer.Elapsed.

В класс MyNewService добавьте переменную-член. Она содержит идентификатор следующего события, которое сохраняется в журнале событий.

Определение действий при остановке службы

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

Определение других действий для службы

Вы можете переопределить методы OnPause, OnContinue и OnShutdown, добавив дополнительные процессы обработки.

Следующий код показывает, как можно переопределить метод OnContinue в классе MyNewService :

Установка состояния службы

Состояния ERVICE_START_PENDING и SERVICE_STOP_PENDING можно реализовать путем добавления кода, вызывающего функцию Windows SetServiceStatus.

Реализация состояния ожидания службы

Добавьте следующий код в файл MyNewService.cs или MyNewService.vb для объявления значений ServiceState и добавления структуры для состояния, которая будет использоваться при вызове неуправляемого кода:

Диспетчер служб использует члены dwWaitHint и dwCheckpoint структуры SERVICE_STATUS, чтобы определить время, в течение которого нужно ожидать запуска или завершения работы службы Windows. Если методы OnStart и OnStop выполняются долго, служба может запросить больше времени, повторно вызвав функцию SetServiceStatus с увеличенным значением dwCheckPoint .

В классе MyNewService объявите функцию SetServiceStatus с помощью вызова неуправляемого кода:

Для реализации состояния SERVICE_START_PENDING добавьте следующий код в начало метода OnStart:

Для установки состояния SERVICE_RUNNING добавьте код в конце метода OnStart :

Если метод OnStop выполняется долго, повторите данную процедуру для OnStop (необязательно). Реализуйте состояние SERVICE_STOP_PENDING и обеспечьте возврат состояния SERVICE_STOPPED до того, как метод OnStop вернет управление.

Добавление установщиков в службу

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

В обозревателе решений в контекстном меню для файла MyNewService.cs или MyNewService.vb выберите пункт Показать конструктор.

В представлении Конструктор щелкните область фона правой кнопкой мыши и выберите в контекстном меню команду Добавить установщик.

По умолчанию Visual Studio добавляет в проект класс компонента ProjectInstaller , содержащий два установщика. Они предназначены для установки службы и связанного со службой процесса.

Убедитесь в том, что в окне Свойства свойство ServiceName имеет значение MyNewService.

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

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

Описание службы в окне "Службы".

Введите текст для свойства DisplayName, например Отображаемое имя MyNewService.

Этот текст отображается в столбце Отображаемое имя в окне Службы. Это имя может отличаться от значения свойства ServiceName, которое представляет собой имя, используемое в системе (например, когда вы запускаете службу с помощью команды net start ).

Выберите для свойства StartType значение Automatic в раскрывающемся списке.

В итоге окно Свойства должно выглядеть так:

Свойства установщика для службы Windows

Это позволит установить и запускать службу от имени локальной системной учетной записи.

У учетной записи LocalSystem имеется множество разрешений, включая разрешение на запись в журнал событий. Эту учетную запись следует использовать с осторожностью, поскольку это может увеличить риск атак с помощью вредоносных программ. Для других задач следует рассмотреть возможность использования учетной записи LocalService , которая аналогична учетной записи непривилегированного пользователя локального компьютера. Удаленным серверам при этом передаются учетные данные анонимного пользователя. В этом примере произойдет ошибка, если вы попытаетесь использовать учетную запись LocalService , так как для нее требуется разрешение на запись в журнал событий.

Дополнительные сведения об установщиках см. в руководстве по добавлению установщиков в приложение-службу.

Установка параметров запуска (необязательно)

Прежде чем добавлять параметры запуска, решите, является ли это наилучшим способом передачи информации в службу. Хотя параметры запуска просты для использования и синтаксического анализа и пользователи могут легко их переопределять, для пользователей их поиск и применение могут оказаться затрудненными (без документации). Как правило, если вашей службе требуется всего несколько параметров запуска, то следует использовать реестр или файл конфигурации.

Служба Windows может принимать аргументы командной строки или параметры запуска. При добавлении кода в параметры запуска процесса пользователь может запускать службу со своими собственными специальными параметрами из окна свойств службы. Однако эти параметры запуска не сохраняются при следующем запуске службы. Задать постоянные параметры запуска можно в реестре.

Для каждой службы Windows создается запись в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Для хранения информации, к которой может обращаться ваша служба, в разделе службы можно использовать подраздел Parameters. Файлы конфигурации приложения для службы Windows можно использовать так же, как и для программ других типов. Пример кода см. в разделе ConfigurationManager.AppSettings.

Добавление параметров запуска

Выберите файл Program.cs или MyNewService.Designer.vb, а затем в контекстном меню выберите пункт Просмотреть код. Измените код метода Main , добавив входной параметр, который будет передаваться в конструктор службы:

В файле MyNewService.cs или MyNewService.vb измените конструктор MyNewService для обработки входного параметра следующим образом:

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

Чтобы задать аргументы командной строки, добавьте следующий код в класс ProjectInstaller в файле ProjectInstaller.cs или ProjectInstaller.vb:

Как правило, это значение представляет собой полный путь к исполняемому файлу службы Windows. Для правильного запуска службы пользователь должен заключить путь и каждый параметр в кавычки. Чтобы изменить параметры запуска службы Windows, пользователь может настроить параметры в разделе реестра ImagePath. Однако лучше изменять их программными средствами и создать для пользователей удобный интерфейс для этой возможности, например в виде программы управления или настройки.

Сборка службы

В обозревателе решений выберите пункт Свойства в контекстном меню проекта MyNewService.

Отобразятся страницы свойств для проекта.

На вкладке Приложение в списке Автоматически запускаемый объект выберите MyNewService.Program (или Sub Main для проекта Visual Basic).

Чтобы выполнить сборку проекта, в обозревателе решений выберите в контекстном меню проекта пункт Сборка (или нажмите клавиши CTRL+SHIFT+B).

Установка службы

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

Откройте Командную строку разработчика Visual Studio с учетными данными администратора.

В командной строке разработчика для Visual Studio перейдите к папке, которая содержит выходные данные проекта (по умолчанию это подкаталог \bin\Debug проекта).

Введите следующую команду:

Если служба установлена успешно, команда сообщит об успешном выполнении.

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

  • Класс RunInstallerAttribute отсутствует в классе ProjectInstaller .
  • Значение атрибута отличается от true .
  • Класс ProjectInstaller не определен как public .

Запуск и выполнение службы

В Windows откройте классическое приложение Службы. Нажмите клавиши Windows+R, чтобы открыть окно Выполнить, введите services.msc и нажмите клавишу ВВОД или кнопку ОК.

Заданное вами отображаемое имя службы отобразится в списке Службы, представленном в алфавитном порядке.

MyNewService в окне "Службы".

Чтобы запустить службу, в ее контекстном меню выберите пункт Запустить.

Чтобы остановить службу, в ее контекстном меню выберите пункт Остановить.

Для запуска и остановки службы в командной строке можно использовать команды net start <имя службы> и net stop <имя службы> (необязательно).

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

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

В Visual Studio доступ к журналам событий можно получить, открыв обозреватель сервера в меню Вид (или нажав клавиши CTRL+ALT+S) и развернув узел Журналы событий для локального компьютера.

В средстве просмотра событий разверните узел Журналы приложений и служб.

Найдите в списке элемент MyNewLog (или MyLogFile1, если вы использовали процедуру добавления аргументов командной строки) и разверните его. Вы увидите записи для двух действий (запуск и остановка), которые выполнила ваша служба.

Просмотр записей в журнале событий с помощью компонента "Просмотр событий"

Очистка ресурсов

Если приложение службы Windows вам больше не нужно, его можно удалить.

Откройте Командную строку разработчика Visual Studio с учетными данными администратора.

В окне Командная строка разработчика для Visual Studio перейдите к папке, которая содержит выходные данные проекта.

Введите следующую команду:

Если служба удалена успешно, команда сообщит об этом. Дополнительные сведения см. в разделе Практическое руководство. Установка и удаление служб.

Следующие шаги

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

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

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

Для создания журнала событий при установке приложения, а не во время его запуска, можно воспользоваться установщиком. В этом случае журнал событий удаляется установщиком при удалении приложения. Для получения дополнительной информации см. EventLogInstaller.

Что можете подсказать по данной задаче?

Использую Visual Studio 2012. Нашел что в ней можно создать еще некий проект ATL, при создании проекта можно выбрать тип приложения "Служба.exe" - может это то, что мне нужно на самом деле, если так подскажите пример или уроки создания подобного приложения.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Socket и windows service (служба)
Пишу IPC(межпроцессорное воздействие) между служебным приложением и Windows forms (дальше WF).


Что такое служба ? Windows Service
Рассматриваю вариант решение поставленной задачи написанием своей службы. Собственно, доки.

Создание Windows Service
Добрый день! Пытаюсь разобраться как писать вин сервисы, что это за зверь такой и зачем он вообще.

Добрый день. Открыл пример создания сервиса. Но на 7й винде выдёт ошибку. У меня студия 2012. Если запускаю через неё - то выдаёт Первый этап обработки исключения по адресу 0x759EC41F (KernelBase.dll) в ConsoleApplication1.exe: 0x00000005: Отказано в доступе.

Если запускаю экзешник из папки от имени администратора, то GetLastError выдаёт 183 ошибку.

Вот код всего main.cpp

использовал данный пример на Win7 32bit + VS2012. Все работает добротно

Службу создал удачно. Она запускается. НО из неё ничего нельзя делать!
Получается только в файл писать!
С впн работать не хочет (через RASDIAL)
Так же, пытаюсь запустить процесс (для примера - notepad) - не пашет!
Процесс создан с параметрами
Службу создал удачно. Она запускается. НО из неё ничего нельзя делать!
Получается только в файл писать!
С впн работать не хочет (через RASDIAL)
Так же, пытаюсь запустить процесс (для примера - notepad) - не пашет!

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

Во-вторых, для служб выделена отдельная нулевая сессия. На Windows XP и Windows Server 2003 в
этой же сессии выполняются процессы первого залогиненного пользователя. Начиная с Windows
Vista, нулевая сессия принадлежит исключительно службам, а пользовательские сессии начинаются с
первой (Session 0 Isolation).

В-третьих, запуская notepad.exe из службы, Вы запускаете его с правами службы, а не пользователя.
Со всеми вытекающими последствиями.

Могу ли я запустить процесс из службы с правами пользователя?

P.S. В какой литературе можно поподробнее почитать об этом(на русском)?

Могу ли я запустить процесс из службы с правами пользователя? В какой литературе можно поподробнее почитать об этом(на русском)?

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

Если процесс нужно запускать в произвольные моменты времени, когда пользователь уже
залогинен, то здесь все усложняется. Нужно из службы вызвать WTSQueryUserToken и с
полученным токеном запустить процесс через CreateProcessAsUser. При этом следует, как
минимум, создать для нового процесса блок переменных окружения - CreateEnvironmentBlock, в
противном случае он унаследует блок переменных системного процесса.

Здесь самая тонкость в том, что для WTSQueryUserToken нужен ID пользовательской сессии, в
которой будет создаваться новый процесс. Существует только один корректный способ
получить этот ID - это подписаться в службе на событие SERVICE_CONTROL_SESSIONCHANGE и
вести учет всех созданных сессий, а также их состояний. Но на этом пути Вас будут поджидать
различные ловушки, так что "малой кровью" обойтись не удастся.

Подробности ищите на RSDN, я по этой теме там отписывался предельно подробно.

Читайте также: