Различие между сервисом и службой в виндовс. Как запустить приложение в виде службы Windows. Службы Windows, которые можно перевести в ручной режим работы

С точки зрения программной совместимости. Поэтому вполне естественно, что мы возвращаемся к обсуждению служб в контексте Windows 7. Но на этот раз мы поговорим о некоторых выгодах оптимизации служб, доступных в Windows 7. Эта статья посвящена новой возможности Windows 7 – Trigger Start Services . Но прежде, чем обратиться к API, давайте обрисуем общую картину служб.

Что такое службы?

Служба – это внутренний механизм, встроенный в операционную систему Windows. Вы можете считать службы специальными приложениями, работающие вне зависимости от текущего пользовательского контекста. Службы отличаются от обычных приложений тем, что ее можно настроить на работу с момента включения (загрузки) системы и до выключения, не требуя присутствия пользователя. То есть, службы могут работать, даже если пользователь не выполнил вход в систему.

Мы предпочитаем считать службы запущенными задачами, работающими в фоновом режиме и не затрагивающими операции пользователя. Службы в Windows отвечают за все виды фоновой активности, начиная с Remote Procedure Call (RPC), Printer Spooler и вплоть до Network Location Awareness.

На протяжении многих лет Windows росла и вместе с тем увеличивалось число служб. Будем честны, фоновые службы в Windows ощущаются довольно болезненно – операционная система изначально поставляется со множеством служб. Помимо этого, независимые разработчики ПО (ISV) и их приложения добавляют еще больше служб. На пример, службы обновления программного обеспечения. Вместе с тем, некоторые службы критически важны и требуются в процессе загрузки, в то время как необходимость в других возникает позже, когда определенный пользователь выполняет вход в систему, а иные и вовсе не нуждаются в запуске, пока не будут вызваны. Несмотря на это, когда вы просматриваете список запущенных в данный момент служб, то видите множество объектов, которым нет необходимости работать по схеме 24х7.

Что плохого в службах, работающих 24 часа в сутки 7 дней в неделю?

Есть несколько проблем, связанных со службами, работающими по схеме 24х7. Во-первых, зачем что-то должно работать (пусть даже и в фоновом режиме), если в нем нет нужды? Любой запущенный процесс (включая службы) использует драгоценную память и ресурсы ЦП, которые могли бы использоваться для других приложений и служб. Если вы подсчитаете все службы, запущенные в определенный момент, то они сложатся в значительный объем памяти, дескрипторов, потоков и использование ЦП. Все эти «растрачиваемые» ресурсы понижают общую производительность компьютера, его отзывчивость и создают впечатление, что компьютер вялый и медлительный. К тому же, поскольку множество служб настроены на автоматический запуск (начинают работать при старте системы), они влияют на время загрузки компьютера.

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

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

Наконец, если служба работает по схеме 24х7, и если это хорошо известная служба (которая может оказаться у каждого популярного приложения – например, у PDF Reader), то это создает большую поверхность для атаки. Злоумышленник может воспользоваться сведениями о том, что определенное популярное приложение устанавливает службу, работающую в режиме 24х7, и попытаться взломать ее для получения доступа к компьютеру.

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

  • Disabled (Отключена) полностью отключает службу и предотвращает ее запуск и запуск зависимых служб – это означает, что пользователь должен включить службу вручную из панели управления или командной строки
  • Manual (Вручную) запускает службу по надобности (в связи с зависимостями других служб) или при вызове службы из приложения при помощи соответствующих API, как будет показано ниже
  • Automatic (Автоматически) запускает службу при входе в систему
  • Automatic Delayed (Автоматический отложенный запуск) – более новый тип запуска, появившийся в Windows Vista, при помощи которого запуск службы происходит после завершения загрузки и выполнения первоначальных операций, что ускоряет запуск системы.

К сожалению, многие ISV (включая саму корпорацию Microsoft) продолжают настраивать свои службы на автоматический (Automated) или автоматический отложенный запуск (Automatic Delayed), поскольку для всех представляется простейшим решением. Служба просто работает 24х7 и всегда доступна, устраняя любую необходимость проверки зависимостей или того, запущена ли служба.

Можно привести множество примеров существующих служб, которые могут расходовать куда меньше ресурсов и стать безопаснее, не работая в режиме 24х7. Например, подумайте о службе обновлений, которая проверяет наличие новых обновлений для приложения. Если компьютер не подключен к сети и не имеет IP-адреса, зачем ей работать? Она ничего не может сделать, так зачем оставлять работающей программу, которая ничего не делает? Подумайте о службе управления политиками, которая используется при изменении групповых политик или при подключении компьютера к домену или отключении от него, но сейчас, когда компьютер подключен к моей домашней сети, служба, опять же, работает впустую.

Появление служб с запуском по триггеру

Решение вышеуказанных проблем заключается в выведении службы из «состояния постоянной работы» в другие виды фоновой активности, такие как запланированные задачи или службы, запускаемые триггером. Эта статья посвящена Windows 7 Trigger Start Services. О Windows 7 Scheduled Tasks можно сказать очень много интересного, что и будет сделано в последующих статьях.

Здравствуйте дорогие читатели, сегодня я хотел бы поговорить:

1. О службах Windows , что это, для чего нужны и какие за что отвечают.

2. И как же повысить быстродействия компьютера?

И так что это за службы Windows?

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

Открыть список служб можно несколькими способами:

1. Удерживая кнопку windows нажимаем R, откроется окно , там введите services.msc

2. Пуск > Панель управления > Администрирование > Службы

3. Пуск > правой кнопкой мыши по моему компьютеру > Управление > Службы и приложения > Службы

Как видите в Windows их достаточно много и скачав , Вы можете ознакомиться какие службы существуют и за что каждая из них отвечает .

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

Какие службы можно отключить в Windows 7, 8

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

* BranchCache — Служба кэширует сетевое содержимое. Если не пользуетесь домашней сетью, то вообще можете отключить.

* DHCP-клиент — Если пользуетесь интернетом не трогайте ни в коем случае. Именно эта служба присваивает вам ip адрес.

* DNS-клиент Так же необходимая служба для использования интернета. Работает с вашими DNS (служит для правильных направлений).

* KtmRm для координатора распределенных транзакций — системная функция транзакций. Её так же оставляем.

* Microsoft .NET Framework — Все такие службы оставляем как есть. Они служат для нормальной работы большинства приложений.

* Parental Controls — Служба для родительского контроля. Если не используете, можно отключить.

* Plug-and-Play — служит для автоматического распознавания изменений в системе. Например когда вы подключаете флешку, просыпается эта служба… Так что оставляем как есть.

* Quality Windows Audio Video Experience — передача аудио и видео по сети в режиме реального времени. Не нужна только если нет сети (или интернета) в остальных случаях оставляем.

* Remote Desktop Configuration — Для удаленного рабочего стола. Если не пользуетесь удаленными подключениями, отключаем.

* Superfetch — Полезная функция, работает с кэшем. Ускоряет работу Windows, так что оставляем.

* Windows Audio — Управляет звуком. Если не нужен звук отключаем. В остальных случаях оставляем.

* Windows CardSpace — ненужная и небезопасная служба. По этому отключаем.

* Windows Driver Foundation — User-mode Driver Framework — для нормальной работы драйверов, не трогайте. Пусть остается как есть.

* Windows Search — Индексирование файлов для поиска. Если не пользуетесь и есть время подождать пока найдется файл, то отключаем. На ssd обязательно отключаем!

* WMI Performance Adapter — нужна для служб требующие wmi, ставим вручную. Если каким-то приложениям понадобятся, те сами запустят)

* Автонастройка WWAN — служба для использования мобильного интернета. Если пользуетесь usb модемом, сим картой в ноуте, то не отключайте.

* Автономные файлы — помогает работать, автономно с недоступными файлами, которые загрузились до этого. Ставим вручную.

* Агент защиты сетевого доступа — Ставим вручную, т.к. при необходимости служба запустится, если какая-то программа запросит необходимую информацию.

* А гент политики IPsec — Нужна при наличии сети и интернета.

* Адаптивная регулировка яркости — Оставляем если есть датчик освещения.

* Архивация Windows — Если не пользуетесь отключайте. Но лучше почитайте про архивацию в windows мало ли, будете пользоваться.

* Биометрическая служба Windows — нужна лишь при использовании биометрических устройств. В остальных случаях отключаем.

* Брандмауэр Windows — Я если честно всегда отключаю, т.к. воровать у меня нечего) А если и зашифруют данные, то восстановлю) Но вам посоветую обзавестись например касперским интернет секьюрити, которого есть и антивирус и брандмауэр. А этот отключите нафиг, т.к. он иногда блокирует что не нужно) Вообщем он следит за безопасностью вашего компьютера и закрывает порты, чтобы ворюги не смогли залезть к вам в компьютер)

* Браузер компьютера Вдомашней сети не нужна. Вручную.

* Веб-клиент — Нудна если нет интернета. Служит для работы с файлами в интернете. Оставляем.

* Виртуальный диск — Служба для работы с запоминающими устройствами. Ставим вручную.

* Вспомогательная служба IP — Работает с протоколом версии 6. Я всегда отключаю его самого, так что и службу можно вообще отключить.

* Вторичный вход в систему — Ставьте вручную, т.к. некоторые игры или программы включат её по необходимости.

* Группировка сетевых участников — Нужна для домашней группы. Ставьте вручную, мало ли понадобится…

* Дефрагментация диска — В принципе она не мешает. Можете оставить или отключить. Если отключите, то рекомендую делать раз в месяц. А для ssd дисков, вообще отключаем!

* Диспетчер автоматических подключений удаленного доступа — Ставим вручную. Нужна для удаленных подключений.

* Диспетчер печати — Нужна если есть с чего печатать. В остальных случаях отключаем.

* Диспетчер подключений удаленного доступа — вручную. Один раз вообще отключил и не смог создать подключение. Так что лучше вручную.

* Диспетчер сеансов диспетчера окон рабочего стола — Если не используете прозрачность от Aero, то можно отключить, даст большой прирост.

* Диспетчер удостоверения сетевых участников — Ставим лучше вручную.

* Диспетчер учетных данных — Лучше вручную. Хранит ваши данные, например логины и пароли.

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

* Доступ к HID-устройствам — Доступ к быстрым клавишам. Отключите, если какие-то комбинации перестанут работать, то поставьте обратно.

* Журнал событий Windows — записывает все события. Полезный инструмент для опытного пользователя. Отключить невозможно.

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

* Защита программного обеспечения — так же системная служба, оставляем как есть.

* Защитник Windows — Защита от шпионских и вредных программ. Установите нормальный антивирус, а эту службу отключите.

* Изоляция ключей CNG — Вручную.

* Инструментарий управления Windows — Системная служба, без неё, некоторые приложения могут работать некорректно, так что лучше оставить.

* Информация о совместимости приложений — Полезная штука, помогает запустится приложениям, которые отказываются работать на вашей ос. Ставим вручную.

* Клиент групповой политики — Оставляем. Отвечает за настройками политики безопасности.

* Клиент отслеживания изменившихся связей — Отслеживание файлов ntfs, не нужно. Отключаем.

* Координатор распределенных транзакций — Ставим вручную.

* Кэш шрифтов Windows Presentation Foundation — Ставим вручную. При необходимости её запустят приложения.

* Ловушка SNMP — Некоторые программы будут собирать о вас информацию. Так что отключайте.

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

* Маршрутизация и удаленный доступ — Не нужна. Отключаем.

* Модули ключей IPsec для обмена ключами в Интернете и протокола IP с проверкой подлинности — Не нужна, но лучше вручную.

* Модуль запуска процессов DCOM-сервера — Системная служба, оставляем как есть.

* Модуль поддержки NetBIOS через TCP/IP — Если нет других компьютеров в сети, то вручную.

* Немедленные подключения Windows — регистратор настройки — Вручную.

* Обнаружение SSDP — Оставьте как есть. Необходима для новых устройств.

* Обнаружение интерактивных служб — Вручную.

* Общий доступ к подключению к Интернету (ICS) — Не нужна, если вы не расшариваете ваш интернет в сетевых подключениях.

* Определение оборудования оболочки — необходима для диалогового окна автозапуска диска или флешки. Кому как удобно, большинству это нужно. Я оставил.

* Основные службы доверенного платформенного модуля — Нужно только для использования чипов ТМР и/или BitLocker.

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

* П еречислитель IP-шин PnP-X — Лучше поставить вручную.

* Питание — Не отключается. Оставляем.

* Планировщик заданий — Желательно оставить как есть, т.к. сейчас много программ его использует.

* Планировщик классов мультимедиа — Оставляем, для кого важен звук.

* Поддержка элемента панели управления «Отчеты о проблемах и их решениях» — Вручную.

* Политика удаления смарт-карт — для пользователей смарт-карт, лучше вручную.

* Поставщик домашней группы — Для использования домашних групп. Лучше вручную.

* Проводная автонастройка — Вручную.

* Программный поставщик теневого копирования (Microsoft) — Вручную.

* Прослушиватель домашней группы — Вручную.

* Протокол PNRP — Тоже оставляем вручную. Некоторые приложения могут использовать службу.

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

* Рабочая станция — лучше оставить, т.к. некоторые приложения задействуют данную службу.

* Распространение сертификата — Лучше вручную.

* Расширяемый протокол проверки подлинности (EAP) — Вручную.

* Сборщик событий Windows — Вручную.

* Сведения о приложении — Вручную.

* Сервер — Если компьютер не используется как сервер или не использует общий доступ к файлам и принтерам, то отключайте.

* Сервер упорядочения потоков — Отключаем если нет домашней группы.

* Сетевой вход в систему — Вручную.

* Сетевые подключения — Оставьте как есть. Если нет сети или интернета, то можете отключить.

* Система событий COM+ — ставим вручную. Приложения зависящие от это службы сами её запустят при необходимости.

* Системное приложение COM+ — Так же вручную.

* Служба SSTP — Оставляем как есть, нужна служба если есть интернет на компьютере.

* Служба автоматического обнаружения веб-прокси WinHTTP — Если нужен интернет, то оставьте как есть.

* Служба автонастройки WLAN — служба для беспроводных сетей. Соответственно если их нет, она не нужна.

* Служба базовой фильтрации — с одной стороны, она не нужна (если не нужна безопасность), но с другой, некоторые программы, могут выдавать ошибки. Так что оставляем.

* Служба ввода планшетного ПК — если экран не сенсорный, то не нужна.

* Служба времени Windows — нужна для синхронизации времени с интернетом.

* Служба загрузки изображений Windows (WIA) — Нужна служба, только если есть сканер. Она отвечает за получение изображений со сканеров и камер.

* Служба инициатора Майкрософт iSCSI — Ставим вручную, если программам понадобится, они сами её запустят.

* Служба интерфейса сохранения сети — Нужна для нормальной работы сети.

* Служба кэша шрифтов Windows — служит для повышения производительности, кэширует шрифты и не тратит время на загрузку.

* С лужба медиаприставки Media Center — Если не используете никаких приставок, она не нужна.

* Служба модуля архивации на уровне блоков — Ставим вручную. Если понадобится архивация или восстановление, то служба сама запуститься.

* Служба общего доступа к портам Net.Tcp — По умолчанию выключена. Нужна если только понадобится протокол Net.Tcp.

* Служба общих сетевых ресурсов проигрывателя Windows Media — Вручную. Понадобится, включится.

* Служба перечислителя переносных устройств — Служит для синхронизации музыки, видео и т.д. со съемными носителями. Я бы поставил вручную. Не всегда это нужно.

* Служба планировщика Windows Media Center — Нужна если только смотрите передачи в Windows Media Player.

* Служба поддержки Bluetooth — Нужна если есть Bluetooth.

* Служба политики диагностики — Нужна для диагностики неполадок… Она если честно помогает редко. По этому можете по-экспериментировать, отключив её. Если понадобится — включите.

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

* Служба профилей пользователей — Лучше оставить. Она работает с профилями пользователей компьютера.

* Служба публикации имен компьютеров PNRP — Нужна для домашних групп.

* Служба регистрации ошибок Windows — Регистрирует ошибки. Лучше поставить вручную.

* Служба ресивера Windows Media Center — для просмотра телерадио передач в плеере.

* Служба сведений о подключенных сетях — Лучше оставить как есть, для нормальной работы сети.

* Служба списка сетей — Так же лучше оставить.

* Служба уведомления SPP — Для лицензирования. Оставьте вручную.

* Служба уведомления о системных событиях — Если не собираетесь смотреть сообщения Windows, то она вам не нужна.

* Служба удаленного управления Windows (WS-Management) — Поставьте вручную.

* Служба шифрования дисков BitLocker — Шифрует диски. Если не пользуетесь, то лучше отключите.

* Служба шлюза уровня приложения — Служба нужна только для работы с брандмауэром. Вручную.

* Службы криптографии — Для установки новых программ, лучше оставьте как есть.

* Службы удаленных рабочих столов — Если не пользуетесь удаленными рабочими столами, то отключайте.

* Смарт-карта — Если ими не пользуетесь, то она вам не нужна.

* Сопоставитель конечных точек RPC — Служба нужна для входящего трафика. С ней ничего нельзя сделать. По этому оставляем.

* Средство построения конечных точек Windows Audio — Если нужен звук, оставьте.

* Телефония — Оставьте вручную. Если понадобится, запустится.

* Темы — Едят много ресурсов памяти. Если не нужны, отключайте.

* Теневое копирование тома — Создает точки восстановления, архивация в фоновом режиме. Поставьте вручную. Если нужно будет запустится.

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

* Удаленный вызов процедур (RPC) — Системная служба. Оставьте как есть.

* Удаленный реестр — Позволяет удаленным пользователям, манипулировать вашим реестром. Отключайте.

* Удостоверение приложения — Вручную.

* Узел системы диагностики — Диагностика проблем. Поставьте вручную.

* Узел службы диагностики — Так же вручную.

* Узел универсальных PNP-устройств — Ставьте вручную. Не все устройства PnP.

* Управление приложениями — Ставьте вручную. Служба позволяет настроить политики для приложений.

* Управление сертификатами и ключом работоспособности — Ставьте вручную, понадобится, запустится сама.

* Установщик ActiveX — Так же вручную. Понадобится установить такой объект, она сама запустится.

* Установщик Windows — Установка программ.msi. Вручную.

* Установщик модулей Windows — Устанавливает и удаляет компоненты и обновления. Вручную.

* Факс — Нужна если только есть факс.

* Фоновая интеллектуальная служба передачи (BITS) — Оставляем вручную. Служба полезная.

* Хост поставщика функции обнаружения — Оставляем вручную. Нужно будет запустится.

* Цветовая система Windows (WCS) — Вручную. Нужна будет устройствам, запустят.

* Центр обеспечения безопасности — Следит за безопасностью Windows. Меня она бесит со своими уведомлениями. Так что отключать или нет, выбирать вам.

* Центр обновления Windows — С одной стороны полезная функция. Заделывает дыры в системе, обновляет драйвера, но с другой стороны, активно использует интернет, ресурсы памяти и если при обновлении выключить компьютер, может рухнуть ОС. Так что так же вам выбирать что важнее, безопасность или быстродействие.

* Шифрованная файловая система (EFS) — Для безопасности файлов. Лучше оставьте как есть вручную.

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

Как запустить приложение в виде службы Windows



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

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

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

Для создания службы с именем notepad запускаем командную консоль, переходим в папку с распакованным NSSM (для 64-разрядной Windows) и вводим команду

Код:

Nssm install notepad

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

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

На вкладке «Shutdown» перечислены методы остановки и таймауты, используемые при штатном завершении работы или аварийной остановке приложения. Когда NSSM получает команду остановки (напр. при завершении работы приложения), то он пытается остановить контролируемое приложение штатным образом. Если же приложение не отвечает, то NSSM может принудительно завершить все процессы и подпроцессы этого приложения.

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

На первом этапе NSSM пытается сгенерировать и отправить событие Ctrl+C. Этот способ хорошо работает для консольных приложений или скриптов, но не применим для графических приложений;
Затем NSSM определяет все окна, созданные приложением, и посылает им сообщение WM_CLOSE, инициирующее выход из приложения;
Третьим этапом NSSM вычисляет все потоки, созданные приложением, и отправляет им сообщение WM_QUIT, которое будет получено если приложение имеет очередь сообщений потока;
И в качестве последнего средства NSSM может вызвать метод TerminateProcess(), принудительно завершив работу приложения.

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

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

На вкладке «Input/Output (I/O)» можно задать перенаправление ввода\вывода приложения в указанный файл.

На вкладке «Environment» можно задать для службы новые переменные окружения, или переопределить существующие.

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

Код:

Nssm install notepad "C:\Windows\system32\notepad.exe"

Управление службой

После создания службы с помощью NSSM зайдем в оснастку Services и найдем службу notepad. Как видите, с виду она ничем не отличается от остальных служб, мы также можем ее запустить, остановить или изменить режим запуска. Однако обратите внимание, что в качестве исполняемого файла указан nssm.exe.

А если зайти в Task Manager, то мы увидим следующую картину: в качестве основного (родительского) процесса запущен NSSM, служба notepad запущена как его дочерний процесс, и уже в этом дочернем процессе запущено приложение Блокнот.


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

Применение служб

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

  • Сервера в архитектуре клиент-сервер (например, MS SQL, MS Exchange Server)
  • Сетевые службы Windows NT (Server, Workstation);
  • Серверные (в смысле функциональности) компоненты распределенных приложений (например, всевозможные программы мониторинга).

Основные свойства служб

От обычного приложения Win32 службу отличают 3 основных свойства. Рассмотрим каждое из них.

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

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

И, наконец, возможность работы в произвольном контексте безопасности. Контекст безопасности Windows NT определяет совокупность прав доступа процесса к различным объектам системы и данным. В отличие от обычного приложения Win32, которое всегда запускается в контексте безопасности пользователя, зарегистрированного в данный момент в системе, для службы контекст безопасности ее выполнения можно определить заранее. Это означает, что для службы можно определить набор ее прав доступа к объектам системы заранее и тем самым ограничить сферу ее деятельности. Применительно к службам существует специальный вид контекста безопасности, используемый по умолчанию и называющийся Local System. Служба, запущенная в этом контексте, обладает правами только на ресурсы локального компьютера. Никакие сетевые операции не могут быть осуществлены с правами Local System, поскольку этот контекст имеет смысл только на локальном компьютере и не опознается другими компьютерами сети.

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

Любое приложение, имеющее соответствующие права, может взаимодействовать со службой. Взаимодействие, в первую очередь, подразумевает изменение состояния службы, то есть перевод ее в одно из трех состояний - работающее (Запуск), приостанов (Пауза), останов и осуществляется при помощи подачи запросов SCM. Запросы бывают трех типов - сообщения от служб (фиксация их состояний), запросы, связанные с изменением конфигурации службы или получением информации о ней и запросы приложений на изменение состояния службы.

Для управления службой необходимо в первую очередь получают ее дескриптор с помощью функции Win32 API OpenService. Функция StartService запускает службу. При необходимости изменение состояния службы производится вызовом функции ControlService.

База данных службы

Информация о каждой службе хранится в реестре - в ключе HKLM\SYSTEM\CurrentControlSet\Services\ServiceName. Там содержатся следующие сведения:

  • Тип службы. Указывает на то, реализована ли в данном приложении только одна служба (эксклюзивная) или же их в приложении несколько. Эксклюзивная служба может работать в любом контексте безопасности. Несколько служб внутри одного приложения могут работать только в контексте LocalSystem.
  • Тип запуска. Автоматический - служба запускается при старте системы. По требованию - служба запускается пользователем вручную. Деактивированный - служба не может быть запущена.
  • Имя исполняемого модуля (EXE-файл).
  • Порядок запуска по отношению к другим службам. В некоторых случаях для корректной работы службы требуется, чтобы была запущена одна или несколько других служб. В этом случае в реестре содержится информация о службах, запускаемых перед данной.
  • Контекст безопасности выполнения службы (сетевое имя и пароль). По умолчанию контекст безопасности соответствует LocalSystem.

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

  • OpenSCManager, CreateService, OpenService, CloseServiceHandle - для создания (открытия) службы;
  • QueryServiceConfig, QueryServiceObjectSecurity, EnumDependentServices, EnumServicesStatus - для получения информации о службе;
  • ChangeServiceConfig, SetServiceObjectSecurity, LockServiceDatabase, UnlockServiceDatabase, QueryServiceLockStatus - для изменения конфигурационной информации службы.

Внутреннее устройство службы.

Для того, чтобы, приложение должно быть устроено соответствующим образом, а именно - включать в себя определенный набор функций (в терминах C++) с определенной функциональностью. Рассмотрим кратко каждую из них.

Функция main

Как известно функция main - точка входа любого консольного Win32 приложения. При запуске службы первым делом начинает выполняться код этой функции. Втечение 30 секунд с момента старта функция main должна обязательно вызвать StartServiceCtrlDispatcher для установления соединения между приложением и SCM. Все коммуникации между любой службой данного приложения и SCM осуществляются внутри функции StartServiceCtrlDispatcher, которая завершает работу только после остановки всех служб в приложении.

Функция ServiceMain

Помимо общепроцессной точки входа существует еще отдельная точка входа для каждой из служб, реализованных в приложении. Имена функций, являющихся точками входа служб (для простоты назовем их всех одинаково - ServiceMain), передаются SCM в одном из параметров при вызове StartServiceCtrlDispatcher. При запуске каждой службы для выполнения ServiceMain создается отдельный поток.

Получив управление, ServiceMain первым делом должна зарегистрировать обработчик запросов к службе, функцию Handler, свою для каждой из служб в приложении. После этого в ServiceMain обычно следуют какие-либо действия для инициализации службы - выделение памяти, чтение данных и т.п. Эти действия должны обязательно сопровождаться уведомлениями SCM о том, что служба все еще находится в процессе старта и никаких сбоев не произошло. Уведомления посылаются при помощи вызовов функции SetServiceStatus. Все вызовы, кроме самого последнего должны быть с параметром SERVICE_START_PENDING, а самый последний - с параметром SERVICE_RUNNING. Периодичность вызовов определяется разработчиком службы, исходя их следующего условия: продолжительность временного интервала между двумя соседними вызовами SetServiceStatus не должна превышать значения параметра dwWaitHint, переданного SCM при первом из двух вызовов. В противном случае SCM, не получив во-время очередного уведомления, принудительно остановит службу. Такой способ позволяет избежать ситуации службы на старте в результате возникновения тех или иных сбоев (вспомним, что службы обычно неинтерактивны и могут запускаться в отсутствие пользователя). Обычная практика заключается в том, что после завершения очередного шага инициализации происходит уведомление SCM.

Функция Handler

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

Один запрос следует отметить особо - запрос, поступающий при завершении работы системы (Shutdown). Этот запрос сигнализирует о необходимости выполнить деинициализацию и завершиться. Microsoft утверждает, что для завершения работы каждой службе выделяется 20 секунд, после чего она останавливается принудительно. Однако тесты показали, что это условие выполняется не всегда и служба принудительно останавливается до истечения этого промежутка времени.

Система безопасности служб

Любое действие над службами требует наличия соответствующих прав у приложения. Все приложения обладают правами на соединение с SCM, перечисление служб и проверку заблокированности БД службы. Регистрировать в сиситеме новую службу или блокировать БД службы могут только приложения, обладающие административными правами.

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

  • Все пользователи имеют права SERVICE_QUERY_CONFIG, SERVICE_QUERY_STATUS, SERVICE_ENUMERATE_DEPENDENTS, SERVICE_INTERROGATE и SERVICE_USER_DEFINED_CONTROL;
  • Пользователи, входящие в группу Power Users и учетная запись LocalSystem дополнительно имеют права SERVICE_START, SERVICE_PAUSE_CONTINUE и SERVICE_STOP;
  • Пользователи, входящие в группы Administrators и System Operators имеют право SERVICE_ALL_ACCESS.

Службы и интерактивность

По умолчанию интерактивные службы могут выполняться только в контексте безопасности LocalSystem. Это связано с особенностями вывода на экран монитора в Windows NT, где существует, например, такой объект как "Desktop", для работы с которым нужно иметь соответствующие права доступа, которых может не оказаться у произвольной учетной записи, отличной от LocalSystem. Несмотря на то, что в подавляющем большинстве случаев это ограничение несущественно однако иногда существует необходимость создать службу, которая выводила бы информацию на экран монитора и при этом выполнялась бы в контексте безопасности отличном от LocalSystem, например, серверная компонента приложения для запуска приложений на удаленном компьютере.

Фрагмент кода из . иллюстрирует такую возможность.

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

Пример службы (ключевые фрагменты)

Рассмотрим на примере ключевые фрагменты приложения на языке С++, реализующего службу Windows NT. Для наглядности несущественные части кода опущены.

Функция main

В показан код функции main.

Функция ServiceMain

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

Для преодоления этой проблемы все операции по взаимодействию с SCM следует выполнять в отдельном потоке, не зависящем от действий, происходящих на этапе инициализации.

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

Функция Handler

В показан код функции Handler и вспомогательных потоков. Для запросов "Stop" и "Shutdown" используется алгоритм корректного останова службы, аналогичный тому, который используется при старте службы, с той лишь разницей, что вместо параметра SERVICE_START_PENDING в SetserviceStatus передается параметр SERVICE_STOP_PENDING, а вместо SERVICE_RUNNING - SERVICE_STOPPED.

В идеале для запросов "Pause" и "Continue" тоже следует использовать этот подход. Любознательный читатель без труда сможет реализовать его, опираясь на данные примеры.

Заключение

В заключение хотелось бы отметить, что с переходом на Windows NT 2000 разработка служб не претерпела изменений. Службы по-прежнему остаются важной частью программного обеспечения на платформе Windows, что предоставляет разработчикам широкое поле деятельности.


// Функция, аналог MessageBox Win32 API int ServerMessageBox(RPC_BINDING_HANDLE h, LPSTR lpszText, LPSTR lpszTitle, UINT fuStyle) { DWORD dwThreadId; HWINSTA hwinstaSave; HDESK hdeskSave; HWINSTA hwinstaUser; HDESK hdeskUser; int result; // Запоминаем текущие объекты "Window station" и "Desktop". GetDesktopWindow(); hwinstaSave = GetProcessWindowStation(); dwThreadId = GetCurrentThreadId(); hdeskSave = GetThreadDesktop(dwThreadId); // Меняем контекст безопасности на тот, // который есть у вызавшего клиента RPC // и получаем доступ к пользовательским // объектам "Window station" и "Desktop". RpcImpersonateClient(h); hwinstaUser = OpenWindowStation("WinSta0", FALSE, MAXIMUM_ALLOWED); if (hwinstaUser == NULL) { RpcRevertToSelf(); return 0; } SetProcessWindowStation(hwinstaUser); hdeskUser = OpenDesktop("Default", 0, FALSE, MAXIMUM_ALLOWED); RpcRevertToSelf(); if (hdeskUser == NULL) { SetProcessWindowStation(hwinstaSave); CloseWindowStation(hwinstaUser); return 0; } SetThreadDesktop(hdeskUser); // Выводим обычное текстовое окно. result = MessageBox(NULL, lpszText, lpszTitle, fuStyle); // Восстанавливаем сохраненные объекты // "Window station" и "Desktop". SetThreadDesktop(hdeskSave); SetProcessWindowStation(hwinstaSave); CloseDesktop(hdeskUser); CloseWindowStation(hwinstaUser); return result; } void main() { SERVICE_TABLE_ENTRY steTable = { {SERVICENAME, ServiceMain}, {NULL, NULL} }; // Устанавливаем соединение с SCM. Внутри этой функции // происходит прием и диспетчеризация запросов. StartServiceCtrlDispatcher(steTable); } void WINAPI ServiceMain(DWORD dwArgc, LPSTR *psArgv) { // Сразу регистрируем обработчик запросов. hSS = RegisterServiceCtrlHandler(SERVICENAME, ServiceHandler); sStatus.dwCheckPoint = 0; sStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; sStatus.dwServiceSpecificExitCode = 0; sStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; sStatus.dwWaitHint = 0; sStatus.dwWin32ExitCode = NOERROR; // Для инициализации службы вызывается функция InitService(); // Для того, чтобы в процессе инициализации система не // выгрузила службу, запускается поток, который раз в // секунду сообщает, что служба в процессе инициализации. // Для синхронизации потока создаётся событие. // После этого запускается рабочий поток, для // синхронизации которого также // создаётся событие. hSendStartPending = CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE hSendStartThread; DWORD dwThreadId; hSendStartThread = CreateThread(NULL, 0, SendStartPending, NULL, 0, &dwThreadId); //Здесь производится вся инициализация службы. InitService(); SetEvent(hSendStartPending); if(WaitForSingleObject(hSendStartThread, 2000) != WAIT_OBJECT_0) { TerminateThread(hSendStartThread, 0); } CloseHandle(hSendStartPending); CloseHandle(hSendStartThread); hWork = CreateEvent(NULL, TRUE, FALSE, NULL); hServiceThread = CreateThread(NULL, 0, ServiceFunc, 0, 0, &dwThreadId); sStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hSS, &sStatus); } // Функция потока, каждую секунду посылающая уведомления SCM // о том, что процесс инициализации идёт. Работа функции // завершается, когда устанавливается // событие hSendStartPending. DWORD WINAPI SendStartPending(LPVOID) { sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_START_PENDING; sStatus.dwWaitHint = 2000; // "Засыпаем" на 1 секунду. Если через 1 секунду // событие hSendStartPending не перешло // в сигнальное состояние (инициализация службы не // закончилась), посылаем очередное уведомление, // установив максимальный интервал времени // в 2 секунды, для того, чтобы был запас времени до // следующего уведомления. while (true) { SetServiceStatus(hSS, &sStatus); sStatus.dwCheckPoint++; if(WaitForSingleObject(hSendStartPending, 1000)!=WAIT_TIMEOUT) break; } sStatus.dwCheckPoint = 0; return 0; } // Функция, инициализирующая службу. Чтение данных, // распределение памяти и т.п. void InitService() { ... } // Функция, содержащая код службы. DWORD WINAPI ServiceFunc(LPVOID) { while (true) { if (!bPause) { // Здесь содержится код, который как правило // выполняет какие-либо циклические операции... } if (WaitForSingleObject(hWork, 1000)!=WAIT_TIMEOUT) break; } return 0; } // Обработчик запросов от SCM void WINAPI ServiceHandler(DWORD dwCode) { switch (dwCode) { case SERVICE_CONTROL_STOP: case SERVICE_CONTROL_SHUTDOWN: ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 0, 1000); hSendStopPending = CreateEvent(NULL, TRUE, FALSE, NULL); hSendStopThread = CreateThread(NULL, 0, SendStopPending, NULL, 0, & dwThreadId); SetEvent(hWork); if (WaitForSingleObject(hServiceThread, 1000) != WAIT_OBJECT_0) { TerminateThread(hServiceThread, 0); } SetEvent(hSendStopPending); CloseHandle(hServiceThread); CloseHandle(hWork); if(WaitForSingleObject(hSendStopThread, 2000) != WAIT_OBJECT_0) { TerminateThread(hSendStopThread, 0); } CloseHandle(hSendStopPending); sStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hSS, &sStatus); break; case SERVICE_CONTROL_PAUSE: bPause = true; sStatus.dwCurrentState = SERVICE_PAUSED; SetServiceStatus(hSS, &sStatus); break; case SERVICE_CONTROL_CONTINUE: bPause = true; sStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hSS, &sStatus); break; case SERVICE_CONTROL_INTERROGATE: SetServiceStatus(hSS, &sStatus); break; default: SetServiceStatus(hSS, &sStatus); break; } } // Функция потока, аналогичная SendStartPending // для останова службы. DWORD WINAPI SendStopPending(LPVOID) { sStatus.dwCheckPoint = 0; sStatus.dwCurrentState = SERVICE_STOP_PENDING; sStatus.dwWaitHint = 2000; while (true) { SetServiceStatus(hSS, &sStatus); sStatus.dwCheckPoint++; if(WaitForSingleObject(hSendStopPending, 1000)!=WAIT_TIMEOUT) break; } sStatus.dwCheckPoint = 0; return 0; }

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

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

Существует несколько режимов для служб:

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

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

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

Службы и их атрибуты могут быть изменены в консоли управления MMC:

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

Список служб операционных систем Microsoft Windows

Выводимое имя Имя службы Функции Описание
DHCP-клиент Dhcp Регистрирует и обновляет IP-адреса и DNS-записи для этого компьютера. Если эта служба остановлена, этот компьютер не сможет получать динамические IP-адреса и выполнять обновления DNS.
DNS-клиент Dnscache Служба DNS-клиента (dnscache) кэширует имена DNS (Domain Name System) и регистрирует полное имя данного компьютера. Если служба остановлена, разрешение имен DNS будет продолжаться. Однако результаты очередей имен DNS не будут кэшироваться, и имя компьютера не будет зарегистрировано.
KtmRm для координатора распределённых транзакций KtmRm Координирует транзакции между MSDTC и диспетчером транзакций ядра (Kernel Transaction Manager - KTM).
ReadyBoost EMDMgmt ReadyBoost Поддержка повышения производительности системы с помощью технологии ReadyBoost .
Superfetch SysMain Superfetch Поддерживает и улучшает производительность системы.
Windows Audio Audiosrv Управление средствами работы со звуком для программ Windows. Если эта служба остановлена, то аудиоустройства и эффекты не будут правильно работать.
Windows CardSpace idsvc Обеспечивает надежную возможность создания, управления и раскрытия цифровых удостоверений.
Автоматическое обновление WUAUSERV Включает загрузку и установку обновлений Windows. Если служба отключена, то на этом компьютере нельзя будет использовать возможности автоматического обновления или веб-узел Windows Update.

Список служб, создаваемых приложениями и программами Microsoft

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

См. также

Список служб Windows

Ссылки

  • pcs.suite101.com/article.cfm/index_of_services: Index of Windows XP Services - An Index of the Services running on Windows XP operating system
  • Как удалить службу в Windows Vista или Windows XP
  • Службы Windows XP (рус.)

Wikimedia Foundation . 2010 .

Смотреть что такое "Службы Windows" в других словарях:

    Windows SharePoint Services (WSS) бесплатное дополнение к Microsoft Windows Server 2003 и 2008, реализующее полнофункциональную веб платформу с поддержкой следующих возможностей: Система управления контентом Средства для совместной работы… … Википедия

    Разработчик Microsoft Семейство ОС Windows … Википедия

    Компонент Microsoft Windows … Википедия

Операционные системы