Parses connection strings into named groups Key
and Value
, which can then be handled by whatever programmatic method you like. Ideally handled as key value pairs.
I did this in PowerShell using the below:
function Resolve-ConnectionString {
param(
[string]$ConnectionString,
[string[]]$IncludeKeys = @(),
[switch]$HideSensitiveValues,
[switch]$AsObject
)
begin {
Write-Debug "Enter [$($PSCmdlet.MyInvocation.MyCommand.Name)]..."
$PSBoundParameters.Keys.ForEach{
if ($PSBoundParameters.PSItem -is [string]) {
Write-Debug "$_ : $($PSBoundParameters.Item($_))"
} else {
Write-Debug "$_ : $($PSBoundParameters.Item($_).GetType())"
}
}
$SensitiveValueKeys = [System.Collections.Generic.List[string]]::new([string[]]@(
'AccountKey',
'Password',
'SharedAccessKey',
'SharedAccessSignature',
'Token',
'PAT',
'PersonalAccessToken',
'AccessToken'
))
# Example Connection Strings
# $testcontent2 = @"
# AccountEndpoint=https://some-base-name.documents.azure.com:443/;AccountKey=kascuh9823nfsdvxc==;
# Endpoint=sb://other-more-different-name.servicebus.windows.net/;SharedAccessKeyName=mysak-name;SharedAccessKey=msd8fs2bsc==;EntityPath=someentitypath;TransportType=Amqp
# Data Source=myServerName.whatever.local;Initial Catalog=MyDatabaseName;Persist Security Info=True;User ID=myUserId;Password=MyBadPractice;MultipleActiveResultSets=True;MultiSubnetFailover=True;
# "@
$regexString = "(?:(?'Key'[^""\n][\w|\s]*)=(?'Value'[^;'"",`\n]+);?)"
}
process {
if ($AsObject) {
$output = [PSCustomObject]::new()
} else {
$output = @{}
}
if ($IncludeKeys.Count -gt 0) {
$IncludeKeys.ForEach{
Write-Debug "Adding key [$PSItem] to list of sensitive keys"
$SensitiveValueKeys.Add($PSItem)
}
}
Write-Debug "SensitiveValueKeys Count: $($SensitiveValueKeys.Count)"
[regex]::Matches($ConnectionString, $regexString).foreach{
$Key = $PSItem.Groups.Where({ $PSItem.Name -eq 'Key' })[0].Value
$Value = $PSItem.Groups.Where({ $PSItem.Name -eq 'Value' })[0].Value
Write-Debug "Key: [$($Key)]"
Write-Debug "Value: [$($Value)]"
$keyIsSensitive = ($SensitiveValueKeys | ForEach-Object {
$Key -like "*$PSItem*"
}).Contains($true)
Write-Debug "Key is sensitive: [$($keyIsSensitive)]"
if ($HideSensitiveValues -and $keyIsSensitive) {
$Value = '********'
} elseif ($keyIsSensitive) {
Write-Warning "The value of [$($Key)] is sensitive and will be included in the output!!!"
}
if ($AsObject) {
$output | Add-Member -MemberType NoteProperty -Name $Key -Value $Value -Force
} else {
$output.$Key = $Value
}
}
}
end {
$output
Write-Debug "Exit [$($PSCmdlet.MyInvocation.MyCommand.Name)]..."
}
}