繁体   English   中英

使用Azure Powershell Runbook将AzureAD用户作为db_owner添加到Azure SQL数据库

[英]Use Azure Powershell Runbook to add AzureAD user as db_owner to an Azure SQL database

我有一台Powershell Runbook,我试图在其中将AzureAD用户添加为Azure SQL数据库上的数据库所有者。

## Connect
$servicePrincipalConnection = Get-AutomationConnection -Name "AzureRunAsConnection"
Connect-AzureAD `
    -TenantId $servicePrincipalConnection.TenantId `
    -ApplicationId $servicePrincipalConnection.ApplicationId `
    -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 

## Generate new access token
$cert = Get-AutomationCertificate -Name 'AzureRunAsCertificate'
# Set Resource URI to Azure Database
$resourceAppIdURI = 'https://database.windows.net/'
# Set Authority to Azure AD Tenant
$authority = 'https://login.windows.net/' + $servicePrincipalConnection.TenantId
$ClientCred = [Microsoft.IdentityModel.Clients.ActiveDirectory.ClientAssertionCertificate]::new($servicePrincipalConnection.ApplicationId, $cert)
$authContext = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]::new($authority)
$authResult = $authContext.AcquireTokenAsync($resourceAppIdURI, $ClientCred)
$AccessToken = $authResult.Result.AccessToken

## Execute sql
$AccessToken
$connectionString = "Data Source=MYCOOLSQLSERVER.database.windows.net;Initial Catalog=MYCOOLDATABASE;Connect Timeout=30"
$connection = New-Object -TypeName System.Data.SqlClient.SqlConnection($connectionString)
$query = "Create User [abc@xyz.com] From EXTERNAL PROVIDER;"

$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($query, $connection)
$connection.AccessToken = $AccessToken
$connection.Open()
$command.ExecuteNonQuery()
$connection.Close()

我最终收到以下错误,其中abc@xyz.com是AzureAD用户。

主体“ abc@xyz.com”无法解析。

有什么我想念的吗?

创建用户后,我打算使用Alter role使他成为db_owner

参考: https : //blogs.technet.microsoft.com/stefan_stranger/2018/06/06/connect-to-azure-sql-database-by-obtaining-a-token-from-azure-active-directory-aad/

https://techcommunity.microsoft.com/t5/Azure-Database-Support-Blog/Azure-SQL-Database-Token-based-authentication-with-PowerShell/ba-p/369078

对于这种情况,我们应该使用用户密码流来使此命令起作用。 请尝试以下PS:

$tenant='<your tenant name/id>'
$username='<SQL admin account>'
$password='<SQL admin password>'
$appid='<app id>'
$appsec='<app secret>'

$SQLServerName = '<azure sql servername>'
$DatabaseName='<db name>'

$body=@{
    "grant_type"="password";
    "resource"="https://database.windows.net/";
    "client_id"=$appid;
    "client_secret"=$appsec;
    "username"=$username;
    "password" = $password;
}
 
$result=Invoke-RestMethod -Uri "https://login.windows.net/$tenant/oauth2/token" -Method POST -Body $body 



$conn = New-Object System.Data.SqlClient.SQLConnection 
$conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30"
$conn.AccessToken = $result.access_token

Write-Verbose "Connect to database and execute SQL script"
$conn.Open() 

$query = 'CREATE USER [Account] FROM EXTERNAL PROVIDER;'

$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($query, $conn)     
$Result = $command.ExecuteScalar()
$Result
$conn.Close() 

在运行脚本之前,应在以下位置为Azure AD中的SPN授予user_impersonation Azure SQL API访问权限: 在此处输入图片说明 在此处输入图片说明 添加后授予权限: 在此处输入图片说明

顺便说一句,请确保SQL管理员帐户和SPN都是Active Directory管理员组的成员: 在此处输入图片说明

它对我有效,并且已成功添加记录: 在此处输入图片说明

如果有任何不清楚的地方,请随时告诉我:)

事实证明,有一种未记录的方法可以执行此操作。 在Azure支持团队的帮助下发现了它。

实际上要使用的SQL查询是:

使用SID = $ hexSid创建用户[abc@xyz.com],输入E;

这里的$hexSid可以通过下面的SQL查询获得

  1. 获取AzureAD用户的ObjectId

$objectId = (Get-AzureADUser -ObjectId "abc@xyz.com").ObjectId

  1. 使用下面的SQL获取sid

宣告@sid = uniqueidentifier = cast('$ objectId'作为uniqueidentifier)选择cast(@sid作为varbinary(max))

  1. 现在,理想情况下,有效的查询将直接使用@sid但这是不可能的,因为With SID需要硬编码的值。 所以我不得不像下面这样分别处理sid查询的输出:
 $result = $command.ExecuteScalar() # result is byte array $hexSid = ($result | ForEach-Object ToString X2) -Join '' # convert to hex format $hexSid = "0x$hexSid" 

有了这些更改,问题中的代码就可以正常工作!

实际上,我们仅在“创建用户”查询中传递AzureAD用户的objectId。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM