2011-02-01 17 views
13

Hizmetimi yüklemek için InstallUtil kullanıyorum ve bunun için başlangıç ​​parametrelerini nasıl belirleyeceğimi bilemiyorum!Başlangıç ​​parametrelerini içeren bir Windows hizmeti yüklemek için InstallUtil'i kullanma

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

kimse Hizmetin başlangıç ​​parametrelerini belirlemek nasıl gösterir misiniz: Benim Yükleyici alt sınıf İşte

mı?

cevap

15

Bulunamadı.

Ben tekrar yazmış şöyle yöntemi yükleyin:

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

, gerçek komut satırı argümanları geçmek önceden tanımlanmış komut satırı parametreleri (--service), kod kolayca adapte edilebilir vermek rağmen, sadece kullanıcı adı ve parola parametrelerini geçirirken aynı modeli kullanın.

+2

Bu yaklaşım, yükleme yöntemini geçersiz kılmak yerine, hizmet yükleyici nesnesinin BeforeInstall olayına bir işleyici eklerseniz de çalışır. –

+2

Aslında hayır öyle değil. Olmalı ve eskiden olduğundan eminim ama kontrol ettim ve yapmıyor. Geçersiz kılma sürümü ile sopa. –

+0

Yükleyicim için kimlik bilgilerini geçmek için aynı çözüme sahibim. Sorun şu ki, günlük dosyası sizin kimlik bilgilerinizi içerir, bu da benim düşüncemde büyük bir sorun. Günlük dosyasında "Etkilenen parametreler:" yazısının nasıl devre dışı bırakılacağı hakkında bir fikriniz var mı? Tam log dosyasını devre dışı bırakmak istemiyorum! – flayn

4

Bunun eski bir yazı olduğunu biliyorum ama cevabımı göndereceğimi düşündüm. Bunu BeforeInstall olayını kullanarak bir .net 4 hizmetinde yaptım.

ServiceProcessInstaller en BeforeInstall olay: Bu ince yürütür enter image description here

ve ben hizmetin ana işlev içinde parametreler inceleyebilirsiniz şu şekildedir:

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

yüklü hizmet görünüyor.

İlgili konular