简体   繁体   English

使用InstallUtil安装具有启动参数的Windows服务

[英]Using InstallUtil to install a Windows service with startup parameters

I am using InstallUtil to install my service and I just cannot figure out how to specify the startup parameters for it! 我使用InstallUtil来安装我的服务,我只是无法弄清楚如何为它指定启动参数!

Here is my Installer subclass: 这是我的Installer子类:

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

Can anyone indicate how do I specify the service startup parameters? 任何人都可以指出我如何指定服务启动参数?

Found it. 找到了。

I have rewritten the Install method like so: 我已经重写了Install方法,如下所示:

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

Although, I give the predefined command line parameters ( --service ), the code is easily adaptable to pass real command line arguments, just use the same pattern for passing the username and password parameters. 虽然,我给出了预定义的命令行参数( --service ),但代码很容易适应传递真实的命令行参数,只需使用相同的模式传递用户名密码参数。

I know this is an old post but thought I'd post my response. 我知道这是一个老帖子,但我想发布我的回复。 I did this in a .net 4 service using the BeforeInstall event. 我使用BeforeInstall事件在.net 4服务中完成了此操作。

The ServiceProcessInstaller's BeforeInstall event: ServiceProcessInstaller的BeforeInstall事件:

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

The installed service looks as follows: 已安装的服务如下所示: 在此输入图像描述

It executes fine, and I can examine the parameters from within the main function of the service. 它执行正常,我可以从服务的主要功能中检查参数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM