Служба Windows, не могу получить доступ к app.config из конструктора моего установщика - PullRequest
8 голосов
/ 19 декабря 2008

Я хочу сохранить информацию об имени пользователя и пароле моей службы Windows 'logon as' user в файле app.config.

Итак, в моем установщике я пытаюсь получить имя пользователя / пароль из app.config и установить свойство, но при установке службы я получаю сообщение об ошибке.

Работает нормально, если я жестко кодирую имя пользователя / пароль, и завершается неудачно при попытке доступа к app.config

public class Blah : Installer
{

    public Blah()
    {

        ServiceProcessInstaller oServiceProcessInstaller = new ServiceProcessInstaller();
                ServiceInstaller oServiceInstaller = new ServiceInstaller();            

                oServiceProcessInstaller.Account = ServiceAccount.User;

        oServiceProcessInstaller.Username =             ConfigurationManager.AppSettings["ServiceProcessUsername"].ToString();

    }
}

Ответы [ 4 ]

13 голосов
/ 20 января 2009

Просто несколько идей по доступу к файлам конфигурации внутри установщика.

Configuration config = ConfigurationManager.OpenExeConfiguration(assemblyPath);
ConnectionStringsSection csSection = config.ConnectionStrings;

Путь сборки можно получить несколькими способами: Реализация класса внутри установщика с:

this.Context.Parameters["assemblypath"].ToString();

или иногда с отражением:

Assembly service = Assembly.GetAssembly(typeof(MyInstaller));
string assemblyPath = service.Location;
6 голосов
/ 19 декабря 2008

Проблема в том, что когда ваш установщик работает, вы все еще находитесь в фазе установки и ваше приложение не было полностью установлено. Файл app.config будет доступен только при запуске самого приложения.

Однако вы можете сделать следующее:

  1. Запрашивает у пользователя имя пользователя и пароль в установщике (или в командной строке).
  2. Передайте эту информацию вашему классу установщика (Google it)
  3. В вашем классе установщика есть переменная, которая сообщает вам путь установки
  4. Внутри соответствующего события в установщике используйте функции System.IO, чтобы открыть файл app.config и вставить введенную пользователем информацию
2 голосов
/ 05 октября 2011

У меня была такая же проблема с установщиком сервиса. Вы должны вызвать ваш файл конфигурации "myService.exe.config" и использовать метод OpenExeConfiguration с путем сборки, чтобы найти правильный файл конфигурации (как объясняется в первом ответе, когда ваши установщики запускаются, базовый каталог каталог установки, а не вашего установщика)

{
Assembly __ServiceAssembly = Assembly.GetAssembly(typeof(MyServiceInstaller));
Configuration config = ConfigurationManager.OpenExeConfiguration(__ServiceAssembly.Location);
KeyValueConfigurationCollection  svcSettings = config.AppSettings.Settings;
info("Service name : " + svcSettings["ServiceName"].Value);
}

Если вы не хотите использовать формат «myService.exe.config», используйте exeConfigurationFileMap:

{
Assembly __ServiceAssembly = Assembly.GetAssembly(typeof(SyslogServiceInstaller));
ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = 
     Path.Combine(Directory.GetParent(__ServiceAssembly.Location).ToString(),
     "App.config");

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(
     configFileMap, ConfigurationUserLevel.None);
KeyValueConfigurationCollection mySettings = config.AppSettings.Settings;

Console.Out.WriteLine(mySettings["ServiceName"].Value);
}
0 голосов
/ 23 декабря 2008

Вы действительно не должны хранить пароль в файле app.config, это очень плохо. Вам нужно либо использовать служебную учетную запись текущего пользователя, либо подсказать им. Также пользователь может щелкнуть правой кнопкой мыши по файлу .exe (который, по-видимому, запускает установку) и выбрать «запустить как», чтобы изменить свои учетные данные перед установкой (в этом случае текущий пользователь будет хорошим выбором).

Кроме того, в диспетчере служб пользователь может изменить того пользователя, которому должна быть запущена служба, после завершения установки. Но вы определенно не хотите хранить пароли в текстовых файлах.

...