2008-11-20 7 views

Antwort

3

Sie sollten es in einer benutzerdefinierten Aktion tun können. Der Catch, den ich gefunden habe, ist, dass das Laden einer Assembly für eine ExeConfigurationFileMap eine Ausnahme auslöst, aber Sie können das handhaben, indem Sie der AppDomain einen AssemblyResolve-Handler hinzufügen. Dies ist eine Art Hack-up von einer Rich-Client-Anwendung, die ich geschrieben habe, um geschützte Konfigurationsabschnitte mit einem Maschinenverschlüsselungsschlüssel zu verschlüsseln/entschlüsseln. Es ist wahrscheinlich nicht der hübscheste Code, aber ich hoffe, du kannst das Bild daraus machen. In diesem Code wird davon ausgegangen, dass Sie den zu verwendenden ProtectionProvider in der Konfigurationsdatei definiert haben.

//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; 
} 

Dann können Sie Ihre Konfiguration wie folgt laden:

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); 

Ich hoffe, das hilft Ihnen, viel Glück. Hier

3

ist das, was ich am Ende mit ...

I verwendet WiX und DTF erstellt einen Code Custom Action verwaltet einen bestimmten Abschnitt einer Konfigurationsdatei zu verschlüsseln:

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); 

     } 
    } 

Teil meiner mangelndes Verständnis, das diese Frage ausgelöst hat, war nicht das Wissen, dass Sie benutzerdefinierte Aktionen in verwaltetem Code mit DTF sicher erstellen können. Dokumentation ist bei DTF spärlich, aber wenn Sie es erst mal zum Laufen bringen, ist es großartig.

Ich fand, dass dies nur funktionierte, wenn ich die benutzerdefinierte Aktion nach InstallFinalize einplante.

Hier die WiX Config ist es um sie geschehen:

<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> 

Diese Blogs/Websites half mir dort und der Code viel bekommen von oben aus ihnen abgeleitet wurde:

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 ... Danke für die Antwort. Ich habe festgestellt, dass ich die Assembly nicht laden musste, um die Konfigurationsdatei zu verschlüsseln.

Wenn Sie dies verwenden, sollten Sie versuchen, fangen und ein ActionResult zurückgeben ... Das obige ist Pseudocode.

Schließlich verwende ich den DataProtectionConfigurationProvider. Für den RSA-Provider denke ich, dass es noch ein paar Reifen mehr gibt, durch die man springen kann.

Ich hoffe, das hilft jemandem!

+0

Schön! Dies wird mir in Zukunft sicher weiterhelfen. –