使用 Automation RunAs 服务主体连接到 Azure Analysis Services 并处理

Use Automation RunAs service principal to connect to Azure Analysis Services and process

TL;DR

总的来说,步骤是:

  1. 使用正确的代码(此post中的最后一个代码)
  2. 以服务器管理员或数据库管理员的身份在 SSMS 中手动添加您的应用程序 ID

然后您可以从 Azure 自动化帐户处理 Azure Analysis Services 多维数据集,而无需创建另一个单独的服务帐户

实际问题:

我正在尝试使用 Azure Automation RunAs 服务主体处理 Azure Analysis Services 多维数据集。这是 Azure 自动化帐户中的 运行

这个代码

#Get the existing AzureRunAsConnection connection
$Conn = Get-AutomationConnection -Name AzureRunAsConnection

# Login with service principal account
Login-AzureRMAccount 
    -ServicePrincipal 
    -Tenant $Conn.TenantID 
    -ApplicationId $Conn.ApplicationID 
    -CertificateThumbprint $Conn.CertificateThumbprint

# Process cube
Invoke-ProcessASDatabase -databasename "DB" -server "Server" -RefreshType "Full"

结果

Authentication failed: User ID and Password are required when user interface is not available.

我的理解是,当您创建 Azure 自动化帐户时,它还会创建一个 'RunAs' 帐户,后者又会创建一个服务主体帐户。 (虽然doco好像有点亮)

我已尝试在 Azure AD 中找到此主体帐户并将其添加到 Azure 门户中的 SSAS 管理员,但找不到实际帐户。服务主体实际上是否显示为帐户?

下面的代码工作正常,但它使用了预先保存的凭据,但我不想再管理另一个帐户。

# Purpose: Run a full process the SSAS cube
$AzureCred = Get-AutomationPSCredential -Name "MyCredential"

Add-AzureRmAccount -Credential $AzureCred | Out-Null
Invoke-ProcessASDatabase -databasename "MyDB" -server "MyServer" -RefreshType "Full" -Credential $AzureCred 

更新 1

我也尝试过在 SSMS 会员区手动添加这些(在自动化帐户的 RunAs Account 区域中查找 guid 之后):

app:applicationid@tenantid

obj:serviceprincipalobjectid@tenantid

我收到相同的错误消息。

我还 运行 非管理员用户的脚本并获得了

The "zzz" database does not exist on the server.

所以看来我的问题是身份验证,而不是授权。换句话说,不是我不访问,而是我无法登录。我在考虑基于该错误,在针对 Azure 分析服务调用 Invoke-ProcessAsDatabase 时,-credential 不是可选的

此外,我注意到对于 -credential 选项,帮助说

If no credentials are specified, the default Windows account of the user running the script is assume

鉴于 Azure Analysis Services 在连接到数据源时似乎只能使用 SQL 凭据(没有任何 AD 凭据),我只能推测 Azure Analysis Services 无法使用任何一种用于内部流程的 Azure Ad 身份验证。

烦人的是,这在任何地方都没有说明。

更新 2

所以我没有仔细阅读link。有效的代码主要在网站上 post 两位回答者编辑 here。要预先验证到 Azure 分析服务器,您需要使用 Add-AzureAnalysisServicesAccount(linked 博客使用 Login-AzureAsAccount,但我无法让它工作,也找不到 doco)。您需要安装 powershell 模块 "Azure.AnalysisServices" 才能使用它。

$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureAnalysisServicesAccount -RolloutEnvironment "australiasoutheast.asazure.windows.net" -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint
Invoke-ProcessASDatabase -databasename "MYDB" -server "MyServerEndpoint" -RefreshType "Full"

您可以使用RunAs帐户,之后就不需要使用-credential

所以.. 这实际上可以工作并且无需单独的凭据即可登录,但现在它无法访问数据库。我得到的不是登录错误,而是

The "ZZZZ" database does not exist on the server.

我认为 RunAs 帐户可以访问服务器但不能访问数据库,我无法找到它来授予它访问权限。

更新 3:

这是一个更直接的指南,介绍如何让应用程序访问模型以便构建模型:

请注意,您无法在 Azure 门户中添加,因为它找不到。在 SSMS 中添加它 "manually" 它会起作用,它也会作为管理员出现在 Azure 门户中

现在一切正常。

更新 4:

这已成为存储我通过 MSI 进行身份验证的发现的便利位置

虽然这个问题已解决,但我不想使用 MSI 安全性从其他设备连接到 SQL Azure。没有连接字符串支持此 - none 任何连接字符串中的身份验证方法都支持 MSI 身份验证。我确实发现这个很有趣 link 这意味着您 可以 创建一个支持身份验证的连接字符串作为 MSI:

https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-connect-msi

感兴趣的代码是:

az webapp config connection-string set 
--resource-group myResourceGroup 
--name <app name> 
--settings MyDbConnection='Server=tcp:<server_name>.database.windows.net,1433;Database=<db_name>;' 
--connection-string-type SQLAzure

我找不到对参数 --connection-string-type 的任何引用。但看起来您只是完全排除了身份验证部分。

根据官方文档:

Once the service principal is created, its application ID can be assigned permissions in the Azure Analysis Services server or model roles using the following syntax. The example below adds a service principal to the server administrators group in SSMS.

我没有看到使用 运行-as 选项,我建议检查这个 blog

它还包含有关在 Azure 自动化中存储凭据 的信息,这将帮助您不在代码中硬写凭据。

在你的例子1中,似乎不是你登录Azure Login-AzureRMAccount得到的错误日志。据我所知,Invoke-ProcessASDatabase 不是 Azure Power Shell cmdlet。事实上,您无需登录您的 Azure 订阅。只有 Invoke-ProcessASDatabase -databasename "MyDB" -server "MyServer" -RefreshType "Full" -Credential $AzureCred 适合您。

Yes if I supply a credential it works, but I want to use the RunAs credential. If I can't, then what is the point of it.

RunAs credential 仅适用于登录您的 Azure 订阅,它不会存储您的 SQL 的凭据。在您的场景中,您可以将 SQL 凭据存储在 runbook PSCredential 中,例如您的示例 2。事实上,在您的示例中,您可以删除 Add-AzureRmAccount -Credential $AzureCred | Out-Null.

更新:

您应该在 Runbook 中使用以下脚本。

$Conn = Get-AutomationConnection -Name AzureRunAsConnection 
Login-AzureASAccount -RolloutEnvironment "southcentralus.asazure.windows.net" -ServicePrincipal -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint -TenantId $Conn.TenantID 
Invoke-ProcessTable -Server "asazure://southcentralus.asazure.windows.net/myserver" -TableName "MyTable" -Database "MyDb" -RefreshType "Full"

有关此的更多信息,请查看此 blog