2008-12-18 11 views
8

Quiero almacenar la información de nombre de usuario/contraseña del usuario de inicio de sesión de mi servicio de Windows en el app.config.Servicio de Windows, no puedo acceder a app.config desde el constructor de mi Instalador

Por lo tanto, en mi Instalador, estoy tratando de obtener el nombre de usuario/contraseña de app.config y establecer la propiedad, pero me aparece un error al intentar instalar el servicio.

Funciona bien si codificar el nombre de usuario/contraseña y falla cuando intento y acceder a los app.config

public class Blah : Installer 
{ 

    public Blah() 
    { 

     ServiceProcessInstaller oServiceProcessInstaller = new ServiceProcessInstaller(); 
       ServiceInstaller oServiceInstaller = new ServiceInstaller();    

       oServiceProcessInstaller.Account = ServiceAccount.User; 

     oServiceProcessInstaller.Username =    ConfigurationManager.AppSettings["ServiceProcessUsername"].ToString(); 

    } 
} 

Respuesta

6

El problema es que cuando se ejecuta su instalador, que todavía están en fase de instalación y su aplicación no ha sido completamente instalada. App.config solo estará disponible cuando se ejecute la aplicación real.

Sin embargo, puede hacer lo siguiente:

  1. solicitar al usuario el nombre de usuario y contraseña en el instalador (o en la línea de comandos).
  2. pasar esta información a su clase de instalación (google)
  3. Dentro de la clase de instalación, no es una variable que indica la ruta de instalación
  4. Dentro del evento apropiado en el instalador, utilice funciones System.IO para abrir el archivo app.config e inserte la información ingresada por el usuario
0

No debería almacenar una contraseña en un archivo app.config, eso es muy malo. Debe usar la cuenta de servicio, el usuario actual o solicitarlos. Además, un usuario puede hacer clic con el botón derecho en .exe (que presumiblemente es lo que está activando su instalación) y seleccionar "ejecutar como" para cambiar sus credenciales antes de la instalación (en cuyo caso el usuario actual sería una buena opción).

Además, en el administrador de servicios un usuario puede cambiar qué usuario se supone que debe ejecutar el servicio como después de que la instalación haya finalizado. Pero definitivamente no desea almacenar contraseñas en archivos de texto sin formato.

13

Algunas ideas para acceder a los archivos de configuración dentro de un instalador.

Configuration config = ConfigurationManager.OpenExeConfiguration(assemblyPath); 
ConnectionStringsSection csSection = config.ConnectionStrings; 

Ruta de ensamblado se puede conseguir de varias maneras: Dentro del instalador implementación de la clase con:

this.Context.Parameters["assemblypath"].ToString(); 

o, a veces con la reflexión:

Assembly service = Assembly.GetAssembly(typeof(MyInstaller)); 
string assemblyPath = service.Location; 
2

que tenía el mismo problema con un instalador de servicio . Debe llamar a su archivo de configuración "myService.exe.config" y usar el método OpenExeConfiguration con la ruta del ensamblado para buscar el archivo de configuración correcto (como se explica en la primera respuesta, cuando se ejecutan los instaladores, el directorio base es el directorio de la installutil y no su instalador)

{ 
Assembly __ServiceAssembly = Assembly.GetAssembly(typeof(MyServiceInstaller)); 
Configuration config = ConfigurationManager.OpenExeConfiguration(__ServiceAssembly.Location); 
KeyValueConfigurationCollection svcSettings = config.AppSettings.Settings; 
info("Service name : " + svcSettings["ServiceName"].Value); 
} 

Si no desea seguir el formato "myService.exe.config", utilice un exeConfigurationFileMap:

{ 
Assembly __ServiceAssembly = Assembly.GetAssembly(typeof(SyslogServiceInstaller)); 
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap(); 
configFileMap.ExeConfigFilename = 
    Path.Combine(Directory.GetParent(__ServiceAssembly.Location).ToString(), 
    "App.config"); 

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
    configFileMap, ConfigurationUserLevel.None); 
KeyValueConfigurationCollection mySettings = config.AppSettings.Settings; 

Console.Out.WriteLine(mySettings["ServiceName"].Value); 
} 
+0

no puedo acceder a Configuración o ConfigurationManager dentro de la clase de instalador ... ¿Se supone que debo agregar alguna referencia? – Aditi

+0

Escribí esto hace mucho tiempo. Aquí está mi lista de uso: 'using System; usando System.Collections; usando System.Collections.Generic; usando System.ComponentModel; usando System.Configuration.Install; usando System.Linq; usando System.Configuration; usando System.ServiceProcess; usando System.Reflection; usando System.IO; ' – BenC

Cuestiones relacionadas