Azure SQL 使用 PowerShell 和 ServicePrincipal 为 AD 用户授予访问权限

标签 azure powershell azure-sql-database powershell-core service-principal

我尝试为 Azure SQL Server 创建用户。我想使用 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()

用于生成 token 的 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。我可以查询结果。因此我认为身份验证本身不是问题。 另一方面,当使用我的 Active Directory 用户(属于同一 AAD 组的一部分)而不是服务主体登录 azure cli 时,CREATE USER ... 命令将起作用,并且用户已创建。

我想自动化运行代码,因此我需要它与我的服务主体一起工作。有什么办法可以让这项工作成功吗?

最佳答案

Azure SQL 数据库目前不允许服务主体创建用户。

但其他人找到了一些解决方法来解决该问题: enter image description here

微软MSFT确认正确,官方教程即将发布:

  1. 为 Azure SQL 逻辑服务器分配服务器标识

    Set-AzSqlServer -ResourceGroupName-ServerName<服务器名称>-AssignIdentity

  2. 向服务器身份授予目录读取者权限。

请引用此博客:

  1. CREATE USER FROM EXTERNAL PROVIDER by Service Principal
  2. https://github.com/MicrosoftDocs/sql-docs/issues/4959

希望这有帮助。

关于Azure SQL 使用 PowerShell 和 ServicePrincipal 为 AD 用户授予访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62677458/

相关文章:

sql-server - 关于数据库键

Web应用程序的Azure表存储设计

c# - 使用C#获取Azure服务器中的所有数据库

reactjs - 使用 MSAL 检索的访问 token 不包含组 ID

azure - 无法坚持使用 SSL 的应用程序网关重定向的自定义域

powershell - mkdir 和 mkdir -p 之间的区别?

string - 在 Powershell 中将长字符串分成几行

node.js - npm install - Azure Pipeline 中不存在 jest

C# 模型与 CosmosDB 如何处理模型更改

powershell - PowerShell删除更快