2011-02-01 2 views
13

Я использую InstallUtil для установки моей службы, и я просто не могу понять, как указать параметры запуска для нее!Использование InstallUtil для установки службы Windows с параметрами запуска

Вот мой Установщик подкласс:

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

Можно ли указать, как указать параметры запуска службы?

ответ

15

Найдено.

Я переписывать метод установки следующим образом:

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

Хотя, я даю предопределенные параметры командной строки (--service), код легко адаптируется для передачи аргументов реальной командной строки, просто используйте тот же шаблон для передачи имя пользователя и пароль параметров.

+2

Этот подход также работает, если вы прикрепляете обработчик к событию BeforeInstall объекта установщика службы, а не переопределяете метод установки. –

+2

На самом деле нет. Это должно быть, и я уверен, что это было, но я только что проверил, и это не так. Придерживайтесь переопределенной версии. –

+0

У меня такое же решение для передачи учетных данных моему установщику. Проблема в том, что файл журнала содержит ваши учетные данные, а это, по-моему, большая проблема. У вас есть идея, как отключить запись «Затронутые параметры:» в файле журнала? Я не хочу отключать полный файл журнала! – flayn

4

Я знаю, что это старый пост, но я думал, что отправлю свой ответ. Я сделал это в службе .net 4, используя событие BeforeInstall.

BeforeInstall событие 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(); 
    } 
} 

Установленная служба выглядит следующим образом: enter image description here

Он выполняет прекрасно, и я могу проверить параметры внутри основной функции сервиса.

Смежные вопросы