У меня есть служба Windows, которую я устанавливаю с помощью InstallUtil.exe. Несмотря на то, что я установил метод автозагрузки в автоматический, служба не запускается при установке, я должен вручную открыть службы и нажать «начать». Есть ли способ запустить его либо через командную строку, либо через код службы?Автоматический запуск службы Windows при установке
ответ
В классе установщика добавьте обработчик для события AfterInstall. Затем вы можете вызвать ServiceController в обработчике событий для запуска службы.
using System.ServiceProcess;
public ServiceInstaller()
{
//... Installer code here
this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}
void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
{
sc.Start();
}
}
Теперь, когда вы запускаете InstallUtil у вашего установщика, он будет устанавливать и запускать службу.
Автоматический запуск означает, что служба автоматически запускается при запуске Windows. Как отмечали другие, чтобы запустить его с консоли, вы должны использовать ServiceController.
Я не хочу этого делать. Я хочу сделать это за один раз из командной строки или из классов Windows Service. – mickyjtwin
Извините, мой плохой, я пропустил тот момент, когда вы явно исключили возможность запуска его через панель управления. –
Как насчет следующих команд?
net start "<service name>"
net stop "<service name>"
Вы можете использовать следующую команду, чтобы запустить службу:
net start *servicename*
Используйте ServiceController, чтобы начать свой сервис от кода.
Обновление: И более правильным способом запуска службы из командной строки является использование команды «sc» (Service Controller) вместо «net».
Вы можете использовать метод GetServices
класса ServiceController , чтобы получить массив всех услуг. Затем найдите свою услугу, проверив свойство ServiceName
каждой службы. Когда вы нашли свою услугу, вызовите метод Start
, чтобы запустить его.
Вы также должны проверить свойство Status
, чтобы узнать, в каком состоянии он находится до начала вызова (он может быть запущен, приостановлен, остановлен и т. Д.).
алгоритмической опции для управления услугами:
- Машинный код может использованы, "Starting a Service". Максимальное управление с минимальными зависимостями, но большая часть работы.
- WMI: Win32_Service имеет метод
StartService
. Это хорошо для случаев, когда вам нужно иметь возможность выполнять другую обработку (например, для выбора той службы). - PowerShell: выполнить
Start-Service
черезRunspaceInvoke
или создать собственныйRunspace
и использовать его методCreatePipeline
. Это хорошо для случаев, когда вам нужно иметь возможность выполнять другую обработку (например, для выбора какой услуги) с гораздо более простой моделью кодирования, чем WMI, но зависит от установленного PSH. - .NET-приложение может использовать
ServiceController
После рефакторинга немного, это пример полного установщика окон службы с автоматическим запуском:
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;
namespace Example.of.name.space
{
[RunInstaller(true)]
public partial class ServiceInstaller : Installer
{
private readonly ServiceProcessInstaller processInstaller;
private readonly System.ServiceProcess.ServiceInstaller serviceInstaller;
public ServiceInstaller()
{
InitializeComponent();
processInstaller = new ServiceProcessInstaller();
serviceInstaller = new System.ServiceProcess.ServiceInstaller();
// Service will run under system account
processInstaller.Account = ServiceAccount.LocalSystem;
// Service will have Start Type of Manual
serviceInstaller.StartType = ServiceStartMode.Automatic;
serviceInstaller.ServiceName = "Windows Automatic Start Service";
Installers.Add(serviceInstaller);
Installers.Add(processInstaller);
serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;
}
private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
ServiceController sc = new ServiceController("Windows Automatic Start Service");
sc.Start();
}
}
}
Этот код дал мне следующие ошибки: Исключение произошло на этапе установки. System.InvalidOperationException: Исключение произошло в обработчике событий OnAfterInstall System.ServiceProcess.ServiceInstaller. Внутреннее исключение. Исключение System.InvalidOperationException было вызвано следующим сообщением об ошибке: Не удается запустить service serviceName на компьютере. '.. Внутреннее исключение. Исключение System.ComponentModel.Win32Exception было отправлено со следующим сообщением об ошибке: исполняемая программа, настроенный для запуска, не реализует службу. – goamn
Ошибки изъяты после того, как я прокомментировал строку «InitializeComponent()». Я считаю, что эта строка дублирует все другие строки, поскольку журналы, похоже, показывают две идентичные вещи, происходящие вместе перед ошибкой: Установка сервисного сервисаName ... Служба serviceName успешно установлена. Создание источника EventLog sourceName в журнале Application ... Установка службы serviceName ... Создание источника службы EventLogName в журнале Application ... Исключение произошло в обработчике событий OnAfterInstall System.ServiceProcess.ServiceInstaller. – goamn
Вы действительно спасли мой день :) Спасибо за этот полезный комментарий. После того как я прокомментировал вызов InitializeComponent(), моя служба также начала отлично – Konstantin
Вы испорчен дизайнером.Внесите свой компонент установщика. Он должен иметь serviceInstaller и serviceProcessInstaller. Установщик serviceInstaller с свойством Startup Method, установленным в Automatic, будет запускаться при установке и после каждой перезагрузки.
Несмотря на то, что я все равно не смог получить услугу, мне все же не удалось запустить службу. Вместо этого мне было предоставлено сообщение об ошибке при установке, в котором указано, что только что установленная служба не может быть запущена, поскольку ее не было , несмотря на использование this.serviceInstaller.ServiceName
, а не буквальное ...
в конце концов я нашел альтернативное решение, которое использует в командной строке:
private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e) {
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C sc start " + this.serviceInstaller.ServiceName;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();
}
Только примечание: Вы могли бы настроить свой сервис по-разному, используя формирует интерфейс для добавления установщика услуг и установщика проекта. В этом случае замените там, где указано serviceInstaller.ServiceName, с именем «name from designer» .ServiceName.
Вам также не нужны частные члены в этом случае.
Спасибо за помощь.
- 1. Автоматический запуск службы Windows при установке
- 2. «Автоматический» против «Автоматический (отложенный запуск)»
- 3. Проблемы при установке службы windows
- 4. автоматический запуск службы при закрытии приложения
- 5. Запуск службы windows при установке без проекта проекта
- 6. RabbitMQ Windows - автоматический запуск сервера
- 7. Windows 8.1 Автоматический запуск
- 8. Windows - автоматический запуск определенных приложений при загрузке
- 9. Ошибка 1001 при установке пользовательской службы Windows
- 10. Автоматический запуск службы системного приложения в Android
- 11. Автоматический запуск Windows Sound Recorder
- 12. Запуск службы windows без регистрации
- 13. Как настроить работу службы WCF Автоматический запуск
- 14. System.BadImageFormatException при установке службы
- 15. Запуск службы Windows и cobertura
- 16. Универсальное приложение для Windows - автоматический запуск
- 17. Запуск службы WCF во время службы Windows
- 18. Автоматический запуск при обновлении встречи
- 19. Автоматический запуск приложения при зарядке
- 20. Windows 10 Mobile App фоновая задача или автоматический запуск службы при перезагрузке телефона
- 21. Запуск веб-службы .asmx как службы Windows
- 22. Запуск службы фляжки в качестве службы Windows
- 23. Автоматический запуск Rails-сервера при запуске Ubuntu
- 24. Windows Phone 8: Автоматический запуск * .PPTX неудачу
- 25. Автоматический запуск скрипта PHP в Windows
- 26. автоматический запуск служебной функции при посещении страницы
- 27. запуск службы windows из java
- 28. Запуск приложения как службы windows
- 29. Запуск службы Windows на консоли
- 30. Запуск программы из службы windows
(комментарий от предлагаемого редактирования): лучше использовать serviceInstaller.ServiceName, если имя servicename будет изменено, оно будет использовать правильное имя без необходимости его изменения в коде. –
Также не помешает обернуть «ServiceController» в операторе using. – ChrisO
Мне нужно было указать идентификатор сервисного установщика в OnBeforeInstall. Что-то вроде serviceInstaller = serviceInstaller1; где serviceInstaller1 является идентификатором от дизайнера. Выполнение этого в OnBeforeInstall сделало вышеприведенную работу безупречно для меня. Я не пробовал, но вы можете сделать это и в вызове ServiceInstaller(). –