Служба 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 будет доступен только при запуске самого приложения.
Однако вы можете сделать следующее:
- Запрашивает у пользователя имя пользователя и пароль в установщике (или в командной строке).
- Передайте эту информацию вашему классу установщика (Google it)
- В вашем классе установщика есть переменная, которая сообщает вам путь установки
- Внутри соответствующего события в программе установки используйте функции 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 (что, по-видимому, и вызывает установку) и выбрать "запустить как", чтобы изменить свои учетные данные перед установкой (в этом случае текущий пользователь будет хорошим выбором).
Кроме того, в диспетчере служб пользователь может изменить того, какой пользователь должен запускать службу после завершения установки. Но вы определенно не хотите хранить пароли в текстовых файлах.