Полезные службы виндовс. Службы Windows (сервисы)

Каждый пользователь операционной системы Windows 7 обращал внимание на компонент операционной системы – службы. Что такое службы и зачем они нужны? Какая польза от того, если пользователь умеет с ними работать и настраивать их? Данная информация раскроет эти темы.
Что такое службы Windows ? Служба – это приложение, которое стартует автоматически при запуске операционной системы. В частных случаях возможен запуск вручную.

Работают службы независимо от пользователя и его прав, запущенных программ. Однако для редактирования служб нужны права администратора. Являются аналогом демонов в Unix. Таким образом, службы обеспечивают выполнение многих задач, которые должны выполняться для обеспечения работоспособности операционной системы. Хорошим примером того, зачем нужны службы, может стать диспетчер очереди печати. Благодаря этой службе обеспечивается выполнение печати. Кроме этого, службы написаны таким образом, что их работоспособность полностью зависит от SCM (Service Control Manager). Работа службы регистрируется в диспетчере SCM при помощи API.
Работают службы в фоновом режиме. Для работы со службами используется диспетчер управления службами. Он обеспечивает работу и контроль над ними. При помощи диспетчера служб администратор может создавать, менять режим работы и удалять службы.

Службы имеют несколько режимов работы.
1. Служба отключена на автозапуск.
2. Служба отключена на автозапуск и запускается вручную.
3. Служба включена и состоит в автозапуске.
4. Автоматический автозапуск. Данный режим работает и введен с ОС Windows Vista. Позволяет запускать службу только в случае ее надобности.
5. Системная работа службы. В это входит автозапуск и невозможность завершения службы пользователем, так как это может привести к неработоспособности операционной системы.

Как было сказано, работа служб обеспечивается при помощи диспетчера управления службами. Он имеет графическую оболочку. Получить доступ к ней в ОС Windows 7 можно только администратору. Для этого необходимо зайти в "Панель управления" . После этого выбрать "Администрирование" . Среди предложенных средств администрирования нужно выбрать "Службы" .



Кроме доступа при помощи оболочки существует второй способ работы со службами. Данный способ осуществляется при помощи реестра Windows 7. Также можно управлять службами при помощи командной строки. Ниже описаны команды. Вместо "x" нужно подставить название службы.

Остановить службу: net stop x .
Запустить службу: net start x .
Удалить службу: sc delete x .
Установка режима запуска: sc config x start=y , где y – параметр запуска. Возможные параметры запуска: disabled, demand, auto .
Просмотр состояния службы: sc qc x .

Управлять службами не сложно. Но зачем это знать и для чего? Знание того, для чего нужны службы и как они работают, может помочь при ремонте и восстановлении ОС. Также знание позволит настроить ПК наиболее оптимально для администратора. Представим себе пример. На ПК перестала работать автозагрузка внешних носителей при их подключении. Опытный пользователь быстро поймет, что за это отвечает служба автозагрузки. При проверке пользователь определяет, что служба не запущена и запускает ее. После этого автозагрузка работает.

Безусловно, знание того, что такое службы в Windows 7 позволяет грамотно управлять операционной системой. Однако всегда при работе со службами нужно соблюдать осторожность. Любая, на первый взгляд ненужная служба, может играть очень важную роль. Работая со службами правильным образом, администратор станет действительно администратором своего компьютера.

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

Для создания и службы из командной строки можно использовать программу SC (Sc.exe). SC представляет из себя утилиту командной строки, которая реализует вызовы ко всем функциям интерфейса прикладного программирования (API) управления службами Windows. С ее помощью можно производить любые действия со службами — просматривать состояние, управлять (запускать, останавливать и т.п.), изменять параметры, а также создавать новые службы.

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

Для создания нового сервиса запускаем команду Sc create . Она создает запись службы в реестре и в базе данных диспетчера служб. Sc create имеет следующий синтаксис:

sc create <параметр1= > <параметр2= >

ServiceName — указывает имя, которое будет присвоено разделу службы в реестре. Имейте в виду, что это имя отличается от отображаемого имени службы (имени, которое отображается в оснастке «Services»);
binPath — указывает путь к исполняемому файлу службы.

Для примера создадим службу MyService, укажем отображаемое имя My New Service, зададим тип службы и поставим ее на авто-запуск:

Sc create MyService binPath=C:\MyService\MyService.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:\MyService\MyService.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 Service, сервисы) - приложения, автоматически запускаемые системой при запуске Windows и выполняющиеся вне зависимости от статуса пользователя. Имеет общие черты с концепцией демонов в Unix.

Режимы работы

В большинстве случаев службам запрещено взаимодействие с консолью или рабочим столом пользователей (как локальных, так и удалённых), однако для некоторых сервисов возможно исключение - взаимодействие с консолью (сессией с номером 0, в которой зарегистрирован пользователь локально или при запуске службы mstsc с ключом /console).

Существует четыре режима для сервисов:

* запрещён к запуску;
* ручной запуск (по запросу);
* автоматический запуск при загрузке компьютера;
* обязательный сервис (автоматический запуск и невозможность (для пользователя) остановить сервис).

Фоновый режим

Windows предлагает программу Service Control Manager, с её помощью можно управлять созданием, удалением, запуском и остановкой служб. Приложение, имеющее статус сервиса, должно быть написано таким образом, чтобы оно могло принимать сообщения от Service Control Manager. Затем, одним или несколькими вызовами API, имя службы и другие атрибуты, такие, как его описание, регистрируются в Service Control Manager.

Запуск, остановка и изменение служб Windows

После установки службы, её атрибуты могут быть изменены путём запуска «Services» из Панели управления Windows в Administrative Tools.

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

Список служб находится в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Значения параметра «Start» имеют тип «REG_DWORD» и могут принимать значения: «0», «1», «2», «3» и «4» (когда служба не запускается, то есть запуск даной службы запрещен).

Управление работой служб из командной строки

Управление службами возможно с помощью командной строки: остановка службы - «net stop service_name», запуск службы - «net start service_name».

Права пользователя и особенности реализации

Сервисы Windows по умолчанию запускаются от имени пользователя «LocalSystem», который обладает полными правами в системе (превосходящими права даже учётной записи Administrator). Рабочим каталогом будет системный каталог Windows (обычно C:\WINNT или C:\WINDOWS), а каталог для хранения временных файлов будет C:\WINNT\TEMP.

Поскольку это не настоящий пользователь, а «виртуальный», появляются некоторые трудности, когда приложению необходимо сохранить данные, относящиеся к пользователю (user-specific data), поскольку не существует папки этого пользователя.

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

Эта документация перемещена в архив и не поддерживается.

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

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

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

    В Visual Studio в строке меню выберите Файл , Создать , Проект .

    Откроется диалоговое окно Новый проект .

    В списке шаблонов проектов Visual Basic или Visual C# выберите Служба Windows и присвойте проекту имя MyNewService . Нажмите кнопку ОК .

    Шаблон проекта автоматически добавит класс компонента с именем Service1 , наследуемый от .

    В меню Правка выберите Найти и заменить , Найти в файлах (сочетание клавиш: Ctrl+Shift+F). Замените все вхождения службы Service1 на MyNewService . Вы найдете экземпляры в Service1.cs, Program.cs и Service1.Designer.cs (или их эквивалентах.vb).

    В окне Свойства для Service1.cs или Service1.vb установите для и свойства (Имя) для Service1 значение MyNewService , если это еще не сделано.

    В обозревателе решений переименуйте Service1.cs в MyNewService.cs или Service1.vb в MyNewService.vb .

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

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

    В окне Обозреватель решений MyNewService.cs или MyNewService.vb и выберите Конструктор представлений .

    Из раздела Компоненты панели элементов перетащите в окно конструктора компонент .

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

    Добавьте объявление для объекта eventLog в классе MyNewService сразу после строки, которая объявляет переменную components:

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

    public MyNewService() { InitializeComponent(); eventLog1 = new System.Diagnostics.EventLog(); if (!System.Diagnostics.EventLog.SourceExists("MySource" )) { System.Diagnostics.EventLog.CreateEventSource("MySource" ,"MyNewLog" ); } eventLog1.Source = "MySource" ; eventLog1.Log = "MyNewLog" ; }

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

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

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

    Добавьте код для обработки события таймера:

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

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

Когда служба Windows устанавливается классом , должны выполняться некоторые специализированные действия. С помощью Visual Studio для службы Windows можно специально создавать подобные установщики и добавлять их в проект.

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

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

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

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

    public enum ServiceState { SERVICE_STOPPED = 0x00000001, SERVICE_START_PENDING = 0x00000002, SERVICE_STOP_PENDING = 0x00000003, SERVICE_RUNNING = 0x00000004, SERVICE_CONTINUE_PENDING = 0x00000005, SERVICE_PAUSE_PENDING = 0x00000006, SERVICE_PAUSED = 0x00000007, } public struct ServiceStatus { public long dwServiceType; public ServiceState dwCurrentState; public long dwControlsAccepted; public long dwWin32ExitCode; public long dwServiceSpecificExitCode; public long dwCheckPoint; public long dwWaitHint; };

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

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

    // Update the service state to Start Pending. ServiceStatus serviceStatus = new ServiceStatus(); serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING; serviceStatus.dwWaitHint = 100000; SetServiceStatus(this .ServiceHandle, ref serviceStatus);

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

    // Update the service state to Running. serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING; SetServiceStatus(this.ServiceHandle, ref serviceStatus);

    " Update the service state to Running. serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING SetServiceStatus(Me .ServiceHandle, serviceStatus)

    (Необязательно) Повторите данную процедуру для метода .

Внимание!

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

    В методе Main метода в файле Program.cs или в MyNewService.Designer.vb добавьте аргумент для командной строки:

    Измените конструктор MyNewService следующим образом:

    public MyNewService(string args) { InitializeComponent(); string eventSourceName = "MySource" ; string logName = "MyNewLog" ; if (args.Count() > 0) { eventSourceName = args; } if (args.Count() > 1) { logName = args; } eventLog1 = new System.Diagnostics.EventLog(); if (!System.Diagnostics.EventLog.SourceExists(eventSourceName)) { System.Diagnostics.EventLog.CreateEventSource(eventSourceName, logName); } eventLog1.Source = eventSourceName; eventLog1.Log = logName; }

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

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

    protected override void OnBeforeInstall(IDictionary savedState) { string parameter = "MySource1\" \"MyLogFile1" ; Context.Parameters["assemblypath" ] = "\"" + Context.Parameters["assemblypath" ] + "\" \"" + parameter + "\"" ; base .OnBeforeInstall(savedState); }

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

Данный материал является зеркалом статьи сайта Заметки о WINDOWS с некоторыми примечаниями из личного опыта.

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

Для создания и службы из командной строки можно использовать программу SC (Sc.exe). SC представляет из себя утилиту командной строки, которая реализует вызовы ко всем функциям интерфейса прикладного программирования (API) управления службами Windows. С ее помощью можно производить любые действия со службами - просматривать состояние, управлять (запускать, останавливать и т.п.), изменять параметры, а также создавать новые службы.

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

Для создания нового сервиса запускаем команду Sc create . Она создает запись службы в реестре и в базе данных диспетчера служб. Sc create имеет следующий синтаксис:

sc create

ServiceName - указывает имя, которое будет присвоено разделу службы в реестре. Имейте в виду, что это имя отличается от отображаемого имени службы (имени, которое отображается в оснастке «Services»);
binPath - указывает путь к исполняемому файлу службы.

Для примера создадим службу MyService, укажем отображаемое имя My New Service, зададим тип службы и поставим ее на авто-запуск:

Sc create MyService binPath=C:\MyService\MyService.exe DisplayName=″My New Service″ type=own start=auto

Затем откроем оснастку «Services» и посмотрим результат.

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

Sc config MyService DisplayName=″My Service″

Ну и полностью удалить службу можно вот так:

Sc delete MyService



Примечание. Есть некоторые особенности использования утилиты sc. Например при создании сервиса в Windows XP необходимо ставить пробел перед аргументом, передаваемым параметру!

Если мы подадим команду:

C:\sc create Weblogic binPath=C:\Oracle\MiddleWare\user_projects\base_domain\startWeblogic.cmd DisplayName="WebLogic" type=share start=auto error=ignore

В ответ получим help по использованию sc без какого либо сообщения об ошибке:



Подаем ту же команду вставив пробелы после символа "=":

C:\>sc create Weblogic binPath= C:\Oracle\MiddleWare\user_projects\base_domain\startWeblogic.cmd DisplayName= "WebLogic" type= share start= auto error= ignore

CreateService SUCCESS


Вот такая недокументированная особенность.

Так же необходимо внимательно относится к прочим параметрам. В случае приведенном ниже изменены значения параметров start и type:


Получаем сообщение

CreateService FAILED 87:

и после двоеточия никаких пояснений.

Подробное значение параметров можно посмотреть или .

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

# sc config имя_службы start= параметр_запуска

Для того, чтобы запустить службу в ОС Windows нужно в консоли набрать:

# net start имя_службы

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

# net stop имя_службы

Для перезагрузки службы:

# net restart имя_службы

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

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

sc enumdepend Lanmanserver

Запуск такой команды на моем тестовом сервере Windows 2003, например, показывает, что службы Netlogon, Dfs, а также службы браузера компьютера находятся в зависимости от службы сервера.

Для завершения и определения зависимостей сервера можно воспользоваться подкомандой qc, как показано ниже

sc qc Lanmanserver

Эта команда выдает девять строчек информации о службе, одна из которых DEPENDENCIES. При запуске этой команды выясняется, что сервер не зависит ни от каких служб. Чтобы узнать, какие службы имеют более одной зависимости, можно протестировать диспетчер на службе Netlogon. Мы увидим, что служба Netlogon для начала работы требует запуска служб и сервера, и Workstation.

Иногда зависимости бывают более сложными. Например, некоторые службы могут начать работу, только если запущена одна из трех других служб. Запуск всех трех необязателен, вполне достаточно одной. Можно проинструктировать Windows по поводу такой динамики, информируя систему о том, что данная служба находится в зависимости от группы служб. В системе Windows имеется целый ряд таких служб, как, например, SCSI CDROM Class, SCSI miniport, Parallel arbitrator, NetBIOSGroup, NDIS, а также службы первичного диска и многие другие. Все эти службы и драйверы можно увидеть в списке групп, набрав

sc query type= service?driver?all group=

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

sc query type= all group=

Названия групп значения не имеют. Можно добавлять службы в имеющиеся группы или создавать новые группы служб, добавив команду group= groupname в команду SC Create или используя SC Config для сохранения службы в какую-либо группу. Например, чтобы добавить службу Webimagemailer в новую группу под названием unimportant, надо набрать

sc config webimagemailer group= unimportant

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

Кроме того, можно сделать так, чтобы не происходила загрузка службы Webimagemailer без необходимой группы служб. Чтобы определить фиктивную группу Webstartup, воспользуемся параметром depends= webstartup. Чтобы указать Windows, что Webstartup - это группа, а не еще одна служба, следует перед ее именем поставить знак «плюс». Например, для перенастройки службы Webimagemailer на зависимость от группы запуска Webstartup, надо набрать

sc config webimagemailer depends= +webstartup

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

PowerShell

PowerShell может почти все, в том числе и управлять службами Windows. Создать новую службу можно с помощью командлета New-Service . Создадим такой же сервис, как и в предыдущем примере, только добавим к нему описание (Description):

New-Service -Name MyService -BinaryPathName C:\MyService\MyService.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()

  • Сергей Савенков

    какой то “куцый” обзор… как будто спешили куда то