Skip to content

Commit 156fdb9

Browse files
Add SecureString support for AccessToken in Connect-DbaInstance (#9722)
1 parent f85add9 commit 156fdb9

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

public/Connect-DbaInstance.ps1

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ function Connect-DbaInstance {
140140
.PARAMETER AccessToken
141141
Connect to an Azure SQL Database or an Azure SQL Managed Instance with an AccessToken, that has to be generated with Get-AzAccessToken or New-DbaAzAccessToken.
142142
143+
Supports both String (Azure PowerShell v13 and earlier) and SecureString (Azure PowerShell v14+) token formats.
144+
The function automatically detects the token type and converts SecureString tokens to the required plain text format internally.
145+
143146
Note that the token is valid for only one hour and cannot be renewed automatically.
144147
145148
Note that the returned SMO is not a fully functional SMO. It can only be used in a limited list of commands like Invoke-DbaQuery, Import-DbaCsv or Write-DbaDbTableData.
@@ -268,8 +271,20 @@ function Connect-DbaInstance {
268271
PS C:\> Invoke-DbaQuery -SqlInstance $server -Query "select 1 as test"
269272
270273
Connect to an Azure SQL Database or an Azure SQL Managed Instance with an AccessToken.
274+
Works with both Azure PowerShell v13 (string tokens) and v14+ (SecureString tokens).
271275
Note that the token is valid for only one hour and cannot be renewed automatically.
272276
277+
.EXAMPLE
278+
PS C:\> # Azure PowerShell v14+ with SecureString token support
279+
PS C:\> Connect-AzAccount
280+
PS C:\> $azureToken = (Get-AzAccessToken -ResourceUrl https://database.windows.net).Token
281+
PS C:\> $azureInstance = "YOUR-AZURE-SQL-MANAGED-INSTANCE.database.windows.net"
282+
PS C:\> $server = Connect-DbaInstance -SqlInstance $azureInstance -Database "YOURDATABASE" -AccessToken $azureToken
283+
PS C:\> Invoke-DbaQuery -SqlInstance $server -Query "select 1 as test"
284+
285+
Connect to an Azure SQL Managed Instance using Azure PowerShell v14+ where Get-AzAccessToken returns a SecureString.
286+
The function automatically detects and converts the SecureString token to the required format.
287+
273288
.EXAMPLE
274289
PS C:\> $token = New-DbaAzAccessToken -Type RenewableServicePrincipal -Subtype AzureSqlDb -Tenant $tenantid -Credential $cred
275290
PS C:\> Connect-DbaInstance -SqlInstance sample.database.windows.net -Accesstoken $token
@@ -913,14 +928,36 @@ function Connect-DbaInstance {
913928
# If we have an AccessToken, we will build a SqlConnection
914929
if ($AccessToken) {
915930
# Check if token was created by New-DbaAzAccessToken or Get-AzAccessToken
916-
Write-Message -Level Debug -Message "AccessToken detected, checking for string or PsObjectIRenewableToken"
931+
Write-Message -Level Debug -Message "AccessToken detected, checking for string, SecureString, or PsObjectIRenewableToken"
917932
if ($AccessToken | Get-Member | Where-Object Name -eq GetAccessToken) {
918933
Write-Message -Level Debug -Message "Token was generated using New-DbaAzAccessToken, executing GetAccessToken()"
919934
$AccessToken = $AccessToken.GetAccessToken()
920935
}
921936
if ($AccessToken | Get-Member | Where-Object Name -eq Token) {
922937
Write-Message -Level Debug -Message "Token was generated using Get-AzAccessToken, getting .Token"
923-
$AccessToken = $AccessToken.Token
938+
$tokenValue = $AccessToken.Token
939+
# Check if the Token property is a SecureString (Azure PowerShell v14+)
940+
if ($tokenValue -is [System.Security.SecureString]) {
941+
Write-Message -Level Debug -Message "Token is SecureString (Azure PowerShell v14+), converting to plain text"
942+
try {
943+
$AccessToken = ConvertFrom-SecurePass -InputObject $tokenValue
944+
Write-Message -Level Debug -Message "Successfully converted SecureString token to plain text"
945+
} catch {
946+
Stop-Function -Target $instance -Message "Failed to convert SecureString AccessToken to plain text: $($_.Exception.Message)" -Continue
947+
}
948+
} else {
949+
Write-Message -Level Debug -Message "Token is plain text string (Azure PowerShell v13 and earlier)"
950+
$AccessToken = $tokenValue
951+
}
952+
} elseif ($AccessToken -is [System.Security.SecureString]) {
953+
# Handle direct SecureString AccessToken input
954+
Write-Message -Level Debug -Message "AccessToken is directly provided as SecureString, converting to plain text"
955+
try {
956+
$AccessToken = ConvertFrom-SecurePass -InputObject $AccessToken
957+
Write-Message -Level Debug -Message "Successfully converted direct SecureString AccessToken to plain text"
958+
} catch {
959+
Stop-Function -Target $instance -Message "Failed to convert SecureString AccessToken to plain text: $($_.Exception.Message)" -Continue
960+
}
924961
}
925962
Write-Message -Level Debug -Message "We have an AccessToken and build a SqlConnection with that token"
926963
Write-Message -Level Debug -Message "But we remove 'Integrated Security=True;'"

0 commit comments

Comments
 (0)