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

场景:

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


做了什么:

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


我能做什么:

我希望能够将starttype设置为Automatic(Delayed Start)


我试过的:

我把以下的coderow放在重写的OnBeforeInstall中

serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;

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


我在网上发现了什么:

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

  • WS2008:启动进程和延迟自动启动

有任何想法吗?

罗伯特佩尔松,瑞典

现在,.NET 4.0就在这里:

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

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

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

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

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

我将扩展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; 

根据菲亚特的回答。