通过Powershell将Azure应用注册连接到Azure SQL数据库

通过Powershell将Azure应用注册连接到Azure SQL数据库,powershell,azure-active-directory,azure-sql-database,adal,Powershell,Azure Active Directory,Azure Sql Database,Adal,需要在prem上运行Powershell脚本,该脚本将作为Azure AD应用程序注册登录到Azure SQL数据库。我能够获取应用注册的访问令牌,但在尝试使用该令牌登录数据库时出错: 使用0参数调用Open时出现异常:用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败 我已经在目标数据库中创建了用户并应用了授权 从外部提供商创建用户[App Reg Dave Test]; 更改角色[db_datareader]添加成员[App Reg Dave Test]; 更改角色[d

需要在prem上运行Powershell脚本,该脚本将作为Azure AD应用程序注册登录到Azure SQL数据库。我能够获取应用注册的访问令牌,但在尝试使用该令牌登录数据库时出错:

使用0参数调用Open时出现异常:用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败

我已经在目标数据库中创建了用户并应用了授权

从外部提供商创建用户[App Reg Dave Test]; 更改角色[db_datareader]添加成员[App Reg Dave Test]; 更改角色[db_datawriter]添加成员[App Reg Dave Test]; 我不确定这是否必要,但我还为SQL数据库用户\u模拟和应用\u模拟的应用程序注册授予了api权限。这是我的PS代码示例。$connection.open命令失败

-Intall ADAL.ps 导入模块ADAL.PS ------------------ -获取应用注册的令牌 ------------------ $TENATID=448b9f7b-9e69-xxxx-XXXXXXXXXX $authority=https://login.microsoftonline.com/$tenantId/oauth2/v2.0/authorize $resourceUrl=api://123a7216-7b20-yyyy-yyyy-yyyyyyyyyyyy $clientId=123a7216-7b20-yyyy-yyyy-YYYYYY $secret=converttosecurestring-StringX87ZK@NPw=zzzzzzz x/--AsPlainText-Force $response=Get ADALToken-Authority$Authority-resourceUrl-ClientId$ClientId-ClientSecret$secret $token=$response.AccessToken ------------------ -连接到数据库 ------------------ $sqlServerUrl=dave-sqls2.database.windows.net $database=advworks $connectionString=Server=tcp:$sqlServerUrl,1433;初始目录=$database;持久安全信息=False;MultipleActiveResultSets=False;加密=真;TrustServerCertificate=False; $connection=New Object System.Data.SqlClient.SqlConnection$connectionString 将AAD生成的令牌添加到SQL连接令牌 $connection.AccessToken=$response.AccessToken $connection-用于调试的输出连接对象。 $query=SELECT@@Servername,@@Version $command=New对象类型System.Data.SqlClient.SqlCommand$query,$connection $connection.Open $adapter=新对象System.Data.sqlclient.sqlDataAdapter$命令 $dataset=新对象System.Data.dataset $adapter.Fill$dataSet | Out Null $connection.Close $dataSet.Tables
根据您提供的PowerShell脚本,您使用了错误的resourceUrl。请将资源url更新为https://database.windows.net/. 有关更多详细信息,请参阅

具体步骤如下。 1.创建服务主体

$SecureStringPassword = ConvertTo-SecureString -String "[Enter SPN Password]" -AsPlainText -Force
New-AzureRmADApplication -DisplayName "[Enter name for Application]" -HomePage "https://www.contoso.com/sqldb-spn" -IdentifierUris "https://www.contoso.com/sqldb-spn" -Password $SecureStringPassword -OutVariable app
New-AzureRmADServicePrincipal -ApplicationId $app.ApplicationId
使用Azure AD admin通过SSMS登录Azure SQL。然后运行以下命令 获取访问令牌 4连接SQL


$sqlServerUrl = "<your server name>.database.windows.net"
$database = "master"
$connectionString = "Server=tcp:$sqlServerUrl,1433;Initial Catalog=$database;Connect Timeout=30"
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$connection.AccessToken = $response.AccessToken
$connection.Open()

$query="SELECT name, database_id, create_date  FROM sys.databases ; "
$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($query, $connection)   
$Result = $command.ExecuteScalar()
$Result
$connection.Close()

由于某些原因,我在conn.open MethodInvocationException上遇到此错误:使用0参数调用open时发生异常:用户登录失败。
$tenantId = "your tenant id"
$authority = "https://login.microsoftonline.com/$tenantId/oauth2/authorize"
$resourceUrl = "https://database.windows.net/"
$clientId = "your application id"
$secret=ConvertTo-SecureString "" -AsPlainText -Force
$response = Get-ADALToken -Authority $authority -Resource $resourceUrl -ClientId $clientId -ClientSecret $secret
$token = $response.AccessToken

$sqlServerUrl = "<your server name>.database.windows.net"
$database = "master"
$connectionString = "Server=tcp:$sqlServerUrl,1433;Initial Catalog=$database;Connect Timeout=30"
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$connection.AccessToken = $response.AccessToken
$connection.Open()

$query="SELECT name, database_id, create_date  FROM sys.databases ; "
$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($query, $connection)   
$Result = $command.ExecuteScalar()
$Result
$connection.Close()