2011-02-01 19 views
13

¡Estoy usando InstallUtil para instalar mi servicio y simplemente no puedo encontrar la manera de especificar los parámetros de inicio para él!Uso de InstallUtil para instalar un servicio de Windows con los parámetros de inicio

Aquí está mi subclase Instalador:

[RunInstaller(true)] 
public class ServerHostInstaller : Installer 
{ 
    private ServiceInstaller m_serviceInstaller; 
    private ServiceProcessInstaller m_serviceProcessInstaller; 
    private static string s_usage = "Usage:\ninstallutil /i /username=<user_name> /password=<user_password> NCStub.Server.Host.exe"; 

    public ServerHostInstaller() 
    { 
    m_serviceInstaller = new ServiceInstaller(); 
    m_serviceInstaller.ServiceName = Program.ServiceName; 
    m_serviceInstaller.DisplayName = Program.ServiceName; 
    m_serviceInstaller.StartType = ServiceStartMode.Automatic; 

    m_serviceProcessInstaller = new ServiceProcessInstaller(); 
    m_serviceProcessInstaller.Account = ServiceAccount.User; 

    Installers.Add(m_serviceInstaller); 
    Installers.Add(m_serviceProcessInstaller); 
    } 

    public override void Install(IDictionary stateSaver) 
    { 
    base.Install(stateSaver); 

    string userName = this.Context.Parameters["username"]; 
    if (userName == null) 
    { 
     Console.WriteLine(s_usage); 
     throw new InstallException("Missing parameter 'username'"); 
    } 

    string userPass = this.Context.Parameters["password"]; 
    if (userPass == null) 
    { 
     Console.WriteLine(s_usage); 
     throw new InstallException("Missing parameter 'password'"); 
    } 

    m_serviceProcessInstaller.Username = userName; 
    m_serviceProcessInstaller.Password = userPass; 
    } 
} 

¿Alguien puede indicar cómo puedo especificar los parámetros de inicio del servicio?

Respuesta

15

Lo encontraste.

he reescrito el método Instalar este modo:

public override void Install(IDictionary stateSaver) 
{ 
    string userName = this.Context.Parameters["username"]; 
    if (userName == null) 
    { 
    Console.WriteLine(s_usage); 
    throw new InstallException("Missing parameter 'username'"); 
    } 

    string userPass = this.Context.Parameters["password"]; 
    if (userPass == null) 
    { 
    Console.WriteLine(s_usage); 
    throw new InstallException("Missing parameter 'password'"); 
    } 

    m_serviceProcessInstaller.Username = userName; 
    m_serviceProcessInstaller.Password = userPass; 

    var path = new StringBuilder(Context.Parameters["assemblypath"]); 
    if (path[0] != '"') 
    { 
    path.Insert(0, '"'); 
    path.Append('"'); 
    } 
    path.Append(" --service"); 
    Context.Parameters["assemblypath"] = path.ToString(); 
    base.Install(stateSaver); 
} 

Aunque, doy los parámetros de línea de comandos predefinidos (--service), el código es fácilmente adaptable para pasar argumentos de línea de comandos real, sólo utilice el mismo patrón para pasar los parámetros de nombre de usuario y contraseña.

+2

Este enfoque también funciona si conecta un controlador al evento BeforeInstall del objeto de instalador de servicio en lugar de anular el método de instalación. –

+2

En realidad, no, no es así. Debería y estoy bastante seguro de que solía hacerlo, pero acabo de comprobar y no es así. Quédate con la versión de anulación –

+0

Tengo la misma solución para pasar credenciales a mi instalador. El problema es que el archivo de registro también contiene sus credenciales, lo cual es un gran problema en mi opinión. ¿Tiene una idea de cómo desactivar la escritura de "Los parámetros afectados son:" en el archivo de registro? ¡No quiero deshabilitar el archivo de registro completo! – flayn

4

Sé que esta es una publicación anterior pero pensé en publicar mi respuesta. Hice esto en un servicio .net 4 usando el evento BeforeInstall.

caso beforeInstall del ServiceProcessInstaller:

private void serviceProcessInstaller1_BeforeInstall(object sender, InstallEventArgs e) 
{ 
    System.ServiceProcess.ServiceProcessInstaller installer = sender as System.ServiceProcess.ServiceProcessInstaller; 

    if (installer != null) 
    { 
     //Get the existing assembly path parameter 
     StringBuilder sbPathWIthParams = new StringBuilder(installer.Context.Parameters["assemblypath"]); 

     //Wrap the existing path in quotes if it isn't already 
     if (!sbPathWIthParams[0].Equals("\"")) 
     { 
      sbPathWIthParams.Insert(0, "\""); 
      sbPathWIthParams.Append("\""); 
     } 

     //Add desired parameters 
     sbPathWIthParams.Append(" test"); 

     //Set the new path 
     installer.Context.Parameters["assemblypath"] = sbPathWIthParams.ToString(); 
    } 
} 

El servicio instalado se ve de la siguiente manera: enter image description here

Se ejecuta bien, y puedo examinar los parámetros dentro de la función principal del servicio.

Cuestiones relacionadas