我们设置了一个 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帐户(即使用带有Azure AD MFA的Powershell连接到SQL Server)。
我发现的其他示例都添加了
UID
和 Password
,考虑到我已经通过了身份验证,这应该是不需要的。
有没有办法使用现有的 Connect-AzAccount 会话对我的 Azure SQL Server 进行身份验证?如果可以,ConnectionString 应该采用什么格式?我有一种感觉,我非常接近解决方案,但似乎无法真正实现连接的打开。
提前致谢。
阅读了越来越多的内容后,我终于偶然发现了这个帖子。 @golfalot 的答案正是我所需要的。
因此初始化连接的正确代码是:
# 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()
嗨@schmitzIT,我正在尝试为 Entra 用户身份验证方法启动 SSMS。这些用户确实启用了 MFA。使用 AutoIT,我设法注入服务器和用户名,这有助于我重定向到 Azure 门户网页,它希望在其中输入 Entra 凭据。如何使用相同的 AutoIT 脚本在网页中自动注入凭据?