已通过Connect-AzAccount(MFA)登录,如何连接Azure SQL Server?
解决Azure SQL Server的PowerShell认证连接问题
先排查核心权限问题
你已创建外部用户,但需确保该用户拥有目标数据库的访问权限,在SSMS或已连接的工具中执行以下SQL语句:
ALTER ROLE db_datareader ADD MEMBER [<你的账号>] -- 若需写入权限,追加执行:ALTER ROLE db_datawriter ADD MEMBER [<你的账号>] -- 若需管理权限,可使用:ALTER ROLE db_owner ADD MEMBER [<你的账号>]
方式一:使用AccessToken复用Connect-AzAccount会话
这是稳定性最高的实现方式,步骤如下:
- 获取正确的Azure SQL访问令牌:
注意:资源URL必须严格为$token = (Get-AzAccessToken -ResourceUrl "https://database.windows.net/").Tokenhttps://database.windows.net/,不可拼写错误。 - 构建无认证参数的基础连接字符串:
$connString = "Server=tcp:<你的SQL服务器名>.database.windows.net,1433;Database=<你的数据库名>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" - 初始化连接对象并设置令牌:
若仍报$sqlConn = New-Object System.Data.SqlClient.SqlConnection($connString) $sqlConn.AccessToken = $token try { $sqlConn.Open() Write-Host "连接成功" # 此处可添加SQL执行逻辑 } catch { Write-Error "连接失败:$_" } finally { $sqlConn.Close() }<token-identified principal>登录失败,检查:- 创建的外部用户账号与
Connect-AzAccount登录的账号完全一致(含UPN后缀) - SQL服务器防火墙规则允许当前机器IP访问
- 创建的外部用户账号与
方式二:使用Active Directory Default认证(自动复用会话)
无需手动获取令牌,连接字符串会直接调用已有的Azure会话:
- 构建带认证参数的连接字符串:
$connString = "Server=tcp:<你的SQL服务器名>.database.windows.net,1433;Database=<你的数据库名>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Default;" - 直接发起连接:
注:需确保PowerShell环境安装最新版$sqlConn = New-Object System.Data.SqlClient.SqlConnection($connString) try { $sqlConn.Open() Write-Host "连接成功" } catch { Write-Error "连接失败:$_" } finally { $sqlConn.Close() }SqlServer和Az.Accounts模块,可通过Update-Module SqlServer、Update-Module Az.Accounts更新。
原方式失败原因说明
- Active Directory Integrated:该认证依赖Windows域环境或本地AD集成,在非域绑定机器、PowerShell非交互式环境中极易失效,不适合MFA账号使用。
- AccessToken方式报错:大概率是未给外部用户分配数据库权限,或令牌资源URL拼写错误、账号匹配不一致导致。
内容的提问来源于stack exchange,提问作者SchmitzIT
相关产品推荐
相关产品推荐

