2011-02-01 17 views
13

Tôi đang sử dụng InstallUtil để cài đặt dịch vụ của mình và tôi không thể tìm ra cách chỉ định tham số khởi động cho nó!Sử dụng InstallUtil để cài đặt dịch vụ Windows với thông số khởi động

Đây là lớp con Installer của tôi:

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

bất cứ ai có thể chỉ ra làm thế nào để xác định các thông số dịch vụ khởi động?

Trả lời

15

Tìm thấy.

Tôi đã viết lại các cài đặt phương pháp như vậy:

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

Mặc dù, tôi cung cấp cho các tham số dòng lệnh được xác định trước (--service), các mã có thể dễ dàng thích nghi để vượt qua đối số dòng lệnh thực, chỉ cần sử dụng cùng một mẫu để chuyển các thông số tên người dùngmật khẩu.

+2

Cách tiếp cận này cũng hoạt động nếu bạn đính kèm trình xử lý vào sự kiện BeforeInstall của đối tượng trình cài đặt dịch vụ thay vì ghi đè phương thức Cài đặt. –

+2

Trên thực tế không có nó không. Nó nên và tôi khá chắc chắn nó được sử dụng để nhưng tôi chỉ cần kiểm tra và nó không. Gắn bó với phiên bản ghi đè. –

+0

Tôi có cùng giải pháp để chuyển thông tin đăng nhập cho trình cài đặt của mình. Vấn đề là tệp nhật ký chứa thông tin xác thực của bạn, đây là một vấn đề lớn trong quan điểm của tôi. Bạn có một ý tưởng làm thế nào để vô hiệu hóa các văn bản của "tham số bị ảnh hưởng là:" trong logfile? Tôi không muốn vô hiệu hóa logfile hoàn chỉnh! – flayn

4

Tôi biết đây là một bài đăng cũ nhưng tôi nghĩ rằng tôi sẽ đăng câu trả lời của tôi. Tôi đã làm điều này trong một dịch vụ .net 4 bằng cách sử dụng sự kiện BeforeInstall.

BeforeInstall sự kiện của 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(); 
    } 
} 

Dịch vụ cài đặt trông như sau: enter image description here

Nó thực thi tốt, và tôi có thể kiểm tra các thông số từ bên trong các chức năng chính của dịch vụ.