2013-02-22 4 views
1

В настоящее время у меня есть служба Windows (работающая под управлением LocalSystem), которую я устанавливаю с помощью InstallSheild LE. Эта служба предназначена для чтения некоторых данных из локального файла базы данных, упаковки пакета и отправки его на внешний сервер с заданным интервалом. Скорее, у меня есть расположение базы данных, URL-адрес сервера и т. Д., Я хочу прочитать их из файла настроек. Я могу сделать это достаточно легко с App.config, но из моих исследований я получаю изображение, что изменение App.config (или любого файла в Program Files) затруднено/невозможно после установки.Использование приложения Windows для изменения настроек, используемых службой Windows

Мой вопрос в том, что было бы лучшим способом иметь приложение, которое я могу запустить, чтобы изменить необходимые параметры для службы без необходимости «Запускать как администратор». Должен ли я помещать эти настройки в реестр. Вставляет ли они в AppData правильный ответ, и если да, то как эти параметры разделяют между настройками, изменяющими приложение и службу?

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

+1

Специально для службы работает с учетной записью, как всемогущего как 'LocalSystem', я бы очень осторожно иметь параметры, записываемые, не являющимися администраторами. Я думаю, что ваше решение не редактировать файл, хранящийся в Program Files, является хорошим с точки зрения установки и обновления, но я бы предложил внедрить манифест в приложение для редактирования, чтобы потребовать права администратора для его запуска, и применить его строго ограничивающий ACL файлы, ключи реестра или все, что вы используете для хранения. – shambulator

+0

Делает смысл. Можете ли вы указать мне в сторону любой документации по встраиванию манифеста и настройке списков ACL? – jdehlin

ответ

1

Вы можете найти App.Config вне каталога установки приложения и поместить его в общую папку (например, AppData). Затем вы сообщите своему приложению, чтобы загрузить его, вместо того, чтобы просто вставлять его из каталога установки приложения.

ConfigurationManager.OpenMappedExeConfig позволяет загрузить конфигурацию из произвольного расположения.

// Access a configuration file using mapping. 
    // This function uses the OpenMappedExeConfiguration 
    // method to access a new configuration file.  
    // It also gets the custom ConsoleSection and 
    // sets its ConsoleEment BackgroundColor and 
    // ForegroundColor properties to green and red 
    // respectively. Then it uses these properties to 
    // set the console colors. 
    public static void MapExeConfiguration() 
    { 

    // Get the application configuration file. 
    System.Configuration.Configuration config = 
     ConfigurationManager.OpenExeConfiguration(
      ConfigurationUserLevel.None); 

    Console.WriteLine(config.FilePath); 

    if (config == null) 
    { 
     Console.WriteLine(
     "The configuration file does not exist."); 
     Console.WriteLine(
     "Use OpenExeConfiguration to create the file."); 
    } 

    // Create a new configuration file by saving 
    // the application configuration to a new file. 
    string appName = 
     Environment.GetCommandLineArgs()[0]; 

    string configFile = string.Concat(appName, 
     ".2.config"); 
    config.SaveAs(configFile, ConfigurationSaveMode.Full); 

    // Map the new configuration file. 
    ExeConfigurationFileMap configFileMap = 
     new ExeConfigurationFileMap(); 
    configFileMap.ExeConfigFilename = configFile; 

    // Get the mapped configuration file 
    config = 
     ConfigurationManager.OpenMappedExeConfiguration(
     configFileMap, ConfigurationUserLevel.None); 

    // Make changes to the new configuration file. 
    // This is to show that this file is the 
    // one that is used. 
    string sectionName = "consoleSection"; 

    ConsoleSection customSection = 
     (ConsoleSection)config.GetSection(sectionName); 

    if (customSection == null) 
    { 
     customSection = new ConsoleSection(); 
     config.Sections.Add(sectionName, customSection); 
    } 
    else 
     // Change the section configuration values. 
     customSection = 
      (ConsoleSection)config.GetSection(sectionName); 

    customSection.ConsoleElement.BackgroundColor = 
     ConsoleColor.Green; 
    customSection.ConsoleElement.ForegroundColor = 
     ConsoleColor.Red; 

    // Save the configuration file. 
    config.Save(ConfigurationSaveMode.Modified); 

    // Force a reload of the changed section. This 
    // makes the new values available for reading. 
    ConfigurationManager.RefreshSection(sectionName); 

    // Set console properties using the 
    // configuration values contained in the 
    // new configuration file. 
    Console.BackgroundColor = 
     customSection.ConsoleElement.BackgroundColor; 
    Console.ForegroundColor = 
     customSection.ConsoleElement.ForegroundColor; 
    Console.Clear(); 

    Console.WriteLine(); 
    Console.WriteLine("Using OpenMappedExeConfiguration."); 
    Console.WriteLine("Configuration file is: {0}", 
     config.FilePath); 
    } 

Образец Источник: MSDN

+0

Я считаю, что это то, что я ищу. Благодаря! – jdehlin

+0

Этот ответ указал мне в правильном направлении, но предоставленный примерный код копирует конфигурацию в тот же каталог (в Program Files). Я использовал следующее, чтобы поместить его в ProgramData (не AppData, который является специфичным для пользователя). Var configFile = Environment.GetFolderPath (Environment.SpecialFolder.CommonApplicationData) + "\\" + AppName + "\\ App.config"; '. Вы можете использовать SpecialFolder.ApplicationData, а не SpecialFolder.CommonApplicationData для пользовательских конфигураций. – jdehlin

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