You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取app.config中所有连接字符串并加密保存至配置文件?

控制台连接字符串加密工具实现方案

刚好碰到过类似的TFS构建场景,给你整理了一个完整的C#实现,能自动处理任意名称的connectionStrings,完美适配你的需求:

核心实现步骤

  • 解析命令行传入的app.config路径和密钥两个参数
  • 加载目标配置文件,定位到<connectionStrings>节点
  • 遍历所有<add>节点,对每个connectionString值执行加密(这里假设你已经有现成的加密方法EncryptConnectionString,如果需要调整加密逻辑直接替换即可)
  • 将加密后的内容写回原配置文件,保持其他节点不变

完整代码示例

using System;
using System.Configuration;

namespace ConnectionStringEncryptor
{
    class Program
    {
        static void Main(string[] args)
        {
            // 验证命令行参数数量
            if (args.Length != 2)
            {
                Console.WriteLine("用法:EncryptConnStrings.exe <app.config路径> <加密密钥>");
                Console.WriteLine("示例:EncryptConnStrings.exe \"C:\\MyProject\\app.config\" \"MyStrongPasskey123\"");
                return;
            }

            string configPath = args[0];
            string passkey = args[1];

            try
            {
                // 加载配置文件(打开可写模式)
                var config = ConfigurationManager.OpenExeConfiguration(configPath);
                var connectionStringsSection = config.ConnectionStrings;

                if (connectionStringsSection == null || connectionStringsSection.ConnectionStrings.Count == 0)
                {
                    Console.WriteLine("配置文件中未找到connectionStrings节点或节点为空");
                    return;
                }

                // 遍历所有连接字符串并加密
                foreach (ConnectionStringSettings connSetting in connectionStringsSection.ConnectionStrings)
                {
                    // 跳过系统默认连接字符串(比如LocalSqlServer)
                    if (connSetting.Name == "LocalSqlServer" && string.IsNullOrEmpty(connSetting.ConnectionString))
                        continue;

                    // 执行加密(替换成你已实现的加密逻辑)
                    string encryptedConnStr = EncryptConnectionString(connSetting.ConnectionString, passkey);
                    connSetting.ConnectionString = encryptedConnStr;
                    Console.WriteLine($"已加密连接字符串:{connSetting.Name}");
                }

                // 保存修改后的配置文件
                config.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("connectionStrings");
                Console.WriteLine("所有连接字符串加密完成,已保存回原配置文件");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"执行出错:{ex.Message}");
                Environment.Exit(1); // 返回错误码给TFS构建服务器
            }
        }

        // 这里替换成你已实现的加密逻辑
        private static string EncryptConnectionString(string plainText, string passkey)
        {
            // 示例加密逻辑(实际请替换为你的加密实现)
            // 比如使用AES、RSA或者DPAPI(如果是同一服务器运行的话)
            return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes($"{plainText}:{passkey}"));
        }
    }
}

使用说明

  1. 将代码编译成控制台程序(比如EncryptConnStrings.exe)
  2. 在TFS构建任务中添加命令行执行步骤,传入两个参数:
    EncryptConnStrings.exe "$(Build.SourcesDirectory)\MyApp\app.config" "YourSecurePasskeyHere"
    
    (注意路径要根据你的项目结构调整)

关键注意事项

  • 权限问题:确保TFS构建服务器的运行账号对目标app.config文件有读写权限,否则会保存失败
  • 加密一致性:加密逻辑必须和你项目中解密连接字符串的逻辑完全匹配,否则程序运行时无法正常读取
  • 重复加密判断:如果需要避免重复加密,可以在EncryptConnectionString方法中添加判断逻辑,比如检查字符串是否已经是加密后的格式(比如是否以特定前缀开头)
  • 系统连接字符串:代码中跳过了默认的LocalSqlServer空连接字符串,你可以根据需要调整这个过滤规则

内容的提问来源于stack exchange,提问作者mortenstarck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:40:42