2008-11-20 6 views
7

Я нашел пример для шифрования web.config во время установки here, но мое приложение является службой Windows. Метод aspnetreg_iis работает только для файлов web.config.Как шифровать разделы файла app.config во время установки с помощью WiX?

Я знаю, как программно шифровать конфигурационный файл, но я не думаю, что могу это сделать с помощью WiX. Я ошибаюсь? Есть идеи?

ответ

3

Вы должны быть в состоянии сделать это в рамках специального действия. Ловушка, которую я обнаружил, заключается в том, что загрузка сборки для ExeConfigurationFileMap приведет к исключению, но вы можете справиться с этим, добавив обработчик AssemblyResolve в AppDomain. Это своего рода взлом из приложения rich-client, которое я написал для шифрования/дешифрования защищенных разделов конфигурации с использованием ключа машинного шифрования. Вероятно, это не самый красивый код, но я надеюсь, что вы сможете получить картину. Этот код предполагает, что у вас есть 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

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

Я использовал 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 ... Спасибо за ответ. Я обнаружил, что мне не нужно было загружать сборку для шифрования файла конфигурации.

Если вы используете это, вы должны использовать try catch и возвращать ActionResult ... Вышеупомянутый псевдокод.

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

Надеюсь, это поможет кому-то!

+0

Ницца! Это, безусловно, поможет мне в будущем. – 2008-11-25 16:19:20

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

  • Нет связанных вопросов^_^