使用PowerShell通过服务主体登录Azure SQL失败问题求助
解决PowerShell服务主体登录Azure SQL失败的问题
核心问题分析
你遇到的Login failed for user '<token-identified principal>'错误,大概率是获取的访问令牌包含多余双引号,导致Azure SQL无法正确解析;此外旧版SqlServer模块也可能存在AccessToken参数的兼容性问题。
解决方案
1. 修正访问令牌的获取方式
使用az account get-access-token时,默认返回带双引号的JSON字符串,需去掉引号才能正常使用:
- 方法一:用
--output tsv直接返回纯令牌文本
$accessToken = az account get-access-token --resource https://database.windows.net --query accessToken --output tsv Invoke-Sqlcmd -ServerInstance "test.database.windows.net" -Database "test-01" -AccessToken $accessToken -Query "SELECT GETUTCDATE()"
- 方法二:通过JSON解析提取令牌
$tokenResult = az account get-access-token --resource https://database.windows.net | ConvertFrom-Json $accessToken = $tokenResult.accessToken Invoke-Sqlcmd -ServerInstance "test.database.windows.net" -Database "test-01" -AccessToken $accessToken -Query "SELECT GETUTCDATE()"
2. 更新SqlServer模块到最新版本
旧版SqlServer模块对AccessToken参数的支持存在缺陷,执行以下命令更新:
Update-Module -Name SqlServer -Force
3. 使用Az模块的Get-AzAccessToken获取令牌(更可靠)
如果已安装Az.Accounts模块,可直接用PowerShell原生方式获取令牌,避免az cli的字符串解析问题:
# 先通过服务主体登录Azure(提前配置好SP凭据) Connect-AzAccount -ServicePrincipal -ApplicationId "你的服务主体应用ID" -TenantId "Azure租户ID" -Credential (Get-Credential) # 若用证书认证,替换为: # Connect-AzAccount -ServicePrincipal -ApplicationId "你的SP应用ID" -TenantId "租户ID" -CertificateThumbprint "证书指纹" # 获取Azure SQL的访问令牌 $token = Get-AzAccessToken -ResourceUrl https://database.windows.net $accessToken = $token.Token # 执行SQL命令 Invoke-Sqlcmd -ServerInstance "test.database.windows.net" -Database "test-01" -AccessToken $accessToken -Query "SELECT GETUTCDATE()"
4. 额外验证(可选)
若以上方法仍失败,可确认:
- 服务主体确实被设置为Azure SQL服务器的Entra管理员
- 没有防火墙规则阻止PowerShell所在IP访问Azure SQL服务器
内容的提问来源于stack exchange,提问作者michasaucer
相关产品推荐
相关产品推荐

