2015-07-05 8 views
0

Я создаю службу Windows, которая, как предполагается, ищет данные в определенной таблице, а затем обрабатывает запись на основе состояния.Передача параметров службе Windows во время установки

Я хочу передать учетные данные БД во время установки службы с помощью installutill в качестве параметров и сохранить их в реестре. Я попытался сделать это, используя код ниже, но я продолжаю получать ошибку в событии «OnBeforeInstall».

Я считаю, что либо неправильно передаю параметры, либо пишу код в неправильном случае. Нужна ваша помощь, чтобы понять, что я делаю неправильно.

protected override void OnBeforeInstall(IDictionary savedState) 
{ 
    base.OnBeforeInstall(savedState); 
    _eventLog.WriteEntry("OnBeforeInstall Started"); 
    try 
    { 
     RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\RyteRMS"); 
     if (key != null) 
     { 
      _eventLog.WriteEntry("Write data to registry key"); 
      key.SetValue("DBTYPE", this.Context.Parameters["dbtype"].ToString()); // This throws error, I am assuming as the above event entry is visible. 
      key.SetValue("DATASOURCE", this.Context.Parameters["datasource"].ToString()); 
      key.SetValue("USERID", this.Context.Parameters["userid"].ToString()); 
      key.SetValue("PASSWORD", this.Context.Parameters["password"].ToString()); 
      key.SetValue("DBNAME", this.Context.Parameters["dbname"].ToString()); 
      key.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     _eventLog.WriteEntry(ex.Message); 
    } 
    _eventLog.WriteEntry("OnBeforeInstall Finished"); 
} 

Я пишу это в командной строке: InstallUtil RMSBGService.exe/DbType = SQLServer/DataSource = hitin-л/имя_бд = эфф/Идентификатор_пользователя = админ/пароль = passw0rd

Ошибка: «Ссылка на объект не установлена ​​в экземпляр объекта».

P.S. Я не знаю, как отлаживать Win Service, поэтому я использую журнал событий для записи всех вещей.

ответ

0

Удалось сделать это самостоятельно, это то, что мы предполагаем сделать.

protected override void OnBeforeInstall(IDictionary savedState) 
{ 
    _eventLog.WriteEntry("OnBeforeInstall Started"); 
    try 
    { 
     RegistryKey key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWARE\RMS"); 
     if (key != null) 
     { 
      _eventLog.WriteEntry("Write data to registry key"); 

      Process _prc = new Process(); 
      _prc.StartInfo.FileName = "cmd.exe"; 
      _prc.StartInfo.UseShellExecute = false; 
      _prc.StartInfo.RedirectStandardOutput = true; 
      _prc.StartInfo.RedirectStandardInput = true; 
      _prc.Start(); 

      ConsoleColor _color = Console.ForegroundColor; 
      Console.ForegroundColor = ConsoleColor.DarkGreen; 
      Console.WriteLine("\n\n"); 
      Console.WriteLine("PLEASE ENTER FOLLOWING DETAILS TO COMPLETE SETUP"); 
      Console.WriteLine("NOTE: if you enter wrong information, you will need to reinstall the application."); 
      Console.WriteLine("\n\n"); 
      Console.WriteLine("Enter DBTYPE (SQLSERVER or ORACLE):"); 
      key.SetValue("DBTYPE", StringCipher.Encrypt(Console.ReadLine(), "@xx")); 
      Console.WriteLine("Enter DATASOURCE (SERVER NAME):"); 
      key.SetValue("DATASOURCE", StringCipher.Encrypt(Console.ReadLine(), "@xx")); 
      Console.WriteLine("Enter DATABASE USER ID:"); 
      key.SetValue("USERID", StringCipher.Encrypt(Console.ReadLine(), "@xx")); 
      Console.WriteLine("Enter PASSWORD:"); 
      key.SetValue("PASSWORD", StringCipher.Encrypt(Console.ReadLine(), "@xx")); 
      Console.WriteLine("Enter DATABASE NAME:"); 
      key.SetValue("DBNAME", StringCipher.Encrypt(Console.ReadLine(), "@xx")); 
      key.Close(); 
      Console.ForegroundColor = _color; 
      _prc.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     _eventLog.WriteEntry(ex.Message); 
    } 
    _eventLog.WriteEntry("OnBeforeInstall Finished"); 
    base.OnBeforeInstall(savedState); 
} 

StringCipher - это специальная функция, которую я использовал для шифрования/расшифровки моего текста. Позже я начинаю читать эти сохраненные значения из реестра и расшифровывать их, чтобы передать их на код подключения к базе данных и сделать это нужным.

Надеюсь, это поможет кому-то.

ПРИМЕЧАНИЕ

Вы должны установить эту услугу с помощью «InstallUtil», если вы решили установить его с помощью проекта установки, эта установка будет застрял с CMD открытым окном.

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