【问题标题】:How to make Windows Service start as "Automatic (Delayed Start)"如何使 Windows 服务启动为“自动(延迟启动)”
【发布时间】:2010-01-28 09:36:34
【问题描述】:

场景:

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


做了什么:

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


我能做什么:

我希望能够将启动类型设置为自动(延迟启动)


我尝试过的:

我将以下代码行放在重写的 OnBeforeInstall 中

serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;

我想我会欺骗 ServiceStartMode 枚举来表示自动(延迟启动),但没有用。没有尝试过更多的东西,因为我找不到可以尝试的东西。


我在网上找到的:

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

有什么想法吗?

罗伯特·佩尔松,瑞典

【问题讨论】:

    标签: c# windows-services wcf


    【解决方案1】:

    现在 .NET 4.0 已经发布:

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

    【讨论】:

    • 有谁知道这段代码是在哪里添加的?服务安装程序.cs?在 ServiceInstaller() 的构造函数中?在服务的构造函数中?
    • 我在我的 ProjectInstaller.Designer.cs 文件中拥有它以及凭据等。
    【解决方案2】:

    您唯一的其他选择是使用 P/invoke 调用 ChangeServiceConfig2SERVICE_CONFIG_DELAYED_AUTO_START_INFO。但是由于您似乎不愿意添加注册表项,我怀疑您是否会想要使用 P/invoke。 .NET Framework (

    【讨论】:

    • 谢谢!如果可能,承包商希望该服务具有自动(延迟启动),但这并不重要。所以我们会等到 .NET 4。感谢您的回答。
    【解决方案3】:

    对于我的 .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);
      }
    }
    

    请注意,在您安装该服务后,该服务将不会被列为“自动(延迟)”,直到计算机重新启动后

    【讨论】:

    • 感谢有关重启的提示。当我看到注册表项在那里时,我正在寻找为什么它不起作用的原因。
    • 您好 jdknight,是否必须更改“自动(延迟启动)”的注册表设置?
    • 对于 .NET 3.5 是这样。如果您使用的是新框架,请参阅fiat's answer
    【解决方案4】:

    我会稍微扩展一下 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;
    

    根据法币的回答。

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2016-06-20
      • 1970-01-01
      相关资源
      最近更新 更多