我们设置了一个SQL Server(由我创建,我的帐户作为管理帐户(,使用Management Studio,我可以很好地访问数据库。我现在正试图通过Powershell实现同样的目标。我已经创建了我自己的用户使用:
CREATE USER [<my ccount>] FROM EXTERNAL PROVIDER
我首先使用MFA连接(并使用弹出窗口/MFA登录(:
Connect-AzAccount -SubscriptionId $subscriptionID
这很好,并返回指定订阅的预期值,以及我的Azure AD登录帐户。我可以访问我的KeyVault并从中提取秘密。
我现在想使用PowerShell会话中已经登录的凭据连接到我的SQL Server,这就是我遇到的问题。
我尝试了一个包含Authentication=Active Directory Integrated
的ConnectionString,但它抛出了一个错误Exception calling "Open" with "0" argument(s): "One or more errors occurred."
。
然后我尝试使用这样的连接字符串:Server=tcp:<server>.database.windows.net,1433;Initial Catalog=<database>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30
,并使用SqlConn.AccessToken = $(Get-AzAccessToken -ResourceUrl "Https://database.windows.net/")
添加一个AccessToken。
然而,当我尝试打开连接时,我得到了错误:"Login failed for user '<token-identified principal>'."
谷歌搜索了几篇SO文章,但都没有使用Connect AzAccount,而是使用(我认为已经过时的(Az Account(即使用带有Azure AD MFA的Powershell连接到SQL Server(。
我发现的其他示例都添加了UID
和Password
,考虑到我已经进行了身份验证,应该不需要它们。
有没有一种方法可以使用现有的Connect AzAccount会话对我的Azure SQL Server进行身份验证?如果有,ConnectionString应该采用什么格式?我有一种感觉,我离解决方案很近了,但似乎无法真正实现连接的开放。
提前谢谢。
在阅读了越来越多之后,我终于偶然发现了这个线程@戈法洛的回答正是我所需要的。
因此,初始化连接的正确代码是:
# Sign in to Azure
Connect-AzAccount -SubscriptionID $subscriptionID
$connectionString = "Server=<server>.database.windows.net;Initial Catalog=<database>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30"
$accessToken = (Get-AzAccessToken -ResourceUrl https://database.windows.net).Token
$sqlConn = New-Object System.Data.SqlClient.SqlConnection
$sqlConn.ConnectionString = $connectionString
$sqlConn.AccessToken = $accessToken
$sqlConn.Open()