1

TL;博士

总而言之,步骤是:

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

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

实际问题:

我正在尝试使用 Azure 自动化 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"

结果是

身份验证失败:用户界面不可用时需要用户 ID 和密码。

我的理解是,当您创建 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 帐户区域中查找 guid 之后):

app:applicationid@tenantid

obj:serviceprincipalobjectid@tenantid

我得到同样的错误信息。

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

服务器上不存在“zzz”数据库。

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

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

如果未指定凭据,则假定运行脚本的用户的默认 Windows 帐户

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

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

更新 2

所以我没有仔细阅读链接。有效的代码主要在两个回答者在这里发布的网站上。要对 Azure 分析服务器进行预身份验证,您需要使用Add-AzureAnalysisServicesAccount(链接的博客使用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

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

服务器上不存在“ZZZZ”数据库。

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

更新 3:

这是关于如何让应用程序访问模型以便构建模型的更直接指南:

使用服务主体的 Azure 分析服务连接不起作用

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

现在一切正常。

更新 4:

这已成为存储我在通过 MSI 进行身份验证时发现的一个方便的地方

虽然这个问题已经解决了,但不,我想使用 MSI 安全性从其他东西连接到 SQL Azure。没有连接字符串支持这一点 - 任何连接字符串中的身份验证方法都不支持 MSI 身份验证。我确实找到了这个有趣的链接,这意味着您可以创建一个支持作为 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。但看起来您只是完全排除了身份验证部分。

4

2 回答 2

1

根据官方文档:

创建服务主体后,可以使用以下语法为其应用程序 ID 分配 Azure Analysis Services 服务器或模型角色中的权限。下面的示例将服务主体添加到 SSMS 中的服务器管理员组。

我没有看到使用 Run-as 选项,我建议查看这个博客

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

于 2018-02-01T17:48:13.873 回答
1

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

是的,如果我提供凭证,它可以工作,但我想使用 RunAs 凭证。如果我不能,那有什么意义。

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

更新:

您应该在运行手册中使用以下脚本。

$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"

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

于 2018-02-02T05:57:10.937 回答