Automatically start a Windows Service on install

前端 未结 13 1268
轻奢々
轻奢々 2020-11-28 19:13

I have a Windows Service which I install using the InstallUtil.exe. Even though I have set the Startup Method to Automatic, the service does not start when installed, I have

相关标签:
13条回答
  • 2020-11-28 19:49

    In your Installer class, add a handler for the AfterInstall event. You can then call the ServiceController in the event handler to start the service.

    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();
        }
    }
    

    Now when you run InstallUtil on your installer, it will install and then start up the service automatically.

    0 讨论(0)
  • 2020-11-28 19:49

    Just a note: You might have set up your service differently using the forms interface to add a service installer and project installer. In that case replace where it says serviceInstaller.ServiceName with "name from designer".ServiceName.

    You also don't need the private members in this case.

    Thanks for the help.

    0 讨论(0)
  • 2020-11-28 19:52

    Use ServiceController to start your service from code.

    Update: And more correct way to start service from the command line is to use "sc" (Service Controller) command instead of "net".

    0 讨论(0)
  • 2020-11-28 19:54

    This is OK for me. In Service project add to 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();
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 19:57

    Despite following the accepted answer exactly, I was still unable to get the service to start-- I was instead given a failure message during installation stating that the service that was just installed could not be started, as it did not exist, despite using this.serviceInstaller.ServiceName rather than a literal...

    I eventually found an alternative solution that makes use of the command line:

    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();
        }
    
    0 讨论(0)
  • 2020-11-28 19:57

    You can use the GetServices method of ServiceController class to get an array of all the services. Then, find your service by checking the ServiceName property of each service. When you've found your service, call the Start method to start it.

    You should also check the Status property to see what state it is already in before calling start (it may be running, paused, stopped, etc..).

    0 讨论(0)
提交回复
热议问题