2008-09-26 11 views

Respuesta

51

Bravo a mi compañero de trabajo (Bruce Eddy). Él encontró una manera que podemos hacer esta llamada de línea de comandos:

installutil.exe /user=uname /password=pw myservice.exe 

Se realiza reemplazando OnBeforeInstall en la clase de instalación:

namespace Test 
{ 
    [RunInstaller(true)] 
    public class TestInstaller : Installer 
    { 
     private ServiceInstaller serviceInstaller; 
     private ServiceProcessInstaller serviceProcessInstaller; 

     public OregonDatabaseWinServiceInstaller() 
     { 
      serviceInstaller = new ServiceInstaller(); 
      serviceInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic; 
      serviceInstaller.ServiceName = "Test"; 
      serviceInstaller.DisplayName = "Test Service"; 
      serviceInstaller.Description = "Test"; 
      serviceInstaller.StartType = ServiceStartMode.Automatic; 
      Installers.Add(serviceInstaller); 

      serviceProcessInstaller = new ServiceProcessInstaller(); 
      serviceProcessInstaller.Account = ServiceAccount.User; 
      Installers.Add(serviceProcessInstaller); 
     } 

     public string GetContextParameter(string key) 
     { 
      string sValue = ""; 
      try 
      { 
       sValue = this.Context.Parameters[key].ToString(); 
      } 
      catch 
      { 
       sValue = ""; 
      } 
      return sValue; 
     } 


     // Override the 'OnBeforeInstall' method. 
     protected override void OnBeforeInstall(IDictionary savedState) 
     { 
      base.OnBeforeInstall(savedState); 

      string username = GetContextParameter("user").Trim(); 
      string password = GetContextParameter("password").Trim(); 

      if (username != "") 
       serviceProcessInstaller.Username = username; 
      if (password != "") 
       serviceProcessInstaller.Password = password; 
     } 
    } 
} 
+5

Para cualquiera que use esto, asegúrese de que todos los argumentos preceden al ".exe" del servicio en la línea de comando, de lo contrario no se procesan/pasan. –

+2

Esto incluirá el nombre de usuario/contraseña en el archivo de registro de instalación. A menos que deshabilite la escritura de archivos de registro, esta información permanecerá, lo cual es bastante peligroso, creo. No he encontrado una mejor solución todavía :( – flayn

+0

Esto incluso funciona con ManagedInstallerClass ManagedInstallerClass.InstallHelper (nueva cadena [] {"/ user = theUserName", "/ password = ******", Assembly. GetExecutingAssembly(). Location}); –

3

No, installutil no es compatible con eso.

Por supuesto, si usted escribió un instalador; con un custom action, entonces usted podría usar eso como parte de un MSI o vía installutil.

2

También puede forzar su servicio para ejecutarse como usuario utilizando ServiceProcessInstaller :: Account = ServiceAccount.User;

Aparece una ventana emergente que pregunta "[dominio \] usuario, contraseña" durante la instalación del servicio.

public class MyServiceInstaller : Installer 
{ 
    /// Public Constructor for WindowsServiceInstaller 
    public MyServiceInstaller() 
    { 
     ServiceProcessInstaller serviceProcessInstaller = new ServiceProcessInstaller(); 
     ServiceInstaller serviceInstaller = new ServiceInstaller(); 

     //# Service Account Information 
     serviceProcessInstaller.Account = ServiceAccount.User; // and not LocalSystem; 
    .... 
+3

-1 la pregunta claramente solicita una instalación silenciosa –

61

Una manera mucho más fácil que los puestos de arriba y sin código adicional en su instalador es utilizar el siguiente:

Installutil.exe/nombre de usuario = dominio \ nombre de usuario/contraseña = contraseña/desatendido C: \ My.exe

Solo asegúrese de que la cuenta que utiliza es válida. Si no es así, recibirá un "ninguna asignación entre nombres de cuenta y de identificación de seguridad que se hizo" excepción

+10

Esto solo funciona si configura la propiedad Account en ServiceProcessInstaller en 'ServiceAccount.User' – headsling

+4

Además, para especificar el uso de la máquina local ".", Como entonces: "/username=.\Administrator" – DenNukem

5

InstallUtil.exe establece StartupType = Manual

En caso de que quiera iniciarse automáticamente el servicio, utilice:

sc config MyServiceName start= auto

(tenga en cuenta que debe haber un espacio después de '=')

+0

En mi caso sc config MyServiceName start = auto no funciona –

Cuestiones relacionadas