How to make Windows Service start as “Automatic (Delayed Start)”

后端 未结 4 1162
误落风尘
误落风尘 2020-12-10 10:46

Scenario:

A WCF service running as a Windows Service. Account is \"User\".


What is done:

I have overridden th

相关标签:
4条回答
  • 2020-12-10 11:11

    I'll expand on jdknight answer a little bit. I had writting permission issues while attempting his solution, so here's what I did:

    void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
        try
        {
            RegistryKey key = Registry.LocalMachine.OpenSubKey("System", true); //Opens the System hive with writting permissions set to true
            key = key.CreateSubKey("CurrentControlSet"); //CreateSubKey opens if subkey exists, otherwise it will create that subkey
            key = key.CreateSubKey("services");
            key = key.CreateSubKey(serviceInstaller1.ServiceName);
            key.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord);
        }
        catch (Exception exc)
        {
            Console.WriteLine(exc.Message);
        }
    }
    

    I also registered to the AfterInstall event by adding a new instance of InstallEventHandler. I'm not sure if that's actually necessary, but it won't hurt either:

    AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);
    

    Works like a charm on .NET Framework 2.0. As it has been pointed out before, for frameworks 4 and above, use

    serviceInstaller1.DelayedAutoStart = true;
    

    according to fiat's answer.

    0 讨论(0)
  • 2020-12-10 11:12

    Now that .NET 4.0 is here:

    serviceInstaller1.StartType = ServiceStartMode.Automatic;
    serviceInstaller1.DelayedAutoStart = true;
    
    0 讨论(0)
  • 2020-12-10 11:13

    For my .NET Framework 3.5 project, I can install my service as an "Automatic (Delayed)" service by manually setting the DelayedAutostart value for my service. For example:

    public ProjectInstaller()
    {
      ...
    
      AfterInstall += ProjectInstaller_AfterInstall;
    }
    
    void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
    {
      string serviceName = <YourSpecific>Installer.ServiceName;
    
      using (RegistryKey serviceKey = Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Services\" + serviceName, true))
      {
          serviceKey.SetValue("DelayedAutostart", 1, RegistryValueKind.DWord);
      }
    }
    

    Note that after you install the service, the service will not be listed as "Automatic (Delayed)" until after the computer is restarted.

    0 讨论(0)
  • 2020-12-10 11:22

    Your only other option is to use P/invoke to call ChangeServiceConfig2 with SERVICE_CONFIG_DELAYED_AUTO_START_INFO. But since you seem to be unwilling to add the registry entry, I doubt you would want to use P/invoke. There's no other way to do it from the .NET Framework (< 4.0).

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