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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:03:11