У меня есть служба Windows, которую я устанавливаю с помощью InstallUtil.exe. Несмотря на то, что я установил для параметра «Метод запуска» значение «Автоматический», служба не запускается при установке, мне приходится вручную открывать службы и нажимать кнопку «Пуск». Есть ли способ запустить его через командную строку или через код Сервиса?
Автоматически запускать службу Windows при установке
Ответы (13)
В своем классе установщика добавьте обработчик для события AfterInstall. Затем вы можете вызвать ServiceController в обработчике событий, чтобы запустить службу.
using System.ServiceProcess;
public ServiceInstaller()
{
//... Installer code here
this.AfterInstall += new InstallEventHandler(ServiceInstaller_AfterInstall);
}
void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
ServiceInstaller serviceInstaller = (ServiceInstaller)sender;
using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
{
sc.Start();
}
}
Теперь, когда вы запустите InstallUtil в своем установщике, он установит, а затем автоматически запустит службу.
ServiceController
в оператор using.
- person ChrisO; 21.10.2013
ServiceInstaller
в вашем классе. Такой класс должен реализовывать System.Configuration.Install.Installer
. Дополнительную информацию см. В этом руководстве по msdn. .
- person Sergio Basurco; 17.01.2017
serviceInstaller
- это объект ServiceInstaller
, на который указывает sender
в обработчике событий, который обычно создается в конструкторе ServiceInstaller()
. Поэтому вы можете добавить ServiceInstaller serviceInstaller = (ServiceInstaller)sender;
перед оператором using
.
- person khargoosh; 10.02.2017
После небольшого рефакторинга это пример полного установщика службы Windows с автоматическим запуском:
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 Automatic Start Type
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();
}
}
}
Как насчет следующих команд?
net start "<service name>"
net stop "<service name>"
Программные варианты управления услугами:
- Можно использовать собственный код, «Запуск службы» . Максимальный контроль с минимумом зависимостей, но большая часть работы.
- WMI: Win32_Service имеет
StartService
метод. Это хорошо для случаев, когда вам нужно иметь возможность выполнять другую обработку (например, чтобы выбрать, какую услугу). - PowerShell: выполнить
Start-Service
через _3 _ или создав свой собственныйRunspace
и используя его _ 5_ метод для выполнения. Это хорошо для случаев, когда вам нужно иметь возможность выполнять другую обработку (например, чтобы выбрать, какую службу) с гораздо более простой моделью кодирования, чем WMI, но зависит от установленного PSH. - Приложение .NET может использовать
ServiceController
Вы можете использовать следующую командную строку для запуска службы:
net start *servicename*
Используйте ServiceController, чтобы запустить службу из кода. .
Обновление: И более правильный способ запустить службу из командной строки - использовать "sc" (Service Controller) вместо net.
Несмотря на то, что я точно следовал принятому ответу, мне все равно не удалось запустить службу - вместо этого во время установки мне было выдано сообщение об ошибке, в котором говорилось, что только что установленная служба не может быть запущена, поскольку она не существует, несмотря на использование 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();
}
Вот процедура и код, использующий сгенерированный ProjectInstaller
в Visual Studio:
- Создать проект Служба Windows в Visual Studio
- Создать установщики для службы
- Откройте
ProjectInstaller
в редакторе дизайна (он должен открываться автоматически при создании установщика) и установите свойства созданныхserviceProcessInstaller1
(например, Account: LocalSystem) иserviceInstaller1
(например, StartType: Automatic) - Откройте
ProjectInstaller
в редакторе кода (нажмитеF7
в редакторе дизайна) и добавьте обработчик событий вServiceInstaller.AfterInstall
- см. Следующий код. Он запустит службу после ее установки.
ProjectInstaller класс:
using System.ServiceProcess;
[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
{
InitializeComponent(); //generated code including property settings from previous steps
this.serviceInstaller1.AfterInstall += Autorun_AfterServiceInstall; //use your ServiceInstaller name if changed from serviceInstaller1
}
void Autorun_AfterServiceInstall(object sender, InstallEventArgs e)
{
ServiceInstaller serviceInstaller = (ServiceInstaller)sender;
using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
{
sc.Start();
}
}
}
Автоматический запуск означает, что служба запускается автоматически при запуске Windows. Как уже упоминалось, чтобы запустить его из консоли, вы должны использовать ServiceController.
Для получить массив всех услуг. Затем найдите свою службу, проверив свойство ServiceName
каждой службы. Когда вы найдете свою службу, вызовите метод Start
, чтобы запустить ее.
Вы также должны проверить свойство Status
, чтобы увидеть, в каком состоянии оно уже находится перед вызовом start (оно может быть запущено, приостановлено, остановлено и т. Д.).
Вы испортили своего дизайнера. Повторно добавьте компонент установщика. У него должны быть установщик служб и установщик процессов. ServiceInstaller со свойством Startup Method, установленным на Automatic, будет запускаться при установке и после каждой перезагрузки.
Просто примечание: вы могли настроить свою службу по-другому, используя интерфейс форм, чтобы добавить установщик службы и установщик проекта. В этом случае замените место, где написано serviceInstaller.ServiceName, на «имя от дизайнера» .ServiceName.
В этом случае вам также не нужны частные члены.
Спасибо за помощь.
Для меня это нормально. В сервисный проект добавить в Installer.cs
[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
{
InitializeComponent();
}
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
//The following code starts the services after it is installed.
using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
{
serviceController.Start();
}
}
}