7

我在这里找到了一个在安装期间加密 web.config 的示例,但我的应用程序是 Windows 服务。该aspnetreg_iis方法仅适用于 web.config 文件。

我知道如何以编程方式加密配置文件,但我认为我不能使用 WiX 来做到这一点。我错了吗?有任何想法吗?

4

2 回答 2

4

这就是我最终得到的......

我使用 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 Provider,我认为还有更多的障碍需要跳过。

我希望这可以帮助别人!

于 2008-11-25T04:59:15.207 回答
3

您应该能够在自定义操作中执行此操作。我发现为 ExeConfigurationFileMap 加载程序集会引发异常,但您可以通过向 AppDomain 添加 AssemblyResolve 处理程序来处理该异常。这是我编写的富客户端应用程序的一种破解,用于使用机器加密密钥加密/解密受保护的配置部分。它可能不是最漂亮的代码,但我希望你能从中得到图片。此代码假定您在配置文件中定义了要使用的 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);

我希望这对你有帮助,祝你好运。

于 2008-11-20T22:21:27.960 回答