У меня есть служба Windows, которую я устанавливаю с помощью InstallUtil.exe. Несмотря на то, что я установил метод автозагрузки в автоматический, служба не запускается при установке, я должен вручную открыть службы и нажать "начать". Есть ли способ запустить его либо через командную строку, либо через код службы?
Автоматически запускать службу Windows при установке
Ответ 1
В своем классе установщика добавьте обработчик для события 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) отправитель;
using (ServiceController sc = new ServiceController(serviceInstaller.ServiceName))
{
sc.Start();
}
}
Теперь, когда вы запустите InstallUtil на вашем установщике, он установит и запустит службу.
Ответ 2
После рефакторинга немного, это пример полного установщика служб 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 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();
}
}
}
Ответ 3
Как насчет следующих команд?
net start "<service name>"
net stop "<service name>"
Ответ 4
Для запуска службы вы можете использовать следующую командную строку:
net start *servicename*
Ответ 5
Программные параметры управления службами:
- Можно использовать собственный код "Запуск службы" . Максимальный контроль с минимальными зависимостями, но большая часть работы.
- WMI: Win32_Service имеет метод
StartService
. Это хорошо для случаев, когда вам нужно иметь возможность выполнять другую обработку (например, для выбора той службы). - PowerShell: выполните
Start-Service
черезRunspaceInvoke
или создав собственныйRunspace
и используяCreatePipeline
. Это хорошо для случаев, когда вам нужно иметь возможность выполнять другую обработку (например, для выбора той службы) с гораздо более простой моделью кодирования, чем WMI, но зависит от установки PSH. - Приложение .NET может использовать
ServiceController
Ответ 6
Используйте ServiceController, чтобы начать службу с кода.
Обновление: И более правильным способом запуска службы из командной строки является использование "sc" (Service Controller) вместо "net".
Ответ 7
Несмотря на то, что в соответствии с принятым ответом точно, я все еще не смог запустить службу. Вместо этого мне пришло сообщение об ошибке при установке, в котором указано, что только что установленная служба не может быть запущена, поскольку ее не было, несмотря на использование 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();
}
Ответ 8
Автоматический запуск означает, что служба запускается автоматически при запуске Windows. Как отмечали другие, чтобы запустить его с консоли, вы должны использовать ServiceController.
Ответ 9
Вы можете использовать метод GetServices
ServiceController
класса, чтобы получить массив всех служб. Затем найдите свою службу, проверив свойство ServiceName
для каждой службы. Когда вы нашли свое обслуживание, вызовите метод Start
, чтобы запустить его.
Вы также должны проверить свойство Status
, чтобы узнать, какое состояние оно уже находится до начала запуска (оно может быть запущено, приостановлено, остановлено и т.д.).
Ответ 10
Вы испортили своего дизайнера. Внесите свой компонент установщика. Он должен иметь serviceInstaller и serviceProcessInstaller. Установщик serviceInstaller с свойством Startup Method, установленным в Automatic, запускается при установке и после каждой перезагрузки.
Ответ 11
Просто примечание. Возможно, вы настроили свою службу по-разному, используя интерфейс форм, чтобы добавить установщика услуг и установщика проекта. В этом случае замените там, где указано serviceInstaller.ServiceName с именем "name from designer".ServiceName.
В этом случае вам также не нужны частные члены.
Спасибо за помощь.
Ответ 12
Довольно поздно, но вы можете использовать инструмент sc в cmd.
sc start ServiceName
Обратите внимание, что вы должны быть в режиме администратора.