如何使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;
根据菲亚特的回答。