Можете ли вы написать службы Windows в Powershell

#powershell #windows-services

#powershell #windows-services

Вопрос:

Я написал программу на PowerShell, которая выполняет циклы и проверяет содержимое. Я хотел бы преобразовать это в службу Windows. Я создал службу Windows (в Admin-> Services), но я не могу ее запустить. Я почти уверен, что мне не хватает надлежащего интерфейса, к которому система должна обращаться, чтобы запустить / остановить / приостановить / etc службу.

Я могу найти множество примеров, когда дело доходит до выполнения этого на VB / C # / MS-lang, но ничего о том, как это сделать с помощью PowerShell. Есть ли какая-либо документация (или, предпочтительно, примеры кода), которая могла бы помочь с этим?

Комментарии:

1. Не было бы лучше использовать запланированную задачу для этого?

2. Если вы нашли пример C #, в большинстве случаев вы сможете адаптировать его к powershell, поскольку он зависит от system .NET.

3. @x0n: хорошая идея, но запланированные задачи выполняются недостаточно часто (каждую секунду), и мне нужно, чтобы они запускались как другая программа и запускались с правами администратора. @empo: я уже пытаюсь конвертировать из примера C , но это мое поле, и на это уходит вечность.

4. Согласны с x0n в использовании запланированной задачи. Если они выполняются с таким интервалом, запишите их для запуска в цикле process-sleep-process. Настройте запланированную задачу для запуска под учетной записью администратора, затем предоставьте любой запущенной другой программе разрешение на запуск / остановку задачи (другая программа не обязательно должна запускаться с правами администратора).

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

Ответ №1:

Здесь есть несколько спорных моментов:

  • Вы уверены, что вам действительно нужна служба? Я согласен с комментариями об использовании планировщика для выполнения периодических задач. Планировщик может запускать задачи от имени администратора.
  • Службы вызывают специальный набор API для связи с диспетчером Service Control, поэтому обычная программа не может быть использована напрямую.
  • Диспетчер управления службами использует CreateProcessAsUser для запуска процесса обслуживания, поэтому вам нужно указать SCM на исполняемый двоичный файл, а не на скрипт.

Если вы не можете использовать планировщик (хотя я настоятельно рекомендую вам попробовать), я полагаю, вы могли бы написать исполняемый двоичный файл, который действует как служба. Затем он выполнит PowerShell и ваш скрипт от вашего имени. Я думаю, что что-то вроде srvany программы, которая раньше входила в комплект ресурсов Windows Server 2003, могло бы загрузить службу для вас.

Комментарии:

1. «специальный набор API для взаимодействия с SCM, поэтому обычная программа не может быть использована» — я знаю это, в этом весь мой вопрос. Я уже написал службу на Python, расширив win32serviceutil. Класс ServiceFramework Python, который предоставляет все перехваты / специальные API, необходимые SCM. Итак, я мог бы написать оболочку Python для вызова моего powershell. Я пытаюсь выяснить, есть ли что-то подобное в powershell, что будет означать, что мне не придется устанавливать python или оболочку C # / C (потому что я не знаю C # / C (и мне не очень интересно их изучать)).

2. Как я уже писал, SCM не может напрямую вызывать скрипт. Для этого необходимо запустить исполняемый двоичный файл Windows, вы не можете указать его на скрипт PowerShell или скрипт Python или что-то еще. Для правильной обработки ассоциации файлов SCM потребуется использовать ShellExecute, но, как я уже писал, он использует CreateProcessAsUser, поэтому вы должны использовать двоичный файл. Если вы не хотите писать службу, почему бы вам не попробовать загрузить программу srvany, о которой я упоминал, и попробовать это?

Ответ №2:

Если вы абсолютно хотите выполнить свой код PowerShell в службе, я думаю, вы можете написать оболочку службы C # для кода PowerShell.

Вы нашли примеры того, как создать службу с помощью C #, и из C # просто вызвать Powershell. Итак, я удивлен, что настолько маленький, ориентированный на SrvAny PowerShell еще не существует.

Мой совет здесь, вам лучше переписать свой код на C # как службу.

Комментарии:

1. Никогда не нравилась идея использования планировщика, поскольку было слишком много оговорок ко времени, когда я хотел его запустить. Я хочу закрыть этот вопрос, поэтому выбираю ваш ответ. Powershell имеет очень тесную интеграцию с C #, и вы предоставили код для этого.

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

Ответ №3:

Вы можете использовать опцию PowerGUI «Скомпилировать скрипт в службу«:http://documents.software.dell.com/DOC144271

Ответ №4:

Я думаю, что вы ищете SrvAny.exe от Microsoft (я не знаю, поддерживают ли они это больше, но это было в наборе ресурсов Windows 2000 в течение многих лет. По сути, это превратит практически любой исполняемый файл (.exe, .cmd и т.д.) в службу. У меня есть VBScripts, работающие как квазисервисы, использующие Srvany.exe и это работает в Windows 2003 и Windows 2008 (даже 64-разрядной). Это немного ограничено тем, что не обеспечивает 100% функциональности службы (остановка запущенного скрипта может быть затруднена), но если вы теперь немного разбираетесь в программировании и среде Windows, вы можете адаптировать его для работы довольно хорошо (т. Е. Он запустит программу после перезапуска сервера, как вам, вероятно, потребуется из службы. Есть некоторая документация с SrvAny.exe (хотя это может быть немного туповато и его трудно найти). Однако это бесплатно и создано для Windows, поэтому оно должно работать у вас. Я согласен для простоты, что над идеей запланированной задачи стоит подумать, поскольку она еще более упрощена, чем srvany.exe

Ответ №5:

http://www.firedaemon.com/

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

Комментарии:

1. Я мог бы написать одну из них сам! Весь смысл в том, чтобы просто запускать то, что уже установлено на компьютере. Я настроил его как службу, используя Python, но это дополнительные 60 МБ для установки, тогда как PowerShell уже там. В любом случае, спасибо.

2. Это законный альтернативный ответ, если выбран ответ @JPBlanc «Напишите это на C #». Нет ничего плохого в стороннем программном обеспечении, если оно соответствует всем требованиям и вариантам использования.