我在这里找到了一个在安装期间加密 web.config 的示例,但我的应用程序是 Windows 服务。该aspnetreg_iis
方法仅适用于 web.config 文件。
我知道如何以编程方式加密配置文件,但我认为我不能使用 WiX 来做到这一点。我错了吗?有任何想法吗?
我在这里找到了一个在安装期间加密 web.config 的示例,但我的应用程序是 Windows 服务。该aspnetreg_iis
方法仅适用于 web.config 文件。
我知道如何以编程方式加密配置文件,但我认为我不能使用 WiX 来做到这一点。我错了吗?有任何想法吗?
这就是我最终得到的......
我使用 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,我认为还有更多的障碍需要跳过。
我希望这可以帮助别人!
您应该能够在自定义操作中执行此操作。我发现为 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);
我希望这对你有帮助,祝你好运。