在安装时自动启动Windows服务

时间:2009-06-24 06:33:09

标签: c# windows-services

我有一个使用InstallUtil.exe安装的Windows服务。即使我已将启动方法设置为自动,但安装时服务无法启动,我必须手动打开服务并单击开始。有没有办法通过命令行或通过服务代码启动它?

14 个答案:

答案 0 :(得分:202)

在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时,它将安装然后启动该服务。

答案 1 :(得分:27)

重构一下后,这是一个完整的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();
    }
}
}

答案 2 :(得分:6)

以下命令怎么样?

net start "<service name>"
net stop "<service name>"

答案 3 :(得分:4)

您可以使用以下命令行启动服务:

net start *servicename*

答案 4 :(得分:4)

用于控制服务的程序化选项:

  • 可以使用本机代码"Starting a Service"。最大程度的控制,最小的依赖性,但最多的工作。
  • WMI:Win32_ServiceStartService方法。这适用于您需要能够执行其他处理的情况(例如,选择哪种服务)。
  • PowerShell:通过RunspaceInvoke执行Start-Service或创建自己的Runspace并使用其CreatePipeline方法执行。这对于您需要能够使用比WMI更容易编码模型执行其他处理(例如选择哪种服务)的情况更好,但取决于正在安装的PSH。
  • .NET应用程序可以使用ServiceController

答案 5 :(得分:2)

使用ServiceController从代码启动服务。

更新:从命令行启动服务的更正确的方法是使用“sc”(Service Controller)命令而不是“net”。

答案 6 :(得分:1)

尽管完全按照接受的答案,我仍然无法启动服务 - 我在安装过程中给出了一条失败消息,说明刚刚安装的服务无法启动,因为它不存在,尽管使用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();
    }

答案 7 :(得分:0)

自动启动意味着Windows启动时会自动启动该服务。正如其他人所提到的,要从控制台启动它,您应该使用ServiceController。

答案 8 :(得分:0)

您可以使用GetServicesServiceController方法 class获取所有服务的数组。然后,通过检查每项服务的ServiceName属性来查找您的服务。找到服务后,请调用Start方法启动它。

您还应该检查Status属性以查看它在调用start之前已经处于什么状态(它可能正在运行,暂停,停止等等。)

答案 9 :(得分:0)

你腐蚀了你的设计师。重新添加安装程序组件。它应该有一个serviceInstaller和一个serviceProcessInstaller。具有“启动方法”属性设置为“自动”的serviceInstaller将在安装时以及每次重新启动后启动。

答案 10 :(得分:0)

请注意:您可能使用表单界面以不同方式设置服务,以添加服务安装程序和项目安装程序。在这种情况下,用service&#34; .ServiceName中的&#34;名称替换它所说的serviceInstaller.ServiceName。

在这种情况下,您也不需要私人会员。

感谢您的帮助。

答案 11 :(得分:0)

最近,您可以使用cmd中的sc工具。

sc start ServiceName

请注意,您必须处于管理员模式。

答案 12 :(得分:0)

以下是在Visual Studio中使用生成的ProjectInstaller的过程和代码:

  1. Create Windows Service project in Visual Studio
  2. Generate installers to the service
  3. 在设计编辑器中打开ProjectInstaller(在创建安装程序时应自动打开),并设置生成的serviceProcessInstaller1(例如Account:LocalSystem)和serviceInstaller1(例如StartType:Automatic)的属性。
  4. 在代码编辑器中打开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();
        }
    }
}

答案 13 :(得分:0)

这对我来说还可以。在服务项目中,添加到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();
        }
    }
}