Как я шифрую app.config разделы файлов во время установки с WiX?

Я бы попытался использовать функцию load_checkpoint для этого. Посмотрите, как это делается в этом примере: https://mxnet.incubator.apache.org/versions/master/tutorials/basic/module.html#save-and-load

7
задан quetzalcoatl 28 February 2014 в 18:37
поделиться

2 ответа

Вот то, с чем я закончил...

Я использовал WiX и DTF к созданному управляемый код Пользовательское действие для шифрования данного раздела файла конфигурации:

    public static void EncryptConfig(Session session)
    {

        var configPath = session["APPCONFIGPATH"];
        var sectionToEncrypt = session["SECTIONTOENCRYPT"];

        var fileMap = new ExeConfigurationFileMap();
        fileMap.ExeConfigFilename = configPath;
        var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
        ConfigurationSection section = configuration.GetSection(sectionToEncrypt);

        if (!section.SectionInformation.IsProtected)
        {
            section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
            section.SectionInformation.ForceSave = true;
            configuration.Save(ConfigurationSaveMode.Modified);

        }
    }

Часть моего отсутствия понимания, которое запросило этот вопрос, не знала, что можно безопасно создать пользовательские действия в управляемом коде с помощью DTF. Документация редка на DTF, но после того как Вы получаете его работа, это является большим.

Я нашел, что это только работало, если я запланировал пользовательское действие после InstallFinalize.

Вот конфигурация WiX, чтобы заставить его произойти:

<InstallExecuteSequence>
  <Custom Action="EncryptConfigurationFiles" After="InstallFinalize" />
</InstallExecuteSequence>

<Fragment>
    <Binary Id="YourProject.CustomActions.dll" SourceFile="$(var.YourProject.CustomActions.TargetDir)$(var.YourProject.CustomActions.TargetName).CA.dll" />
    <CustomAction Id="EncryptConfigurationFiles" BinaryKey="YourProject.CustomActions.dll" DllEntry="EncryptConfig" Return="check" />
</Fragment>

Эти блоги/сайты помогли мне добраться там, и большая часть кода сверху была получена от них:

http://geekswithblogs.net/afeng/Default.aspx http://blog.torresdal.net/2008/10/24/WiXAndDTFUsingACustomActionToListAvailableWebSitesOnIIS.aspx http://blogs.msdn.com/jasongin/archive/2008/07/09/votive-project-platform-configurations.aspx

@PITADeveloper... Спасибо за ответ. Я нашел, что не должен был загружать блок для шифрования файла конфигурации.

При использовании этого необходимо использовать выгоду попытки и возвратить ActionResult... Вышеупомянутое является псевдокодом.

Наконец, я использую DataProtectionConfigurationProvider. Для Поставщика RSA я думаю, что существует пара большего количества обручей для перехода через.

Я надеюсь, что это помогает кому-то!

4
ответ дан 7 December 2019 в 07:52
поделиться

Необходимо смочь сделать это в рамках пользовательского действия. Выгода, которую я нашел, - то, что загрузка блока для ExeConfigurationFileMap выдаст исключение, но можно обработать это путем добавления обработчика AssemblyResolve к AppDomain. Это - своего рода взлом из приложения толстого клиента, которое я записал для шифрования/дешифрования защищенных разделов конфигурации с помощью ключа шифрования машины. Это - вероятно, не самый симпатичный код, но я надеюсь, что можно получить изображение от него. Этот код предполагает, что у Вас есть ProtectionProvider, который Вы хотите использовать определенный в файле конфигурации.

//class global
static System.Reflection.Assembly DefiningAssembly;

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

static System.Reflection.Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{
     return DefiningAssembly;
}

Затем можно загрузить конфигурацию как это:

DefiningAssembly = System.Reflection.Assembly.LoadFrom("path to defining assembly for config");

//Set the Configuration using an ExeConfigurationFileMap - This works for any .config file.
ExeConfigurationFileMap CfgMap = new ExeConfigurationFileMap();
CfgMap.ExeConfigFilename = "path to config file";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(CfgMap, ConfigurationUserLevel.None);

List<string> DefiningAssemblyTypes = new List<string>();
foreach (System.Type type in DefiningAssembly.GetExportedTypes())
{
     DefiningAssemblyTypes.Add(type.Name);
}

foreach (ConfigurationSection tempSection in config.Sections)
{
     if (DefiningAssemblyTypes.Contains(tempSection.ElementInformation.Type.Name))
     {
          section = tempSection;
          break;
     }
}
ProtectionProviderName = section.SectionInformation.ProtectionProvider.Name;
section.SectionInformation.ProtectSection(ProtectionProviderName);
config.Save(ConfigurationSaveMode.Minimal, true);

Я надеюсь, что это помогает Вам, всего наилучшего.

3
ответ дан 7 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: