在安装时自动启动Windows服务
我有一个使用InstallUtil.exe安装的Windows服务。 即使我已将启动方法设置为自动,服务安装时不启动,我必须手动打开服务,然后单击开始。 有没有办法通过命令行或通过服务的代码来启动它?
在您的Installer类中,为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服务安装程序的例子:
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(); } } }
如何遵循命令?
net start "<service name>" net stop "<service name>"
用于控制服务的程序化选项:
- 本机代码可以使用“启动服务” 。 最大的控制与最小的依赖关系,但最多的工作。
- WMI: Win32_Service有一个
StartService
方法。 这对于需要执行其他处理的情况(例如,select哪种服务)很有用。 - PowerShell:通过
RunspaceInvoke
执行Start-Service
,或者创build自己的Runspace
并使用它的CreatePipeline
方法执行。 对于需要能够执行其他处理(例如select哪种服务)的情况,这比使用WMI更容易的编码模型,但是取决于PSH被安装。 - .NET应用程序可以使用
ServiceController
您可以使用以下命令行来启动服务:
net start *servicename*
使用ServiceController从代码启动您的服务。
更新:从命令行启动服务的更正确方法是使用“sc”( 服务控制器 )命令而不是“net”。
尽pipe完全按照接受的答案,我仍然无法启动服务 – 我在安装过程中给出了一个失败消息,指出刚刚安装的服务无法启动,因为它不存在,尽pipe使用this.serviceInstaller.ServiceName
而不是文字…
我最终find了一个使用命令行的替代解决scheme:
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(); }
自动启动意味着服务在Windows启动时自动启动。 正如其他人所说,要从控制台启动它,你应该使用ServiceController。
您可以使用ServiceController类的GetServices
方法获取所有服务的数组。 然后,通过检查每个服务的ServiceName
属性find您的服务。 当你find你的服务时,调用Start
方法启动它。
您还应该检查Status
属性,以查看在调用开始之前它已经处于什么状态(可能正在运行,暂停,停止等)。
你腐败了你的devise师。 重新添加您的安装程序组件。 它应该有一个serviceInstaller和一个serviceProcessInstaller。 将属性“启动方法”设置为“自动”的serviceInstaller将在安装时以及每次重新启动后启动。
请注意:您可能使用表单界面以不同方式设置服务,以添加服务安装程序和项目安装程序。 在这种情况下,将其replace为serviceInstaller.ServiceName和“来自devise者的名称”.ServiceName。
在这种情况下,您也不需要私人会员。
谢谢您的帮助。