Azure SQL 使用 PowerShell 和 ServicePrincipal 授予 AD 用户访问权限
Azure SQL Grant Access for AD User using PowerShell and ServicePrincipal
我尝试为 Azure SQL 服务器创建一个用户。我想使用 AzureAD 用户。
这是代码:
$accessToken = $(az account get-access-token --resource https://database.windows.net/ --query accessToken -o tsv --subscription ${data.azurerm_client_config.current.subscription_id})
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = "Data Source = ${azurerm_sql_server.server.fully_qualified_domain_name}; Initial Catalog = ${azurerm_sql_database.sqldb.name}"
$sqlConnection.AccessToken = $accessToken
$sqlConnection.Open()
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.Connection = $sqlConnection
$sqlCmd.CommandText = "CREATE USER [someone.name_domain.com#EXT#@rootdomain.onmicrosoft.com] FROM EXTERNAL PROVIDER"
$sqlCmd.ExecuteNonQuery()
用于生成令牌的 azure 命令行使用服务主体进行身份验证。服务主体使用 AAD 组定义为 azurerm_sql_active_directory_administrator
。我收到以下错误
MethodInvocationException:
Line |
11 | $sqlCmd.ExecuteNonQuery()
| ~~~~~~~~~~~~~~~~~~~~~~~~~
| Exception calling "ExecuteNonQuery" with "0" argument(s): "Principal 'someone.name_domain.com#EXT#@rootdomain.onmicrosoft.com' could not be resolved. Error message: ''"
如果我将 SqlCommand 更改为:SELECT * FROM sys.database_principals
。我可以查询结果。因此我认为身份验证本身不是问题。
另一方面,当使用我的活动目录用户(属于同一 AAD 组)而不是服务主体登录到 azure cli 时,CREATE USER ...
命令起作用并创建了用户。
我想要 运行 自动化代码,因此我需要它与我的服务主体一起工作。有什么可以做的吗?
Azure SQL 数据库暂时不允许服务主体创建用户。
但是其他人找到了一些解决方法来解决这个问题:
Microsoft MSFT确认无误,官方教程即将推出:
将服务器标识分配给 Azure SQL 逻辑服务器
Set-AzSqlServer -ResourceGroupName-ServerName-AssignIdentity
授予对服务器身份的 目录读取者 权限。
请参考此博客:
- CREATE USER FROM EXTERNAL PROVIDER by Service Principal
- https://github.com/MicrosoftDocs/sql-docs/issues/4959
希望对您有所帮助。
我尝试为 Azure SQL 服务器创建一个用户。我想使用 AzureAD 用户。
这是代码:
$accessToken = $(az account get-access-token --resource https://database.windows.net/ --query accessToken -o tsv --subscription ${data.azurerm_client_config.current.subscription_id})
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = "Data Source = ${azurerm_sql_server.server.fully_qualified_domain_name}; Initial Catalog = ${azurerm_sql_database.sqldb.name}"
$sqlConnection.AccessToken = $accessToken
$sqlConnection.Open()
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.Connection = $sqlConnection
$sqlCmd.CommandText = "CREATE USER [someone.name_domain.com#EXT#@rootdomain.onmicrosoft.com] FROM EXTERNAL PROVIDER"
$sqlCmd.ExecuteNonQuery()
用于生成令牌的 azure 命令行使用服务主体进行身份验证。服务主体使用 AAD 组定义为 azurerm_sql_active_directory_administrator
。我收到以下错误
MethodInvocationException:
Line |
11 | $sqlCmd.ExecuteNonQuery()
| ~~~~~~~~~~~~~~~~~~~~~~~~~
| Exception calling "ExecuteNonQuery" with "0" argument(s): "Principal 'someone.name_domain.com#EXT#@rootdomain.onmicrosoft.com' could not be resolved. Error message: ''"
如果我将 SqlCommand 更改为:SELECT * FROM sys.database_principals
。我可以查询结果。因此我认为身份验证本身不是问题。
另一方面,当使用我的活动目录用户(属于同一 AAD 组)而不是服务主体登录到 azure cli 时,CREATE USER ...
命令起作用并创建了用户。
我想要 运行 自动化代码,因此我需要它与我的服务主体一起工作。有什么可以做的吗?
Azure SQL 数据库暂时不允许服务主体创建用户。
但是其他人找到了一些解决方法来解决这个问题:
Microsoft MSFT确认无误,官方教程即将推出:
将服务器标识分配给 Azure SQL 逻辑服务器
Set-AzSqlServer -ResourceGroupName-ServerName
-AssignIdentity 授予对服务器身份的 目录读取者 权限。
请参考此博客:
- CREATE USER FROM EXTERNAL PROVIDER by Service Principal
- https://github.com/MicrosoftDocs/sql-docs/issues/4959
希望对您有所帮助。