通过PowerShell连接Azure SQL DB提示现有连接被远程主机关闭如何解决?
PowerShell连接Azure SQL DB报错排查方案
核心报错根因定位方向
该报错说明TCP网络连通性正常,故障出在登录认证阶段被服务端主动断开连接,结合你已完成的排查项,按以下优先级逐一验证:
1. 验证Azure AD访问令牌有效性
这是该场景下最高发的问题:
- 首先确认令牌不为空:执行命令
echo $env:ACCESSTOKEN查看是否有输出 - 校验令牌属性:将令牌内容粘贴到JWT解析工具,确认两个核心属性
aud(受众)必须为https://database.windows.net/,如果是其他资源(如Graph、Azure管理接口)的令牌会被Azure SQL直接拒绝exp(过期时间)必须晚于当前时间,过期令牌会触发连接断开
- 确认令牌对应身份的SQL权限:SSMS连接使用的身份和令牌身份可能不一致,需确认令牌对应的AAD用户/服务主体已被添加为Azure SQL服务器的AAD管理员,或已在目标库中创建了对应的包含用户并授予连接权限
2. 替换SqlClient驱动组件
旧版本的System.Data.SqlClient存在Azure AD令牌认证、TLS 1.2握手的兼容性bug,按以下步骤替换为官方推荐的Microsoft.Data.SqlClient测试:
- 安装驱动包:执行PowerShell命令
Install-Package Microsoft.Data.SqlClient - 修改你的连接代码,仅替换实例化语句即可,其余逻辑不变:
# 仅修改这一行,其余配置保持和原代码一致 $conn = new-object Microsoft.Data.SqlClient.SqlConnection
重新执行代码验证连接是否正常。
3. 验证PowerShell会话网络配置
SSMS会默认继承系统代理配置,而PowerShell会话的.NET网络配置可能和系统不一致:
- 执行命令查看当前会话代理配置:
[System.Net.WebRequest]::DefaultWebProxy - 如果存在代理配置,可临时关闭本地代理后重试连接,或配置SqlClient走系统代理
4. 使用官方内置命令交叉验证
使用Azure PowerShell的原生Invoke-SqlCmd命令测试连接,排除自定义代码问题:
Invoke-SqlCmd -ServerInstance $sqlServer -Database $sqlDB -AccessToken $env:ACCESSTOKEN -Query "SELECT @@VERSION"
- 若命令执行成功:说明你的自定义SqlClient代码存在问题,优先按第二步替换驱动解决
- 若命令执行失败:说明问题出在令牌或权限配置,回到第一步重新校验
内容的提问来源于stack exchange,提问作者Asher
相关产品推荐
相关产品推荐

