2010-01-28 32 views
18

Escenario:¿Cómo hacer iniciar el servicio de Windows como "Automático (inicio retardado)"

Un servicio WCF se ejecuta como un servicio de Windows. La cuenta es "Usuario".


lo que se hace:

me han anulado la OnBeforeInstall en el ProjectInstaller a ser capaz de establecer nombre de usuario y contraseña de un archivo de configuración.


Lo que sería capaz de hacer:

Me gustaría ser capaz de establecer el StartType como Automático (inicio retrasado)


lo que he tratado :

Puse el siguiente coderow en OnBeforeInstall anulado

serviceInstaller1.StartType = ServiceStartMode.Automatic + 1;

pensé que podría engañar a la enumeración que representa ServiceStartMode en automático (inicio retrasado), no funcionó. No he intentado nada más simplemente porque no pude encontrar nada para probar.


Lo que he encontrado en la red:

descubrí que Automático (inicio retrasado) estará disponible en .NET 4, pero eso no me ayuda en este momento. MSDN Descubrí que DelayedAutoStart podría agregarse a la clave de configuración del servicio, pero esto parece un truco si debería hacer esto desde el código. Pero tal vez esta es la única solución disponible para mí en este momento?

¿Alguna idea?

Robert Persson, Suecia

Respuesta

5

Su única otra opción es utilizar P/Invoke para llamar ChangeServiceConfig2 con SERVICE_CONFIG_DELAYED_AUTO_START_INFO. Pero dado que parece que no desea agregar la entrada de registro, dudo que desee utilizar P/invoke. No hay otra manera de hacerlo desde .NET Framework (< 4.0).

+0

Gracias! El contratista quería que el servicio tuviera Automatic (Start Delayed) si fuera posible, pero no era crucial. Así que esperaremos hasta .NET 4. Gracias por la respuesta. –

28

Ahora que .NET 4.0 está aquí:

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

¿Alguien sabe dónde se agrega este código? ServiceInstaller.cs? En el constructor para el ServiceInstaller()? En el constructor para el servicio? – cvocvo

+1

Lo tengo en mi archivo ProjectInstaller.Designer.cs junto con las credenciales, etc. –

4

Para mi proyecto de .NET Framework 3.5, puedo instalar mi servicio como un "Automático (retardado)" servicio manualmente ajustando el valor DelayedAutostart para mi servicio .Por ejemplo:

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

Tenga en cuenta que después de instalar el servicio, el servicio no se enumera como "Automatic (Delayed)" hasta después de que el equipo se reinicia.

+0

Gracias por la pista sobre el reinicio. Me estaba enojando buscando razones por las que no funcionó cuando, por lo que pude ver, las claves de registro estaban allí. –

+0

Hola jdknight, ¿Es obligatorio cambiar la configuración del registro para "Automático (Inicio diferido)"? –

+0

Para .NET 3.5 es. Si está utilizando un nuevo marco, consulte [respuesta de Fiat] (http://stackoverflow.com/a/9525289/693291). – jdknight

1

Expandiré en jdknight responderé un poco. Había escribiendo problemas de permisos al intentar su solución, así que esto es lo que hice:

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

También registrará en el evento AfterInstall mediante la adición de una nueva instancia de InstallEventHandler. No estoy seguro de si eso es realmente necesario, pero no va mal tampoco:

AfterInstall += new InstallEventHandler(ProjectInstaller_AfterInstall); 

funciona como un encanto en .NET Framework 2.0. Como se ha señalado anteriormente, para los marcos 4 y superiores, use

serviceInstaller1.DelayedAutoStart = true; 

según la respuesta de fiat.

Cuestiones relacionadas