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

我使用InstallUtil来安装我的服务,我只是无法弄清楚如何为它指定启动参数!

这是我的Installer子类:

[RunInstaller(true)] public class ServerHostInstaller : Installer { private ServiceInstaller m_serviceInstaller; private ServiceProcessInstaller m_serviceProcessInstaller; private static string s_usage = "Usage:\ninstallutil /i /username= /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; } } 

任何人都可以指出如何指定服务启动参数?

找到了。

我已经重写了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); } 

虽然,我给出了预定义的命令行参数( –service ),但代码很容易适应传递真实的命令行参数,只需使用相同的模式传递用户名密码参数。

我知道这是一个老post,但我想发布我的回复。 我使用BeforeInstall事件在.net 4服务中完成了此操作。

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

已安装的服务如下所示: 在此处输入图像描述

它执行正常,我可以检查服务的主要function内的参数。