2010-01-28 559 views
18

场景:如何使Windows服务启动“自动(延时启动)”

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


什么做:

我在projectinstaller覆盖了OnBeforeInstall能够从一个配置文件中设置用户名和密码。


我将能够做什么:

我希望能够将StartType为自动(延时启动)


我曾尝试:

我把下面的代码放在重写的OnBeforeInstall中

serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;

想我会诱骗ServiceStartMode枚举为代表自动(延时启动),没有工作。没有尝试过任何东西,因为我找不到任何东西尝试。


我已经在网上发现:

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

任何想法?

罗伯特·佩尔松,瑞典

回答

5

你唯一的选择是使用的P/Invoke调用ChangeServiceConfig2SERVICE_CONFIG_DELAYED_AUTO_START_INFO。但是由于你似乎不愿意添加注册表项,我怀疑你会想使用P/invoke。没有其他方法可以从.NET Framework中执行它(< 4.0)。

+0

谢谢! 如果可能,承包商希望服务具有自动(启动延迟),但这并不重要。所以我们要等到.NET 4. 感谢您的回答。 – 2010-01-28 12:23:07

28

现在.NET 4.0是在这里:

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

有谁知道这段代码被添加到哪里? ServiceInstaller.cs?在ServiceInstaller()的构造函数中?在该服务的构造函数中? – cvocvo 2014-06-25 22:02:19

+1

我将它放在我的ProjectInstaller.Designer.cs文件中,以及凭证等。 – 2014-08-29 00:50:00

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

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

+0

感谢您提供有关重新启动的提示。当我看到注册表键在那里时,我正在生气寻找它没有工作的原因。 – 2014-12-19 17:46:45

+0

Hello jdknight,是否需要更改“Automatic(Delayed Start)”的注册表设置? – 2016-04-04 11:34:34

+0

对于.NET 3.5而言。如果您使用的是新框架,请参阅[fiat's answer](http://stackoverflow.com/a/9525289/693291)。 – jdknight 2016-04-04 15:13:07

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; 

根据fiat的回答。