如何使Windows服务启动为“自动(延迟启动)”

时间:2010-01-28 09:36:35

标签: c# windows-services wcf

情境:

作为Windows服务运行的WCF服务。帐户是“用户”。


做了什么:

我已经覆盖了projectinstaller中的OnBeforeInstall,以便能够从配置文件中设置用户名和密码。


我能做什么:

我希望能够将starttype设置为Automatic(延迟启动)


我尝试了什么:

我将以下coderow放在重写的OnBeforeInstall

serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;

想象一下,我会把ServiceStartMode枚举变成代表自动(延迟启动),但是没有用。没有尝试过任何更简单的因为我找不到任何可以尝试的东西。


我在网上找到了什么:

我发现自动(延迟启动)将在.NET 4中可用,但这对我现在没有帮助。 MSDN 我发现可以将DelayedAutoStart添加到服务的配置键中,但如果我应该从代码中执行此操作,这感觉就像是一个黑客攻击。但也许这是目前唯一可用的解决方案?

任何想法?

Robert Persson,瑞典

4 个答案:

答案 0 :(得分:37)

现在.NET 4.0就在这里:

serviceInstaller1.StartType = ServiceStartMode.Automatic;
serviceInstaller1.DelayedAutoStart = true;

答案 1 :(得分:5)

您唯一的另一个选择是使用P / invoke与SERVICE_CONFIG_DELAYED_AUTO_START_INFO拨打ChangeServiceConfig2。但由于您似乎不愿意添加注册表项,我怀疑您是否想要使用P / invoke。没有其他方法可以从.NET Framework(< 4.0)中完成。

答案 2 :(得分:4)

对于我的.NET Framework 3.5项目,我可以通过手动设置服务的DelayedAutostart值来将我的服务安装为“自动(延迟)”服务。例如:

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

请注意,安装服务后,在重新启动计算机之前,服务不会列为“自动(延迟)”。

答案 3 :(得分:1)

我将在jdknight上稍微扩展一下。我在尝试他的解决方案时有写权限问题,所以这就是我所做的:

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

我还通过添加InstallEventHandler的新实例注册到AfterInstall事件。我不确定这是否真的有必要,但它也不会受到伤害:

AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall);

就像.NET Framework 2.0上的魅力一样。如前所述,对于框架4及以上,使用

serviceInstaller1.DelayedAutoStart = true;

根据菲亚特的回答。