如何在PowerShell中使用AAD SSO账号执行Azure SQL查询?
解决Azure Cloud Shell中PowerShell用AAD身份执行Invoke-Sqlcmd的Kerberos认证问题
在Azure Cloud Shell的PowerShell环境中,若要以当前SSO登录的AAD用户身份执行SQL查询(例如创建AAD外部用户),直接调用Invoke-Sqlcmd会触发Kerberos认证错误——这是因为Cloud Shell环境无法初始化Kerberos,且常规的账号密码方式不符合当前AAD身份的需求。以下是可行的解决方案,完全模拟Azure数据库查询编辑器的AAD认证流程,无需输入密码:
核心方案:使用AAD访问令牌认证
Azure SQL支持通过AAD访问令牌直接认证,这也是数据库查询编辑器的底层认证逻辑,适配Cloud Shell的SSO环境:
获取Azure SQL的AAD访问令牌
利用Cloud Shell中已登录的AAD会话,直接获取针对Azure SQL资源的访问令牌:$accessToken = (Get-AzAccessToken -ResourceUrl https://database.windows.net).Token这里的
https://database.windows.net是Azure SQL的固定资源ID,必须准确填写。构造带令牌的连接字符串并执行查询
用获取到的令牌构造符合Active Directory Access Token认证格式的连接字符串,再传入Invoke-Sqlcmd:$serverName = 'your-server-name.database.windows.net' $dbName = 'your-database-name' $query = 'CREATE USER [AAD_User] FROM EXTERNAL PROVIDER;' $connectionString = "Server=tcp:$serverName,1433;Database=$dbName;Authentication=Active Directory Access Token;UID=任意字符串;PWD=$accessToken;" Invoke-Sqlcmd -ConnectionString $connectionString -Query $query注意:
UID字段可填写任意字符串,仅用于满足连接字符串格式要求,实际身份由令牌决定。
注意事项
- 确保当前AAD用户拥有目标数据库的对应权限(例如创建外部用户需要
ALTER ANY USER权限) - 目标Azure SQL服务器已配置AAD管理员,且当前用户被授权访问该数据库
Get-AzAccessToken依赖Az.Accounts模块,Cloud Shell默认已预装,本地环境需提前安装:Install-Module -Name Az.Accounts -Force
备选方案(仅适用于有界面环境)
若使用本地有界面的PowerShell环境,且SqlServer模块版本≥v21.1.18256,可直接指定交互式AAD认证:
Invoke-Sqlcmd -ServerInstance $serverName -Database $dbName -Query $query -Authentication ActiveDirectoryInteractive
但此方式在Cloud Shell的无头环境中无法弹出认证窗口,不适用当前场景。
内容的提问来源于stack exchange,提问作者new_programmer_22
相关产品推荐
相关产品推荐

