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

Я хочу сохранить информацию об имени пользователя и пароле моей учетной записи службы Windows "вход в систему" ​​в файле 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 ответа

Решение

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

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

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

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

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

Путь сборки можно получить несколькими способами: Внутри реализации класса Installer с помощью:

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

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

Assembly service = Assembly.GetAssembly(typeof(MyInstaller));
string assemblyPath = service.Location;

У меня была такая же проблема с установщиком сервиса. Вы должны вызвать ваш файл конфигурации "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);
}

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

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

Другие вопросы по тегам