.net - toolset - wix visual studio 2015
¿Cómo encripto las secciones del archivo app.config durante la instalación con WiX? (2)
Debería poder hacerlo dentro de una acción personalizada. El truco que he encontrado es que cargar un ensamblaje para un ExeConfigurationFileMap arrojará una excepción, pero puede manejar eso agregando un controlador AssemblyResolve al AppDomain. Es una especie de hack-up de una aplicación de cliente enriquecido que escribí para encriptar / descifrar secciones de configuración protegida utilizando una clave de encriptación de máquina. Probablemente no sea el código más bonito, pero espero que puedas obtener la imagen de él. Este código supone que tiene el ProtectionProvider que desea usar definido en el archivo de configuración.
//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;
}
Luego, puede cargar su configuración de esta manera:
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);
Espero que esto te ayude, mucha suerte.
He encontrado un ejemplo para encriptar un web.config durante la instalación aquí , pero mi aplicación es un servicio de Windows. El método aspnetreg_iis
funciona solo para archivos web.config.
Sé cómo codificar programáticamente el archivo de configuración, pero no creo que pueda hacerlo con WiX. ¿Me equivoco? ¿Algunas ideas?
Aquí es a lo que terminé ...
Usé WiX y DTF para crear un código administrado Acción personalizada para cifrar una sección determinada de un archivo de configuración:
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);
}
}
Parte de mi falta de comprensión que provocó esta pregunta no fue saber que puede crear de manera segura acciones personalizadas en el código administrado utilizando DTF. La documentación es escasa en DTF, pero una vez que lo haces funcionar, es genial.
Descubrí que esto solo funcionaba si programaba la acción personalizada después de InstallFinalize.
Aquí está la configuración de WiX para que esto suceda:
<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>
Estos blogs / sitios me ayudaron a llegar y gran parte del código de arriba se deriva de ellos:
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 ... Gracias por la respuesta. Descubrí que no necesitaba cargar el ensamblaje para encriptar el archivo de configuración.
Si usa esto, debe usar un try catch y devolver un ActionResult ... Lo anterior es pseudo-código.
Finalmente, estoy usando DataProtectionConfigurationProvider. Para el proveedor de RSA, creo que hay un par de aros más para pasar.
¡Espero que esto ayude a alguien!