首页 > 解决方案 > 从 Powershell 读取 Machine.config 中的加密连接字符串

问题描述

是否可以从 Powershell 脚本中读取 Machine.config 中的加密连接字符串?

由于安全原因,我们正在尝试将硬编码的连接字符串从 PowerShell 脚本移动到 Machine.config

更新:Powershell 脚本应该从 Machine.config 读取连接字符串(通过 aspnet_regiis 加密)并连接到数据库。

标签: powershellpowershell-3.0machine.config

解决方案


我不确定 PowerShell 在您的问题中的位置。如果您使用 aspnet_regiis.exe 之类的内置命令来加密配置部分,那么您的 IIS 站点不会意识到该部分已加密。

我不确定在 machine.config 中添加内容如何使应用程序更安全,因为任何透明读取它的内容都适用于该机器上的任何应用程序。

.net 配置的工作方式是你有一个 some.exe,它有一个 some.exe.config 文件。当您部署 some.exe 时,您可以(应该?)包括一个加密敏感部分的步骤。该应用程序仍然只是读取数据,不知道它已被加密。

但同样是应用程序,而不是读取加密值的 powershell。

这是我用来加密/解密部分的脚本的一部分。谨慎使用,因为加密的数据只能在同一台机器(并且可能是同一台操作系统)上解密。YMMV

$appConfig = "your.exe"
$sectionName = "appSettings"
$dataProtectionProvider = "DataProtectionConfigurationProvider"

if (-not (Test-Path $path) ) { throw "Unable to find $($appConfig) $($path)" }

$configuration = [System.Configuration.ConfigurationManager]::OpenExeConfiguration($path)
$section = $configuration.GetSection($sectionName)
if (-not $section.SectionInformation.IsProtected) {
    $section.SectionInformation.ProtectSection($dataProtectionProvider)
    $section.SectionInformation.ForceSave = $true
    $configuration.Save([System.Configuration.ConfigurationSaveMode]::Full)
    Write-Information -Message "$($sectionName) in $($appConfig) has been protected from casual users"
}
else {
    Write-Information -Message "$($sectionName) in $($appConfig) is already protected"
    $section.SectionInformation.UnprotectSection()
    $section.SectionInformation.ForceSave = $true
    $configuration.Save([System.Configuration.ConfigurationSaveMode]::Full)
    Write-Information -Message "$($sectionName) in $($appConfig) protection removed"
}

这是加密/解密配置部分的完整脚本的片段。


推荐阅读